{"version":3,"sources":["site/gallery/config.js","lib/polyfill-ie/index.js","lib/store/reducers.js","lib/store/storeProvider.js","layout/topHeader/navBar.js","cssInJs/variables.js","config.js","lib/css-emotion/breakpoints.js","lib/css-emotion/mixin.js","layout/backButton/backButtonStyle.js","layout/backButton/backButton.js","layout/hamburger/hamburgerStyle.js","layout/hamburger/hamburger.js","layout/topHeader/topHeaderStyle.js","layout/topHeader/topHeader.js","components/notFound/notFound.js","env.js","lib/app-version/index.js","components/form/buttons/button.js","lib/ui-error/errorMessage.js","lib/ui-error/errorPopup.js","lib/icons-svg/icons/NarrowRight.js","lib/icons-svg/icons/Loading--circle.js","lib/ui-loading-v2/sectionLoading.js","lib/utils-core/url.js","lib/utils-core/form.js","lib/utils-core/array.js","lib/utils-core/date.js","lib/utils-core/css.js","lib/utils-core/ui.js","lib/utils-core/money.js","lib/utils-core/text.js","lib/utils-core/random.js","lib/utils-core/object.js","lib/utils-core/media.js","lib/utils-core/index.js","site/siteUtils.js","utils/index.js","lib/net-api/index.js","lib/dev-mediaQueryStatus/index.js","lib/seo/meta-tag.js","lib/seo/tracking--deprecated.js","lib/animation/animationUtils.js","lib/net-loader/loadJs.js","lib/ui-parallax/index.js","lib/router/useRouter.js","lib/router/useHistoryStore.js","lib/router/handleLink.js","lib/router/siteLink.js","lib/instagram-feed/feedStyle.js","lib/instagram-feed/feed.js","lib/utils-core/debounce.js","lib/youtube/iframeApi.js","lib/youtube/youtubeEmbedPopup.js","site/_cmsItems/cmsUtils.js","site/_cmsItems/code-instagram/render.js","site/_offline/index.js","lib/form/formModelHelper.js","lib/form/formBuilder.js","lib/form/validatorHelper.js","lib/form/validators/required.js","lib/form/validators/email.js","lib/form/validators/date.js","lib/form/validators/length.js","lib/form/validators.js","lib/form/formRenderHelper.js","lib/form/components/ValidationAlert.js","lib/form/controls/TextInput.js","lib/form/controls/RadioListInput.js","lib/form/controls/CheckboxListInput.js","lib/form/controls/DateSeparateInput.js","lib/form/controls/FileInput.js","lib/form/controls/index.js","lib/form/controls/TextareaInput.js","lib/form/controls/CheckboxInput.js","lib/form/controls/SelectInput.js","lib/form/controls/HiddenInput.js","lib/form/controlRenderer.js","lib/form/formValidate.js","lib/form/useForm.js","lib/tracking/gtm.js","site/button/buttonStyle.js","site/button/formButton.js","site/_cmsItems/code-subscribe/subscribe.js","site/_cmsItems/code-subscribe/subscribeFormModel.js","site/_cmsItems/code-subscribe/render.js","site/_cmsItems/html/view/renderHtml.js","site/_cmsItems/html/view/html.js","site/_cmsItems/html/render.js","site/_cmsItems/htmlV2/view/renderHtml.js","site/_cmsItems/htmlV2/view/htmlStyle.js","site/_cmsItems/htmlV2/view/html.js","site/_cmsItems/htmlV2/render.js","site/bannerSize/bannerSize.js","site/_cmsItems/imagePanel/view/imagePanelStyle.js","site/useParallax/useParallax.js","site/_cmsItems/imagePanel/view/imagePanel.js","site/_cmsItems/imagePanel/render.js","site/_cmsItems/multiColumnPanel2/view/multiColumnPanel2Style.js","site/_cmsItems/multiColumnPanel2/view/renderHtml.js","site/_cmsItems/multiColumnPanel2/view/multiColumnPanel2.js","site/_cmsItems/multiColumnPanel2/render.js","site/tileList/tileList.js","site/tileList/tileListStyle.js","site/_cmsItems/pageTiles/view/pageTile/pageTile.js","site/_cmsItems/pageTiles/view/pageTile/pageTileStyle.js","site/_cmsItems/pageTiles/view/pageTiles.js","site/_cmsItems/pageTiles/render.js","site/_cmsItems/panel/view/panel.js","site/_cmsItems/panel/render.js","site/gallery/galleryTiles.js","site/gallery/galleryStyle.js","site/portal/portal.js","site/gallery/gallery.js","site/_cmsItems/photoGallery/view/photoGallery.js","site/_cmsItems/photoGallery/render.js","site/shareButtons/shareButtons.js","site/shareButtons/shareButtonStyle.js","site/_cmsItems/sharingIcons/view/sharingIcons.js","site/_cmsItems/sharingIcons/render.js","lib/youtube/youtubeBanner--mobilePopup.js","site/_cmsItems/videoPanel/view/videoPanel.js","site/_cmsItems/videoPanel/render.js","site/_cmsItems/items-generated.js","cms/utils/cmsUtils.js","cms/items/bannerPanel/view.js","cms/items/bannerItem/view.js","cms/items/panel/view.js","cms/items/html/view.js","cms/items/imagePanel/view.js","cms/items/pageTiles/view.js","components/tiles/bsyc/style.js","components/tiles/bsyc/view.js","cms/items/singleBanner/view.js","cms/items/contactForm/contactForm.js","cms/items/contactForm/contactFormModel.js","cms/items/contactForm/view.js","cms/items/VideoPanel/view.js","site/searchResult/searchResult.js","components/TextWithJavaScript/view.js","cms/items/code/view.js","cms/items/blogPosts/view.js","cms/items/blogPostTitle/view.js","cms/items/videoHolder/view.js","cms/items/videoItem/view.js","cms/items/multiColumnPanel/view.js","cms/items/expandableHtml/view.js","components/photoGallery/style.js","components/photoGallery/view.js","components/testimonial/testimonialPanel/style.js","components/testimonial/testimonialItem/style.js","components/testimonial/testimonialItem/view.js","components/testimonial/testimonialPanel/view.js","components/expandablePanel/style.js","components/expandablePanel/view.js","site/ecm/productList/productTileStyle.js","site/ecm/productList/productTile.js","site/ecm/productList/productItems.js","site/ecm/productList/categoryListModel.js","site/ecm/cart/cartStyle.js","site/ecm/cartStep/stepStyle.js","site/ecm/cartStep/stepNav.js","site/ecm/cartOrderItems/orderItemStyle.js","site/ecm/cartSummary/summaryStyle.js","site/ecm/cartSummary/summary.js","site/ecm/cartOrderItems/orderItems.js","site/ecm/cartOrderItems/orderItemFormData.js","site/ecm/cartShipping/shipping.js","site/ecm/cartShipping/shippingFormData.js","site/ecm/cartPayment/payStyle.js","site/ecm/cartPayment/pay.js","site/ecm/cartPayment/payStripe.js","site/ecm/cart/cart.js","site/ecm/cart/useStep.js","cms/items/ecm/view.js","cms/items/item.js","cms/pages/viewPage/viewPage.js","lib/instagram-useInstagram/index.js","cms/services/cms-radio-sender.js","cms/services/cms-radio-receiver.js","cms/services/cms-html-editor.js","cms/services/cms-page-controller.js","cms/pages/editPage/editPage.js","layout/bottomDock/bottomDock.js","layout/popup/commonVideoPopup.js","AppRouteChanged.js","site/ecm/product/productViewStyle.js","cms/pages/partials/viewPartial.js","site/ecm/product/addToCart.js","cms/pages/partials/productPagePartial.js","site/ecm/product/productView.js","site/ecm/product/enquiryFormModel.js","site/ecm/orderDetails/orderDetailsStyle.js","site/ecm/orderDetails/orderDetails.js","App.js","serviceWorker.js","index.js","site/tileList/config.js"],"names":["exports","settings","breakpointNames","numOfTilesPerBreakpoints","marginLR","marginTB","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","s","el","this","parentElement","parentNode","nodeType","initialState","page","menu","popup","history","reducer","state","action","type","payload","Error","StoreContext","createContext","StoreProvider","children","useReducer","dispatch","useEffect","Provider","value","useStore","useContext","NavBar","props","open","items","currentLocation","length","path","menuItemElts","map","item","index","MenuItem","key","depth","onCloseMenu","className","id","useState","subMenuOpened","setSubMenuOpened","subItems","subItemsElts","subItem","SubMenuItem","SiteLink","to","url","onClick","title","e","preventDefault","stopPropagation","toggleSubmenu","colors","blueGray","darkGray","red","lightGray","variables","familyBase","familyHeader","primaryColor","fontColor","bgColor","breakpoints","cssEmotion","config","siteConfig","mq","facepaint","bp","mqMin","forEach","mqMax","mediaQuery","window","matchMedia","isMin","isMax","overlay","content","position","top","bottom","left","right","transition","button","css","lineHeight","color","fontSize","BackButton","useHistoryStore","last","style","pop","rs","w","h","barW","barH","space","line","width","height","borderRadius","transitionProperty","backgroundColor","display","transitionDuration","transitionDelay","transitionTimingFunction","cursor","zIndex","alignItems","justifyContent","padding","background","border","outline","font","textTransform","buttonScrolled","button2","transform","buttonScrolled2","hamburger","line1","line2","line3","lineActive1","opacity","lineActive2","lineActive3","Hamburger","opened","toggleMenu","scrolled","aria-label","logo","logoImg","logoScrolled","top2","topScrolled2","logo2","logoImg2","margin","logoScrolled2","container2","TopHeader","menuOpened","setMenuOpened","setScrolled","backTop","scrollTo","behavior","useScrollPosition","prevPos","currPos","y","src","alt","topScrolled","NotFound","debugInfo","href","location","reload","refreshPage","back","goBack","marginTop","pageUrl","loadFrom","isProd","process","locale","REACT_APP_COUNTRY_LOCALE","hostname","toLowerCase","indexOf","search","getCountry","siteName","titleSuffix","siteCode","apiBase","resourceBase","baseOrigin","origin","GATSBY_BASEURL","getBaseUrl","cmsEndpoint","ver","updateDate","stripeKey","console","log","getDevCartId","localStorage","getItem","setDevCartId","cartId","setItem","AppVersion","React","checkStatus","setCheckStatus","env","updateSW","then","timer","setTimeout","clearTimeout","AppVersionPage","Button","status","btnStyle","buttonStyle","disabled","role","aria-hidden","ErrorMessage","errors","summaryMessage","message","Array","isArray","error","ErrorPopup","messages","push","maxWidth","maxHeight","inx","dangerouslySetInnerHTML","__html","SvgNarrowRight","iconColors","primary","secondary","SvgLoading","viewBox","preserveAspectRatio","cx","cy","r","fill","stroke","strokeWidth","attributeName","repeatCount","dur","values","keyTimes","keySplines","calcMode","begin","Loading","loaded","setLoaded","loading","minHeight","isExternalLink","link","getLinkFromElement","linkEl","getAttribute","getLinkInfo","currentPath","pathname","linkFiltered","replace","linkLower","isExternal","isHash","isTel","isMailTo","i","exts","isStaticFile","ext","getExtension","filename","split","getFilename","getFolderPath","parentDepth","slice","join","toQueryString","params","Object","keys","encodeURIComponent","getYoutubeId","undefined","getSlug","text","getWebUrl","schema","getErrors","result","err","errorMessage","getErrorMessage","convertToObject","array","reduce","obj","convertToKeyValues","moveItem","list","fromIndex","toIndex","splice","removed","removeItem","insertItem","find","fn","findIndex","contains","distinct","comparer","filtered","x","sum","total","equal","list1","list2","found","j","caseInsensitiveCompare","a","b","localeCompare","compareIgnoreEmpty","asc","isNaN","addDays","date","days","Date","setDate","getDate","formatDate","dateObj","formatStr","toDate","format","formatYYYYMMDD","dd","mm","getMonth","yyyy","getFullYear","formatDDMMYYYY","parseDate","parseISO","toDateTime","dateStr","parse","isValidDate","d","bgUrl","imageUrl","encodeURI","decodeURI","bgUrlStyle","screenWidth","innerWidth","document","documentElement","clientWidth","body","screenHeight","innerHeight","clientHeight","outerWidth","offsetWidth","outerHeight","offsetHeight","hasClass","classList","match","RegExp","addClass","add","removeClass","remove","reg","toggleClass","selector","duration","delay","findElement","offset","elementOffset","gsap","ease","querySelectorOrNull","querySelector","rect","getBoundingClientRect","scrollLeft","pageXOffset","scrollTop","pageYOffset","isElementInViewport","getCurrentBreakpoint","bpHolder","getComputedStyle","getPropertyValue","formatMoney","number","fraction","formatter","Intl","NumberFormat","currency","minimumFractionDigits","toMonthlyCost","amount","frequency","isBlank","str","test","isEmpty","isNumeric","num","capitalize","expression","charAt","toUpperCase","toFieldName","trim","toHtml","truncateWords","maxLen","separator","ellipsis","pos","lastIndexOf","substr","numberWithCommas","parts","toString","registerPlugin","ScrollToPlugin","formatNumber","Math","round","toTelephoneNumber","like","shortId","shortid","guid","uuid","toCamel","o","newO","origKey","newKey","hasOwnProperty","constructor","getImageSetPath","setId","info","getPathDetails","baseFolder","setIds","lastFolder","classNames","form","ui","money","random","object","media","isMobile","md","resourcePath","utils","fullUrl","isNZ","coreUtils","site","useApi","response","setResponse","setErrors","setStatus","request","setRequest","options","apiNetJwt","fetch","res","ok","json","statusText","JSON","fetchData","hasErrors","containsErrorMessage","msg","finding","some","addErrors","errs","done","send","sendRaw","httpOptionFn","args","setResult","reset","usePost","formDataFn","data","method","post","headers","stringify","sending","sendFormData","useGet","get","MediaQueryStatus","MetaTag","seoData","assign","description","name","keywords","language","country","faceBookDomainVerifi","heroImageUrl","rel","canonical","alternates","hreflang","MAX","MIN","getScrollProgress","scroll","scrollY","progress","boundsTop","viewport","bounds","setClass","pr","range","prVal","min","max","removeTransform","getScreenSize","defaultHolder","storeName","loadJs","promises","scripts","script","loadScript","Promise","all","holder_","forceToReload","holder","resolve","reject","networkLoaded","existing","createElement","onload","onerror","getElementsByTagName","appendChild","defaultSettings","cutoffPadding","speed","ParallaxData","screenSize","panels","imageRatio","panelHeight","elements","timeoutId","useParallax","handleScroll","element","au","calculated","fromTop","toTop","backgroundPositionY","init","useLayoutEffect","addEventListener","removeEventListener","cnt","panel","querySelectorAll","autoPanelHeight","parseFloat","shadowHeight","shadowWidth","baseHeight","backgroundSize","useRouter","useParams","useLocation","useHistory","useRouteMatch","useMemo","navigate","Redirect","hash","query","queryString","loc","setHistory","handleElementLink","externalHandler","linkInfo","handled","target","other","goToLink","tiles","marginLeft","marginRight","flexWrap","tile","flexBasis","tileImage","mixin","tileIcon","InstagramFeed","Feeds","posts","numOfPost","xs","sm","lg","xl","xxl","displayingPosts","Feed","debounce","ms","_","apply","arguments","loadApi","onApiReady","YT","tag","onYouTubeIframeAPIReady","firstScriptTag","insertBefore","thumbnailMax","videoId","getYoutubeCode","YoutubeEmbedPopup","posterUrl","yt","posterImageUrl","popupIndex","setPopupIndex","backgroundImage","sources","defaultVal","payloads","hasItemInPageData","pageData","matchFn","sections","hasItemInItems","getCodeJson","code","hasItemInPageDataByItemTypeCode","itemTypeCode","renderRule","cmsOption","cmsUtils","itemElt","navigator","onLine","findControl","controlNameOrIndex","root","controls","findControlTraverse","controlName","control","getValue","getValueTraverse","helperFns","getFilesTraverse","getKeyValueTraverse","keyValue","controlType","customValueFn","files","findIndexById","abstractControl","controlObject","validators","controlOptions","touched","incomplete","findValidator","controlArray","ctrl","disableValidators","formModelHelper","parent","hasRequiredValidator","getNameForValidator","label","createValidator","opt","validate","defaultOpt","continueToValidate","getValidatorOptions","val","isValidEmail","mail","isDate","isPast","now","getTime","isValidLength","validator","Required","validateOpt","triggeredByChange","Email","PastDate","PastDateNullAllowed","Length","validateControl","getLabel","formOption","requiredMark","getLabelAsString","ValidationAlert","TextInput","handleChange","helpText","attrs","fieldId","usePlaceholder","fieldLabel","placeHolder","valueStr","prependText","htmlFor","onChange","onKeyDown","onBlur","autoComplete","placeholder","checked","optionValue","includes","DateSeparateInput","thisYear","year","setYear","month","setMonth","day","setDay","handleChangeInner","persist","months","selectStyle","fromYear","recentYear","handleChangeDay","handleChangeMonth","m","handleChangeYear","FileInput","Components","RadioListInput","option","inline","TextareaInput","textAreaRef","useRef","textAreaHeight","setTextAreaHeight","parentHeight","setParentHeight","disableAutoHeight","current","scrollHeight","rows","ref","CheckboxInput","linkText","CheckboxListInput","SelectInput","HiddenInput","renderControlDirect","Component","getControl","renderControl","formRoot","nameOrIndex","validateTraverse","errorsFromControl","errorsFromSub","useForm","initialFormModel","formModel","setFormModel","template","onControlChanged","controlFromEvent","getControlValue","onBeforeUpdateValue","validateGroup","successHandler","errorHandler","formValidate","model","controlRenderer","validateForm","getFiles","hasGTM","dataLayer","pageView","pageTitle","pageOpt","event","sendEvent","eventName","sendGAEvent","category","buttonColor","baseStyle","overflow","appearance","darken","textDecoration","buttonBg","buttonTxt","smallStyle","fontWeight","letterSpacing","FormButton","overridingStyle","ss","Subscribe","fb","email","sendingStatus","setSendingStatus","gtm","contactEmail","render","colorBlue","textAlign","node","attribs","attributesToProps","replaceImg","class","domToReact","replaceButton","_embedDataList","codeType","renderHtml","_cmsOption","replaceEmbedCode","html","isCmsEdit","cmsViewMode","embedDataList","Html","cssClass","anchorName","htmlBlock","data-cms-html","data-cms-item-id","itemId","processed","_href","setAttribute","handleClick","container","html__item","backgroundTile","vertical","horizontal","cssClassContainer","mqBanner","bannerThin","bannerStandard","getImageBannerStyle","heightSet","setName","bannerSize","bannerHeight","backgroundPositionX","photoCredit","transformOrigin","panelRef","_settings","paddingHeightRatio","stretchToFit","actionRange","cutTop","cutBottom","getSettings","onScroll","bgHeight","bgWidth","cutTopPx","cutBottomPx","onResize","ImagePanel","photoCreditUrl","hideTop","hideBottom","pageOptions","imagePath","cssClass2","parallaxSetting","paddingRight","paddingLeft","order","html__wrapper","flexDirection","html__container","MultiColumnPanel","bgTheme","leftPanel","leftPanelBanner","leftTextVertical","leftTextHorizontal","leftTextBgColor","leftTextWidth","rightPanel","rightPanelBanner","rightTextVertical","rightTextHorizontal","rightTextBgColor","rightTextWidth","linkUrl","content2","idFirstUse","GetItem","itemName","bannerItems","checkOtherPanel","textVertical","textHorizontal","textBgColor","textWidth","_imgs","data-cms-item-id2","dots","infinite","autoplaySpeed","fade","autoplay","slidesToShow","slidesToScroll","ImgItem","TileList","useSlider","slickSettings","tilesSlider","getTileListStyle","marginBottom","PageTile","tileLink","disableLink","desc","tileDesc","paddingTop","paddingBottom","flexGrow","flexShrink","rgba","tileSlider","tileBg","backgroundPosition","backgroundRepeat","tileContent","WebkitLineClamp","WebkitBoxOrient","getTileStyle","PageTiles","pagesSerialized","getPages","Panel","Item","GalleryTiles","images","openPopupImage","img","ImageTile","image","getImageTileStyle","thumbnailUrl","Portal","mount","getElementById","removeChild","createPortal","set","Gallery","toggler","setToggler","popupImages","galleryImages","caption","Fragment","sourceIndex","PhotoGallery","ShareButtons","shareUrl","topLabel","shareButtons","shareButtonTitle","shareButton","FacebookShareButton","FacebookIcon","size","WhatsappShareButton","WhatsappIcon","EmailShareButton","subject","EmailIcon","SharingIcons","YoutubeBannerMobilePopup","youtubeBannerRef","playerStatus","setPlayerStatus","playerSize","setPlayerSize","ytPlayer","setYtPlayer","muted","setMuted","countPlayedRef","popupOpened","setPopupOpened","video","videoLinkOrId","playerId","mobileImageUrl","canPlayVideo","loadVideo","containerSize","getSize","player","Player","events","PlayerState","ENDED","countPlayed","playVideo","mute","resized","canPlay","allow","frameBorder","pauseVideo","unMute","channel","isOpen","onClose","VideoPanel","videoCode","posterFrameUrl","code_instagram","code_subscribe","htmlV2","imagePanel","multiColumnPanel2","pageTiles","photoGallery","sharingIcons","BannerPanel","slides","BannerItem","captionTitle","captionButton","titlePanel","linkOverlay","block","embed","ReactDOM","replaceEmbedCodes","buttons","restructureButton","span","innerHTML","data-pxh","pageTileElts","Tile","responsive","breakpoint","pageTile__tile","flex","tile__content","tile__flip__wrapper","tile__bg","tile__bg2","tile__details","PageTilesBsyc","idx","colorTheme","data-aos","SingleBanner","alignV","_none__menuHeader","Contact","emailReceiver","fileAttachment","mailchimpApiKey","mailchimpAudienceKey","phone","enquiry","attachments","mailChimpError","setMailChimpError","mailChimpErrorMemo","results","MailChimpError","grecaptcha","ready","execute","token","grecaptchaToken","formData","FormData","append","file","uploadFile","ContactForm","SearchResult","keyword","q","pages","PageList","searchHighlight","TextWithJavScript","javaScriptCode","substring","nonjavaScriptCode","javaScriptTopCode","javaScriptInsideCode","_src","async","defer","_functionName","functionName","Code","codeJson","BlogPosts","numOfTileLines","parseInt","tilesPerLine","step","tilesToShow","setTilesToShow","showMore","BlogPostTitle","postDate","VideoHolder","VideoItem","youtubeCode","captionTitleYoutube","shortDesc","reverse","columnWidths","mobileColumnWidths","countItem","countD","countM","col","ExpandableHtml","setOpen","buttonTitle","icon","iconOpen","iconClosed","panelCollapsed","panelOpen","thumbnails","thumbnail","bg","_images","_thumbImages","_texts","_text","testimonialPanel","testimonialItem","testimonialItem_title","testimonialItem_desc","testimonialItem_bottom","TestimonialItem","startRatingColor","ratingValue","rating","TestimonialPanel","testimonialItems","exTextItem","ExpandablePanel","data-anchor-status","data-cms-item-anchor","numberOfTiles","widthPercent","tileListStyle","categoryList","tileStyle","prdImage","shortDes","fontFamily","price","desContainer","buyNowButton","ProductTile","product","productUrl","productSlug","productName","productStatus","productStatusText","priceTextOveriding","priceIncTax","ProductItems","categories","Items","defaultCategories","defaultCategoriesArray","_allCategory","categoryName","categoryId","unshift","getCategoryListModel","categoryListForm","_items","sortProudcts","filter","favorites","productId","productCategories","seqInCategory","seq","setShowProducts","showProducts","sort","cart","stepsWrapper","steps","stepCurrent","stepPrev","stepNext","stepLast","navs","borderBottom","nav","navArrow","navCurrent","navFilled","navClickable","arrow","arrowPrev","arrowNext","StepNav","stepInfo","currentStep","moveTo","canGo","filled","details","optionName","qty","minWidth","summary","totalHdr","totalAmount","CartSummary","shippingMethod","shippingAmount","borderTop","OrderItems","moveNext","ItemVariantSummary","orderItem","variantOptionsSerialised","Name","Value","acc","orderItems","orderItemType","taxLines","orderItemId","quantity","unitPrice","itemAmount","getOrderItemFormData","itemArray","orderItemData","Shipping","saveShipping","billingInfo","shippingInfo","useSameAddress","Address","addressModel","address","firstName","surname","street1","street2","suburb","postcode","mobile","pay","stripeWrapper","formActions","paymentInfoText","Pay","payStripe","stripe","setStripe","card","setCard","setError","Stripe","create","base","fontSmoothing","invalid","iconColor","initStripe","OrderIdToken","createToken","tokenId","itemTotalAmount","Cart","setCart","cartInfo","totalQuantity","CartView","EmptyCart","goNext","setGoNext","initialSteps","setSteps","setCurrentStep","lastStep","setLastStep","movePrev","markAsFilled","canGoNext","canGoPrev","useStep","orderItemForm","orderItemChanged","shippingForm","billingAddress","shippingAddress","shippingCountry","getShippingFormData","cartModel","stepStyle","next","stepView","EcmItems","ItemBranch","typeCode","_tileType","PageMemo","memo","sectionItems","section","Section","sectionName","getMetaTag","pageTypeCode","prevProps","nextProps","ViewPage","pageLoaded","setPageLoaded","setData","embedStatus","setEmbedStatus","loadEmbedJs","instgrm","Embeds","useInstagram","redirectTo","CmsRadioSender","controller","cloned","postMessage","htmlChanges","sendMessageToParent","returnTo","CmsRadioReceiver","self","selectItem","mediaSelectedCKEditor","getAllDirtyHtml","sender","returnAllDirtyHtml","getHtml","returnHtml","tools","callFunction","funcNum","selectedPath","selectItemFromController","CmsHtmlEditor","ckeditorConfig","startupFocus","filebrowserBrowseUrl","filebrowserImageBrowseUrl","extraPlugins","toolbar","groups","extraAllowedContent","ckeditorStylesSet","attributes","$editor","CKEDITOR","disableAutoInline","editor","stylesSet","on","evt","ed","markDirtyHtml","instances","cmsCurrentEditor","getData","destroy","CmsPageController","viewOnly","receiver","htmlEditor","$","initGlobalVars","prop","off","attr","is","change","_value","ctrlKey","which","saveAllDirtyHtml","$item","fromController","doubleclicked","cke_top","closeEditingItem","findItem","removeAttr","showHtmlEditor","each","selectControllerItem","openEdit","editableParent","parents","first","close","dataCmsItemId2","show","extend","htmleditor","getAnchors","anchors","htmlbody","floor","animate","$section","getCurrentHtml","ItemId","SectionId","Content","SectionId2","Content2","itemid","formvals","cms_replace_item_html","EditPage","publishVer","editVer","pageId","cmsPageController","catch","BottomDock","isCurrent","linkElts","iconHover","CommonVideoPopup","setSources","onOpen","AppRouteChanged","parallax","dataArr","foundIndex","findIndexReverse","getPreviousPostitionInArray","dataStr","getPositionData","getPreviousPostition","anchor","heroImageContainer","heroImage","productPageCol","productFavorite","productBreadCrumbs","listStyle","productViewImageBg","productViewImages","productViewImage","productViewShortDes","productViewTitle","addToCartBtn","priceText","socialMedia","attributesRow","attrContainer","desktopMobile","quoteContainer","enquiryFormContainer","ecm__button__container","ViewPartial","AddToCart","getFormModel","newModel","_array","n","variantAttributes","attributesEx","setAttributesEx","checkGoToCartBtn","setCheckGoToCartBtn","addToCart","formVal","_variantOptions","variantOptions","_item","_cartId","pre","_new","onSubmit","formValues","variantOptionArray","variants","dyName","optionsSelected","currentSelection","availableOptions","from","Set","getAvailableOptionValues","optionsInVariant","currentControlName","optionSelected","optionInVariant","matchVariantOptions","displayName","newVariantAttribute","ProductPagePartial","ProductView","productCode","slug","totalCnt","Product","mainPhoto","productImages","allPhotos","setHeroImage","openPopup","setOpenPopup","enquiryFormModel","enquiryForm","enquiryFormRender","breadCrumbs","photo","itemScope","itemType","itemProp","RelatedProducts","products","relatedProducts","metaDesc","intro","orderDetails","fv","OrderDetails","Details","orderNo","orderDate","itemDescHtml","addedUnitPrice","discountUnitPrice","addr","Billing","billingAddr","AppLayout","storeContext","AOS","App","isLocalhost","Boolean","serviceUpdateCheckerInterval","registerValidSW","swUrl","serviceWorker","register","updateViaCache","registration","scope","waiting","clearInterval","setInterval","update","preventDevToolsReloadLoop","getRegistration","active","oldSw","ev","newSw","onupdatefound","installing","installingWorker","onstatechange","onUpdate","onSuccess","URL","contentType","unregister","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.beaa34e8.chunk.js","sourcesContent":["const settings = {\n  //                         xs,    sm,    md,    lg,    xl,    xxl          <-- only sample, check your breakpoints settings.\n  //                         <      576    768    992    1200   1600\n  breakpointNames:          ['xs', 'sm',  'md',  'lg',  'xl',  'xxl'],\n  numOfTilesPerBreakpoints: [2,     2,     2,     3,     4,     6],\n  marginLR:                 [14,    20,    20,    20,    20,    20],\n  marginTB:                 [14,    20,    20,    20,    20,    20],\n}\n\nexports.settings = settings","// closest\r\n\r\nif (!Element.prototype.matches) {\r\n  Element.prototype.matches = Element.prototype.msMatchesSelector || \r\n                              Element.prototype.webkitMatchesSelector;\r\n}\r\n\r\nif (!Element.prototype.closest) {\r\n  Element.prototype.closest = function(s) {\r\n    var el = this;\r\n\r\n    do {\r\n      if (el.matches(s)) return el;\r\n      el = el.parentElement || el.parentNode;\r\n    } while (el !== null && el.nodeType === 1);\r\n    return null;\r\n  };\r\n}\r\n\r\n\r\n// getBoundingClientRect","const initialState = {\r\n  page: null,\r\n  menu: null,\r\n  popup: null,\r\n  history: null\r\n};\r\n\r\nconst reducer = (state = initialState, action) => {\r\n  //console.log('reducer', action)\r\n  switch (action.type) {\r\n    case 'SET_PAGE':\r\n      return {\r\n        ...state,\r\n        page: action.payload\r\n      };\r\n    case 'SET_MENU':\r\n      return {\r\n        ...state,\r\n        menu: action.payload\r\n      };\r\n    case 'SET_POPUP':\r\n      return {\r\n        ...state,\r\n        popup: action.payload\r\n      };\r\n    case 'SET_HISTORY':\r\n      return {\r\n        ...state,\r\n        history: action.payload\r\n      };\r\n    case 'SET_STATE':\r\n      return {\r\n        ...state,\r\n        ...action.payload\r\n      };\r\n    default:\r\n      throw new Error(\"Unexpected action\");\r\n  }\r\n};\r\n\r\nexport { initialState, reducer };","import React, { createContext, useReducer, useContext, useEffect } from 'react';\r\nimport { initialState, reducer } from '../../store';\r\n\r\nconst StoreContext = createContext(initialState);\r\n\r\nconst StoreProvider = ({ children }) => {\r\n  // Get state and dispatch from Reacts new API useReducer. \r\n  const [state, dispatch] = useReducer(reducer, initialState);\r\n  //console.log('StoreProvider')\r\n  // Log new state\r\n  useEffect(() => {\r\n    //console.log('-- new state', state);\r\n    //console.trace();\r\n  }, [state]);\r\n  // Render state, dispatch and special case actions\r\n  return (\r\n    <StoreContext.Provider value={{ state, dispatch }}>\r\n      {children}\r\n    </StoreContext.Provider>\r\n  );\r\n};\r\nexport { StoreContext, StoreProvider };\r\n\r\nexport const useStore = () => useContext(StoreContext);","import React, {useState, useEffect} from 'react';\nimport { SiteLink } from '../../components';\nimport { useStore } from '../../store';\n\nimport { FaChevronDown } from 'react-icons/fa';\n//import { SearchBar } from './searchBar';\n\nexport function NavBar(props) {\n  const open = props.open;\n  //const currentLocation = props.currentLocation;\n  const { state } = useStore();\n\n  const menu = state.menu || { items: [] };\n  const currentLocation = state.history && state.history.length > 0? state.history[state.history.length - 1].path : '';\n  const depth = 1;\n  const menuItemElts = menu.items.map((item, index) =>\n    <MenuItem item={item} key={index} depth={depth} onCloseMenu={props.onCloseMenu} currentLocation={currentLocation}></MenuItem>\n  );\n  return (\n    <div className={`navBar2 ${open ? 'navBar--on2' : ''}`} id=\"sliding-menu\">\n      {/* <SearchBar onCloseMenu={props.onCloseMenu}/> */}\n      <div className=\"navBar__scrollArea\" id=\"top-menu\">\n        <nav className=\"navBar_nav\">\n          <ul>\n            {menuItemElts}\n          </ul>\n        </nav>\n      </div>\n\n    </div>\n  );\n\n}\n\nfunction MenuItem(props) {\n  const [subMenuOpened, setSubMenuOpened] = useState(false);\n  const item = props.item;\n  const subItems = item.items || [];\n  const currentLocation = props.currentLocation;\n\n  const subItemsElts = subItems.length > 0? subItems.map((subItem, index) =>\n    <SubMenuItem item={subItem} key={index} onCloseMenu={props.onCloseMenu} />\n  ) : null;\n\n\n  useEffect(() => {\n    //console.log('navbar', currentLocation);\n    setSubMenuOpened(false);\n  }, [currentLocation])\n\n  function closeMenu() {\n    props.onCloseMenu();\n  }\n\n  function toggleSubmenu(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    setSubMenuOpened(!subMenuOpened);\n  }\n\n  return (\n    <li className={`navBar__item ${subMenuOpened ? 'navBar__item--open' : ''}`}>\n      <SiteLink className=\"navBar__link\" to={item.url} onClick={() => closeMenu()}>\n        <span>{item.title}</span>\n        {subItemsElts && <span className=\"navBar__icon\" onClick={(e) => toggleSubmenu(e)}><FaChevronDown /></span>}\n      </SiteLink>\n      {subItemsElts &&\n        <ul className={`navBar__subMenu`}>\n          {subItemsElts}\n        </ul>}\n    </li>\n  )\n}\n\nfunction SubMenuItem(props) {\n  const item = props.item;\n  function closeMenu() {\n    props.onCloseMenu();\n  }\n\n  return (\n    <li className=\"navBar__subItem\">\n      <SiteLink className=\"navBar__subLink\" to={item.url} onClick={() => closeMenu()}>\n        <span>{item.title}</span>\n      </SiteLink>\n    </li>\n  )\n}","const overloading = {\n  breakpointNames: ['sm', 'md', 'lg', 'xl', 'xxl'],\n  breakpoints: [576, 768, 992, 1200, 1600]\n}\n\nconst colors = {\n  blueGray : '#4f6283',\n  darkGray : '#3b3b3b',\n  red : '#a22932',\n  lightGray : '#ebebeb'\n}\n\nconst variables = {\n  familyBase: '\"proxima-nova\",sans-serif',\n  familyHeader: '\"proxima-nova\",serif',\n\n  primaryColor: colors.blueGray,\n  fontColor: colors.darkGray,\n  bgColor: '#ebebeb',\n\n  ...colors,\n  ...overloading\n}\n\nexport default variables;","import variables from './cssInJs/variables';\n\nconst cssEmotion = {\n  breakpointNames: variables.breakpointNames,\n  breakpoints: variables.breakpoints\n}\n\nexport default {\n  cssEmotion\n}","import facepaint from 'facepaint'\r\nimport siteConfig from '../../config';\r\n\r\nconst config = siteConfig.cssEmotion\r\nconst breakpointNames = (config && config.breakpointNames) || ['sm', 'md', 'lg', 'xl', 'xxl']\r\nconst breakpoints = (config && config.breakpoints) || [576, 768, 992, 1200, 1600]\r\n\r\nconst mq = facepaint(\r\n  breakpoints.map(bp => `@media (min-width: ${bp}px)`)\r\n)\r\n\r\nconst mqMin = {};\r\nbreakpointNames.forEach((bp, index) => mqMin[bp] = `@media (min-width: ${breakpoints[index]}px)`)\r\n\r\nconst mqMax = {};\r\nbreakpointNames.forEach((bp, index) => mqMax[bp] = `@media (max-width: ${breakpoints[index] - 1}px)`)\r\n//console.log(mqMin, mqMax)\r\n\r\nconst matches = (mediaQuery) => !!window.matchMedia(mediaQuery).matches\r\nconst isMin = {};\r\nbreakpointNames.forEach((bp, index) => isMin[bp] = () => matches(`(min-width: ${breakpoints[index]}px)`))\r\n\r\nconst isMax = {};\r\nbreakpointNames.forEach((bp, index) => isMax[bp] = () => matches(`(max-width: ${breakpoints[index] - 1}px)`))\r\n\r\nexport { mq, mqMin, mqMax, isMin, isMax }","export function overlay() {\r\n  return {\r\n    content: `''`,\r\n    position: 'absolute',\r\n    top:0,\r\n    bottom:0,\r\n    left: 0,\r\n    right: 0,\r\n    transition: 'all 0.5s'\r\n  }\r\n}","import { css } from '@emotion/core';\nimport { mq } from '../../cssInJs';\nexport default {\n  button: css(mq({\n    position: 'absolute',\n    left: '1rem',\n    lineHeight: '1.6rem',\n    color: '#ddd',\n    fontSize: ['12px', null, '15px']\n  })),\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport { SiteLink } from '../../components';\nimport { FaAngleLeft } from 'react-icons/fa';\nimport { useHistoryStore } from '../../components';\nimport style from './backButtonStyle';\n\nexport function BackButton(props) {\n\n  const history = useHistoryStore();\n\n  function goBack(e) {\n    history.pop();\n  }\n\n  if (history.last()) {\n    return (<SiteLink css={style.button} title=\"Go Back\" to={history.last()} onClick={goBack} >\n      <FaAngleLeft />\n    </SiteLink>)\n  } else {\n    return null;\n  }\n}","import { css } from '@emotion/core';\nimport { mq } from '../../cssInJs';\n\nconst rs = [\n  { w: 44, h: 44, barW: 28, barH: 3, space: 8 },\n  { w: 56, h: 56, barW: 44, barH: 3, space: 10 }\n]\n\nconst line = css(mq({\n  width: [rs[0].barW, null, rs[1].barW],\n  height: [rs[0].barH, null, rs[1].barH],\n  borderRadius: '4px',\n  position: 'absolute',\n  transitionProperty: 'transform',\n  backgroundColor: 'white',\n  display: 'block',\n  transitionDuration: '0.15s',\n  transitionDelay: '0.15s',\n  transitionTimingFunction: 'cubic-bezier(0.55, 0.055, 0.675, 0.19)',\n}))\n\nexport default {\n  button: css(mq({\n    cursor: 'pointer',\n    zIndex: '1000',\n    position: 'fixed',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    transition: 'all 0.3s ease-in-out',\n    padding: '0',\n    //top: [0, null, 12],\n    top: 0,\n    width: [rs[0].w, null, rs[1].w],\n    height: [rs[0].h, null, rs[1].h],\n    right: [0, null, 20],\n    background: 'transparent', //variables.primaryColor,\n    border: 'none',\n    outline: 'none',\n    font: 'inherit',\n    color: 'inherit',\n    textTransform: 'none',\n    '&:focus': {\n      outline: 'none',\n    }\n  })),\n\n  buttonScrolled: css(mq({\n    top: [0, null, 0]\n  })),\n\n  button2: css(mq({\n    cursor: 'pointer',\n    zIndex: '1000',\n    position: 'absolute',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    transition: 'all 0.3s ease-in-out',\n    padding: '0',\n    //top: [0, null, 12],\n    top: '50%',\n    width: [rs[0].w, null, rs[1].w],\n    height: [rs[0].h, null, rs[1].h],\n    right: [0, null, 20],\n    background: 'transparent', //variables.primaryColor,\n    border: 'none',\n    outline: 'none',\n    font: 'inherit',\n    color: 'inherit',\n    transform:'translateY(-50%)',\n    textTransform: 'none',\n    '&:focus': {\n      outline: 'none',\n    }\n  })),\n\n  buttonScrolled2: css(mq({\n    top: '50%'\n  })),\n\n  hamburger: css(mq({\n    width: [rs[0].barW, null, rs[1].barW],\n    height: [rs[0].barH + rs[0].space * 2, null, rs[1].barH + rs[1].space * 2],\n    position: 'relative',\n    display: 'block',\n  })),\n\n  line1: css(mq(line, {\n    top: 0,\n    transition: 'top 0.3s 0.1s cubic-bezier(0.33333, 0.66667, 0.66667, 1), opacity 0.1s 0.1s linear',\n  })),\n  line2: css(mq(line, {\n    transition: 'top 0.12s 0.3s cubic-bezier(0.33333, 0.66667, 0.66667, 1), transform 0.15s cubic-bezier(0.55, 0.055, 0.675, 0.19)',\n    top: [rs[0].space, null, rs[1].space],\n  })),\n  line3: css(mq(line, {\n    top: [rs[0].space * 2, null, rs[1].space * 2],\n  })),\n\n  lineActive1: css({\n    opacity: '0',\n    top: 18,\n    transition: 'top 0.3s cubic-bezier(0.33333, 0, 0.66667, 0.33333), opacity 0.2s linear',\n  }),\n  lineActive2: css({\n    transform: 'rotate(-135deg)',\n    transition: 'top 0.12s 0.18s cubic-bezier(0.33333, 0, 0.66667, 0.33333), transform 0.15s 0.42s cubic-bezier(0.215, 0.61, 0.355, 1)',\n  }),\n  lineActive3: css(mq({\n    transform: [`translate3d(0, -${rs[0].space}px, 0) rotate(-45deg)`, null, `translate3d(0, -${rs[1].space}px, 0) rotate(-45deg)`],\n    transitionDelay: '0.32s',\n    transitionTimingFunction: 'cubic-bezier(0.215, 0.61, 0.355, 1)',\n  }))\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './hamburgerStyle';\n\nexport function Hamburger({ opened, toggleMenu, scrolled }) {\n\n  // return <button css={[style.button, scrolled && style.buttonScrolled]} type=\"button\" aria-label=\"Menu\" onClick={toggleMenu}>\n  //   <span css={style.hamburger}>\n  //     <span css={[style.line1, opened && style.lineActive1]}></span>\n  //     <span css={[style.line2, opened && style.lineActive2]}></span>\n  //     <span css={[style.line3, opened && style.lineActive3]}></span>\n  //   </span>\n  // </button>\n\n  return <button css={[style.button2, scrolled && style.buttonScrolled2]} type=\"button\" aria-label=\"Menu\" onClick={toggleMenu}>\n    <span css={style.hamburger}>\n      <span css={[style.line1, opened && style.lineActive1]}></span>\n      <span css={[style.line2, opened && style.lineActive2]}></span>\n      <span css={[style.line3, opened && style.lineActive3]}></span>\n    </span>\n  </button>\n}","import { css  } from '@emotion/core'\nimport { mq } from '../../cssInJs'\n\nexport default {\n  top: css(mq({\n    //height: [44, null, 80],\n    height: [44, null, 56],\n    background: 'white',\n    position: 'fixed',\n    width: '100%',\n    zIndex: '999',\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    transition: 'all 0.3s',\n    top:0\n  })),\n  // topScrolled: css(mq({\n  //   height: [44, null, 56],\n  // })),\n  logo: css(mq({\n  })),\n  logoImg: css(mq({\n    display: 'block',\n    height: [22, null, 36],\n  })),\n  logoScrolled: css(mq({\n\n  })),\n\n  top2: css(mq({\n    height: [60, null, 90],\n    background: 'black',\n    position: 'sticky',\n    top:'0px',\n    width: '100%',\n    zIndex: '999',\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    transition: 'all 0.3s'\n  })),\n  topScrolled2: css(mq({\n    //height: [44, null, 56],\n  })),\n  logo2: css(mq({\n  })),\n  logoImg2: css(mq({\n    display: 'block',\n    margin: 'auto',\n    height: [22, null, 30],\n  })),\n  logoScrolled2: css(mq({\n\n  })),\n  container2 :{\n    position:'relative',\n    width:'100%',\n  }\n}","/** @jsx jsx */\nimport { jsx } from \"@emotion/core\";\n\nimport { useState, Fragment } from \"react\";\nimport { SiteLink } from \"../../components\";\nimport { useScrollPosition } from \"@n8tb1t/use-scroll-position\";\nimport { NavBar } from \"./navBar\";\nimport { BackButton } from \"../backButton/backButton\";\nimport { Hamburger } from \"../hamburger/hamburger\";\nimport style from \"./topHeaderStyle\";\n\nexport function TopHeader(props) {\n  const [menuOpened, setMenuOpened] = useState(false);\n  const [scrolled, setScrolled] = useState(false);\n  const type = props.type || \"none__menu\";\n\n  useScrollPosition(\n    ({ prevPos, currPos }) => {\n      //console.log(currPos.x)\n      //console.log(currPos.y);\n      if (currPos.y > 90) {\n        setScrolled(true);\n      } else {\n        setScrolled(false);\n      }\n      //setScrolled(currPos.y > 90)\n    },\n    [],\n    null,\n    true\n  );\n\n  function toggleMenu(e) {\n    setMenuOpened(!menuOpened);\n  }\n\n  function onCloseMenu() {\n    setMenuOpened(false);\n  }\n  function backTop() {\n    window.scrollTo({ top: 0, behavior: \"smooth\" });\n  }\n  if (type === \"menu\") {\n    return (\n      <Fragment>\n        <header\n          css={[style.top2, scrolled && style.topScrolled2]}\n          id='top'\n          className={type}\n        >\n          <div css={[style.container2]}>\n            <BackButton />\n            <SiteLink\n              to='/'\n              css={[style.logo2, scrolled && style.logoScrolled2]}\n              onClick={backTop}\n            >\n              <img\n                css={style.logoImg2}\n                src='/assets/logos/logo.png?v=2'\n                alt='logo'\n              />\n            </SiteLink>\n            <Hamburger\n              opened={menuOpened}\n              toggleMenu={toggleMenu}\n              scrolled={scrolled}\n            />\n            <NavBar open={menuOpened} onCloseMenu={onCloseMenu}></NavBar>\n          </div>\n        </header>\n      </Fragment>\n    );\n  }\n\n  return (\n    <Fragment>\n      <header\n        css={[style.top, scrolled && style.topScrolled]}\n        id='top'\n        className={type}\n      >\n        <BackButton />\n        <SiteLink\n          to='/'\n          css={[style.logo, scrolled && style.logoScrolled]}\n          onClick={backTop}\n        >\n          <img\n            css={style.logoImg}\n            src='/assets/logos/logo.png?v=1'\n            alt='logo'\n          />\n        </SiteLink>\n        <Hamburger\n          opened={menuOpened}\n          toggleMenu={toggleMenu}\n          scrolled={scrolled}\n        />\n        <NavBar open={menuOpened} onCloseMenu={onCloseMenu}></NavBar>\n      </header>\n    </Fragment>\n  );\n}\n","import React, { Fragment } from 'react';\nimport { TopHeader } from '../../layout/topHeader/topHeader';\n\nexport function NotFound(props) {\n  const debugInfo = props.debugInfo;\n\n  function refreshPage(e) {\n    e.preventDefault();\n    if (typeof window !== `undefined`) {\n      window.location.reload();\n    }\n  }\n\n  function goBack(e) {\n    e.preventDefault();\n    if (typeof window !== `undefined`) {\n      window.history.back();\n    }\n  }\n\n  return (\n    <Fragment>\n      <TopHeader></TopHeader>\n    <div className=\"error-panel\">\n      <div className=\"container\">\n        <h1>404 Error</h1>\n\n        <p>Please <a href=\"/\" onClick={(e) => refreshPage(e)}>refresh</a> your browser.</p>\n        <div>\n          <button onClick={(e) => goBack(e)}>or Go Back</button>\n        </div>\n\n        {\n          debugInfo &&\n          <pre style={{ marginTop: '3rem', color: 'chocolate', fontSize: '0.7rem' }}\n          >Error message: {debugInfo.pageUrl} - {debugInfo.loadFrom} </pre>\n        }\n      </div>\n    </div>\n    </Fragment>\n\n  )\n}","const config = {\n  isProd: process.env.NODE_ENV === \"production\",\n  locale: getLocale(),\n  siteName: process.env.REACT_APP_SITENAME,\n  titleSuffix: process.env.REACT_APP_TITLESUFFIX,\n  siteCode: process.env.REACT_APP_SITECODE,\n  apiBase: process.env.REACT_APP_API_ENDPOINT,\n  resourceBase: process.env.REACT_APP_RESOURCE_BASEURL,\n  baseOrigin: getBaseUrl(),\n  cmsEndpoint: process.env.REACT_APP_CMS_ENDPOINT,\n  ver: process.env.REACT_APP_VERSION,\n  updateDate: process.env.REACT_APP_UPDATED_AT,\n  stripeKey: process.env.REACT_APP_STRIPE_KEY\n  \n  //bvClientId: process.env.REACT_APP_BAZZAR_CLIENT_ID,\n  //bvSiteId: process.env.REACT_APP_BAZZAR_SITE_ID,\n  //bvEnv: process.env.REACT_APP_BAZZAR_ENV,\n  //bvLocale: getLocale() === 'nz' ? 'en_NZ' : 'en_AU',\n}\n\nfunction getLocale() {\n  return process.env.REACT_APP_COUNTRY_LOCALE || getCountry()\n}\n\nfunction getCountry() {\n  if (typeof window !== `undefined`) {\n    if (window.location.hostname.toLowerCase().indexOf(\".nz\") >= 0) return 'nz';\n    if (window.location.hostname.toLowerCase().indexOf(\"-nz\") >= 0) return 'nz';\n    if (window.location.search === '?nz=true') return 'nz';\n  }\n  return 'au';\n}\n\nfunction getBaseUrl() {\n  if (typeof window !== `undefined`) {\n  return window.location.origin;\n  }\n  return process.env.GATSBY_BASEURL;\n}\n\nconsole.log(process.env, config)\nexport default {\n  ...config,\n  getDevCartId: function() {\n    return !config.isProd && typeof window !== `undefined` ? window.localStorage.getItem('cart') : null\n  },\n  setDevCartId: function(cartId) {\n    if(!config.isProd && typeof window !== `undefined`) window.localStorage.setItem('cart', cartId)\n  }\n}","import React from 'react';\r\nimport env from '../../env';\r\n\r\nexport function AppVersion(props) {\r\n\r\n  const [checkStatus, setCheckStatus] = React.useState('idle')\r\n  //const [secs, setSecs] = React.useState(10)\r\n  const ver = env.ver;\r\n  const updateDate = env.updateDate;\r\n\r\n  React.useEffect(() => {\r\n    console.log(checkStatus);\r\n    if (checkStatus === 'checking') {\r\n      if (typeof window !== `undefined`) {\r\n        window.updateSW().then(function () {\r\n          console.log('sw update called');\r\n          setCheckStatus('checked')\r\n        })\r\n      }\r\n\r\n      let timer = setTimeout(() => {\r\n        if (typeof window !== `undefined`) {\r\n          window.location.reload()\r\n        }\r\n      }, 5000)\r\n      return () => { clearTimeout(timer) }\r\n    }\r\n  }, [checkStatus])\r\n\r\n  function checkUpdates(e) {\r\n    if (typeof window !== `undefined`) {\r\n      if (window.updateSW) {\r\n        setCheckStatus('checking')\r\n      } else {\r\n        window.location.reload();\r\n      }\r\n    }\r\n  }\r\n\r\n  function refreshApp(e) {\r\n    if (typeof window !== `undefined`) {\r\n      window.location.reload();\r\n    }\r\n  }\r\n\r\n  let button = null\r\n  if (checkStatus === 'checking') {\r\n    button = <button className=\"btn btn-primary\" type=\"button\">Checking App Version...</button>;\r\n  } else if (checkStatus === 'checked') {\r\n    button = <><button className=\"btn btn-primary\" type=\"button\" onClick={refreshApp}>Reloading App...</button> <div>(If this does't reload automatically, please click the above button)</div></>;\r\n  } else {\r\n    button = <button className=\"btn btn-primary\" type=\"button\" onClick={checkUpdates}>Update App (Refresh)</button>;\r\n  }\r\n\r\n  return (\r\n    <div className=\"appInfo htmlPanel\">\r\n      <div className=\"appInfo__ver\">\r\n        <b>Version</b>: {ver} ({updateDate})\r\n      </div>\r\n      <div style={{ marginTop: '1rem' }}>\r\n        {button}\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n\r\nexport function AppVersionPage(props) {\r\n  return (\r\n    <div style={{ margin: '5rem auto', width: '900px' }}>\r\n      <AppVersion />\r\n    </div>);\r\n}","import React from 'react';\n\nexport function Button({onClick, status, children, btnStyle='primary', className}) {\n  let buttonStyle = 'btn-' + btnStyle;\n  return (\n    <button className={`btn ${buttonStyle} ${className}`} onClick={onClick} type=\"button\" disabled={status === 'pending'}>\n      {status === 'pending' && <span className=\"spinner-grow spinner-grow-sm\" role=\"status\" aria-hidden=\"true\"></span>}\n      {children}\n    </button>\n  );\n}","import React from 'react';\r\n\r\nexport const ErrorMessage = ({ errors, summaryMessage }) => {\r\n    if (!errors) return null;\r\n    if (typeof errors.length !== 'undefined' && errors.length === 0) return null;\r\n    \r\n    if (summaryMessage) return <div className=\"error\" role=\"alert\">{summaryMessage}</div>\r\n    let message = errors;\r\n    if (Array.isArray(errors)) {\r\n        if (errors.length === 0) return null;\r\n        message = errors.map((error, index) => <div key={index}>{error}</div>);\r\n    }\r\n    \r\n    return <div className=\"error\" role=\"alert\">{message}</div>\r\n}\r\n","//import React from 'react';\r\n/** @jsx jsx */\r\nimport { css, jsx } from '@emotion/core'\r\n\r\nexport const ErrorPopup = (props) => {\r\n  const title = props.title || 'Errors';\r\n  const errors = props.errors;\r\n  let messages = [];\r\n  if (errors) {\r\n    if (Array.isArray(errors)) {\r\n      messages = errors;\r\n    } else {\r\n      messages.push(errors);\r\n    }\r\n  }\r\n\r\n  const style = css({\r\n    position: 'fixed',\r\n    padding: '3rem',\r\n    width: '800px',\r\n    maxWidth: '90vw',\r\n    maxHeight: '90vw',\r\n    background: 'white',\r\n    color: 'red',\r\n    top: '50%',\r\n    left: '50%',\r\n    transform: 'translate(-50%, -50%)',\r\n    zIndex: '1000'\r\n  })\r\n\r\n  return <div css={style}>\r\n    <h3>{title}</h3>\r\n    {props.children}\r\n    {messages.map((error, inx) => (\r\n      <div key={inx} dangerouslySetInnerHTML={{ __html: error }}></div>\r\n    ))}\r\n    \r\n  </div>\r\n}\r\n","import React from \"react\";\r\n\r\nfunction SvgNarrowRight(props) {\r\n  return (\r\n    <svg viewBox=\"0 0 100 240\" {...props}>\r\n      <path\r\n        fill=\"currentColor\"\r\n        d=\"M26 20l50 100-50 100v-10l44-90-44-90z\"\r\n      />\r\n    </svg>\r\n  );\r\n}\r\n\r\nexport default SvgNarrowRight;\r\n","import * as React from \"react\";\r\nimport siteConfig from '../../../config';\r\n\r\nconst iconColors = (siteConfig && siteConfig.iconColors) || { primary: \"#eee\", secondary: \"#000\" }\r\n\r\nfunction SvgLoading(props) {\r\n  return (\r\n    <svg\r\n      width={200}\r\n      height={200}\r\n      viewBox=\"0 0 100 100\"\r\n      preserveAspectRatio=\"xMidYMid\"\r\n      {...props}\r\n    >\r\n      <circle\r\n        cx={50}\r\n        cy={50}\r\n        r={29.973}\r\n        fill=\"none\"\r\n        stroke={iconColors.primary}\r\n        strokeWidth={8}\r\n      >\r\n        <animate\r\n          attributeName=\"r\"\r\n          repeatCount=\"indefinite\"\r\n          dur=\"1.8518518518518516s\"\r\n          values=\"0;40\"\r\n          keyTimes=\"0;1\"\r\n          keySplines=\"0 0.2 0.8 1\"\r\n          calcMode=\"spline\"\r\n          begin=\"-0.9259259259259258s\"\r\n        />\r\n        <animate\r\n          attributeName=\"opacity\"\r\n          repeatCount=\"indefinite\"\r\n          dur=\"1.8518518518518516s\"\r\n          values=\"1;0\"\r\n          keyTimes=\"0;1\"\r\n          keySplines=\"0.2 0 0.8 1\"\r\n          calcMode=\"spline\"\r\n          begin=\"-0.9259259259259258s\"\r\n        />\r\n      </circle>\r\n      <circle\r\n        cx={50}\r\n        cy={50}\r\n        r={8.673}\r\n        fill=\"none\"\r\n        stroke={iconColors.secondary}\r\n        strokeWidth={8}\r\n      >\r\n        <animate\r\n          attributeName=\"r\"\r\n          repeatCount=\"indefinite\"\r\n          dur=\"1.8518518518518516s\"\r\n          values=\"0;40\"\r\n          keyTimes=\"0;1\"\r\n          keySplines=\"0 0.2 0.8 1\"\r\n          calcMode=\"spline\"\r\n        />\r\n        <animate\r\n          attributeName=\"opacity\"\r\n          repeatCount=\"indefinite\"\r\n          dur=\"1.8518518518518516s\"\r\n          values=\"1;0\"\r\n          keyTimes=\"0;1\"\r\n          keySplines=\"0.2 0 0.8 1\"\r\n          calcMode=\"spline\"\r\n        />\r\n      </circle>\r\n    </svg>\r\n  );\r\n}\r\n\r\nexport default SvgLoading;","import React from 'react';\r\nimport { LoadingCircle } from '../../icons';\r\n/** @jsx jsx */\r\nimport { css, jsx } from '@emotion/core'\r\n\r\nexport function Loading({ children }) {\r\n  const [loaded, setLoaded] = React.useState(false);\r\n\r\n  const style = {\r\n    loading: css({\r\n      minHeight: '300px',\r\n      display: 'flex',\r\n      justifyContent: 'center',\r\n      alignItems: 'center',\r\n      opacity: '0',\r\n      transition: 'all 1s',\r\n    }),\r\n    loaded: css({\r\n      opacity: '1'\r\n    })\r\n  }\r\n\r\n  React.useEffect(() => {\r\n    let timer = setTimeout(() => setLoaded(true), 500)\r\n    return () => { clearTimeout(timer) }\r\n  }, [])\r\n\r\n  return <div css={[style.loading, loaded ? style.loaded : {}]}>\r\n    <div>\r\n      <LoadingCircle />\r\n      {children}\r\n    </div>\r\n  </div>\r\n}","export function isExternalLink(link){\r\n  return link && (link.indexOf('https://') === 0 || link.indexOf('http://') === 0 || link.indexOf('://') === 0);\r\n}\r\n\r\nexport function getLinkFromElement(el){\r\n  if (!el) return null;\r\n  const linkEl = el.closest('a');\r\n  //console.log(el, linkEl);\r\n  if (linkEl){\r\n    return linkEl.getAttribute('href');\r\n  }\r\n  return null;\r\n}\r\n\r\n\r\n// router utils\r\nexport function getLinkInfo(link) {\r\n  if (!link) return null;\r\n\r\n  const origin = typeof window !== `undefined` && window.location && window.location.origin;\r\n  const currentPath = typeof window !== `undefined` && window.location && window.location.pathname;\r\n  let linkFiltered = link.replace(origin, '').replace(currentPath + '#', '#');\r\n  let linkLower = link.toLowerCase();\r\n\r\n  //if (isStaticFile(linkLower)) return null;\r\n  const isExternal = isExternalLink(linkFiltered);\r\n  const isHash = linkFiltered.indexOf('#') === 0;\r\n  const isTel = linkFiltered.indexOf('tel:') === 0;\r\n  const isMailTo = linkFiltered.indexOf('mailto:') === 0;\r\n  const type = (isHash && 'hash') || (isTel && 'tel') || (isMailTo && 'mailto') || \r\n    (isStaticFile(linkLower) && 'static') || (isExternal && 'external') || 'internal';\r\n\r\n  return { url: linkFiltered, type: type, ext: getExtension(link) };\r\n}\r\n\r\nvar exts = ['.pdf', '.jpg', '.png', '.gif', '.docx', '.doc']\r\nfunction isStaticFile(path) {\r\n  for(let i = 0; i < exts.length; i++) {\r\n    if (path.indexOf(exts[i]) >= 0) return true;\r\n  }\r\n  return false;\r\n}\r\n\r\nexport function getExtension(filename) {\r\n  if (!filename || filename.indexOf('.') < 0) return null;\r\n  return filename.split('.').pop().toLowerCase();\r\n}\r\n\r\nexport function getFilename(url) {\r\n  return url.split('/').pop().split('?')[0];\r\n}\r\n\r\nexport function getFolderPath(url, parentDepth = -1) {\r\n  return url.split('/').slice(0, parentDepth).join('/');\r\n}\r\n\r\n//\r\nexport function toQueryString(params) {\r\n  var queryString = Object.keys(params).map((key) => {\r\n      return encodeURIComponent(key) + '=' + encodeURIComponent(params[key])\r\n  }).join('&');\r\n  return queryString;\r\n}\r\n\r\nexport function getYoutubeId(url){\r\n  url = url.split(/(vi\\/|v=|\\/v\\/|youtu\\.be\\/|\\/embed\\/)/);\r\n  return (url[2] !== undefined) ? url[2].split(/[^0-9a-z_-]/i)[0] : url[0];\r\n}\r\n\r\nexport function getSlug(text){\r\n  return text.toLowerCase().replace(/ /g,'-').replace(/[-]+/g, '-').replace(/[^\\w-]+/g,'');\r\n}\r\n\r\nexport function getWebUrl(url, schema = 'https://'){\r\n  if (!url) return null;\r\n  if (url.indexOf('https:') >= 0 || url.indexOf('http:') >= 0 || url.indexOf(':') >= 0) {\r\n    return url;\r\n  }\r\n  return schema + url;\r\n}","//#region error json parsing\r\nexport const getErrors = (result) => {\r\n  let errors = [];\r\n  if (result && result.errors && result.errors.length > 0) {\r\n    result.errors.forEach(err => {\r\n      errors.push(err.errorMessage);\r\n    });\r\n  }\r\n  return errors;\r\n}\r\n\r\nexport const getErrorMessage = (result) => {\r\n  let errors = getErrors(result);\r\n  return errors.join(\" \");\r\n}\r\n//#endregion","//#region conversion between array and object\r\nexport const convertToObject = (array, key) => {\r\n  const initialValue = {};\r\n  return array.reduce((obj, item) => {\r\n    return {\r\n      ...obj,\r\n      [item[key]]: item,\r\n    };\r\n  }, initialValue);\r\n};\r\n\r\nexport const convertToKeyValues = (array, key, value) => {\r\n  const initialValue = {};\r\n  return array.reduce((obj, item) => {\r\n    return {\r\n      ...obj,\r\n      [item[key]]: item[value],\r\n    };\r\n  }, initialValue);\r\n};\r\n//#endregion\r\n\r\n//#region array helper functions\r\nexport const moveItem = (list, fromIndex, toIndex) => {\r\n  //const list = Array.from(array);\r\n  const [removed] = list.splice(fromIndex, 1);\r\n  list.splice(toIndex, 0, removed);\r\n\r\n  return list;\r\n};\r\n\r\nexport const removeItem = (list, index) => {\r\n  //const list = Array.from(array);\r\n  list.splice(index, 1);\r\n\r\n  return list;\r\n};\r\n\r\nexport const insertItem = (list, index, item) => {\r\n  //const list = Array.from(array);\r\n  list.splice(index, 0, item);\r\n\r\n  return list;\r\n};\r\n\r\n\r\nexport const find = (list, fn) => {\r\n  if (!list) return null;\r\n  for (let i = 0; i < list.length; i++) {\r\n    if (fn(list[i])) {\r\n      return list[i];\r\n    }\r\n  }\r\n  return null;\r\n};\r\n\r\nexport const findIndex = (list, fn) => {\r\n  if (!list) return -1;\r\n  for (let i = 0; i < list.length; i++) {\r\n    if (fn(list[i])) {\r\n      return i;\r\n    }\r\n  }\r\n  return -1;\r\n};\r\n\r\nexport const contains = (list, fn) => {\r\n  return findIndex(list, fn) >= 0;\r\n}\r\n\r\n// utils.array.distinct(images, (x, y) => x.imageUrl === y.imageUrl)\r\nexport const distinct = (list, comparer) => {\r\n  const filtered = []\r\n  for (let i = 0; i < list.length; i++) {\r\n    if (!contains(filtered, (x) => comparer(x, list[i]))) {\r\n      filtered.push(list[i])\r\n    }\r\n  }\r\n  return filtered;\r\n}\r\n\r\nexport const sum = (list, fn) => {\r\n  if (!list) return 0;\r\n  let total = 0;\r\n  for (let i = 0; i < list.length; i++) {\r\n    total += fn(list[i]) || 0\r\n  }\r\n  return total\r\n}\r\n\r\nexport const equal = (list1, list2, fn) => {\r\n  if (!list1 && !list2) return true;\r\n  if (!list1 || !list2) return false;\r\n  if (list1.length !== list2.length) return false;\r\n  for (let i = 0; i < list1.length; i++) {\r\n    let found = false;\r\n    for (let j = 0; j < list2.length; j++) {\r\n      if(fn(list1[i], list2[i])) {\r\n        found = true;\r\n        break;\r\n      }\r\n    }\r\n    if (!found) return false;\r\n  }\r\n  return true;\r\n}\r\n//#endregion\r\n\r\n//#region sorting helpers\r\nexport const caseInsensitiveCompare = function (a, b) {\r\n  return a.toLowerCase().localeCompare(b.toLowerCase());\r\n}\r\n\r\n// put the null items at the end.\r\nexport const compareIgnoreEmpty = function (asc) {\r\n  return asc ?\r\n    function (a, b) {\r\n      return (a === null || isNaN(a)) - (b === null || isNaN(b)) || +(a > b) || -(a < b);\r\n    }\r\n    :\r\n    function (a, b) {\r\n      return (a === null || isNaN(a)) - (b === null || isNaN(b)) || -(a > b) || +(a < b);\r\n    }\r\n}\r\n//#endregion","import parse from \"date-fns/parse\";\r\nimport parseISO from \"date-fns/parseISO\";\r\nimport format from \"date-fns/format\";\r\n\r\n//#region manipulation\r\nexport const addDays = (date, days) => {\r\n  var result = new Date(date);\r\n  result.setDate(result.getDate() + days);\r\n  return result;\r\n};\r\n//#endregion\r\n\r\n//#region format\r\nexport function formatDate(dateObj, formatStr) {\r\n  const date = toDate(dateObj);\r\n  if (!date) return \"\";\r\n  return format(date, formatStr);\r\n}\r\n\r\nexport function formatYYYYMMDD(dateObj) {\r\n  const date = toDate(dateObj);\r\n  //console.log(dateObj, date)\r\n  if (!date) return \"\";\r\n  var dd = date.getDate();\r\n  var mm = date.getMonth() + 1; //January is 0!\r\n\r\n  var yyyy = date.getFullYear();\r\n  if (dd < 10) {\r\n    dd = \"0\" + dd;\r\n  }\r\n  if (mm < 10) {\r\n    mm = \"0\" + mm;\r\n  }\r\n  return `${yyyy}-${mm}-${dd}`;\r\n}\r\n\r\nexport function formatDDMMYYYY(dateObj) {\r\n  const date = toDate(dateObj);\r\n  //console.log(dateObj, date)\r\n  if (!date) return \"\";\r\n  var dd = date.getDate();\r\n  var mm = date.getMonth() + 1; //January is 0!\r\n\r\n  var yyyy = date.getFullYear();\r\n  if (dd < 10) {\r\n    dd = \"0\" + dd;\r\n  }\r\n  if (mm < 10) {\r\n    mm = \"0\" + mm;\r\n  }\r\n  return `${dd}-${mm}-${yyyy}`;\r\n}\r\n//#endregion\r\n\r\n//#region parse\r\nexport function toDate(dateObj) {\r\n  if (!dateObj) return null;\r\n  if (typeof dateObj === \"string\") {\r\n    return (\r\n      parseDate(dateObj, \"yyyy-MM-dd\") ||\r\n      parseDate(dateObj, \"yyyy-M-d\") ||\r\n      parseDate(dateObj, \"dd/MM/yyyy\") ||\r\n      parseDate(dateObj, \"d/M/yyyy\") ||\r\n      parseISO(dateObj)\r\n    );\r\n  } else {\r\n    return dateObj;\r\n  }\r\n}\r\n\r\nexport function toDateTime(dateObj) {\r\n  if (!dateObj) return null;\r\n  if (typeof dateObj === \"string\") {\r\n    return (\r\n      parseDate(dateObj, \"yyyy-MM-dd'T'HH:mm:ss.SSSxxx\") ||\r\n      parseDate(dateObj, \"yyyy-MM-dd HH:mm:ss.SSSxxx\") ||\r\n      parseDate(dateObj, \"yyyy-M-d HH:mm:ss.SSSxxx\") ||\r\n      parseDate(dateObj, \"dd/MM/yyyy HH:mm:ss.SSSxxx\") ||\r\n      parseDate(dateObj, \"d/M/yyyy HH:mm:ss.SSSxxx\") ||\r\n      parseISO(dateObj)\r\n    );\r\n  } else {\r\n    return dateObj;\r\n  }\r\n}\r\n\r\nexport function parseDate(dateStr, format) {\r\n  const date = parse(dateStr, format, new Date());\r\n  return date && isValidDate(date) ? date : null;\r\n}\r\n\r\nexport function isValidDate(d) {\r\n  return d instanceof Date && !isNaN(d);\r\n}\r\n//#endregion\r\n","//#region background images\r\nexport const bgUrl = (imageUrl) => {\r\n  return `background-image:url(\"` + encodeURI(decodeURI(imageUrl)) + `\")`\r\n}\r\n\r\nexport const bgUrlStyle = (imageUrl) => {\r\n  return `url(\"` + encodeURI(decodeURI(imageUrl)) + `\")`\r\n}\r\n//#endregion\r\n\r\n//#region screen/element size\r\nexport const screenWidth = () => {\r\n  if (typeof window !== `undefined`) { \r\n    return window.innerWidth ||\r\n      document.documentElement.clientWidth ||\r\n      document.body.clientWidth\r\n  } else {\r\n    return 0;\r\n  }\r\n}\r\n\r\nexport const screenHeight = () => {\r\n  if (typeof window !== `undefined`) { \r\n    return window.innerHeight ||\r\n      document.documentElement.clientHeight ||\r\n      document.body.clientHeight\r\n  } else {\r\n    return 0;\r\n  }\r\n}\r\n\r\nexport const outerWidth = el => el.offsetWidth\r\nexport const outerHeight = el => el.offsetHeight\r\n//#endregion\r\n\r\n//#region css class\r\n/**\r\n * Check if element has the css class on it.\r\n */\r\nexport const hasClass = (el, className) => {\r\n  if (el.classList) {\r\n    return el.classList.contains(className)\r\n  }\r\n\r\n  return !!el.className.match(new RegExp(`(\\\\s|^)${className}(\\\\s|$)`))\r\n}\r\n\r\n/**\r\n * Adds the provided css className to the element.\r\n */\r\nexport const addClass = (el, className) => {\r\n  if (el.classList) {\r\n    el.classList.add(className)\r\n    return\r\n  }\r\n\r\n  if (!hasClass(el, className)) {\r\n    el.className += ` ${className}`\r\n  }\r\n}\r\n\r\n/**\r\n * Remove the provided css className from the element.\r\n */\r\nexport const removeClass = (el, className) => {\r\n  if (el.classList) {\r\n    el.classList.remove(className)\r\n    return\r\n  }\r\n\r\n  if (hasClass(el, className)) {\r\n    const reg = new RegExp(`(\\\\s|^)${className}(\\\\s|$)`)\r\n    el.className = el.className.replace(reg, ' ')\r\n  }\r\n}\r\n\r\n/**\r\n * Adds or removes a class name on the input depending on the status flag.\r\n */\r\nexport const toggleClass = (el, className, status) => {\r\n  if (!el || !className) return\r\n\r\n  if (status) {\r\n    return addClass(el, className)\r\n  }\r\n\r\n  removeClass(el, className)\r\n}\r\n//#endregion","import { gsap } from 'gsap';\r\nimport { ScrollToPlugin } from 'gsap/ScrollToPlugin';\r\n\r\ngsap.registerPlugin(ScrollToPlugin);\r\n\r\nexport function scrollTo(selector, duration = 750, delay = 0) {\r\n  const el = findElement(selector);\r\n  if (el) {\r\n    setTimeout(() => {\r\n      //console.log(element);\r\n      const offset = elementOffset(el);\r\n      //console.log(offset)\r\n      //window.scrollTo(0, offset.top - 300);\r\n\r\n      gsap.to(window, {duration: (duration/1000), scrollTo: offset.top - 100, ease: 'power1'});\r\n\r\n    }, delay);\r\n      //el.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'smooth' }); }, timeout);\r\n    return true;\r\n  }\r\n  return false;\r\n}\r\n\r\nexport function findElement(selector) {\r\n  if (typeof selector !== 'string') return selector;\r\n\r\n  let found = querySelectorOrNull(selector)\r\n    || querySelectorOrNull('#' + selector)\r\n    || querySelectorOrNull('.' + selector)\r\n  \r\n  return found;\r\n}\r\n\r\nexport function querySelectorOrNull(selector) {\r\n  try {\r\n    return document.querySelector(selector);\r\n  } catch(e){\r\n    return null;\r\n  };\r\n}\r\n\r\nexport function elementOffset(el) {\r\n  var rect = el.getBoundingClientRect(),\r\n    scrollLeft = typeof window !== `undefined` ? (window.pageXOffset || document.documentElement.scrollLeft) : 0,\r\n    scrollTop = typeof window !== `undefined` ? (window.pageYOffset || document.documentElement.scrollTop) : 0;\r\n\r\n  return { top: rect.top + scrollTop, left: rect.left + scrollLeft, width: el.offsetWidth, height: el.offsetHeight }\r\n}\r\n\r\nexport function isElementInViewport (el) {\r\n  if (typeof window !== `undefined`) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n        rect.top >= 0 &&\r\n        rect.left >= 0 &&\r\n        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /* or $(window).height() */\r\n        rect.right <= (window.innerWidth || document.documentElement.clientWidth) /* or $(window).width() */\r\n    );\r\n  } else {\r\n    return true;\r\n  }\r\n}\r\n\r\nexport function getCurrentBreakpoint() {\r\n  if (typeof window === `undefined`) return null;\r\n  \r\n  const bpHolder = document.querySelector('.devMediaQueryStatus__current');\r\n  if (!bpHolder) return null;\r\n  return window.getComputedStyle(bpHolder, ':before').getPropertyValue('content').replace(/[\"']/g, '');\r\n}\r\n\r\n","export function formatMoney(number, fraction = 0) {\r\n  var formatter = new Intl.NumberFormat('en-AU', {\r\n    style: 'currency',\r\n    currency: 'AUD',\r\n    minimumFractionDigits: fraction,\r\n  });\r\n\r\n  return formatter.format(number);\r\n}\r\n\r\nexport function toMonthlyCost(amount, frequency) {\r\n  if (!amount) return 0;\r\n  if (frequency === 'Week') {\r\n    return amount * 52.1429 / 12.0;\r\n  } else if (frequency === 'Fortnight') {\r\n    return amount * 52.1429 / 2.0 / 12.0;\r\n  } else if (frequency === 'Month') {\r\n    return amount;\r\n  } else if (frequency === 'Quarter') {\r\n    return amount * 4.0 / 12.0;\r\n  } else if (frequency === 'Year') {\r\n    return amount / 12.0;\r\n  } else {\r\n    return amount;\r\n  }\r\n}\r\n","export function isBlank(str) {\r\n  return (!str || /^\\s*$/.test(str))\r\n}\r\n\r\nexport function isEmpty(str) {\r\n  return (!str || str.length === 0)\r\n}\r\n\r\nexport function isNumeric(num){\r\n  return !isNaN(num)\r\n}\r\n\r\nexport function capitalize(expression) {\r\n  return expression.charAt(0).toUpperCase() + expression.slice(1);\r\n}\r\n\r\nexport function toFieldName(str) {\r\n  if (!str) return null;\r\n  return capitalize((str.replace(/([A-Z]+)/g, ' $1').replace(/([A-Z][a-z])/g, ' $1')).trim());\r\n}\r\n\r\nexport function toHtml(str) {\r\n  if (!str) return null;\r\n  return str.replace(/[\\n\\r]/g, '<br/>')\r\n}\r\n\r\n// Shorten a string to less than maxLen characters without truncating words.\r\nexport function truncateWords(str, maxLen, separator = ' ', ellipsis = '...') {\r\n  if (str.length <= maxLen) return str\r\n  var pos = str.lastIndexOf(separator, maxLen)\r\n  return str.substr(0, pos) + ellipsis\r\n}\r\n\r\nexport function numberWithCommas(x) {\r\n  var parts = x.toString().split(\".\");\r\n  parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n  return parts.join(\".\");\r\n}\r\n\r\nexport const formatNumber = (value) => {\r\n  if (value === 0) return '0';\r\n  if (!value) return '';\r\n  return Math.round(value * 100) / 100\r\n}\r\n\r\nexport const toTelephoneNumber = (str) => {\r\n  return (str || []).replace(/[^+\\d]+/g, \"\");\r\n\r\n}\r\n\r\n// utils.text.like('text here', '%keyword%')\r\nexport const like = (str, search) => {\r\n  if (typeof search !== 'string' || str === null) { return false; }\r\n  // Remove special chars\r\n  search = search.replace(new RegExp(\"([\\\\.\\\\\\\\\\\\+\\\\*\\\\?\\\\[\\\\^\\\\]\\\\$\\\\(\\\\)\\\\{\\\\}\\\\=\\\\!\\\\<\\\\>\\\\|\\\\:\\\\-])\", \"g\"), \"\\\\$1\");\r\n  // Replace % and _ with equivalent regex\r\n  search = search.replace(/%/g, '.*').replace(/_/g, '.');\r\n  // Check matches\r\n  return RegExp('^' + search + '$', 'gi').test(str);\r\n\r\n}","import shortid from 'shortid';\r\nimport uuid from 'uuid/v4';\r\n\r\nexport function shortId() {\r\n  return shortid();\r\n}\r\n\r\nexport function guid() {\r\n  return uuid();\r\n}","export function toCamel(o) {\r\n  var newO, origKey, newKey, value\r\n  if (o instanceof Array) {\r\n    return o.map(function(value) {\r\n        if (typeof value === \"object\") {\r\n          value = toCamel(value)\r\n        }\r\n        return value\r\n    })\r\n  } else {\r\n    newO = {}\r\n    for (origKey in o) {\r\n      if (o.hasOwnProperty(origKey)) {\r\n        newKey = (origKey.charAt(0).toLowerCase() + origKey.slice(1) || origKey).toString()\r\n        value = o[origKey]\r\n        if (value instanceof Array || (value !== null && value.constructor === Object)) {\r\n          value = toCamel(value)\r\n        }\r\n        newO[newKey] = value\r\n      }\r\n    }\r\n  }\r\n  return newO\r\n}","import { getFilename } from './url';\r\nimport { contains } from './array';\r\nexport function getImageSetPath(url, setId) {\r\n  const info = getPathDetails(url)\r\n  if (!info) return url;\r\n  //console.log(url, info);\r\n  return info.baseFolder + \"/@\" + setId + '/' + info.filename\r\n}\r\n\r\nexport function getPathDetails(url, setIds) {\r\n  if (!url) return null;\r\n  const parts = url.split('/').slice(0, -1);\r\n  if (parts.length <= 1) return { baseFolder: '/', setId: null, filename: getFilename(url) };\r\n\r\n  const lastFolder = parts[parts.length - 1];\r\n  const hasSet = setIds && setIds.length > 0 ? contains(setIds, x => x === lastFolder) : lastFolder.indexOf('@') === 0;\r\n\r\n  return hasSet ?\r\n    { baseFolder: parts.slice(0, -1).join('/'), setId: lastFolder, filename: getFilename(url) } :\r\n    { baseFolder: parts.join('/'), setId: null, filename: getFilename(url) }\r\n}","import classNames from 'classnames';\r\nimport * as url from './url';\r\nimport * as form from './form';\r\nimport * as array from './array';\r\nimport * as date from './date';\r\nimport * as css from './css';\r\nimport * as ui from './ui';\r\nimport * as money from './money';\r\nimport * as text from './text';\r\nimport * as random from './random';\r\nimport * as object from './object';\r\nimport * as media from './media';\r\n\r\nexport default { classNames, url, form, array, date, css, ui, money, text, random, object, media};","import utils from \"../utils\";\nimport env from '../env';\nimport { isMin } from '../lib/css-emotion'\n\nexport const isMobile = () => {\n  // isMin.md() ==> min-width: 768px\n  return !isMin.md()\n}\n\nexport function resourcePath(url){\n  if (!url) return null;\n  if (url && url.indexOf('/assets/') === 0) return url;\n  return utils.url.isExternalLink(url)? url : env.resourceBase + url;\n}\n\nexport function fullUrl(url){\n  return utils.url.isExternalLink(url)? url : env.baseOrigin + url;\n}\n\n\nexport const isNZ = env.locale === 'nz'\n\n","import coreUtils from '../lib/utils-core';\nimport * as site from '../site/siteUtils';\n\nexport default { ...coreUtils, site };","import { useState, useEffect } from 'react';\r\nimport utils from '../../utils';\r\nimport siteConfig from '../../config';\r\n\r\nexport function useApi(fn) {\r\n  //console.log('useApi')\r\n  const [response, setResponse] = useState({});\r\n  const [errors, setErrors] = useState([]);\r\n  const [status, setStatus] = useState('ready');\r\n  const [request, setRequest] = useState(null);\r\n\r\n  useEffect(() => {\r\n    if (!request) return;\r\n\r\n    //console.log('fetch now')\r\n    setResponse(null);\r\n    setErrors([]);\r\n    setStatus('ready');\r\n\r\n    const fetchData = async () => {\r\n      setStatus('pending');\r\n      try {\r\n        //console.log(request);\r\n        const options = request.options || {}\r\n        siteConfig.apiNetJwt && await siteConfig.apiNetJwt(options);\r\n\r\n        const res = await fetch(request.url, options);\r\n        //console.log(res);\r\n\r\n        if (!res.ok) {\r\n          try {\r\n            const json = await res.json();\r\n            console.log(json);\r\n\r\n            if (json.message) {\r\n              setErrors([json.message]);\r\n              setStatus('error')\r\n              return;\r\n            }\r\n          } catch (e) { }\r\n\r\n          const statusText = res.status === 401 ? 'Permission denied. Please login first.' : res.statusText\r\n          setErrors(['Error - [' + res.status + ']' + (statusText && (' - ' + statusText))]);\r\n          setStatus('error')\r\n          return;\r\n        }\r\n\r\n        //const json = await res.json();\r\n        const text = await res.text();\r\n        const json = text && text.length ? JSON.parse(text) : null;\r\n        //console.log(json);\r\n\r\n        // check if ajax result from c#\r\n        if (json && json.errors && json.errors.length > 0) {\r\n          setErrors(utils.form.getErrors(json));\r\n          setStatus('error')\r\n          return;\r\n        }\r\n\r\n        setResponse(json);\r\n        setStatus('done')\r\n      } catch (err) {\r\n        //console.log(error, error.toString(), typeof error, JSON.stringify(error))\r\n        setErrors([err.toString()]);\r\n        setStatus('error')\r\n      }\r\n    };\r\n    fetchData();\r\n  }, [request]);\r\n\r\n  const containsErrorMessage = (msg) => {\r\n    const finding = (msg || '').toLowerCase()\r\n    return errors.some(x => (x || '').toLowerCase().indexOf(finding) >= 0)\r\n  }\r\n\r\n  //return [ response, error, status, (...args) => setRequest(fn(...args)) ];\r\n  return {\r\n    request: request,\r\n    response: response,\r\n    errors: errors,\r\n    status: status,\r\n    hasErrors: () => status === 'error',\r\n    containsErrorMessage: containsErrorMessage,\r\n    addErrors: (errs) => {\r\n      setErrors(...errors, ...errs)\r\n      setStatus('error')\r\n    },\r\n    done: () => status === 'done',\r\n    send: (...args) => { setStatus('ready'); setRequest(fn(...args)) },\r\n    sendRaw: (httpOptionFn, ...args) => { setStatus('ready'); setRequest(httpOptionFn(...args)) },\r\n    setResult: (json) => { setResponse(json); setStatus('done') },\r\n    reset: () => {\r\n      setStatus('ready');\r\n      setErrors([]);\r\n    }\r\n  };\r\n}\r\n\r\nexport function usePost() {\r\n  const formDataFn = (url, data, options = {}) =>\r\n    ({\r\n      url: url,\r\n      options: {\r\n        ...options,\r\n        method: 'POST',\r\n        body: data // FormData\r\n      }\r\n    });\r\n  const post = useApi((url, data, options = {}) =>\r\n    ({\r\n      url: url,\r\n      options: {\r\n        ...options,\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application/json' },\r\n        body: JSON.stringify(data)\r\n      }\r\n    })\r\n  );\r\n  return {\r\n    ...post,\r\n    loading: () => post.status === 'ready' || post.status === 'pending',\r\n    sending: () => post.status === 'pending',\r\n    sendFormData: (...args) => post.sendRaw(formDataFn, ...args)\r\n  }\r\n}\r\n\r\nexport function useGet() {\r\n  const get = useApi((url, options = {}) =>\r\n    ({\r\n      url: url,\r\n      options: {\r\n        ...options,\r\n        method: 'GET'\r\n      }\r\n    })\r\n  );\r\n  return {\r\n    ...get,\r\n    loading: () => get.status === 'ready' || get.status === 'pending'\r\n  }\r\n}\r\n\r\n//https://medium.com/@jaryd_34198/seamless-api-requests-with-react-hooks-part-2-3ab42ba6ad5c","import React from 'react';\r\nimport env from '../../env';\r\n\r\nexport function MediaQueryStatus(props) {\r\n  return (\r\n    <div className=\"devMediaQueryStatus\" style={{display: env.isProd ? 'none' : 'block'}}>\r\n      <div className=\"devMediaQueryStatus__current\"></div>\r\n    </div>\r\n  );\r\n}\r\n","import React from 'react';\r\nimport { Helmet } from 'react-helmet-async';\r\n\r\nexport function MetaTag({ data: seoData }) {\r\n  //console.log(seoData)\r\n  const data = Object.assign({}, {\r\n    title: ''\r\n  }, seoData)\r\n\r\n  return (<>\r\n    <Helmet>\r\n      <title>{data.title}</title>\r\n      {data.description && <meta name=\"description\" content={data.description} /> }\r\n      {data.keywords && <meta name=\"keywords\" content={data.keywords} /> }\r\n      {data.language && <meta name=\"language\" content={data.language} /> }\r\n      {data.country && <meta name=\"country\" content={data.country} /> }\r\n      {\r\n        (data.faceBookDomainVerifi && data.faceBookDomainVerifi !== '') &&\r\n        <meta name=\"facebook-domain-verification\" content={data.faceBookDomainVerifi} />\r\n      }\r\n      <meta name=\"twitter:card\" content={!data.heroImageUrl ? \"summary\" : \"summary_large_image\"} />\r\n      <meta name=\"twitter:site\" content={data.siteName} />\r\n      <meta name=\"twitter:title\" content={data.title} />\r\n      {data.description && <meta name=\"twitter:description\" content={data.description} /> }\r\n      {data.heroImageUrl && <meta name=\"twitter:image\" content={data.heroImageUrl} /> }\r\n\r\n      <meta name=\"og:title\" content={data.title} />\r\n      <meta name=\"og:site_name\" content={data.siteName} />\r\n      <meta name=\"og:url\" content={data.url} />\r\n      {data.description && <meta name=\"og:description\" content={data.description} /> }\r\n      {data.heroImageUrl && <meta name=\"og:image\" content={data.heroImageUrl} /> }\r\n\r\n\r\n      <link rel=\"canonical\" href={data.canonical || data.url} />\r\n\r\n      {(data.alternates || []).map((x, index) => <link rel=\"alternate\" key={index} hreflang={x.hreflang} href={x.href} />  )}\r\n\r\n    </Helmet>\r\n  </>)\r\n}\r\n\r\n\r\n// function MetaContent({ name, content }) {\r\n//   console.log(name, content)\r\n//   if (!content) return null;\r\n//   return <Helmet><meta name={name} content={content}></meta></Helmet>\r\n// }\r\n\r\n","import env from '../../env';\r\n\r\nexport const pageView = (url) => {\r\n  if (process.env.NODE_ENV === 'development') {\r\n    console.warn(`Tracking is deprecated.`, `Use seperate tracking helper instead`);\r\n  }\r\n  if (hasGTM()) gtmPageView(url)\r\n  if (hasGtag()) gaPageView(url)\r\n  if (hasFBPixel()) fbPageView(url)\r\n}\r\n\r\nexport const sendFormEvent = (formName, params) => {\r\n  if (process.env.NODE_ENV === 'development') {\r\n    console.warn(`Tracking is deprecated.`, `Use seperate tracking helper instead`);\r\n  }\r\n  const p = Object.assign({ 'gtm.elementId': formName }, params || {})\r\n\r\n  if (hasGTM()) gtmSendEvent('form', p)\r\n  if (hasGtag()) gaSendEvent('form', p)\r\n  if (hasFBPixel()) fbSendEvent('form', p)\r\n}\r\n\r\nexport const sendEvent = (eventName, params) => {\r\n  if (process.env.NODE_ENV === 'development') {\r\n    console.warn(`Tracking is deprecated.`, `Use seperate tracking helper instead`);\r\n  }\r\n  if (hasGTM()) gtmSendEvent(eventName, params)\r\n  if (hasGtag()) gaSendEvent(eventName, params)\r\n  if (hasFBPixel()) fbSendEvent(eventName, params)\r\n}\r\n\r\n//#region GTM\r\nexport const hasGTM = () => {\r\n  return !!(typeof window !== `undefined` && window.dataLayer);\r\n}\r\n\r\nexport const gtmPageView = (url) => {\r\n  if (typeof window !== `undefined`) {\r\n    window.dataLayer.push({\r\n      event: 'pageview',\r\n      page: {\r\n        path: url\r\n      }\r\n    })\r\n  }\r\n}\r\nexport const gtmSendEvent = (eventName, params) => {\r\n  if (typeof window !== `undefined`) {\r\n    window.dataLayer.push(Object.assign({ event: eventName }, params || {}))\r\n  }\r\n}\r\n//#endregion\r\n\r\n//#region Gtag / GA\r\nexport const hasGtag = () => {\r\n  return !!(typeof window !== `undefined` && window.gtag);\r\n}\r\n\r\nexport const gaPageView = (url) => {\r\n  if (typeof window !== `undefined`) {\r\n    if (env.gaAccounts) {\r\n      env.gaAccounts.forEach(id => {\r\n        window.gtag('config', id, { 'page_path': url });\r\n      })\r\n    }\r\n  }\r\n}\r\n\r\nexport const gaSendEvent = (eventName, params) => {\r\n  if (typeof window !== `undefined`) {\r\n    if (env.gaAccounts && env.gaAccounts.length > 0) {\r\n      window.gtag('event', eventName, params || {});\r\n    }\r\n  }\r\n}\r\n//#endregion\r\n\r\n//#region Facebook Pixel\r\nexport const hasFBPixel = () => {\r\n  return !!(typeof window !== `undefined` && window.fbq);\r\n}\r\n\r\nexport const fbPageView = (url) => {\r\n  if (typeof window !== `undefined`) {\r\n    window.fbq('track', 'PageView');\r\n  }\r\n}\r\n\r\nexport const fbSendEvent = (eventName, params) => {\r\n  if (typeof window !== `undefined`) {\r\n    window.fbq('track', eventName, params || {});\r\n  }\r\n}\r\n//#endregion\r\n\r\n\r\n\r\n","import  utils from '../../utils';\r\n\r\nexport const MAX = 100000;\r\nexport const MIN = -100000;\r\n\r\nexport function getScrollProgress(el) {\r\n  if (typeof window !== `undefined`) {\r\n    const scroll = window.scrollY || window.pageYOffset\r\n    if (!el) {\r\n      console.log('not exists', el)\r\n      return {\r\n        progress: 0,\r\n        top: scroll\r\n      }\r\n    }\r\n    const boundsTop = el.getBoundingClientRect().top + scroll\r\n\r\n    const viewport = {\r\n      top: scroll,\r\n      bottom: scroll + window.innerHeight,\r\n      height: window.innerHeight\r\n    }\r\n\r\n    const bounds = {\r\n      top: boundsTop,\r\n      bottom: boundsTop + el.clientHeight,\r\n      height: el.clientHeight\r\n    }\r\n\r\n    //const scrollTop = window.scrollY || window.pageYOffset || document.documentElement.scrollTop;\r\n\r\n    // const status = {\r\n    //   viewport: viewport,\r\n    //   bound: bounds,\r\n    //   inViewport: (bounds.bottom >= viewport.top && bounds.bottom <= viewport.bottom)\r\n    //   || (bounds.top <= viewport.bottom && bounds.top >= viewport.top)\r\n    // }\r\n\r\n    //console.log((viewport.bottom - bounds.top) / (bounds.height + viewport.height))\r\n    return {\r\n      progress: (viewport.bottom - bounds.top) / (bounds.height + viewport.height),\r\n      top: (viewport.bottom - bounds.top) / (viewport.height)\r\n    }\r\n  } else {\r\n    return {\r\n      progress: 0,\r\n      top: 0\r\n    }\r\n  }\r\n}\r\n\r\n//au.setClass(section, 'animated', pr, [0.3, au.MAX])\r\nexport function setClass(el, className, pr, range)\r\n{\r\n  if (pr >= range[0] && pr <= range[1]) {\r\n    utils.css.addClass(el, className);\r\n  } else {\r\n    utils.css.removeClass(el, className);\r\n  }\r\n}\r\n\r\nexport function prVal(min, max, pr, range = [0, 1]) {\r\n  //console.log(min, max, typeof min, typeof to)\r\n  if (pr < range[0]) return min;\r\n  if (pr > range[1]) return max;\r\n  return min + (max - min) * ((pr - range[0])/(range[1] - range[0]));\r\n}\r\n\r\nexport function transform(el, x, y) {\r\n  el.style.transform = 'translate(' + x + ',' + y + ')';\r\n}\r\n\r\nexport function removeTransform(el) {\r\n\r\n}\r\n\r\n// requestAnimationFrame\r\n// const raf =\r\n//   (<any>window).requestAnimationFrame ||\r\n//   (<any>window).webkitRequestAnimationFrame ||\r\n//   (<any>window).mozRequestAnimationFrame ||\r\n//   function (callback) {\r\n//     (<any>window).setTimeout(callback, 1000 / 60)\r\n//   }\r\nexport function getScreenSize() {\r\n  const w = utils.css.screenWidth()\r\n  const h = utils.css.screenHeight()\r\n  return { width: w, height: h };\r\n}\r\n","const defaultHolder = typeof window !== `undefined` ? window : {};\r\nconst storeName = '__j6_lazy_js'\r\n\r\nexport function loadJs(...scripts) {\r\n  const promises = [];\r\n  scripts.forEach((script) => promises.push(loadScript(script, defaultHolder)));\r\n  return Promise.all(promises);\r\n}\r\n\r\nexport function loadedJs(url, holder = defaultHolder) {\r\n  if (!holder[storeName]) return false;\r\n  return holder[storeName][url] && holder[storeName][url].loaded\r\n}\r\n\r\nexport function loadScript(url, holder_, forceToReload = false) {\r\n  const holder = holder_ || defaultHolder\r\n  if (!holder[storeName]) holder[storeName] = {};\r\n\r\n  return new Promise((resolve, reject) => {\r\n    //resolve if already loaded\r\n    if (!forceToReload && holder[storeName][url] && holder[storeName][url].loaded) {\r\n      resolve({ script: url, loaded: true, networkLoaded: false , status: 'Already Loaded' });\r\n    }\r\n    else {\r\n      // remove previous\r\n      const existing = document.querySelector('script[src=\"' + url +'\"]')\r\n      if (existing) existing.remove();\r\n\r\n      // load script\r\n      let script = document.createElement('script');\r\n      script.type = 'text/javascript';\r\n      script.src = url;\r\n      script.onload = () => {\r\n        holder[storeName][url] = { loaded: true };\r\n        resolve({ script: url, loaded: true, networkLoaded: true, status: 'Loaded' });\r\n      };\r\n      script.onerror = (error) => resolve({ script: url, loaded: false, status: 'Load failed' });\r\n      document.getElementsByTagName('head')[0].appendChild(script);\r\n    }\r\n  });\r\n}","import { useLayoutEffect } from 'react';\r\n//import useWindowScroll from '@react-hook/window-scroll';\r\nimport { au } from '../../components';\r\n\r\n/* background image height =\r\n  + cutoff padding = always hidden padding - usually 10 px\r\n    + panel height (desired parallax panel height)\r\n    + padding height = panel height * padding height ratio\r\n  + cutoff padding = always hidden padding - usually 10 px\r\n*/\r\n\r\nconst defaultSettings = {\r\n  cutoffPadding: 10,\r\n  speed: 15, // 5% of image/100px scroll\r\n  //paddingHeightRatio: 0.3\r\n  //screenSize\r\n}\r\n\r\nexport const ParallaxData = {\r\n  settings: {\r\n    screenSize: null\r\n  },\r\n  panels: [\r\n    { selector: '.parallax', imageRatio: 1080 / 1920, panelHeight: 'auto' },\r\n  ],\r\n  elements: [],\r\n  timeoutId: null\r\n}\r\n\r\nexport function useParallax() {\r\n  const handleScroll = () => {\r\n    //console.log('useParallax - scrolling')\r\n    onScroll(ParallaxData);\r\n  }\r\n\r\n  const reset = () => {\r\n    //console.log('useParallax - reset');\r\n    setTimeout(() => { init(ParallaxData); handleScroll(); }, 300)\r\n  }\r\n\r\n  useLayoutEffect(() => {\r\n    //console.log('useParallax - effect');\r\n    setTimeout(() => { init(ParallaxData); handleScroll(); }, 300)\r\n    if (typeof window !== `undefined`) {\r\n      window.addEventListener('scroll', handleScroll)\r\n      window.addEventListener('resize', reset)\r\n    }\r\n    return () => {\r\n      //console.log('useParallax - removed');\r\n      if (typeof window !== `undefined`) {\r\n        window.removeEventListener('scroll', handleScroll)\r\n        window.removeEventListener('resize', reset)\r\n      }\r\n    }\r\n\r\n    // eslint-disable-next-line \r\n  }, []);\r\n\r\n  return { reset };\r\n};\r\n\r\n// export function useParallax(opt) {\r\n//   // const settings = Object.assign({}, defaultSettings, opt);\r\n\r\n//   const [resetCounter, setResetCounter] = useState(0);\r\n//   const [parallaxData,] = useState(ParallaxData);\r\n\r\n//   //const scrollY = useWindowScroll(60 /*fps*/)\r\n//   const reset = () => {\r\n//     setResetCounter(resetCounter + 1);\r\n//   }\r\n\r\n//   const handleScroll = () => {\r\n//     onScroll(parallaxData);\r\n//   }\r\n\r\n//   useLayoutEffect(() => {\r\n//     console.log('useParallax - effect');\r\n\r\n//     setTimeout(() => { init(parallaxData); handleScroll(); }, 300)\r\n\r\n//     //const handleScroll = (): void => setThrottledScroll(getScrollY())\r\n//     window.addEventListener('scroll', handleScroll)\r\n//     window.addEventListener('resize', handleScroll)\r\n//     return (): void => {\r\n//       window.removeEventListener('scroll', handleScroll)\r\n//       window.removeEventListener('resize', handleScroll)\r\n//     }\r\n\r\n//     // eslint-disable-next-line \r\n//   }, [resetCounter]);\r\n//   //console.log(scrollY, resetCounter)\r\n\r\n//   return { reset };\r\n// };\r\n\r\nexport function init(data) {\r\n  //console.log('parallax init');\r\n  const screenSize = data.settings.screenSize = au.getScreenSize();\r\n  data.settings = Object.assign({}, defaultSettings, data.settings)\r\n  let cnt = 0;\r\n  data.panels.forEach(panel => {\r\n    const elements = document.querySelectorAll(panel.selector) || [];\r\n    for (let i = 0; i < elements.length; i++) {\r\n      cnt++;\r\n      const el = elements[i];\r\n      //const el = document.querySelector(panel.selector);\r\n      //console.log(panel.selector, el)\r\n      //if (!el) { panel.el = null; return; }\r\n      const autoPanelHeight = !panel.panelHeight || panel.panelHeight === 'auto';\r\n      const panelHeight = autoPanelHeight ? el.offsetHeight : parseFloat(panel.panelHeight);\r\n      //console.log(autoPanelHeight, panelHeight)\r\n\r\n      const calculated = { shadowHeight: 0, shadowWidth: 0, fromTop: 0, toTop: 0 };\r\n      // calculated.shadowHeight = panelHeight * (1 + data.settings.paddingHeightRatio) + 2 * data.settings.cutoffPadding;\r\n      // calculated.shadowWidth = calculated.shadowHeight / panel.imageRatio;\r\n      // if (calculated.shadowWidth < data.settings.screenSize.width) {\r\n      //   // magnifying the background image to fix the full width of the browser\r\n      //   calculated.shadowWidth = data.settings.screenSize.width;\r\n      //   calculated.shadowHeight = calculated.shadowWidth * panel.imageRatio;\r\n      // }\r\n\r\n      const speed = data.settings.speed * (screenSize.width > 1000 ? 1 : 2) \r\n      let baseHeight = data.settings.screenSize.width * panel.imageRatio > panelHeight ? data.settings.screenSize.width * panel.imageRatio : panelHeight\r\n      baseHeight = baseHeight + (data.settings.screenSize.height + panelHeight) * (speed * 0.01)\r\n      calculated.shadowHeight = baseHeight + 2 * data.settings.cutoffPadding;\r\n      calculated.shadowWidth = calculated.shadowHeight / panel.imageRatio;\r\n      if (calculated.shadowWidth < data.settings.screenSize.width) {\r\n        // magnifying the background image to fix the full width of the browser\r\n        calculated.shadowWidth = data.settings.screenSize.width;\r\n        calculated.shadowHeight = calculated.shadowWidth * panel.imageRatio;\r\n      }\r\n\r\n      calculated.fromTop = -data.settings.cutoffPadding;\r\n      calculated.toTop = -calculated.shadowHeight + panelHeight + data.settings.cutoffPadding;\r\n\r\n      if (!autoPanelHeight)\r\n        (el).style.height = panel.panelHeight + 'px';\r\n\r\n      (el).style.backgroundSize = calculated.shadowWidth + 'px ' + calculated.shadowHeight + 'px'\r\n\r\n      //panel.el = el;\r\n      panel.calculated = calculated;\r\n      data.elements.push({ el: el, calculated: calculated });\r\n      //console.log(panelHeight, baseHeight, calculated)\r\n    }\r\n  })\r\n\r\n  //console.log('parallax init - ' + cnt)\r\n  if (cnt === 0) {\r\n    if (data.timeoutId) {\r\n      try {\r\n        if (typeof window !== `undefined`) { \r\n          window.clearTimeout(data.timeoutId)\r\n        }\r\n      } catch(e){}\r\n    }\r\n    // reschedule\r\n    if (typeof window !== `undefined`) { \r\n      data.timeoutId = window.setTimeout(() => init(data), 500)\r\n    }\r\n  }\r\n}\r\n\r\n\r\nexport function onScroll(data) {\r\n  //console.log(data);\r\n  data.elements.forEach(element => {\r\n    if (!element.el) return;\r\n    const pr = au.getScrollProgress(element.el).progress;\r\n    //console.log(pr);\r\n\r\n    const min = element.calculated.fromTop;\r\n    const max = element.calculated.toTop;\r\n    const top = au.prVal(min, max, pr, [0, 1]);\r\n    //console.log(top);\r\n    (element.el).style.backgroundPositionY = top + 'px'\r\n  })\r\n\r\n}","import { useMemo } from 'react';\r\nimport { useParams, useLocation, useHistory, useRouteMatch, Redirect } from 'react-router-dom';\r\nimport queryString from 'query-string';\r\n\r\nexport function useRouter() {\r\n  const params = useParams();\r\n  const location = useLocation();\r\n  const history = useHistory();\r\n  const match = useRouteMatch();\r\n\r\n  // Return our custom router object\r\n  // Memoize so that a new object is only returned if something changes\r\n  return useMemo(() => {\r\n    return {\r\n      // For convenience add push(), replace(), pathname at top level\r\n      navigate: history.push,\r\n      push: history.push,\r\n      Redirect: Redirect,\r\n      replace: history.replace,\r\n      pathname: location.pathname,\r\n      path: location.pathname + location.hash + location.search,\r\n      // Merge params and parsed query string into single \"query\" object\r\n      // so that they can be used interchangeably.\r\n      // Example: /:topic?sort=popular -> { topic: \"react\", sort: \"popular\" }\r\n      query: {\r\n        ...queryString.parse(location.search), // Convert string to object\r\n        ...params\r\n      },\r\n      // Include match, location, history objects so we have\r\n      // access to extra React Router functionality if needed.\r\n      match,\r\n      location,\r\n      history\r\n    };\r\n  }, [params, match, location, history]);\r\n}","import { useStore } from '../../store';\r\n\r\n// loc data: {path:'', title:''}\r\nexport function useHistoryStore() {\r\n  const { state, dispatch } = useStore();\r\n  const history = state.history || [];\r\n\r\n  function push(loc) {\r\n    const same = history.length > 0 \r\n      && (JSON.stringify(history[history.length - 1]) === JSON.stringify(loc))\r\n    if (!same) {\r\n      // console.log(JSON.stringify(history[history.length - 1]), JSON.stringify(loc))\r\n      setHistory([...history, loc]);\r\n    }\r\n  }\r\n\r\n  function setHistory(history){\r\n    // console.log('history set', history)\r\n    dispatch({ type: 'SET_HISTORY', payload: history })\r\n  }\r\n\r\n  const last = () => {\r\n    // console.log('last history', history)\r\n    if (history.length < 2) return null;\r\n    return history[history.length - 2].path;\r\n  }\r\n\r\n  const pop = () => {\r\n    if (history.length === 0) return null;\r\n    history.pop(); // remove the current first\r\n    const item = history.pop();\r\n    return item;\r\n  }\r\n\r\n  return { history, push, pop, last };\r\n};","import utils from '../../utils';\r\n\r\nexport function handleElementLink(el, externalHandler) {\r\n  // externalHandler = (url) => {\r\n  //   if (typeof window !== `undefined`) window.location.href = url;\r\n  // }\r\n\r\n  const link = utils.url.getLinkFromElement(el);\r\n  const linkInfo = utils.url.getLinkInfo(link);\r\n  //console.log(link, linkInfo)\r\n  if (!linkInfo) return { handled: false, linkInfo: linkInfo };\r\n\r\n  if (linkInfo.type === 'hash') {\r\n    utils.ui.scrollTo(linkInfo.url);\r\n  } else if (linkInfo.type === 'tel' || linkInfo.type === 'mailto') {\r\n\r\n  } else if (linkInfo.type === 'external' && externalHandler) {\r\n    // let the external handler process.\r\n    externalHandler(linkInfo.url);\r\n    return { handled: true, linkInfo: linkInfo };;\r\n  }\r\n  return { handled: false, linkInfo: linkInfo };\r\n}","import React from 'react'; \r\nimport { Link } from 'react-router-dom';\r\nimport utils from '../../utils';\r\nimport { handleElementLink } from './handleLink';\r\n\r\nexport function SiteLink(props) {\r\n  const { children, to, target, onClick, ...other } = props;\r\n\r\n  function goToLink(e) {\r\n    //console.log(e, e.target);\r\n    if (onClick) onClick(e);\r\n    const processed = handleElementLink(e.target);\r\n    //console.log(processed)\r\n    if (processed.handled) {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n    }\r\n  }\r\n\r\n  return utils.url.isExternalLink(to) ?\r\n    <a href={to} target=\"_blank\" rel=\"noopener noreferrer\" onClick={(e) => goToLink(e)} {...other}>{children}</a>\r\n    :\r\n    <Link to={to} onClick={(e) => goToLink(e)} {...other}>{children}</Link>\r\n    ;\r\n}\r\n","import { css } from '@emotion/core'\r\nimport { mixin, mq } from '../../cssInJs'\r\n\r\nexport default {\r\n  tiles: css(mq({\r\n    marginLeft: [0, -5, null, -10],\r\n    marginRight: [0, -5, null, -10],\r\n    display: 'flex',\r\n    justifyContent: 'center',\r\n    flexWrap: 'wrap'\r\n  })),\r\n  tile: css(mq({\r\n    flexBasis: ['50%', '33.33%', '25%', '25%', '20%', '16.66%'],\r\n    padding: [0, 5, null, 10],\r\n    cursor: 'pointer'\r\n  })),\r\n  tileImage: css({\r\n    position: 'relative',\r\n    display: 'block',\r\n    ':after': { ...mixin.overlay() },\r\n    ':hover, :focus': {\r\n      ':after': {\r\n        backgroundColor: 'rgba(0, 0, 0, 0.2)'\r\n      }\r\n    }\r\n  }),\r\n  tileIcon: css({\r\n    position: 'absolute',\r\n    top: 10,\r\n    right: 10,\r\n    fontSize: 30,\r\n    color: 'white',\r\n    zIndex: 1\r\n  })\r\n}","import React from 'react';\r\n/** @jsx jsx */\r\nimport { jsx } from '@emotion/core'\r\nimport env from '../../env';\r\nimport utils from '../../utils';\r\nimport { useGet, ErrorPopup, Loading } from '../../components';\r\nimport style from './feedStyle';\r\nimport {FaRegCaretSquareRight, FaRegClone} from 'react-icons/fa';\r\n\r\nexport function InstagramFeed(props){\r\n  const get = useGet();\r\n\r\n  React.useEffect(() => {\r\n    get.send(env.apiBase + `/api/instagram/GetInstagramFeeds`);\r\n    // eslint-disable-next-line\r\n  }, []);\r\n\r\n  if (get.loading()) {\r\n    return <Loading />\r\n  } else if (get.hasErrors()) {\r\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\r\n  }\r\n\r\n  // console.log(get)\r\n  const data = get.response;\r\n  if (data.length === 0) return null\r\n  return (\r\n    <Feeds posts={data} />\r\n  );\r\n}\r\n\r\nfunction Feeds({posts}) {\r\n  const numOfTileLines = 2;\r\n  const bp = utils.ui.getCurrentBreakpoint();\r\n  const tilesPerLine = {xs:2, sm:3, md:4, lg:4, xl:5, xxl:6}\r\n  const numOfPost = numOfTileLines * (tilesPerLine[bp] || 6);\r\n  console.log(bp, numOfTileLines, numOfPost)\r\n  const displayingPosts = posts.length > numOfPost ? posts.slice(0, numOfPost) : posts;\r\n\r\n  return (\r\n    <div css={style.tiles}>\r\n      {displayingPosts.map((item, index) =>\r\n      <Feed key={index} item={item} />)}\r\n    </div>\r\n  )\r\n}\r\n\r\nfunction Feed({item}) {\r\n  return (\r\n    <div css={style.tile}>\r\n      {/* {item.link} */}\r\n      <a href={item.link} target=\"_blank\" rel=\"noopener noreferrer\" css={style.tileImage}>\r\n        <img src={utils.site.resourcePath(`/instagram/${item.filename}`)} alt={item.filename} />\r\n        {item.type === 'video' && <FaRegCaretSquareRight css={style.tileIcon} />}\r\n        {item.type === 'carousel' && <FaRegClone css={style.tileIcon} />}\r\n      </a>\r\n    </div>\r\n  )\r\n}","// https://www.pluralsight.com/guides/re-render-react-component-on-window-resize\r\nexport function debounce(fn, ms) {\r\n  let timer\r\n  return _ => {\r\n    clearTimeout(timer)\r\n    timer = setTimeout(_ => {\r\n      timer = null\r\n      fn.apply(this, arguments)\r\n    }, ms)\r\n  };\r\n}","import utils from '../../utils';\r\n\r\nexport function loadApi(onApiReady) {\r\n  if (typeof window !== `undefined` && !window.YT) { // If not, load the script asynchronously\r\n    const tag = document.createElement('script');\r\n    tag.src = 'https://www.youtube.com/iframe_api';\r\n\r\n    // onYouTubeIframeAPIReady will load the video after the script is loaded\r\n    window.onYouTubeIframeAPIReady = () => onApiReady(true);\r\n\r\n    const firstScriptTag = document.getElementsByTagName('script')[0];\r\n    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n  } else { // If script is already there, load the video directly\r\n    onApiReady(false);\r\n  }\r\n}\r\n\r\n// export function player(playerId, videoId, playerVars = {}, events = {}) {\r\n//   //let player = null;\r\n//   const defaultPlayerVars = {\r\n//     'autoplay': 1,\r\n//     'controls': 0,\r\n//     'loop': 1,\r\n//     'showinfo': 0,\r\n//     'rel': 0,\r\n//     'modestbranding': 1,\r\n//     'origin': window.location.origin,\r\n//     'allowfullscreen': true,\r\n//     'wmode': 'transparent'\r\n//   }\r\n//   const defaultEvents = {\r\n//     'onStateChange': (e) => { },\r\n//     'onReady': (e) => { console.log('onReady'); player.mute() },\r\n//     'onError': (e) => { console.log(e) }\r\n//   }\r\n\r\n//   const player = new window.YT.Player(playerId, {\r\n//     videoId: videoId,\r\n//     playerVars: Object.assign({}, defaultPlayerVars, playerVars),\r\n//     events: Object.assign({}, defaultEvents, events),\r\n//   });\r\n//   return player;\r\n// }\r\n\r\nexport function thumbnailMax(videoId){\r\n  return `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`\r\n}\r\n\r\n// onPlayerStateChange(event){\r\n//   switch (event.data){\r\n//     case window['YT'].PlayerState.PLAYING:\r\n//       //console.log('Playing');\r\n//       //this.player.mute();\r\n//       break;\r\n//     case window['YT'].PlayerState.PAUSED:\r\n//       //console.log('Pafdsu');\r\n//       break;\r\n//     case window['YT'].PlayerState.ENDED:\r\n//       //console.log('ended ');\r\n//       //this.player.playVideo();\r\n//       this.player.stopVideo();\r\n//       break;\r\n//   }\r\n// }\r\n\r\n// toggleBannerYoutueInCMS(toggleItem:string){ \r\n//   if(toggleItem == 'youtube'){\r\n//     //location.reload();\r\n//     this.toggleBannerOrYoutube = toggleItem;\r\n//     this.player.playVideo();\r\n//     this.init();\r\n//   }\r\n//   else{\r\n//     this.toggleBannerOrYoutube = toggleItem;\r\n//     this.player.stopVideo();\r\n//   }\r\n// }\r\n\r\n\r\nexport function getYoutubeCode(src) {\r\n  // if (src.indexOf('http') >= 0) {\r\n  //   if (src.indexOf('v=') >= 0) {\r\n  //     return src.split('v=')[1];\r\n  //   }\r\n  // }\r\n  // return src;\r\n  return utils.url.getYoutubeId(src);\r\n}","import React from 'react';\r\nimport utils from '../../utils';\r\nimport * as yt from './iframeApi';\r\nimport { FaRegPlayCircle } from 'react-icons/fa';\r\nimport { useStore } from '../../store';\r\n\r\nexport function YoutubeEmbedPopup({ url, title, posterUrl }) {\r\n  const { dispatch } = useStore();\r\n\r\n  const videoId = yt.getYoutubeCode(url);\r\n  const posterImageUrl = utils.site.resourcePath(posterUrl || yt.thumbnailMax(videoId));\r\n  const [popupIndex, setPopupIndex] = React.useState(0);\r\n\r\n  function openVideo() {\r\n    setPopupIndex(popupIndex + 1);\r\n    dispatch({ type: 'SET_POPUP', payload: { sources: [\r\n      // <iframe width=\"560\" height=\"315\" src={`https://www.youtube.com/embed/${videoId}`} frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>\r\n      'https://www.youtube.com/watch?v=' + videoId\r\n    ], popupIndex: popupIndex + 1} });\r\n  }\r\n  return (\r\n    <div className=\"ytEmdPopup__poster\" style={{ backgroundImage: utils.css.bgUrlStyle(posterImageUrl) }} onClick={openVideo}>\r\n      <FaRegPlayCircle className=\"ytEmdPopup__playIcon\" />\r\n    </div>\r\n  );\r\n}\r\n","function payload(item, key, defaultVal = '') {\n  const found = item.payloads.find(x => x.key === key);\n  return found ? found.value : defaultVal;\n}\n\nfunction getCodeJson(item) {\n  const code = payload(item, 'Code');\n  const codeType = payload(item, 'CodeType');\n  if (codeType === 'Json') {\n    const codeJson = JSON.parse(code);\n    return codeJson\n  }\n  return null\n}\n\n\nfunction hasItemInPageDataByItemTypeCode(pageData, itemTypeCode) {\n  return hasItemInPageData(pageData, item => item.itemTypeCode === itemTypeCode);\n}\n\n// hasItemInPageData(cmsOption.pageData, '')\n// matchFn = (item) => item.itemTypeCode === itemTypeCode\nfunction hasItemInPageData(pageData, matchFn) {\n  if (!pageData) return false;\n  for (let i = 0; i < pageData.sections.length; i++) {\n    if (hasItemInItems(pageData.sections[i].items, matchFn)) return true;\n  }\n  return false;\n}\n\nfunction hasItemInItems(items, matchFn) {\n  if (!items) return false;\n  for (let i = 0; i < items.length; i++) {\n    if (matchFn(items[i])) return true;\n    if (hasItemInItems(items[i].items, matchFn)) return true;\n  }\n  return false;\n}\n\nexport default { payload, getCodeJson, hasItemInPageData, hasItemInItems, hasItemInPageDataByItemTypeCode };","import React from 'react';\nimport cmsUtils from '../cmsUtils';\nimport { InstagramFeed } from 'components';\nimport { isOffline } from '@site/_offline';\n\nexport const renderRule = {\n  match: (item, cmsOption) => (cmsUtils.getCodeJson(item) || {})['control'] === 'instagram', \n  itemElt: (item, cmsOption) => (!isOffline() && <InstagramFeed />)\n}","// export { getOfflinePage, getOperators, getOperator, getOperatorById, getFeaturedOperators, getDestination, getExpTypes, getExpType } from './dbSelect'\n// export { indexOfflineData } from './dbInsert'\n// export { addCache, checkCache, existInCache, getAllImagesInCache } from './cache'\n// export { getOfflineMedia } from './media'\n// export { initInstallEventHandler, isInPWA } from './pwa'\n// export { isIOS } from './device'\n\nexport function isOffline() {\n  // return true;\n  return !navigator.onLine;\n}\n\n\nexport async function getStorageInfo() {\n  const messages = []\n  if (!('indexedDB' in window)) {\n    console.log('not supported')\n  }\n  if ('caches' in window) {\n    messages.push('Cache available')\n  }\n  if (navigator.storage && navigator.storage.estimate) {\n    const quota = await navigator.storage.estimate();\n    // quota.usage -> Number of bytes used.\n    // quota.quota -> Maximum number of bytes available.\n    const percentageUsed = ((quota.usage / quota.quota) * 100).toFixed(2);\n    messages.push(`You've used ${percentageUsed}% of the available storage.`);\n    const remaining = ((quota.quota - quota.usage) / 1024 / 1024).toFixed(2);\n    messages.push(`You can write up to ${remaining} more MBs.`);\n  }\n\n  if (navigator.storage && navigator.storage.persist) {\n    const persistent = await navigator.storage.persist();\n    if (persistent)\n      messages.push(\"Storage will not be cleared except by explicit user action\");\n    else\n      messages.push(\"Storage may be cleared by the UA under storage pressure.\");\n  }\n\n  return messages;\n}\n","export function findControl(controlNameOrIndex, root) {\r\n  if (typeof controlNameOrIndex === 'number' && root && root.controls.length > controlNameOrIndex) return root.controls[controlNameOrIndex];\r\n  return findControlTraverse(controlNameOrIndex, root);\r\n}\r\n\r\nfunction findControlTraverse(controlName, control) {\r\n  if (!control) return null;\r\n  if (control.name === controlName) return control;\r\n  if (control.controls && control.controls.length > 0) {\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      const found = findControlTraverse(controlName, control.controls[i]);\r\n      if (found) {\r\n        return found;\r\n      }\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\nexport function findControlById(id, root) {\r\n  return findControlByIdTraverse(id, root);\r\n}\r\n\r\nfunction findControlByIdTraverse(id, control) {\r\n  if (!control) return null;\r\n  if (control.id === id) return control;\r\n  if (control.controls && control.controls.length > 0) {\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      const found = findControlByIdTraverse(id, control.controls[i]);\r\n      if (found) {\r\n        return found;\r\n      }\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\nexport function getValue(root) {\r\n  //console.log(root)\r\n  return getValueTraverse(root);\r\n}\r\n\r\nconst helperFns = {\r\n  getValueTraverse: getValueTraverse,\r\n  getFilesTraverse: getFilesTraverse\r\n}\r\n\r\nfunction getKeyValueTraverse(control) {\r\n  let keyValue = {};\r\n  keyValue[control.name] = getValueTraverse(control);\r\n  return keyValue\r\n}\r\n\r\nfunction getValueTraverse(control) {\r\n  //console.log(control);\r\n  if (control.controlType === 'control') {\r\n    if (control.customValueFn)\r\n      return control.customValueFn(control, helperFns);\r\n\r\n    return control.value;\r\n  } else if (control.controlType === 'group') {\r\n    if (control.customValueFn)\r\n      return control.customValueFn(control, helperFns);\r\n\r\n    let value = {};\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      value = { ...value, ...getKeyValueTraverse(control.controls[i]) };\r\n    }\r\n    return value;\r\n  } else if (control.controlType === 'array') {\r\n    if (control.customValueFn)\r\n      return control.customValueFn(control, helperFns);\r\n\r\n    const array = [];\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      array.push(getValueTraverse(control.controls[i]))\r\n    }\r\n    return array;\r\n  }\r\n  return null;\r\n}\r\n\r\nexport function getFiles(root) {\r\n  //console.log(root)\r\n  return getFilesTraverse(root);\r\n}\r\n\r\nfunction getFilesTraverse(control) {\r\n  if (control.controlType === 'control') {\r\n    return control.files ? [{ name: control.name, files: control.files }] : [];\r\n  } else if (control.controlType === 'group') {\r\n    let files = [];\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      files.push(...getFilesTraverse(control.controls[i]));\r\n    }\r\n    return files;\r\n  } else if (control.controlType === 'array') {\r\n    let files = [];\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      files.push(...getFilesTraverse(control.controls[i]));\r\n    }\r\n    return files;\r\n  }\r\n  return [];\r\n}","//import uuid from 'uuid/v4';\r\nimport shortid from 'shortid';\r\nimport * as formModelHelper from './formModelHelper';\r\n\r\n//#region helpers\r\nfunction findIndexById(id) {\r\n  for (let i = 0; i < this.controls.length; i++) {\r\n    if (this.controls[i].id === id) return i;\r\n  }\r\n  return -1;\r\n}\r\n//#endregion\r\n\r\nconst group = (controls) => {\r\n  const controlArray = [];\r\n  //console.log('group', controls, typeof controls);\r\n  if (controls && typeof controls === 'object') {\r\n    Object.keys(controls).forEach(key => {\r\n      controlArray.push(abstractControl(key, controls[key]))\r\n    })\r\n  }\r\n\r\n  const ctrl = {\r\n    controlType: 'group',\r\n    id: shortid(),\r\n    controls: controlArray,\r\n    find: (name) => controlArray.find((x) => x.name === name),\r\n    customValueFn: null, // function\r\n    disableValidators: false\r\n  }\r\n  ctrl.getValue = () => formModelHelper.getValue(ctrl)\r\n  ctrl.controls.forEach(x => x.parent = ctrl)\r\n\r\n  return ctrl\r\n}\r\n\r\nconst array = (controls) => {\r\n  //console.log('array', controls);\r\n  const ctrl = {\r\n    controlType: 'array',\r\n    id: shortid(),\r\n    controls: controls,\r\n    findIndexById: findIndexById\r\n  }\r\n  ctrl.getValue = () => formModelHelper.getValue(ctrl)\r\n  ctrl.controls.forEach(x => x.parent = ctrl)\r\n\r\n  return ctrl\r\n}\r\n\r\nconst abstractControl = (name, controlObject) => {\r\n  //console.log('abstractControl', name, controlObject);\r\n  if (!controlObject) return null;\r\n  // array or group\r\n  if (controlObject.controlType) {\r\n    controlObject.name = name;\r\n    return controlObject;\r\n  } else {\r\n    return control(name, controlObject)\r\n  }\r\n}\r\n\r\nconst control = (name, [value, validators, controlOptions]) => {\r\n  //const { label, type, options, style } = controlOptions || {};\r\n  //console.log(value, validators, label, type, options)\r\n  return {...{\r\n    controlType: 'control',\r\n    id: shortid(),\r\n    name: name,\r\n    value: value,\r\n    validators: validators || [],\r\n    touched: false,\r\n    incomplete: false,\r\n    findValidator: (type) => (validators || []).find((x) => x.type === type),\r\n    // label: label,\r\n    // type: type,\r\n    // options: options,\r\n    // style: style\r\n  }, ...controlOptions};\r\n}\r\n\r\nexport default { group, array }","import utils from '../../utils';\r\n\r\nexport function hasRequiredValidator(control) {\r\n  if (!control) return false;\r\n  return !!control.findValidator('required')\r\n}\r\n\r\nexport function getNameForValidator(label, name) {\r\n  return utils.text.toFieldName(label || name);\r\n}\r\n\r\nexport function getValidatorOptions(params) {\r\n  const defaultOpt = { continueToValidate: false }\r\n  return params ? { ...defaultOpt, ...params } : defaultOpt;\r\n}\r\n\r\nexport function createValidator(type, message, opt, validate) {\r\n  const validator =\r\n  {\r\n    type: type,\r\n    disabled: false,\r\n    ...getValidatorOptions(opt),\r\n    message: message,\r\n    validate: validate\r\n  }\r\n  return validator;\r\n}","import { createValidator, getNameForValidator } from '../validatorHelper';\r\n\r\nexport function Required(message = null, opt = null) {\r\n  return createValidator('required', message, opt, function(control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return isEmpty(control.value) ? (message || (getNameForValidator(control.label, control.name) + ' is required.')) : null\r\n  })\r\n}\r\n\r\nfunction isEmpty(val) {\r\n  if (Array.isArray(val))\r\n    return val.length === 0;\r\n  return !val && val !== 0;\r\n}\r\n","import { createValidator, getNameForValidator } from '../validatorHelper';\r\n\r\nexport function Email(message = null, opt = null) {\r\n  return createValidator('email', message, opt, function(control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    // only validate for blur keydown tab\r\n    if (e && e.type === 'change') return null;\r\n    return !isEmpty(control.value) && !isValidEmail(control.value) ? (message || (getNameForValidator(control.label, control.name) + ' - Invalid email.')) : null\r\n  })\r\n}\r\n\r\n\r\nexport const isValidEmail = mail => {\r\n  const regex = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n  return regex.test(mail);\r\n}\r\n\r\nfunction isEmpty(val) {\r\n  if (Array.isArray(val))\r\n    return val.length === 0;\r\n  return !val && val !== 0;\r\n}\r\n","import { createValidator, getNameForValidator } from '../validatorHelper';\r\nimport utils from '../../../utils';\r\n\r\nexport function ValidateDate(message = null, opt = null) {\r\n  return createValidator('date', message, opt, function (control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return !isDate(control.value) ? message || getNameForValidator(control.label, control.name) + ' is invalid.' : null;\r\n  });\r\n}\r\n\r\nexport function PastDate(message = null, opt = null) {\r\n  return createValidator('past-date', message, opt, function (control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return !isPast(control.value) ? message || getNameForValidator(control.label, control.name) + ' is invalid.' : null;\r\n  });\r\n}\r\n\r\nexport function PastDateNullAllowed(message = null, opt = null) {\r\n  return createValidator('past-date', message, opt, function (control, e, validateOpt) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return control.value && !isPast(control.value) ? message || getNameForValidator(control.label, control.name) + ' is invalid.' : null;\r\n  });\r\n}\r\n\r\nfunction isDate(val) {\r\n  if (val) {\r\n    const date = utils.date.toDate(val);\r\n    return !!date;\r\n  }\r\n  return false;\r\n}\r\n\r\nfunction isPast(val) {\r\n  if (val) {\r\n    const date = utils.date.toDate(val);\r\n    //console.log(date, typeof date)\r\n    if (date) {\r\n      const now = new Date();\r\n      return date.getTime() < now.getTime();\r\n    }\r\n  }\r\n  return false;\r\n}\r\n","import { createValidator, getNameForValidator } from '../validatorHelper';\r\n\r\nexport function Length(message = null, opt = null) {\r\n  return createValidator('email', message, opt, function(control, e, validateOpt, validator) {\r\n    if (validateOpt.triggeredByChange && control.incomplete) return null;\r\n    return !isValidLength(control.value, validator) ? (message || (getNameForValidator(control.label, control.name) + ' - Invalid length.')) : null\r\n  })\r\n}\r\n\r\n\r\nexport const isValidLength = (text, validator) => {\r\n  const length = (text || '').length;\r\n  if (validator.min && length < validator.min) return false;\r\n  if (validator.max && length > validator.max) return false;\r\n  return true;\r\n}\r\n","import { Required } from './validators/required';\r\nimport { Email } from './validators/email';\r\nimport { ValidateDate, PastDate, PastDateNullAllowed } from './validators/date';\r\nimport { Length } from './validators/length';\r\n\r\nconst validateControl = (control, e, validateOpt) => {\r\n  const errors = [];\r\n  const validators = control.validators || [];\r\n  for (let i = 0; i < validators.length; i++) {\r\n    const validator = validators[i];\r\n    if (!validator.disabled) {\r\n      const error = validator.validate && validator.validate(control, e, validateOpt, validator);\r\n      if (error) {\r\n        errors.push(error);\r\n        //console.log(error, control, validator, e)\r\n\r\n        if (!validator.continueToValidate) break;\r\n      }\r\n    }\r\n  }\r\n  control.errors = errors;\r\n  return errors;\r\n};\r\n\r\nexport default {\r\n  Required,\r\n  Email,\r\n  Date: ValidateDate,\r\n  PastDate,\r\n  PastDateNullAllowed,\r\n  Length,\r\n  validateControl,\r\n};\r\n","import utils from '../../utils';\r\nimport React from 'react';\r\nimport { hasRequiredValidator } from './validatorHelper';\r\n\r\nexport function getLabel(control, formOption) {\r\n  //console.log(label, label == null, label === null, name, label || name)\r\n  const { label, name } = control\r\n  const requiredMark = hasRequiredValidator(control) && (formOption.requiredMark || '*')\r\n  if (label === null) return \"\";\r\n  return <>\r\n    <span dangerouslySetInnerHTML={{ __html: label || utils.text.toFieldName(name) }}></span>\r\n    {requiredMark && <span className=\"req\">{requiredMark}</span>}\r\n  </>;\r\n}\r\n\r\nexport function getLabelAsString(control, formOption) {\r\n  //console.log(label, label == null, label === null, name, label || name)\r\n  const { label, name } = control\r\n  const requiredMark = hasRequiredValidator(control) && (formOption.requiredMark || '*')\r\n  if (label === null) return \"\";\r\n  \r\n  return (label || utils.text.toFieldName(name)) + (requiredMark ? requiredMark : '');\r\n}","import React from 'react';\r\n\r\nconst ValidationAlert = ({ errors }) => {\r\n    if (!errors || errors.length === 0) return null;\r\n    return <div className=\"invalid\" role=\"alert\" dangerouslySetInnerHTML={{ __html: errors.join('<br/>') }}></div>\r\n}\r\n\r\nexport default ValidationAlert;","import * as React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel, getLabelAsString } from '../formRenderHelper';\r\n\r\nfunction TextInput({ control, handleChange, formOption }) {\r\n    const { name, label, type, value, errors, style, helpText, attrs } = control;\r\n    //const { template = 'bootstrap', usePlaceholder = false } = formOption;\r\n    const fieldId = utils.random.shortId();\r\n    const { usePlaceholder = false } = formOption;\r\n    const fieldLabel = getLabel(control, formOption);\r\n    //console.log(control, formOption)\r\n    const placeHolder = usePlaceholder ? getLabelAsString(control, formOption) : null;\r\n    let valueStr = value === 0 ? 0 : (value || \"\");\r\n    if (type === 'date' && value) {\r\n        valueStr = utils.date.formatYYYYMMDD(value);\r\n    }\r\n\r\n    let prependText = null;\r\n    if (style && style.prependText) {\r\n        prependText = style.prependText\r\n    }\r\n    //console.log(name, !!(style && style.autoFocus))\r\n    //const autoFocus = !!(style && style.autoFocus)\r\n\r\n    function keyDown(e) {\r\n        //console.log(e.key)\r\n        if (e.key === \"Enter\" || e.key === 'Tab') {\r\n            handleChange(e, control)\r\n        }\r\n    }\r\n    function changed(e) {\r\n        //console.log('changed', name, e.target.value)\r\n        handleChange(e, control)\r\n    }\r\n    function blur(e) {\r\n        //console.log('blur', name, e.target.value)\r\n        handleChange(e, control)\r\n    }\r\n\r\n    // function focus(e) {\r\n    //     console.log('focus', name, e.target.value)\r\n    // }\r\n\r\n    return (\r\n        <div className={`ff ff--${type} form-group ${style && style.className}`}>\r\n            {!usePlaceholder && fieldLabel && <label htmlFor={fieldId} className=\"label\">{fieldLabel}</label>}\r\n            <div className={`ff__input ${prependText && 'input-group'}`}>\r\n                {prependText && <div className=\"input-group-prepend\">\r\n                    <div className=\"input-group-text\">{prependText}</div>\r\n                </div>\r\n                }\r\n\r\n                <input id={fieldId} name={name} type={type} value={valueStr} //onChange={(e) => handleChange(e, control)} \r\n                    // onBlur={(e) => handleChange(e, control, true)}\r\n                    onChange={changed}\r\n                    onKeyDown={keyDown}\r\n                    onBlur={blur}\r\n                    autoComplete=\"new-password\"\r\n                    //onFocus={focus}\r\n                    //autoFocus={autoFocus}\r\n                    placeholder={placeHolder}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs} />\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default TextInput;","import React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nfunction RadioListInput({ control, handleChange, formOption }) {\r\n    const { name, label, value, errors, style, options, helpText, attrs } = control;\r\n    const fieldId = utils.random.shortId();\r\n    const fieldLabel = getLabel(control, formOption);\r\n    return (\r\n        <div className={`ff ff--radiolist form-group ${style && style.className}`}>\r\n            {fieldLabel && <label className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input controlOptions\">\r\n                {options && options.map((option, index) =>\r\n                    <div className={`form-check ${style && style.inline && 'form-check-inline'}`} key={option.value}>\r\n                        <input className=\"form-check-input\" name={name} type=\"radio\"\r\n                            checked={checked(value, option.value)}\r\n                            onChange={(e) => handleChange(e, control)}\r\n                            value={option.value} id={fieldId + '_' + index} {...attrs} />\r\n                        <label className=\"form-check-label\" htmlFor={fieldId + '_' + index}>\r\n                            {option.name}\r\n                        </label>\r\n                        {\r\n                            (option.helpText && option.helpText !== '') &&\r\n                            <label className={`form-check-label help-text ${(option.id && option.id !== '') && option.id}`}>\r\n                                {option.helpText}\r\n                            </label>\r\n                        }\r\n                    </div>)}\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nfunction checked(value, optionValue) {\r\n    if (optionValue === null || typeof optionValue === 'undefined') return false;\r\n    return value === optionValue;\r\n}\r\n\r\nexport default RadioListInput;","import React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nconst CheckboxListInput = ({ control, handleChange, formOption }) => {\r\n    const { name, label, value, errors, style, options, helpText, attrs } = control;\r\n    const fieldId = utils.random.shortId();\r\n    const fieldLabel = getLabel(control, formOption);\r\n    const values = value ? [...value] : [];\r\n    return (\r\n        <div className={`ff ff--checkbox form-group ${style && style.className}`}>\r\n            {fieldLabel && <label className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input\">\r\n                <div className=\"controlOptions\">\r\n                    {options && options.map((option, index) =>\r\n                        <div className={`form-check ${style && style.inline && 'form-check-inline'}`} key={option.value} >\r\n                            <input className=\"form-check-input\" name={name} type=\"checkbox\"\r\n                                checked={checked(values, option.value)}\r\n                                onChange={(e) => handleChange(e, control)}\r\n                                value={option.value} id={fieldId + '_' + index} {...attrs}/>\r\n                            <label className=\"form-check-label\" htmlFor={fieldId + '_' + index}>\r\n                                {option.name}\r\n                            </label>\r\n                        </div>)}\r\n\r\n                </div>\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nfunction checked(values, value) {\r\n    if (value === null || typeof value === 'undefined') return false;\r\n    return values.includes(value);\r\n}\r\n\r\nexport default CheckboxListInput;","import * as React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nfunction DateSeparateInput({ control, handleChange, formOption }) {\r\n    //const { name, label, value, errors, style } = control;\r\n    const { name, label, errors, style, helpText, attrs } = control;\r\n    const thisYear = (new Date()).getFullYear();\r\n    //console.log(name, value)\r\n    const [year, setYear] = React.useState('')\r\n    const [month, setMonth] = React.useState('')\r\n    const [day, setDay] = React.useState('')\r\n\r\n    //const { template = 'bootstrap', usePlaceholder = false } = formOption;\r\n    const fieldId = utils.random.shortId();\r\n    const { usePlaceholder = false } = formOption;\r\n    const fieldLabel = getLabel(control, formOption);\r\n    //console.log(label, name + '|'+ fieldLabel)\r\n    //const placeHolder = usePlaceholder ? fieldLabel : null;\r\n    // let valueStr = value === 0 ? 0 : (value || \"\");\r\n    // if (type === 'date' && value) {\r\n    //     valueStr = utils.date.formatYYYYMMDD(value);\r\n    // }\r\n\r\n    function handleChangeDay(e) {\r\n        setDay(e.target.value)\r\n        handleChangeInner(year, month, e.target.value)\r\n    }\r\n\r\n    function handleChangeMonth(e) {\r\n        setMonth(e.target.value)\r\n        handleChangeInner(year, e.target.value, day)\r\n    }\r\n\r\n    function handleChangeYear(e) {\r\n        setYear(e.target.value)\r\n        handleChangeInner(e.target.value, month, day)\r\n    }\r\n\r\n    function handleChangeInner(yyyy, mm, dd) {\r\n        control.incomplete = !(yyyy !== '' && mm !== '' && dd !== '')\r\n        const newVal = yyyy + '-' + mm + '-' + dd;\r\n        //console.log(newVal)\r\n        //mimic event\r\n        handleChange({\r\n            persist: () => { },\r\n            target: { name: name, value: newVal, checked: false }\r\n        }, control)\r\n    }\r\n\r\n    //const monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\r\n    const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n    const selectStyle = { width: 'auto', display: 'inline-block', marginRight: '0.5em' };\r\n\r\n    const fromYear = style && style.recentYear ? thisYear : thisYear - 10;\r\n    const recentYear = style && style.recentYear ? style.recentYear : 100;\r\n    return (\r\n        <div className=\"ff ff--dateSeperate form-group\">\r\n            {!usePlaceholder && fieldLabel && <label htmlFor={fieldId} className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input\">\r\n                <select style={selectStyle} id={`day_${fieldId}`} value={day} onChange={(e) => handleChangeDay(e)}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}>\r\n                    <option value=''>Day</option>\r\n                    {[...Array(31).keys()].map(i => i + 1).map(d => <option key={d} value={d}>{d}</option>)}\r\n                </select>\r\n                <select style={selectStyle} id={`month_${fieldId}`} value={month} onChange={(e) => handleChangeMonth(e)}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}>\r\n                    <option value=''>Month</option>\r\n                    {[...Array(12).keys()].map(m => <option key={m} value={m + 1}>{months[m]}</option>)}\r\n                </select>\r\n                <select style={selectStyle} id={`year_${fieldId}`} value={year} onChange={(e) => handleChangeYear(e)}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}>\r\n                    <option value=''>Year</option>\r\n                    {[...Array(recentYear).keys()].map(y => fromYear - y).map(y => <option key={y} value={y}>{y}</option>)}\r\n                </select>\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default DateSeparateInput;","import * as React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nfunction FileInput({ control, handleChange, formOption }) {\r\n    const { name, label, type, value, errors, style, helpText, attrs } = control;\r\n    //const { template = 'bootstrap', usePlaceholder = false } = formOption;\r\n    const fieldId = utils.random.shortId();\r\n    const { usePlaceholder = false } = formOption;\r\n    const fieldLabel = getLabel(control, formOption);\r\n    //console.log(label, control)\r\n    const placeHolder = usePlaceholder ? fieldLabel : null;\r\n    let valueStr = value === 0 ? 0 : (value || \"\");\r\n    if (type === 'date' && value) {\r\n        valueStr = utils.date.formatYYYYMMDD(value);\r\n    }\r\n    return (\r\n        <div className={`ff ff--file form-group ${style && style.className}`}>\r\n            {!usePlaceholder && fieldLabel && <label htmlFor={fieldId} className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input\">\r\n                <input style={{display: 'none'}} id={fieldId} name={name} type='file' value={valueStr} onChange={(e) => handleChange(e, control)} onBlur={(e) => handleChange(e, control)}\r\n                    placeholder={placeHolder}\r\n                    className={\"form-control-file\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}/>\r\n                <div className='choose-file-container'>\r\n                    <label htmlFor={fieldId} className='choose-file-label'> CHOOSE FILE </label>\r\n                    <div className='file__attach__text'> \r\n                        { valueStr === '' ? 'No File Chosen' : valueStr.replace(/^.*\\\\/, \"\")}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default FileInput;","import TextInput from './TextInput';\r\nimport RadioListInput from './RadioListInput';\r\nimport TextareaInput from './TextareaInput';\r\nimport CheckboxInput from './CheckboxInput';\r\nimport CheckboxListInput from './CheckboxListInput';\r\nimport SelectInput from './SelectInput';\r\nimport HiddenInput from './HiddenInput';\r\n//import HtmlInput from './HtmlInput';\r\nimport DateSeparateInput from './DateSeparateInput';\r\nimport FileInput from './FileInput';\r\n\r\nconst Components = { TextInput, RadioListInput, TextareaInput, CheckboxInput, CheckboxListInput, SelectInput, HiddenInput, DateSeparateInput, FileInput };\r\n\r\nconst capitalize = expression => expression.charAt(0).toUpperCase() + expression.slice(1);\r\n\r\nexport function getControl(control, formOption) {\r\n  let Component = null;\r\n  if (control.type === 'number' || control.type === 'email' || control.type === 'date' || control.type === 'password' || control.type === 'tel')\r\n    Component = TextInput;\r\n  else if (control.type === \"dob\")\r\n    Component = DateSeparateInput;\r\n  else\r\n    Component = Components[capitalize(control.type || '') + 'Input'];\r\n\r\n  return Component;\r\n}\r\n\r\n","import React from \"react\";\r\nimport ValidationAlert from \"../components/ValidationAlert\";\r\nimport utils from \"../../../utils\";\r\nimport { getLabel, getLabelAsString } from \"../formRenderHelper\";\r\n\r\nfunction TextareaInput({ control, handleChange, formOption }) {\r\n  const { name, label, type, value, errors, style, helpText, attrs } = control;\r\n  const fieldId = utils.random.shortId();\r\n  const fieldLabel = getLabel(control, formOption);\r\n  //const { template = 'bootstrap', usePlaceholder = false } = formOption;\r\n  const { usePlaceholder = false } = formOption;\r\n  const placeHolder = usePlaceholder\r\n    ? getLabelAsString(control, formOption)\r\n    : null;\r\n  const valueStr = value === 0 ? 0 : value || \"\";\r\n\r\n  const textAreaRef = React.useRef(null);\r\n  const [textAreaHeight, setTextAreaHeight] = React.useState(\"auto\");\r\n  const [parentHeight, setParentHeight] = React.useState(\"auto\");\r\n\r\n  React.useEffect(() => {\r\n    const disableAutoHeight = (style && style.disableAutoHeight) || false;\r\n    if (!disableAutoHeight) {\r\n      if (textAreaRef.current) {\r\n        const h =\r\n          textAreaRef.current.scrollHeight > 60\r\n            ? textAreaRef.current.scrollHeight\r\n            : 60;\r\n        setParentHeight(`${h}px`);\r\n        setTextAreaHeight(`${h}px`);\r\n      }\r\n    }\r\n  }, [valueStr, style]);\r\n\r\n  function onChangeInternal(e) {\r\n    const disableAutoHeight = (style && style.disableAutoHeight) || false;\r\n    if (!disableAutoHeight) {\r\n      setTextAreaHeight(\"auto\");\r\n      if (textAreaRef.current) {\r\n        const h =\r\n          textAreaRef.current.scrollHeight > 60\r\n            ? textAreaRef.current.scrollHeight\r\n            : 60;\r\n        setParentHeight(`${h}px`);\r\n      }\r\n    }\r\n    handleChange(e, control);\r\n  }\r\n\r\n  return (\r\n    <div className={`ff ff--textarea form-group ${style && style.className}`}>\r\n      {!usePlaceholder && fieldLabel && (\r\n        <label htmlFor={fieldId} className=\"label\">\r\n          {fieldLabel}\r\n        </label>\r\n      )}\r\n      <div className=\"ff__input\" style={{ minHeight: parentHeight }}>\r\n        <textarea\r\n          id={fieldId}\r\n          name={name}\r\n          value={valueStr}\r\n          type={type}\r\n          onChange={onChangeInternal}\r\n          placeholder={placeHolder}\r\n          rows={style && style.rows}\r\n          ref={textAreaRef}\r\n          style={{ height: textAreaHeight }}\r\n          className={\r\n            \"form-control\" + (errors && errors.length > 0 ? \" is-invalid\" : \"\")\r\n          }\r\n          {...attrs}\r\n        ></textarea>\r\n      </div>\r\n      {helpText && (\r\n        <div\r\n          className=\"ff__help\"\r\n          dangerouslySetInnerHTML={{ __html: helpText }}\r\n        ></div>\r\n      )}\r\n      <ValidationAlert errors={errors} />\r\n    </div>\r\n  );\r\n}\r\n\r\nexport default TextareaInput;\r\n","import React from \"react\";\r\nimport ValidationAlert from \"../components/ValidationAlert\";\r\nimport utils from \"../../../utils\";\r\nimport { getLabel } from \"../formRenderHelper\";\r\nimport { SiteLink } from \"../../../components\";\r\n\r\nconst CheckboxInput = ({ control, handleChange, formOption }) => {\r\n  const {\r\n    name,\r\n    label,\r\n    type,\r\n    value,\r\n    errors,\r\n    style,\r\n    helpText,\r\n    attrs,\r\n    link,\r\n    linkText,\r\n  } = control;\r\n  const fieldId = utils.random.shortId();\r\n  const fieldLabel = getLabel(control, formOption);\r\n  return (\r\n    <div className={`form-group form-check ${style && style.className}`}>\r\n      <input\r\n        id={fieldId}\r\n        name={name}\r\n        type={type}\r\n        value={value || \"\"}\r\n        checked={value || false}\r\n        onChange={(e) => handleChange(e, control)}\r\n        className={\"form-check-input\"}\r\n        {...attrs}\r\n      />\r\n      <label htmlFor={fieldId} className=\"form-check-label\">\r\n        {fieldLabel}\r\n        {link &&\r\n          link !== \"\" &&\r\n          linkText &&\r\n          linkText !== \"\" &&\r\n          (link.includes(\".pdf\") ? (\r\n            <a href={link} className=\"checkbox_link_text\">\r\n              {\" \"}\r\n              {linkText}{\" \"}\r\n            </a>\r\n          ) : (\r\n            <SiteLink to={link} className=\"checkbox_link_text\">\r\n              {\" \"}\r\n              {linkText}{\" \"}\r\n            </SiteLink>\r\n          ))}\r\n      </label>\r\n\r\n      {helpText && (\r\n        <div\r\n          className=\"ff__help\"\r\n          dangerouslySetInnerHTML={{ __html: helpText }}\r\n        ></div>\r\n      )}\r\n      <ValidationAlert errors={errors} />\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default CheckboxInput;\r\n","import React from 'react';\r\nimport ValidationAlert from '../components/ValidationAlert';\r\nimport utils from '../../../utils';\r\nimport { getLabel } from '../formRenderHelper';\r\n\r\nfunction SelectInput({ control, handleChange, formOption }) {\r\n    const { name, label, type, value, errors, style, options, helpText, attrs } = control;\r\n    const fieldId = utils.random.shortId();\r\n    const fieldLabel = getLabel(control, formOption);\r\n    //console.log(value, typeof value)\r\n    return (\r\n        <div className={`ff ff--select form-group ${style && style.className}`}>\r\n            {fieldLabel && <label htmlFor={fieldId} className=\"label\">{fieldLabel}</label>}\r\n            <div className=\"ff__input\">\r\n                <select id={fieldId} name={name} type={type} value={value === null? '' : value } onChange={(e) => handleChange(e, control)}\r\n                    className={\"form-control\" + (errors && errors.length > 0 ? ' is-invalid' : '')} {...attrs}>\r\n                    {options && options.map(option => <option key={option.value} value={option.value} disabled={!!option.disabled}>{option.name}</option>)}\r\n                </select>\r\n            </div>\r\n            {helpText && <div className=\"ff__help\" dangerouslySetInnerHTML={{ __html: helpText }}></div>}\r\n            <ValidationAlert errors={errors} />\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default SelectInput;\r\n\r\n","import * as React from 'react';\r\nimport utils from '../../../utils';\r\n\r\nfunction TextInput({ control, handleChange, formOption }) {\r\n    const { name, value } = control;\r\n    const fieldId = utils.random.shortId();\r\n    let valueStr = value === 0 ? 0 : (value || \"\");\r\n\r\n\r\n    return (\r\n        <input id={fieldId} name={name} type=\"hidden\" value={valueStr} />\r\n    )\r\n}\r\n\r\nexport default TextInput;","import React from 'react';\r\nimport * as formModelHelper from './formModelHelper';\r\nimport { getControl } from './controls';\r\nimport { getSiteControl } from '../../form';\r\n\r\nexport function renderControlDirect(control, handleChange, formOption) {\r\n  if (control === null) return null;\r\n  let Component = getSiteControl(control, formOption) || getControl(control, formOption);\r\n  if (!Component) return control.value;\r\n  return <Component key={control.name} control={control} handleChange={handleChange} formOption={formOption} />;\r\n}\r\n\r\n\r\nexport function renderControl(formRoot, nameOrIndex, handleChange, formOption) {\r\n  //console.log(formRoot, name);\r\n  const control = formModelHelper.findControl(nameOrIndex, formRoot);\r\n  //console.log(control, formRoot, name, handleChange, formOption)\r\n  if (control) {\r\n    return renderControlDirect(control, handleChange, formOption);\r\n  }\r\n}\r\n\r\nexport default { renderControl, renderControlDirect }","import validators from './validators';\r\n\r\nexport function validate(root, validateOpt = {}) {\r\n  //console.log({...{ triggeredByChange: false }, ...validateOpt})\r\n  //console.log(root, validateOpt)\r\n  const errors = validateTraverse(root, {...{ triggeredByChange: false }, ...validateOpt});\r\n  return errors;\r\n}\r\n\r\nfunction validateTraverse(control, validateOpt) {\r\n  if (!control) return [];\r\n  //console.log(!!control.disableValidators, control)\r\n  if (!!control.disableValidators) { control.errors =[]; return []; }\r\n  const errors = [];\r\n  const errorsFromControl = validators.validateControl(control, null, validateOpt);\r\n  errors.push(...errorsFromControl);\r\n  //console.log(errorsFromControl, errors)\r\n  if (control.controls && control.controls.length > 0) {\r\n    for (let i = 0; i < control.controls.length; i++) {\r\n      const errorsFromSub = validateTraverse(control.controls[i], validateOpt);\r\n      errors.push(...errorsFromSub);\r\n    }\r\n  }\r\n  control.errors = errors;\r\n  return errors;\r\n}\r\n\r\n","import { useState } from 'react';\r\nimport controlRenderer from './controlRenderer';\r\nimport * as formModelHelper from './formModelHelper';\r\nimport * as formValidate from './formValidate';\r\nimport validators from './validators';\r\n\r\nconst useForm = (initialFormModel, option) => {\r\n  const [formModel, setFormModel] = useState(initialFormModel);\r\n  const formOption = {\r\n    ...{\r\n      template: 'bootstrap',\r\n      usePlaceholder: false,\r\n      requiredMark: '*',\r\n      onControlChanged: null\r\n    }, ...option\r\n  };\r\n\r\n  const handleChange = (e, controlFromEvent) => {\r\n    e.persist();\r\n    const control = controlFromEvent || formModelHelper.findControl(e.target.name, formModel);\r\n    //console.log(control)\r\n    // const control = controlId? formModelHelper.findControlById(controlId, formModel)\r\n    //   : formModelHelper.findControl(e.target.name, formModel);\r\n    if (!control) return;\r\n\r\n    //console.log(control.value, e.target)\r\n    control.touched = true;\r\n    control.value = getControlValue(control, e.target);\r\n    if (control.type === 'file') {\r\n      control.files = e.target.files\r\n    }\r\n\r\n    // parseInput(control);\r\n    if (control.onBeforeUpdateValue) {\r\n      control.onBeforeUpdateValue(control, formModel)\r\n    }\r\n\r\n    validators.validateControl(control, e, { triggeredByChange: true });\r\n    setFormModel({ ...formModel });\r\n\r\n    if (formOption.onControlChanged) {\r\n      formOption.onControlChanged(e, control)\r\n    }\r\n  };\r\n\r\n  const validateForm = (e, successHandler, errorHandler) => {\r\n    validateGroup(formModel, e, successHandler, errorHandler)\r\n  };\r\n\r\n  const validateGroup = (control, e, successHandler, errorHandler) => {\r\n    e && e.preventDefault();\r\n    const errors = formValidate.validate(control);\r\n\r\n    if (errors.length === 0) successHandler && successHandler();\r\n    else {\r\n      setFormModel({ ...formModel });\r\n      errorHandler && errorHandler(errors)\r\n    }\r\n  };\r\n\r\n  const reset = (model) => setFormModel(model ? { ...model } : { ...formModel });\r\n\r\n  // const parseInput = input => input.value = input.parseFun ? input.parseFun(input.value) : input.value;\r\n\r\n  const renderControl = (name, formRoot) => controlRenderer.renderControl(formRoot || formModel, name, handleChange, formOption);\r\n  const renderControlDirect = (control) => controlRenderer.renderControlDirect(control, handleChange, formOption);\r\n\r\n  const getValue = (formRoot) => formModelHelper.getValue(formRoot || formModel);\r\n\r\n  const getFiles = (formRoot) => formModelHelper.getFiles(formRoot || formModel);\r\n\r\n  const findControl = (name, formRoot) => {\r\n    const control = formModelHelper.findControl(name, formRoot || formModel);\r\n    return control;\r\n  }\r\n  //return [controls, handleChange, handleSubmit, getValue]\r\n  return {\r\n    model: formModel,\r\n    errors: formModel.errors,\r\n    reset: reset,\r\n    renderControl: renderControl,\r\n    renderControlDirect: renderControlDirect,\r\n    findControl: findControl,\r\n    validateForm: validateForm,\r\n    validateGroup: validateGroup,\r\n    getValue: getValue,\r\n    getFiles: getFiles\r\n  }\r\n};\r\n\r\nfunction getControlValue(control, el) {\r\n  //console.log(control, el)\r\n  if (control.type === 'checkboxList') {\r\n    const options = el.closest('.controlOptions');\r\n    if (options) {\r\n      return [...options.querySelectorAll('input:checked')].map(x => x.value)\r\n    }\r\n    return [];\r\n  }\r\n  else if (control.type === 'radioList') {\r\n    const options = el.closest('.controlOptions');\r\n    if (options) {\r\n      const val = [...options.querySelectorAll('input:checked')].map(x => x.value)\r\n      return val && val.length > 0 ? val[0] : null\r\n    }\r\n    return null;\r\n  }\r\n  return control.type === 'checkbox' ? el.checked : el.value;\r\n}\r\n\r\nexport { useForm };","//#region GTM\r\nexport const hasGTM = () => {\r\n  return !!(typeof window !== `undefined` && window.dataLayer);\r\n}\r\n\r\nexport const pageView = (url, pageTitle = null) => {\r\n  if (!hasGTM()) return;\r\n\r\n  const pageOpt = pageTitle ? {\r\n    path: url,\r\n    title: pageTitle\r\n  } : { path: url }\r\n  //console.log(url, pageOpt)\r\n  window.dataLayer.push({\r\n    event: 'pageview',\r\n    page: pageOpt\r\n  })\r\n}\r\n\r\n// \r\nexport const sendEvent = (eventName, params) => {\r\n  if (!hasGTM()) return;\r\n  window.dataLayer.push(Object.assign({ event: eventName }, params || {}))\r\n}\r\n\r\nexport const sendGAEvent = (category, action, label, value) => {\r\n  if (!hasGTM()) return;\r\n  window.dataLayer.push(Object.assign({ event: 'gaEvent' }, { category: category || '', action: action || '', label: label || '', value: value || '' }))\r\n}\r\n//#endregion\r\n\r\n\r\n","import { css } from '@emotion/core'\nimport { variables, mq } from '../../cssInJs';\nimport { darken } from 'polished';\n\nconst buttonColor = variables.primaryColor;\n\nconst baseStyle = {\n  button: mq({\n    color: 'white',\n    padding: '0.7rem 1.5rem 1rem 1.5rem',\n    position: 'relative',\n    overflow: 'hidden',\n    display: 'inline-block',\n    appearance: 'none',\n    '-webkit-appearance': 'none',\n    //margin: '0 0.5rem',\n    '&:hover .buttonBg': {\n      background: darken(0.1, buttonColor),\n    },\n    '&:hover': {\n      color: 'white',\n      textDecoration: 'none',\n    }\n  }),\n  buttonBg: {\n    transition: 'all 0.3s',\n    borderRadius: '100%',\n    position: 'absolute',\n    background: buttonColor,\n    right: '-200px',\n    left: '-200px',\n    top: '-200px',\n    content: '\"\"',\n    bottom: '0',\n    zIndex: '0',\n  },\n  buttonTxt: {\n    zIndex: '1',\n    position: 'relative',\n  }\n}\n\nconst smallStyle = {\n  button: css(baseStyle.button, {\n    fontSize: '0.85rem',\n    fontWeight: 600,\n    letterSpacing: 1,\n    padding: '0.3rem 1.5rem 0.3rem 1.5rem',\n    '&:hover .buttonBg': {\n      background: darken(0.1, buttonColor),\n    },\n  }),\n  buttonBg: css(baseStyle.buttonBg, {\n    background: buttonColor,\n  }),\n  buttonTxt: baseStyle.buttonTxt\n}\n\nexport function getButtonStyle(type) {\n  if (type === 'small') {\n    return smallStyle\n  }\n  return baseStyle\n} \n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport { getButtonStyle } from './buttonStyle';\n\nexport function FormButton({ onClick, status, children, buttonStyle, overridingStyle, to, ...other }) {\n  const s = getButtonStyle(buttonStyle);\n  const ss = overridingStyle || {};\n  return <a css={[s.button, ss.button]} href=\"/\" onClick={onClick} type=\"button\" disabled={status === 'pending'} {...other}>\n    <span css={[s.buttonBg, ss.buttonBg]} className=\"buttonBg\"></span>\n    <span css={[s.buttonTxt, ss.buttonTxt]}>\n      {status === 'pending' && <span className=\"spinner-grow spinner-grow-sm\" role=\"status\" aria-hidden=\"true\"></span>}\n      {children}</span>\n  </a>\n}\n","import React from 'react';\nimport env from '../../../env';\nimport { usePost } from '../../../components';\nimport { useForm } from '../../../form';\nimport { ErrorMessage } from '../../../components';\nimport { getModel } from './subscribeFormModel';\nimport { gtm } from '../../../lib/tracking';\nimport { FormButton } from '../../button/formButton';\nimport { variables } from 'cssInJs';\n\nimport { darken } from 'polished';\n\nexport function Subscribe() {\n\n  const model = getModel({});\n  const form = useForm(model, { usePlaceholder: true });\n  const [sendingStatus, setSendingStatus] = React.useState(null);\n  const post = usePost();\n\n  function onSubmit(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    form.validateForm(e, () => {\n      const value = { ...form.getValue() };\n      post.send(env.apiBase + \"/api/contact/subscribe\", value);\n      setSendingStatus('pending')\n    })\n  }\n\n\n  if (post.done() && sendingStatus === 'pending') {\n    var value = form.getValue();\n    gtm.sendEvent('subscribeFormSubmitted', {contactEmail: value.email} )\n    form.reset(model)\n    setSendingStatus(null)\n  }\n\n  const render = (name) => form.renderControl(name, null);\n\n  const overridingStyle = {\n    button: {\n      '&:hover .buttonBg': {\n        background: darken(0.1, variables.colorBlue),\n      },\n    },\n    buttonBg: {\n      background: variables.colorBlue,\n    },\n    buttonTxt: {\n      fontWeight: 900,\n      color: 'white'\n    },\n  }\n\n  return (\n    <form className=\"contactForm\">\n      <div className=\"form-row\">\n        <div className=\"col-md-6 mb-2\">{render('name')}</div>\n        {/* <div className=\"col-md-4 mb-2\">{render('phone')}</div> */}\n        <div className=\"col-md-6 mb-2\">{render('email')}</div>\n      </div>\n      <div className=\"form-row\">\n        <div className=\"col-md-12 mb-2\">\n          \n<p style={{ textAlign: 'center'}}>By subscribing to Ecotourism Australia’s monthly newsletter, you accept the terms of our <a href=\"/privacy\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy</a></p>\n          <div className=\"actions\">\n            <h4><FormButton onClick={onSubmit} status={post.status} overridingStyle={overridingStyle}>SUBSCRIBE NOW</FormButton></h4>\n            <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n            <ErrorMessage errors={post.errors} />\n            {post.done() && <span style={{marginLeft: '1.5rem', color:'red', fontWeight: 'bold'}}>Successfully registered!</span>}\n          </div>\n        </div>\n      </div>\n    </form>\n  );\n}","import { fb, validators } from '../../../lib/form';\n\nexport function getModel(data) {\n  const model = fb.group({\n    name: [data.name || '', [validators.Required()], { label: 'Name', type: 'text' }],\n    //phone: [data.phone || '', [validators.Required()], { label: 'Phone', type: 'text' }],\n    email: [data.email || '', [validators.Required(), validators.Email()], { label: 'Email', type: 'email' }],\n  }); \n  return model;\n}","import React from 'react';\nimport cmsUtils from '../cmsUtils';\nimport { Subscribe } from './subscribe';\n\nexport const renderRule = {\n  match: (item, cmsOption) => (cmsUtils.getCodeJson(item) || {})['control'] === 'subscribe', \n  itemElt: (item, cmsOption) => <Subscribe />\n}","import React from 'react';\nimport parse, { domToReact, attributesToProps } from 'html-react-parser';\nimport utils from '../../../../utils';\nimport env from '../../../../env';\n\n//https://github.com/remarkablemark/html-react-parser\n\nconst options = {\n  replace\n};\nlet _embedDataList = []\nlet _cmsOption = {}\n\nexport function renderHtml(html, cmsOption) {\n  _cmsOption = cmsOption\n  if (!cmsOption.isCmsEdit || cmsOption.cmsViewMode === 'viewonly') {\n    _embedDataList = cmsOption?.pageData?.embedDataList;\n    return parse(html || '', options)\n  } else {\n    return parse(html || '', {})\n  }\n}\n\nfunction replace(node) {\n  //console.log(node)\n  if (!env.isProd && node.type === 'tag' && node.name === 'img') {\n    return replaceImg(node)\n  } else if (node.type === 'tag' && node.attribs.class === 'button') {\n    return replaceButton(node)\n  } else if (node.type === 'tag' && node.attribs['data-embed-jaba']) {\n    return replaceEmbedCode(node)\n  }\n\n}\n\nfunction replaceImg(node) {\n  if (node.attribs && node.attribs.src) {\n    const props = attributesToProps(node.attribs)\n    props.src = utils.site.resourcePath(node.attribs.src)\n    // eslint-disable-next-line\n    return <img {...props} />\n  }\n  return null\n}\n\nfunction replaceButton(node) {\n  if (node.children && node.children.some(x => x.name === 'span')) return null;\n  const props = attributesToProps(node.attribs)\n  return React.createElement(node.name, props, <span>{domToReact(node.children, options)}</span>);\n}\n\nfunction replaceEmbedCode(node) {\n  const id = node.attribs['data-embed-jaba'];\n  const found = utils.array.find(_embedDataList, x => x.id === id);\n  if (found) {\n    //console.log(found)\n    return <div className={`codeType_${found.codeType}`}>{renderHtml(found.code, _cmsOption)}</div>\n  }\n  else return null;\n}","import React, { useRef } from 'react';\nimport cmsUtils from '../../cmsUtils';\nimport utils from '../../../../utils';\n\nimport { useRouter } from '../../../../components';\n\nimport { handleElementLink } from '../../../../components';\nimport env from '../../../../env';\nimport { renderHtml } from './renderHtml';\n\n//import { Document, Page } from 'react-pdf'\n//import { Document, Page } from 'react-pdf/dist/entry.webpack';\n\nexport function Html(props) {\n  const ver = env.ver;\n  const item = props.item;\n  //const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  const { history } = useRouter();\n  //const [ pdfViewPath, setPdfViewPath ] = React.useState(null)\n  //console.log('item', item, cmsOption);\n\n  const year = (new Date()).getFullYear();\n  let content = cmsOption.isCmsEdit? \n    cmsUtils.payload(item, 'Content'): \n    cmsUtils.payload(item, 'Content')\n      .replace(/__year__/g, year)\n      .replace(\"__version__\", \"<a href = '/app' class = 'app_version'> PWA \"+ ver +\"</a>\");\n\n\n  const cssClass = utils.classNames('cms_item', 'htmlPanel', cmsOption.isCmsEdit && 'html', item.cssClass || item.anchorName || '');\n\n  //let itemElt = (<div dangerouslySetInnerHTML={{ __html: content }}></div>);\n\n  function handleClick(e) {\n    \n    let target = \"\";\n    if(e.target.closest('a')){\n      target = e.target.closest('a').getAttribute('target');\n    }\n    const processed = (target === \"_blank\" ? handleElementLink(e.target, null) : handleElementLink(e.target));\n    //const link = utils.url.getLinkFromElement(e.target);\n    //console.log('clicked', e, e.target, processed);\n    \n    if (processed.handled) {\n      e.preventDefault();\n      e.stopPropagation();\n    } else if (processed.linkInfo && processed.linkInfo.type === 'internal') {\n      e.preventDefault();\n      e.stopPropagation();\n      history.push(processed.linkInfo.url)\n    } else {\n      //e.preventDefault();\n      //e.stopPropagation();\n      // setPdfViewPath(utils.site.resourcePath(link))\n\n      if(e.target.closest('a')){\n        let href = e.target.closest('a').getAttribute('href') + \"\";\n          if(href.indexOf('#') !== -1){\n          let _href = href.split('#');\n          console.log(\"_href\", _href);\n          let el = document.querySelector('section[data-cms-item-anchor=\"' + _href[1] + '\"]');\n          if (el) {\n            let anchorStatus = el.getAttribute('data-anchor-status');\n            if(anchorStatus === \"collapse\"){\n              el.setAttribute('data-anchor-status', 'expand');\n              el.classList.add(\"expand\");\n            }\n            else{\n              el.setAttribute('data-anchor-status', 'collapse');\n              el.classList.remove(\"expand\");\n            }\n          }\n          e.preventDefault();\n          e.stopPropagation(); \n        }\n      }\n\n    }\n  }\n\n  const htmlBlock = useRef(null);\n  return (\n    <>\n    <div ref={htmlBlock} className={cssClass} data-cms-html=\"true\"\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n      onClick={(e) => handleClick(e)}>\n        {renderHtml(content, cmsOption)}\n      </div>\n    </>\n  )\n}\n","import React from 'react';\nimport { Html } from './view/html';\n\nexport const renderRule = {\n  match: (item, cmsOption) => item.itemTypeCode === 'Html', \n  itemElt: (item, cmsOption) => <Html item={item} cmsOption={cmsOption} />\n}","import React from 'react';\nimport parse, { domToReact, attributesToProps } from 'html-react-parser';\nimport utils from '../../../../utils';\nimport env from '../../../../env';\n\n//https://github.com/remarkablemark/html-react-parser\n\nconst options = {\n  replace\n};\nlet _embedDataList = []\nlet _cmsOption = {}\n\nexport function renderHtml(html, cmsOption) {\n  _cmsOption = cmsOption\n  if (!cmsOption.isCmsEdit || cmsOption.cmsViewMode === 'viewonly') {\n    _embedDataList = cmsOption?.pageData?.embedDataList;\n    return parse(html || '', options)\n  } else {\n    return parse(html || '', {})\n  }\n}\n\nfunction replace(node) {\n  //console.log(node)\n  if (!env.isProd && node.type === 'tag' && node.name === 'img') {\n    return replaceImg(node)\n  } else if (node.type === 'tag' && node.attribs.class === 'button') {\n    return replaceButton(node)\n  } else if (node.type === 'tag' && node.attribs['data-embed-jaba']) {\n    return replaceEmbedCode(node)\n  }\n\n}\n\nfunction replaceImg(node) {\n  if (node.attribs && node.attribs.src) {\n    const props = attributesToProps(node.attribs)\n    props.src = utils.site.resourcePath(node.attribs.src)\n    // eslint-disable-next-line\n    return <img {...props} />\n  }\n  return null\n}\n\nfunction replaceButton(node) {\n  if (node.children && node.children.some(x => x.name === 'span')) return null;\n  const props = attributesToProps(node.attribs)\n  return React.createElement(node.name, props, <span>{domToReact(node.children, options)}</span>);\n}\n\nfunction replaceEmbedCode(node) {\n  const id = node.attribs['data-embed-jaba'];\n  const found = utils.array.find(_embedDataList, x => x.id === id);\n  if (found) {\n    //console.log(found)\n    return <div className={`codeType_${found.codeType}`}>{renderHtml(found.code, _cmsOption)}</div>\n  }\n  else return null;\n}","//import { css } from '@emotion/core'\n//import { mq, variables } from 'cssInJs'\n\nexport default{\n  container : {\n    position:'absolute',\n    width: '100%',\n    height: '85%',\n    top:'50%',\n    transform:'translateY(-50%)'\n  },\n  html__item : {\n    position: 'absolute',\n    '&.top' : {\n\n    },\n    '&.middle' : {\n      top:'50%',\n      transform:'translateY(-50%)',\n    },\n    '&.bottom' : {\n      \n    },\n    '&.left' : {\n      left: '5%',\n    },\n    '&.centre' : {\n      left: '50%',\n      transform:'translateX(-50%)'\n    },\n    '&.right' : {\n      \n    },\n    '&.middle.centre' : {\n      transform: 'translate(-50%, -50%)'\n    }\n  }\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport { useRef } from 'react';\nimport cmsUtils from '../../cmsUtils';\nimport utils from '../../../../utils';\nimport { useRouter } from '../../../../components';\nimport { handleElementLink } from '../../../../components';\nimport env from '../../../../env';\nimport { renderHtml } from './renderHtml';\nimport style from './htmlStyle';\n\nexport function Html(props) {\n  const ver = env.ver;\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n  const { history } = useRouter();\n  //const bgTheme = cmsUtils.payload(item, 'TextColorTheme') || 'white';\n  const bgColor = cmsUtils.payload(item, 'BgColor');\n  const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n  const backgroundTile = cmsUtils.payload(item, 'BackgroundTile');\n  const vertical = cmsUtils.payload(item, 'Vertical') || \"middle\"; //top, middle, bottom\n  const horizontal = cmsUtils.payload(item, 'Horizontal') || \"centre\"; // left, centre, right\n\n\n  console.log(\"item ---- \", item);\n\n  const year = (new Date()).getFullYear();\n  let content = cmsOption.isCmsEdit ?\n    cmsUtils.payload(item, 'Content') :\n    cmsUtils.payload(item, 'Content')\n      .replace(/__year__/g, year)\n      .replace(\"__version__\", \"<a href = '/app' class = 'app_version'> PWA \" + ver + \"</a>\");\n\n  const cssClassContainer = utils.classNames('html__container', item.cssClass || item.anchorName || '');\n  const cssClass = utils.classNames('cms_item', 'htmlPanel', vertical, horizontal, cmsOption.isCmsEdit && 'html');\n\n  let bgUrl = null;\n  if (imageUrl)\n    bgUrl = utils.site.resourcePath(imageUrl);\n  else if (backgroundTile)\n    bgUrl = utils.site.resourcePath(`/dist/transparent-textures/textures/${backgroundTile}`);\n\n  function handleClick(e) {\n\n    let target = \"\";\n    if (e.target.closest('a')) {\n      target = e.target.closest('a').getAttribute('target');\n    }\n    const processed = (target === \"_blank\" ? handleElementLink(e.target, null) : handleElementLink(e.target));\n    //const link = utils.url.getLinkFromElement(e.target);\n    //console.log('clicked', e, e.target, processed);\n\n    if (processed.handled) {\n      e.preventDefault();\n      e.stopPropagation();\n    } else if (processed.linkInfo && processed.linkInfo.type === 'internal') {\n      e.preventDefault();\n      e.stopPropagation();\n      history.push(processed.linkInfo.url)\n    } else {\n\n      if (e.target.closest('a')) {\n        let href = e.target.closest('a').getAttribute('href') + \"\";\n        if (href.indexOf('#') !== -1) {\n          let _href = href.split('#');\n          console.log(\"_href\", _href);\n          let el = document.querySelector('section[data-cms-item-anchor=\"' + _href[1] + '\"]');\n          if (el) {\n            let anchorStatus = el.getAttribute('data-anchor-status');\n            if (anchorStatus === \"collapse\") {\n              el.setAttribute('data-anchor-status', 'expand');\n              el.classList.add(\"expand\");\n            }\n            else {\n              el.setAttribute('data-anchor-status', 'collapse');\n              el.classList.remove(\"expand\");\n            }\n          }\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      }\n\n    }\n  }\n\n  const htmlBlock = useRef(null);\n  return (\n    <div css={style.container} className={cssClassContainer} style={{\n      backgroundColor: `${bgColor}`,\n      backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl)\n    }}>\n      <div style={{ position: 'relative', height: '100%' }}>\n        <div ref={htmlBlock} css={style.html__item} className={cssClass} data-cms-html=\"true\"\n          data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n          onClick={(e) => handleClick(e)}>\n          {renderHtml(content, cmsOption)}\n        </div>\n      </div>\n    </div>\n  )\n}","import React from 'react';\nimport { Html } from './view/html';\n\nexport const renderRule = {\n  match: (item, cmsOption) => item.itemTypeCode === 'HtmlV2', \n  itemElt: (item, cmsOption) => <Html item={item} cmsOption={cmsOption} />\n}","import facepaint from 'facepaint'\n//                  'sm', 'md', 'lg', 'xl', 'xxl'\nconst breakpoints = [576,  768,  992,  1200, 1600, 1900, 2200] \n\nexport const mqBanner = facepaint(\n  breakpoints.map(bp => `@media (min-width: ${bp}px)`)\n)\n\n//                                  576, 768, 992, 1200, 1600, 1900, 2200\nexport const bannerThin =     [180, 190, 200, 220, 250,  270,  290,  300]\nexport const bannerStandard = [350, 350, 400, 450, 500,  550,  600,  700]\n\nexport const getBannerSize = (setName) => {\n  if (setName === 'standard')\n    return bannerStandard\n  else if (setName === 'thin')\n    return bannerThin\n  else\n    return bannerStandard\n}","import { mqBanner, getBannerSize } from 'site/bannerSize/bannerSize';\n\nexport function getImageBannerStyle(heightSet) {\n  const bannerSize = getBannerSize(heightSet);\n\n  return {\n    bannerHeight: mqBanner({\n      height: bannerSize,\n      backgroundPositionX: 'center'\n    }),\n    photoCredit: mqBanner({\n      color: 'white',\n      fontSize: '0.8rem',\n      transform: 'rotate(-90deg) translate(-50%, 10px)',\n      position: 'absolute',\n      top: '50%',\n      left: '0',\n      textAlign: 'center',\n      transformOrigin: 'left top',\n      maxWidth: bannerSize.map(x => x * 0.9),\n      '&:hover, &:active': {\n        color: 'white'\n      }\n    })\n  }\n}","import React from 'react';\nimport { au } from 'components';\n\nexport function useParallax(panelRef, _settings) {\n  const [settings,] = React.useState(getSettings(_settings));\n  const handleScroll = () => {\n    //console.log('useParallax - scrolling')\n    onScroll(settings, panelRef.current);\n  }\n\n  const reset = () => {\n    //console.log('useParallax - reset');\n    setTimeout(() => { onResize(settings, panelRef.current); handleScroll(); }, 300)\n  }\n\n  React.useEffect(() => {\n\n    reset();\n    if (typeof window !== `undefined`) {\n      window.addEventListener('scroll', handleScroll)\n      window.addEventListener('resize', reset)\n    }\n    return () => {\n      if (typeof window !== `undefined`) {\n        window.removeEventListener('scroll', handleScroll)\n        window.removeEventListener('resize', reset)\n      }\n    }\n    // eslint-disable-next-line \n  }, []);\n  return { reset };\n}\n\nfunction getSettings(settings) {\n  const defaultSettings = {\n    cutoffPadding: 10,//px\n    paddingHeightRatio: 1,\n    stretchToFit: true,\n    actionRange: [0.1, 0.9],\n    imageRatio: 1080 / 1920,\n    panelHeight: 'auto',\n    cutTop: 0,\n    cutBottom: 0\n  }\n  return Object.assign({}, defaultSettings, settings);\n}\n\n\nexport function onResize(settings, el) {\n  const screenSize = au.getScreenSize();\n  const autoPanelHeight = !settings.panelHeight || settings.panelHeight === 'auto';\n  const panelHeight = autoPanelHeight ? el.offsetHeight : parseFloat(settings.panelHeight);\n  //console.log(autoPanelHeight, panelHeight)\n\n  let bgHeight = 0, bgWidth = 0;\n  bgHeight = panelHeight * (1 + settings.paddingHeightRatio) + 2 * settings.cutoffPadding;\n  bgWidth = (bgHeight * (1 + settings.cutTop + settings.cutBottom)) / settings.imageRatio;\n  //console.log(panelHeight, settings.paddingHeightRatio, bgHeight, bgWidth)\n  if (settings.stretchToFit && bgWidth < screenSize.width) {\n    // magnifying the background image to fix the full width of the browser\n    bgHeight = screenSize.width * settings.imageRatio;\n    bgWidth = (bgHeight * (1 + settings.cutTop + settings.cutBottom)) / settings.imageRatio;\n    //console.log('magnified', bgHeight, bgWidth, screenSize)\n  }\n  \n  const cutTopPx = bgHeight * (1 + settings.cutTop + settings.cutBottom) * settings.cutTop\n  const cutBottomPx = bgHeight * (1 + settings.cutTop + settings.cutBottom) * settings.cutBottom\n  let fromTop = -settings.cutoffPadding;\n  let toTop = -(bgHeight - panelHeight - settings.cutoffPadding);\n  fromTop += (fromTop - toTop) > cutTopPx ? cutTopPx : 0\n  toTop += (fromTop - toTop) > cutBottomPx ? cutBottomPx : 0\n  //console.log('shift', cutTopPx, cutBottomPx, bgHeight, fromTop, toTop)\n\n  el.setAttribute('data-fromTop', fromTop)\n  el.setAttribute('data-toTop', toTop)\n\n  if (!autoPanelHeight)\n    el.style.height = settings.panelHeight + 'px';\n\n  el.style.backgroundSize = bgWidth + 'px ' + bgHeight + 'px'\n}\n\nexport function onScroll(settings, el) {\n  const pr = au.getScrollProgress(el).progress;\n  //console.log(pr, panel.calculated);\n\n  const min = parseFloat(el.getAttribute('data-fromTop'));\n  const max = parseFloat(el.getAttribute('data-toTop'));\n  const top = au.prVal(min, max, pr, settings.actionRange/*[0, 1]*/);\n  //console.log(min, max, top);\n  el.style.backgroundPositionY = top + 'px'\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport React from 'react';\nimport cmsUtils from '../../cmsUtils';\nimport utils from 'utils';\nimport { SiteLink } from 'components';\nimport { getImageBannerStyle } from './imagePanelStyle';\nimport { useParallax } from 'site/useParallax/useParallax';\n\nexport function ImagePanel(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n  //console.log(cmsOption)\n  //console.log('item', item);\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n  const photoCredit = cmsUtils.payload(item, 'PhotoCredit');\n  const photoCreditUrl = cmsUtils.payload(item, 'PhotoCreditUrl');\n  const hideTop = cmsUtils.payload(item, 'HideTop') || '0';\n  const hideBottom = cmsUtils.payload(item, 'HideBottom') || '0';\n  \n  const cssClass = utils.classNames('cms_item', 'imagePanel', 'parallax_notused', `bannerSize_notused--${heightSet}`, item.cssClass || item.anchorName || '');\n  \n  const bgUrl = cmsOption.pageOptions && cmsOption.pageOptions.imagePath ?\n    utils.site.resourcePath(cmsOption.pageOptions.imagePath):\n    utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n  const htmlBlock = React.useRef(null);\n  const cssClass2 = utils.classNames('cms_item', 'htmlPanel', cmsOption.isCmsEdit && 'html', item.cssClass || item.anchorName || '');\n  const content = cmsUtils.payload(item, 'Content');\n\n  const parallaxSetting = {\n    cutoffPadding: 10,//px\n    paddingHeightRatio: 1,\n    stretchToFit: true,\n    actionRange: [0.1, 0.9],\n    imageRatio: 1080 / 1920,\n    panelHeight: 'auto',\n    cutTop: hideTop? parseFloat(hideTop) : 0,\n    cutBottom: hideBottom? parseFloat(hideBottom) : 0\n  }\n  //console.log(parallaxSetting)\n  \n  const panelRef = React.useRef(null);\n  useParallax(panelRef, parallaxSetting);\n\n  const s = getImageBannerStyle(heightSet);\n\n  return (\n    <div className={cssClass} css={s.bannerHeight} ref={panelRef}\n      style={{ backgroundImage: utils.css.bgUrlStyle(bgUrl) }}>\n      <div ref={htmlBlock} className={cssClass2} data-cms-html=\"true\" data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n        dangerouslySetInnerHTML={{ __html: content }}>\n      </div>\n      \n      {(photoCredit && !photoCreditUrl) && <div css={s.photoCredit}>{photoCredit}</div>}\n      {(photoCredit && photoCreditUrl) && <SiteLink to={photoCreditUrl} css={s.photoCredit}>{photoCredit}</SiteLink>}\n    </div>\n  );\n}\n","import React from 'react';\nimport { ImagePanel } from './view/imagePanel';\n\nexport const renderRule = {\n  match: (item, cmsOption) => item.itemTypeCode === 'ImagePanel', \n  itemElt: (item, cmsOption) => <ImagePanel item={item} cmsOption={cmsOption} />\n}","import { mq } from 'cssInJs'\n\nexport default {\n    container: mq({\n        //border: '1px solid red',\n        maxWidth: ['1700px'],\n        '.row': {\n            marginRight: '0px',\n            marginLeft: '0px'\n        },\n        '.col__item': {\n            paddingRight: '0',\n            paddingLeft: '0',\n        },\n        '.col__item.change__flex__order' : mq({\n            order:[\"2\", null,\"unset\"]\n        }),\n        '.bannerSize--standard, .bannerSize': mq({\n            height: ['450px']\n        }),\n    }),\n    html__wrapper: {\n        display: 'flex',\n        height: '100%',\n        justifyContent:'center',\n        flexDirection:'column'\n    },\n    html__container: {\n        //backgroundColor: variables.lightGray,\n        //height: '100%',\n        //flex: '1 0 auto',\n        //position: 'relative',\n        display: 'flex',\n        flexDirection: 'column',\n        height:'100%',\n        paddingLeft:'2rem',\n        paddingRight:'2rem',\n        justifyContent: 'center',\n        \n        '&.top': {\n        },\n        '&.middle': {\n            justifyContent: 'center'\n        },\n        '&.bottom': {\n\n        },\n        '&.left': {\n            alignItems:'flex-start'\n        },\n        '&.centre': {\n            alignItems: 'center',\n        },\n        '&.right': {\n            alignItems:'flex-end'\n        },\n\n        '&.check_other_panel_banner': {\n            height: '90%',\n        }\n    },\n    html__item: {\n        //position: 'absolute',\n        width: '100%',\n        margin: 'unset',\n        '&.width__short': {\n            maxWidth:'250px'\n        },\n        '&.width__middle': {\n            maxWidth:'400px'\n        },\n        '&.width__wild': {\n            maxWidth:'100%'\n        },\n\n        \n    }\n}","import React from 'react';\nimport parse, { domToReact, attributesToProps } from 'html-react-parser';\nimport utils from '../../../../utils';\nimport env from '../../../../env';\n\n//https://github.com/remarkablemark/html-react-parser\n\nconst options = {\n  replace\n};\nlet _embedDataList = []\nlet _cmsOption = {}\n\nexport function renderHtml(html, cmsOption) {\n  _cmsOption = cmsOption\n  if (!cmsOption.isCmsEdit || cmsOption.cmsViewMode === 'viewonly') {\n    _embedDataList = cmsOption?.pageData?.embedDataList;\n    return parse(html || '', options)\n  } else {\n    return parse(html || '', {})\n  }\n}\n\nfunction replace(node) {\n  //console.log(node)\n  if (!env.isProd && node.type === 'tag' && node.name === 'img') {\n    return replaceImg(node)\n  } else if (node.type === 'tag' && node.attribs.class === 'button') {\n    return replaceButton(node)\n  } else if (node.type === 'tag' && node.attribs['data-embed-jaba']) {\n    return replaceEmbedCode(node)\n  }\n\n}\n\nfunction replaceImg(node) {\n  if (node.attribs && node.attribs.src) {\n    const props = attributesToProps(node.attribs)\n    props.src = utils.site.resourcePath(node.attribs.src)\n    // eslint-disable-next-line\n    return <img {...props} />\n  }\n  return null\n}\n\nfunction replaceButton(node) {\n  if (node.children && node.children.some(x => x.name === 'span')) return null;\n  const props = attributesToProps(node.attribs)\n  return React.createElement(node.name, props, <span>{domToReact(node.children, options)}</span>);\n}\n\nfunction replaceEmbedCode(node) {\n  const id = node.attribs['data-embed-jaba'];\n  const found = utils.array.find(_embedDataList, x => x.id === id);\n  if (found) {\n    //console.log(found)\n    return <div className={`codeType_${found.codeType}`}>{renderHtml(found.code, _cmsOption)}</div>\n  }\n  else return null;\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport cmsUtils from '../../cmsUtils';\nimport utils from '../../../../utils';\nimport style from './multiColumnPanel2Style';\nimport { renderHtml } from './renderHtml';\nimport Slider from \"react-slick\";\nimport { handleElementLink, useRouter, SiteLink } from '../../../../components';\n\nexport function MultiColumnPanel(props) {\n    const item = props.item;\n    \n    const cmsOption = props.cmsOption || {};\n    const bgColor = cmsUtils.payload(item, 'BgColor');\n    const bgTheme = cmsUtils.payload(item, 'TextColorTheme') || 'white';\n    const cssClass = utils.classNames('cms_item', 'contentPanel', 'multiColumnPanelv2', 'contentPanel--' + bgTheme, item.cssClass || item.anchorName || '');\n    const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n    const backgroundTile = cmsUtils.payload(item, 'BackgroundTile');\n\n    const leftPanel = cmsUtils.payload(item, 'LeftPanel') || \"text\"; //text, banner\n    const leftPanelBanner = cmsUtils.payload(item, 'LeftPanelBanner') || \"\";\n    const leftTextVertical = cmsUtils.payload(item, 'LeftTextVertical') || \"middle\"; //top, middle, bottom\n    const leftTextHorizontal = cmsUtils.payload(item, 'LeftTextHorizontal') || \"centre\"; // left, centre, right\n    const leftTextBgColor = cmsUtils.payload(item, 'LeftTextBgColor') || \"transparent\";\n    const leftTextWidth = cmsUtils.payload(item, 'LeftTextWidth') || \"middle\"; //short, middle, wild\n\n    const rightPanel = cmsUtils.payload(item, 'RightPanel') || \"text\";\n    const rightPanelBanner = cmsUtils.payload(item, 'RightPanelBanner') || \"\";\n    const rightTextVertical = cmsUtils.payload(item, 'RightTextVertical') || \"middle\"; //top, middle, bottom\n    const rightTextHorizontal = cmsUtils.payload(item, 'RightTextHorizontal') || \"centre\"; // left, centre, right\n    const rightTextBgColor = cmsUtils.payload(item, 'RightTextBgColor') || \"transparent\"; // left, centre, right\n    const rightTextWidth = cmsUtils.payload(item, 'RightTextWidth') || \"middle\"; //short, middle, wild\n\n    const linkUrl = cmsUtils.payload(item, 'LinkUrl') || \"\";\n\n    //const mobileReverse = cmsUtils.payload(item, 'MobileReverse', 'no');\n    //const subItems = (mobileReverse === \"yes\" && utils.css.screenWidth() <= 550) ? item.items.reverse() || [] : item.items || [];\n    //const columnWidths = cmsUtils.payload(item, 'ColumnWidths').split(\",\");\n    //const mobileColumnWidths = cmsUtils.payload(item, 'MobileColumnWidths').split(\",\");\n    //const countItem = { countD: 0, countM: 0, col: \"\" };\n\n    let content = cmsUtils.payload(item, 'Content') || \"Please add text\";\n    let content2 = cmsUtils.payload(item, 'Content2') || \"Please add text\";\n\n    let bgUrl = null;\n    if (imageUrl)\n        bgUrl = utils.site.resourcePath(imageUrl);\n    else if (backgroundTile)\n        bgUrl = utils.site.resourcePath(`/dist/transparent-textures/textures/${backgroundTile}`);\n\n    let idFirstUse = 1;\n    if (leftPanel !== \"text\") {\n        idFirstUse = 2\n    }\n\n    return (\n        <section className={cssClass} style={{\n            backgroundColor: `${bgColor}`,\n            backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl)\n        }} id={item.anchorName}>\n            <div className=\"contentPanel__bg\"></div>\n            <div className=\"container\" css={style.container}>\n                <div className=\"row\">\n                    <div className={`col-12 col-md-6 col__item ${(leftPanel === 'text' && rightPanel === 'banner') ? \"change__flex__order\" : \"no__change__flex__order\"}`}>\n                        <GetItem\n                            itemName={leftPanel}\n                            content={content}\n                            cmsOption={cmsOption}\n                            itemId={item.itemId}\n                            bannerItems={leftPanelBanner}\n                            index=\"01\"\n                            checkOtherPanel={rightPanel}\n                            textVertical={leftTextVertical}\n                            textHorizontal={leftTextHorizontal}\n                            textBgColor={leftTextBgColor}\n                            textWidth={leftTextWidth}\n                            idFirstUse={idFirstUse === 1 ? true : false}\n                            linkUrl={linkUrl} />\n                    </div>\n                    <div className={`col-12 col-md-6 col__item`}>\n                        <GetItem\n                            itemName={rightPanel}\n                            content={content2}\n                            cmsOption={cmsOption}\n                            itemId={item.itemId}\n                            bannerItems={rightPanelBanner}\n                            index=\"02\"\n                            checkOtherPanel={leftPanel}\n                            textVertical={rightTextVertical}\n                            textHorizontal={rightTextHorizontal}\n                            textBgColor={rightTextBgColor}\n                            textWidth={rightTextWidth}\n                            idFirstUse={idFirstUse === 2 ? true : false}\n                            linkUrl={linkUrl} />\n                    </div>\n                </div>\n            </div>\n        </section>\n    )\n}\n\nfunction GetItem({ itemName,\n    index,\n    content,\n    cmsOption,\n    itemId,\n    bannerItems,\n    checkOtherPanel,\n    textVertical,\n    textHorizontal,\n    idFirstUse,\n    textBgColor,\n    textWidth,\n    linkUrl }) {\n\n    const { history } = useRouter();\n    const settings = {\n        dots: false,\n        infinite: true,\n        speed: 1500,\n        autoplaySpeed: 3000,\n        fade: true,\n        autoplay: true,\n        slidesToShow: 1,\n        slidesToScroll: 1\n    };\n\n    const _imgs = (bannerItems === \"\" ? \"logo.png\" : bannerItems).split(\"|\");\n    //https://jaba.com.au/sites/newjaba/media/banners/ocean1_269430438.jpg\n\n    function handleClick(e) {\n\n        let target = \"\";\n        if (e.target.closest('a')) {\n            target = e.target.closest('a').getAttribute('target');\n        }\n        const processed = (target === \"_blank\" ? handleElementLink(e.target, null) : handleElementLink(e.target));\n        //const link = utils.url.getLinkFromElement(e.target);\n        //console.log('clicked', e, e.target, processed);\n\n        if (processed.handled) {\n            e.preventDefault();\n            e.stopPropagation();\n        } else if (processed.linkInfo && processed.linkInfo.type === 'internal') {\n            e.preventDefault();\n            e.stopPropagation();\n            history.push(processed.linkInfo.url)\n        } else {\n\n            if (e.target.closest('a')) {\n                let href = e.target.closest('a').getAttribute('href') + \"\";\n                if (href.indexOf('#') !== -1) {\n                    let _href = href.split('#');\n                    console.log(\"_href\", _href);\n                    let el = document.querySelector('section[data-cms-item-anchor=\"' + _href[1] + '\"]');\n                    if (el) {\n                        let anchorStatus = el.getAttribute('data-anchor-status');\n                        if (anchorStatus === \"collapse\") {\n                            el.setAttribute('data-anchor-status', 'expand');\n                            el.classList.add(\"expand\");\n                        }\n                        else {\n                            el.setAttribute('data-anchor-status', 'collapse');\n                            el.classList.remove(\"expand\");\n                        }\n                    }\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n            }\n        }\n    }\n\n    if (itemName === 'text') {\n        return (\n            <div css={style.html__wrapper}>\n                <div css={style.html__container} className={`check_other_panel_${checkOtherPanel} ${textVertical} ${textHorizontal}`} style={{ backgroundColor: textBgColor }}>\n                    <div data-cms-html=\"true\"\n                        css={style.html__item}\n                        data-cms-item-id={cmsOption.isCmsEdit && (idFirstUse === true ? itemId : itemId + \"_\" + index)}\n                        data-cms-item-id2={cmsOption.isCmsEdit && itemId}\n                        className={`cms_item htmlPanel html new__multicolumn__panel__html item__${index} ${'width__' + textWidth}`}\n                        onClick={(e) => handleClick(e)}>\n                        {renderHtml(content, cmsOption)}\n                    </div>\n                </div>\n            </div>\n        )\n    }\n    else if (itemName === 'banner') {\n        return (\n            <div className='cms_item bannerPanel bannerWrapperSize--standard'>\n                <Slider {...settings}>\n                    {\n                        _imgs.map((item, index) => {\n                            return <ImgItem key={index} item={item} linkUrl={linkUrl} />\n                        })\n                    }\n                </Slider>\n            </div>\n        )\n    }\n\n    return (\n        <div>No Item</div>\n    )\n}\n\nfunction ImgItem({ item, linkUrl }) {\n    \n    if (linkUrl && linkUrl !== '') {\n        return (\n            <SiteLink to={linkUrl}>\n                <div className='cms_item banner-item bannerSize' style={{ backgroundImage: utils.css.bgUrlStyle(item) }}></div>\n            </SiteLink>\n        )\n    }\n\n    return (\n        <div className='cms_item banner-item bannerSize' style={{ backgroundImage: utils.css.bgUrlStyle(item) }}></div>\n    )\n}\n\n//\"https://jaba.com.au/sites/newjaba/media/banners/ocean1_269430438.jpg\"","import React from 'react';\nimport { MultiColumnPanel } from './view/multiColumnPanel2';\n\nexport const renderRule = {\n  match: (item, cmsOption) => item.itemTypeCode === 'MultiColumnPanel2', \n  itemElt: (item, cmsOption) => <MultiColumnPanel item={item} cmsOption={cmsOption} />\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport Slider from \"react-slick\";\nimport { settings as defaultSettings} from './config';\n\n/**\n * Tile List\n * @param {Array<JSX.Element>} tiles React elements, required\n * @param {Object} style Style object, required\n * @param {string} cssClass\n * @param {string} useSlider Use SlickSlider, default: false\n * @param {Object} settings Tile Settings, required\n * @param {...Object} attrs Other attributes in the list level\n */\nexport function TileList({tiles, style, overridingStyle, cssClass, useSlider = false, settings = defaultSettings, ...attrs}) {\n  const s = style || {};\n  const ss = overridingStyle || {};\n  const slickSettings = settings.slickSettings;\n\n  useSlider = useSlider && tiles.length > 1\n  slickSettings.infinite = tiles.length > 2\n\n  if (useSlider) {\n    return (\n      <div className={cssClass} css={[s.holder, ss.holder]} {...attrs}>\n        <div css={[s.tiles, ss.tiles, useSlider && s.tilesSlider, useSlider && ss.tilesSlider]}>\n          <Slider {...slickSettings} >\n            {tiles}\n          </Slider>\n        </div>\n      </div>\n    );\n  } else {\n    return (\n      <div className={cssClass} css={[s.holder, ss.holder]} {...attrs}>\n        <div css={[s.tiles, ss.tiles]}>\n          {tiles}\n        </div>\n      </div>\n    );\n  }\n\n}","import { variables, mq } from '../../cssInJs';\nimport { settings as defaultSettings} from './config';\n/**\n * Tile List Style. This is only for list wrapper, not tile itself\n * @param {Object} settings Tile Settings, required\n */\nexport function getTileListStyle(settings = defaultSettings) {\n  const marginLR = settings.marginLR;\n  const marginTB = settings.marginTB;\n  return {\n    holder: mq({\n      //maxWidth: 1000,\n      margin: 'auto',\n      marginTop: [30, null, 40],\n      marginBottom: [30, null, 40],\n      '.slick-prev, .slick-next': {\n        top: [100],\n        transform: 'translate(0, 0)',\n      },\n      '.slick-prev': {\n        left: [10, null, -20]\n      },\n      '.slick-next': {\n        right: [10, null, -20]\n      },\n      '.slick-prev:before, .slick-next:before': {\n        color: variables.fontColor\n      }\n    }),\n    tiles: mq({\n      display: 'flex',\n      justifyContent: 'flex-start',\n      alignItems: 'stretch',\n      flexWrap: 'wrap',\n      marginLeft: marginLR.map(x => x === null? null : -x / 2),\n      marginRight: marginLR.map(x => x === null? null : -x / 2),\n      marginTop: marginTB.map(x => x === null? null : x / 2),\n      marginBottom: marginTB.map(x => x === null? null : x / 2),\n    }),\n    tilesSlider: mq({\n      display: 'block',\n      marginLeft: [15, null, 15],\n      marginRight: [15, null, 15],\n    })\n  }\n}\n\n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport utils from 'utils';\nimport { SiteLink } from 'components';\nimport { getTileStyle } from './pageTileStyle';\n\nexport function PageTile({ page, useSlider, disableLink }) {\n  const tileLink = page.pageUrl;\n  const imageUrl = utils.site.resourcePath(page.imageUrl);\n  const title = page.pageTitle;\n  const desc = page.tileDesc || page.description;\n  const s = getTileStyle();\n  return (\n    <SiteLink to={tileLink} css={[s.tile, useSlider && s.tileSlider]} >\n      <div className=\"tileBg\" css={s.tileBg} style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}></div>\n      <div className=\"tileContent\" css={s.tileContent}>\n        <div css={s.title}>{title}</div>\n        <div css={s.desc}>{desc}</div>\n      </div>\n    </SiteLink>\n  )\n}\n","import { variables, mq } from 'cssInJs';\nimport { settings as defaultSettings } from 'site/tileList/config';\n\nimport { rgba } from 'polished';\n\nexport function getTileStyle(settings = defaultSettings) {\n  const numOfTilesPerBreakpoints = settings.numOfTilesPerBreakpoints\n  const marginLR = settings.marginLR\n  const marginTB = settings.marginTB\n\n  return {\n    tile: mq({\n      paddingLeft: marginLR.map(x => x === null ? null : x / 2),\n      paddingRight: marginLR.map(x => x === null ? null : x / 2),\n      paddingTop: marginTB.map(x => x === null ? null : x / 2),\n      paddingBottom: marginTB.map(x => x === null ? null : x / 2),\n      maxWidth: numOfTilesPerBreakpoints.map(x => x === null ? null : 100 / x + '%'),\n      flexBasis: numOfTilesPerBreakpoints.map(x => x === null ? null : 100 / x + '%'),\n      flexGrow: 0,\n      flexShrink: 0,\n      textAlign: 'left',\n      display: 'flex',\n      flexDirection: 'column',\n      color: 'inherit',\n      ':hover': {\n        textDecoration: 'none',\n        color: 'inherit',\n        '.tileBg': {\n          transform: 'scale(1.02)',\n          transition: 'all .2s ease-in-out'\n        },\n        '.tileContent': {\n          backgroundColor: rgba(variables.primaryColor, 0.3),\n        }\n      }\n    }),\n    tileSlider: mq({\n      maxWidth: '100% !important'\n    }),\n    tileBg: mq({\n      backgroundColor: 'white',\n      backgroundPosition: 'center',\n      backgroundRepeat: 'no-repeat',\n      backgroundSize: 'cover',\n      height: 0,\n      paddingBottom: '56.25%',\n    }),\n    tileContent: mq({\n      display: 'flex',\n      flexDirection: 'column',\n      flexGrow: 1,\n      lineHeight: 1.3,\n      //boxShadow: '4px 4px 14px 4px rgba(190,190,190,0.5)',\n      backgroundColor: '#fff',\n      marginTop: [10],\n      padding: [20],\n      transition: 'all .2s ease-in-out'\n    }),\n    title: mq({\n      //fontFamily: variables.familyHeader,\n      fontSize: '1.3rem',\n      textTransform: 'uppercase',\n      lineHeight: 1.3,\n      fontWeight: 900,\n      textAlign: 'center',\n    }),\n    desc: mq({\n      marginTop: 5,\n      fontSize: '0.9rem',\n      display: '-webkit-box',\n      WebkitLineClamp: '9',\n      WebkitBoxOrient: 'vertical',\n      overflow: 'hidden',\n    }),\n  }\n}\n\nexport function getTileListOverridingStyle() {\n  return {\n    tiles: mq({\n      alignItems: 'flex-start',\n    })\n  }\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport cmsUtils from '../../cmsUtils';\nimport { TileList } from 'site/tileList/tileList'\nimport { getTileListStyle } from 'site/tileList/tileListStyle';\n\nimport { PageTile } from './pageTile/pageTile'\n\nexport function PageTiles(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n  //console.log(cmsOption)\n  //console.log('item', item);\n  const useSlider = cmsUtils.payload(item, 'UseSlider') === 'slider';\n  const pages = getPages(cmsUtils.payload(item, 'PageObjects'))\n\n  const tiles = pages.map((page, index) => <PageTile key={index} page={page} useSlider={useSlider} disableLink={cmsOption.isCmsEdit} />)\n  \n  return (\n    <TileList tiles={tiles} style={getTileListStyle()} useSlider={useSlider} />\n  );\n}\n\nfunction getPages(pagesSerialized) {\n  if (pagesSerialized) {\n    return JSON.parse(pagesSerialized);\n  }\n  return [];\n}","import React from 'react';\nimport { PageTiles } from './view/pageTiles';\n\nexport const renderRule = {\n  match: (item, cmsOption) => item.itemTypeCode === 'PageTiles__', \n  itemElt: (item, cmsOption) => <PageTiles item={item} cmsOption={cmsOption} />\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport cmsUtils from '../../cmsUtils';\nimport { Item } from '../../../../cms/items/item';\nimport utils from '../../../../utils';\n\nexport function Panel(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, subItems);\n  //console.log(cmsUtils.hasItemInPageDataByItemTypeCode(cmsOption.pageData, 'DestinationOperators'))\n\n  const bgColor = cmsUtils.payload(item, 'BgColor');\n  //const textColorTheme = cmsUtils.payload(item, 'TextColorTheme');\n  const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n  const backgroundTile = cmsUtils.payload(item, 'BackgroundTile');\n  const bgTheme = cmsUtils.payload(item, 'TextColorTheme') || 'white';\n  //console.log(bgTheme)\n\n  let bgUrl = null;\n  if (imageUrl)\n    bgUrl = utils.site.resourcePath(imageUrl);\n  else if (backgroundTile)\n    bgUrl = utils.site.resourcePath(`/dist/transparent-textures/textures/${backgroundTile}`);\n\n  const cssClass = utils.classNames('cms_item', 'contentPanel', 'contentPanel--' + bgTheme, item.cssClass || item.anchorName || '');\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n\n  return (\n    <section className={cssClass} style={{\n      backgroundColor: `${bgColor}`,\n      backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl)\n    }} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <div className=\"contentPanel__bg\"></div>\n      <div className=\"container\">{subItemsElts}</div>\n    </section>\n  );\n}\n","import React from 'react';\nimport { Panel } from './view/panel';\n\nexport const renderRule = {\n  match: (item, cmsOption) => item.itemTypeCode === 'Panel', \n  itemElt: (item, cmsOption) => <Panel item={item} cmsOption={cmsOption} />\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport utils from '../../utils';\nimport { SiteLink } from '../../components';\n\nimport { TileList } from '../tileList/tileList'\nimport { getTileListStyle } from '../tileList/tileListStyle';\nimport { settings } from './config';\n\nimport { getImageTileStyle } from './galleryStyle';\n\nexport function GalleryTiles({ images, openPopupImage, useSlider = false }) {\n  if (images.length === 0) return null;\n  const tiles = images.map((img, index) => <ImageTile key={index} image={img} useSlider={useSlider} openPopupImage={openPopupImage} />)\n  return <TileList tiles={tiles} style={getTileListStyle(settings)} useSlider={useSlider} />\n}\n\nfunction ImageTile({ image, useSlider, disableLink, openPopupImage }) {\n  const s = getImageTileStyle(settings);\n  //const imageUrl = utils.site.resourcePath(image.imageUrl);\n  const thumbnailUrl = image.thumbnailUrl || image.imageUrl;\n  const tileLink = image.imageUrl;\n\n  return <SiteLink css={[s.tile, useSlider && s.tileSlider]} to={disableLink ? '' : tileLink} onClick={(e) => openPopupImage(e, image)}>\n    <div css={s.tileBg} className=\"tileBg\" style={{ backgroundImage: utils.css.bgUrlStyle(thumbnailUrl) }}></div>\n  </SiteLink>\n}\n","import { mq } from '../../cssInJs';\nimport { settings as defaultSettings} from '../tileList/config';\n\nexport function getImageTileStyle(settings = defaultSettings) {\n  const numOfTilesPerBreakpoints = settings.numOfTilesPerBreakpoints\n  const marginLR = settings.marginLR\n  const marginTB = settings.marginTB\n\n  return {\n    tile: mq({\n      paddingLeft: marginLR.map(x => x === null? null : x / 2),\n      paddingRight: marginLR.map(x => x === null? null : x / 2),\n      paddingTop: marginTB.map(x => x === null? null : x / 2),\n      paddingBottom: marginTB.map(x => x === null? null : x / 2),\n      maxWidth: numOfTilesPerBreakpoints.map(x => x === null? null : 100 / x + '%'),\n      flexBasis: numOfTilesPerBreakpoints.map(x => x === null? null : 100 / x + '%'),\n      flexGrow: 0,\n      flexShrink: 0,\n      textAlign: 'left',\n      display: 'flex',\n      flexDirection: 'column',\n      color: 'inherit',\n      ':hover': {\n        textDecoration: 'none',\n        color: 'inherit',\n        '.tileBg': {\n          transform: 'scale(1.02)',\n          transition: 'all .2s ease-in-out'\n        }\n      }\n    }),\n    tileSlider: mq({\n      maxWidth: '100% !important'\n    }),\n    tileBg: mq({\n      backgroundColor: 'white',\n      backgroundPosition: 'center',\n      backgroundRepeat: 'no-repeat',\n      backgroundSize: 'cover',\n      height: 0,\n      paddingBottom: '100%',//'56.25%',\n    }),\n  }\n}\n\n","import React from 'react';\nimport { createPortal } from \"react-dom\";\n\nexport function Portal({children}){\n  const [el] = React.useState(document.createElement('div'));\n  React.useEffect(() => {\n      let mount = document.getElementById(\"portal-root\");\n      mount.appendChild(el);\n    return () => mount.removeChild(el);\n  }, [el]);\n  return createPortal(children, el);\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport React from 'react';\nimport utils from 'utils';\nimport { GalleryTiles } from './galleryTiles';\n\nimport { Portal } from \"site/portal/portal\";\nimport FsLightbox from 'fslightbox-react';\n\nconst r = utils.site.resourcePath\nconst set = utils.media.getImageSetPath\n\nexport function Gallery({ images, useSlider = false }) {\n\n  const [toggler, setToggler] = React.useState(false);\n  const [popupIndex, setPopupIndex] = React.useState(0);\n\n  const filtered = utils.array.distinct(images, (x, y) => x.imageUrl === y.imageUrl)\n  if (filtered.length === 0) return null;\n\n  const popupImages = filtered.map(x => r(x.imageUrl));\n  const galleryImages = filtered.map(x => ({ imageUrl: r(x.imageUrl), thumbnailUrl: r(set(x.imageUrl, 'thumb')), caption: x.caption }));\n  // console.log(popupImages)\n\n  function openPopupImage(e, image) {\n    e.stopPropagation(); e.preventDefault();\n    const imageUrl = r(image.imageUrl);\n    const inx = utils.array.findIndex(popupImages, x => x === imageUrl);\n    setPopupIndex(inx >= 0 ? inx : 0)\n    setToggler(!toggler)\n  }\n\n  return <React.Fragment>\n    <Portal>\n      <FsLightbox\n        toggler={toggler}\n        sources={popupImages}\n        sourceIndex={popupIndex}\n      />\n    </Portal>\n    <GalleryTiles images={galleryImages} openPopupImage={openPopupImage} useSlider={useSlider} />\n  </React.Fragment>\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport cmsUtils from '../../cmsUtils';\nimport utils from 'utils'\nimport { Gallery } from '@site/gallery/gallery'\n\nexport function PhotoGallery(props) {\n  const item = props.item;\n  //const cmsOption = props.cmsOption || {};\n  //console.log(cmsOption)\n  //console.log('item', item);\n\n  const cssClass = utils.classNames('cms_item', 'photoGallery', item.cssClass || item.anchorName || '');\n  const images = cmsUtils.payload(item, 'ImageUrl') ? cmsUtils.payload(item, 'ImageUrl').split(\"|\") : [];\n  const galleryImages = images.map(x => ({imageUrl: x, thumbnailUrl: x, caption: null}));\n  \n  return (\n    <Gallery cssClass={cssClass} images={galleryImages} useSlider={false} />\n  );\n}\n","import React from 'react';\nimport { PhotoGallery } from './view/photoGallery';\n\nexport const renderRule = {\n  match: (item, cmsOption) => item.itemTypeCode === 'PhotoGallery', \n  itemElt: (item, cmsOption) => <PhotoGallery item={item} cmsOption={cmsOption} />\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport { FacebookShareButton, FacebookIcon } from \"react-share\";\n// import { LinkedinShareButton, LinkedinIcon } from \"react-share\";\n// import { TwitterShareButton, TwitterIcon } from \"react-share\";\nimport { WhatsappShareButton, WhatsappIcon } from \"react-share\";\nimport { EmailShareButton, EmailIcon } from \"react-share\";\n\nimport { getShareButtonStyle } from './shareButtonStyle';\n\nexport function ShareButtons({ shareUrl, pageTitle = null, topLabel = 'SHARE THIS PAGE:' }) {\n  const s = getShareButtonStyle();\n  const title = pageTitle || window.document.title;\n  console.log(title)\n  return <div css={s.shareButtons}>\n    {topLabel && <div css={s.shareButtonTitle}>{topLabel}</div>}\n    <span title=\"Sharing with Facebook\">\n      <FacebookShareButton css={s.shareButton} url={shareUrl}>\n        <FacebookIcon size={50} round={true} />\n      </FacebookShareButton>\n    </span>\n    {/* <span title=\"Sharing with LinkedIn\">\n      <LinkedinShareButton css={s.shareButton} url={shareUrl} title={title}>\n        <LinkedinIcon size={50} round={true} />\n      </LinkedinShareButton>\n    </span> */}\n    {/* <span title=\"Sharing with Twitter\">\n      <TwitterShareButton css={s.shareButton} url={shareUrl} title={title}>\n        <TwitterIcon size={50} round={true} />\n      </TwitterShareButton>\n    </span> */}\n    <span title=\"Sharing with Whatsapp\">\n      <WhatsappShareButton css={s.shareButton} url={shareUrl} title={title}>\n        <WhatsappIcon size={50} round={true} />\n      </WhatsappShareButton>\n    </span>\n    <span title=\"Sharing with Email\">\n      <EmailShareButton css={s.shareButton} url={shareUrl} subject={title}>\n        <EmailIcon size={50} round={true} />\n      </EmailShareButton>\n    </span>\n  </div>\n}\n","//import { mq } from '../../cssInJs';\n\nexport function getShareButtonStyle() {\n  return {\n    shareButtons: {\n      marginTop: '1.5rem',\n    },\n    shareButtonTitle: {\n      fontSize: '0.8rem',\n      marginLeft: '0.5rem',\n      marginBottom: '0.3rem'\n    },\n    shareButton: {\n      margin: 5\n    },\n  }\n} \n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\n// import cmsUtils from '../../cmsUtils';\nimport utils from 'utils'\nimport { ShareButtons } from 'site/shareButtons/shareButtons'\n\nexport function SharingIcons(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n  //console.log(cmsOption)\n  //console.log('item', item);\n\n  const cssClass = utils.classNames('cms_item', item.cssClass || item.anchorName || '');\n  const shareUrl = utils.site.fullUrl(window.location.pathname + window.location.search)\n\n  return <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n    <ShareButtons shareUrl={shareUrl} />\n  </div>\n}\n","import React from 'react';\nimport { SharingIcons } from './view/sharingIcons';\n\nexport const renderRule = {\n  match: (item, cmsOption) => item.itemTypeCode === 'SharingIcons', \n  itemElt: (item, cmsOption) => <SharingIcons item={item} cmsOption={cmsOption} />\n}","import React, { useState, useRef } from 'react';\r\nimport utils from '../../utils';\r\nimport { debounce } from '../utils-core/debounce';\r\nimport * as yt from './iframeApi';\r\nimport { FiVolumeX, FiVolume2 } from 'react-icons/fi';\r\nimport { FaRegPlayCircle } from 'react-icons/fa';\r\nimport ModalVideo from 'react-modal-video'\r\n\r\n\r\nexport function YoutubeBannerMobilePopup(props) {\r\n  const youtubeBannerRef = React.useRef(null);\r\n\r\n  const [playerStatus, setPlayerStatus] = useState('loading');\r\n  const [playerSize, setPlayerSize] = useState(null);\r\n  const [ytPlayer, setYtPlayer] = useState(null);\r\n  const [muted, setMuted] = useState(true);\r\n  const countPlayedRef = useRef(0);\r\n  const [popupOpened, setPopupOpened] = useState(false);\r\n  const { heightSet, videoLinkOrId, playerId } = props.video;\r\n  const videoId = yt.getYoutubeCode(videoLinkOrId);\r\n  //const posterImageUrl = yt.thumbnailMax(videoId);\r\n  const posterImageUrl = (props.posterImageUrl && props.posterImageUrl !== '') ? props.posterImageUrl : yt.thumbnailMax(videoId);\r\n  const mobileImageUrl = props.mobileImageUrl;\r\n  //let countPlayed = 0;\r\n  const canPlayVideo = () => (typeof window !== `undefined` && typeof props.canPlayVideo === `undefined`)? window.innerWidth >= 1200 : !!(typeof props.canPlayVideo === 'function'? props.canPlayVideo() : props.canPlayVideo);\r\n\r\n  const playerVars = {\r\n    'enablejsapi': 1,\r\n    //'autoplay': 1,\r\n    'controls': 0,\r\n    'loop': 1,\r\n    'showinfo': 0,\r\n    'rel': 0,\r\n    'modestbranding': 1,\r\n    //'origin': typeof window !== `undefined` && window.location.origin,\r\n    'allowfullscreen': true,\r\n    'wmode': 'transparent'\r\n  }\r\n\r\n  //console.log('videoId: ' + videoId)\r\n  //const canPlayVideo = () => window.innerWidth >= 1200\r\n  React.useEffect(() => {\r\n    const resized = debounce(() => {\r\n      loadVideo();\r\n    });\r\n    loadVideo();\r\n    if (typeof window !== `undefined`)\r\n      window.addEventListener('resize', resized)\r\n    return () => {\r\n      if (typeof window !== `undefined`)\r\n        window.removeEventListener('resize', resized)\r\n    }\r\n    // eslint-disable-next-line\r\n  }, [])\r\n\r\n  \r\n  function loadVideo() {\r\n    if (youtubeBannerRef.current)\r\n      setPlayerSize(getSize(youtubeBannerRef.current));\r\n    if (canPlayVideo()) {\r\n      yt.loadApi((loadJs) => {\r\n        loadJs ? init() : setTimeout(init, 100)\r\n      })\r\n    }\r\n  }\r\n\r\n  function init() {\r\n    let player = null;\r\n    if (typeof window !== `undefined`) {\r\n      player = new window.YT.Player(playerId, {\r\n        events: {\r\n          'onStateChange': (e) => {\r\n            switch (e.data) {\r\n              // case window.YT.PlayerState.PLAYING:\r\n              //   break;\r\n              // case window.YT.PlayerState.PAUSED:\r\n              //   break;\r\n              case window.YT.PlayerState.ENDED:\r\n                const countPlayed = countPlayedRef.current;\r\n                if (countPlayed < 3 - 1) {\r\n                  //console.log('ended', countPlayed + 1);\r\n                  countPlayedRef.current = countPlayed + 1;\r\n                  if (player && player.playVideo)\r\n                    player.playVideo();\r\n                } else {\r\n                  setPlayerStatus('finished');\r\n                }\r\n                break;\r\n              default:\r\n            }\r\n          },\r\n          'onReady': (e) => {\r\n            //console.log('onReady');\r\n            if (player && player.mute && player.playVideo) {\r\n              player.mute();\r\n              player.playVideo();\r\n            }\r\n            setTimeout(() => setPlayerStatus('loaded'), 1000)\r\n          },\r\n          'onError': (e) => { console.log(e) }\r\n        }\r\n      });\r\n\r\n      setYtPlayer(player);\r\n    }\r\n  }\r\n\r\n  function soundToggle(e) {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    if (ytPlayer){\r\n      if (muted) {\r\n        setMuted(false);\r\n        setTimeout(() => {\r\n          if (ytPlayer && ytPlayer.pauseVideo && ytPlayer.unMute && ytPlayer.playVideo) {\r\n            ytPlayer.pauseVideo();\r\n            ytPlayer.unMute();\r\n            ytPlayer.playVideo();\r\n          }\r\n        }, 100)\r\n      } else {\r\n        setMuted(true);\r\n        setTimeout(() => {\r\n          if (ytPlayer && ytPlayer.pauseVideo && ytPlayer.unMute && ytPlayer.playVideo) {\r\n            ytPlayer.pauseVideo();\r\n            ytPlayer.mute();\r\n            ytPlayer.playVideo();\r\n          }\r\n        }, 100)\r\n      }\r\n    }\r\n\r\n    //https://developers.google.com/web/updates/2017/09/autoplay-policy-changes\r\n  }\r\n\r\n  function playVideo() {\r\n    setPopupOpened(true)\r\n  }\r\n\r\n  const canPlay = canPlayVideo();\r\n  const imageUrl = !canPlay && mobileImageUrl ? mobileImageUrl : posterImageUrl;\r\n  return (\r\n    <React.Fragment>\r\n    <div className={utils.classNames('youtubePlayer', `youtubePlayer--${canPlay ? 'canPlay' : 'cannotPlay'}`, `youtubePlayer--${playerStatus}`, `youtubePlayer--${heightSet}`)} ref={youtubeBannerRef}>\r\n      <div className=\"youtubePlayer__mask\"></div>\r\n      <div className=\"youtubePlayer__poster\" style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}></div>\r\n      {canPlay && playerSize && <iframe className=\"youtubePlayer__iframe\" id={playerId} width=\"640\" height=\"390\" title=\"Youtube video\"\r\n        style={{ width: `${playerSize.width}px`, height: `${playerSize.height}px`, top: `${playerSize.top}px`, left: `${playerSize.left}px` }}\r\n        src={`https://www.youtube.com/embed/${videoId}?${utils.url.toQueryString(playerVars)}`}\r\n        allow=\"autoplay; fullscreen\"\r\n        frameBorder=\"0\"></iframe>}\r\n      {canPlay && playerStatus === 'loaded' && <div className=\"youtubePlayer__soundIcon\" title={muted? 'Sound On': 'Sound Off'} onClick={soundToggle}>\r\n        {muted? <FiVolume2 /> : <FiVolumeX/>}\r\n      </div>}\r\n\r\n      {!canPlay && !mobileImageUrl && <div className=\"youtubePlayer__playIcon\" title=\"Play\" onClick={playVideo}>\r\n      <FaRegPlayCircle />\r\n      </div>}\r\n    </div>\r\n    <ModalVideo channel='youtube' isOpen={popupOpened} videoId={videoId} onClose={() => setPopupOpened(false)} />\r\n    </React.Fragment>\r\n  );\r\n}\r\n\r\nfunction getSize(container) {\r\n  const containerSize = container ? { w: container.offsetWidth, h: container.offsetHeight } : { w: window.innerWidth, h: window.innerHeight }\r\n  const overSize = 1;\r\n  const rate = 9 / 16;\r\n  const w = containerSize.w * overSize;\r\n  const h = containerSize.h * overSize;\r\n  const size = { width: w, height: w * rate, left: 0, top: 0 };\r\n  if (size.height < h) {\r\n    // stretch horizontally\r\n    size.height = h;\r\n    size.width = h / rate;\r\n  }\r\n\r\n  //console.log(size)\r\n  size.left = -(size.width - containerSize.w) / 2;\r\n  size.top = -(size.height - containerSize.h) / 2;\r\n  return size;\r\n}\r\n","import React from 'react';\nimport cmsUtils from '../../cmsUtils';\nimport utils from '../../../../utils';\nimport { YoutubeBannerMobilePopup } from '../../../../lib/youtube/youtubeBanner--mobilePopup';\n\nexport function VideoPanel(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n  const videoCode = cmsUtils.payload(item, 'YoutubeCode');\n  const posterFrameUrl = cmsUtils.payload(item, 'PosterFrameUrl', null);\n  const playerId = 'ytBanner-' + (item.itemId).substr(0, 8);\n\n  const video = {\n    heightSet: heightSet,\n    videoLinkOrId: videoCode,\n    playerId: playerId\n  }\n\n  //const enableYoutube = env.isProd;\n  const canPlayVideo = () => utils.css.screenWidth() >= 1200\n\n  const cssClass = utils.classNames('cms_item', 'youtubePanel', item.cssClass || item.anchorName || '');\n\n  //console.log(window.innerWidth, canPlayVideo())\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName} style={{position: 'relative',overflow:\"hidden\"}}>\n      {/* {canPlayVideo() ? <YoutubeBanner video={video} /> : <BannerPanel item={item}></BannerPanel>} */}\n      <YoutubeBannerMobilePopup video={video} canPlayVideo={canPlayVideo} posterImageUrl={utils.site.resourcePath(posterFrameUrl)} />\n    </div>\n  );\n}\n","import React from 'react';\nimport { VideoPanel } from './view/videoPanel';\n\nexport const renderRule = {\n  match: (item, cmsOption) => item.itemTypeCode === 'VideoPanel', \n  itemElt: (item, cmsOption) => <VideoPanel item={item} cmsOption={cmsOption} />\n}","\nimport { renderRule as code_instagram } from './code-instagram/render';\nimport { renderRule as code_subscribe } from './code-subscribe/render';\nimport { renderRule as html } from './html/render';\nimport { renderRule as htmlV2 } from './htmlV2/render';\nimport { renderRule as imagePanel } from './imagePanel/render';\nimport { renderRule as multiColumnPanel2 } from './multiColumnPanel2/render';\nimport { renderRule as pageTiles } from './pageTiles/render';\nimport { renderRule as panel } from './panel/render';\nimport { renderRule as photoGallery } from './photoGallery/render';\nimport { renderRule as sharingIcons } from './sharingIcons/render';\nimport { renderRule as videoPanel } from './videoPanel/render';\nexport const items = [\n  code_instagram,\n  code_subscribe,\n  html,\n  htmlV2,\n  imagePanel,\n  multiColumnPanel2,\n  pageTiles,\n  panel,\n  photoGallery,\n  sharingIcons,\n  videoPanel,\n]","function payload(item, key, defaultVal = '') {\n  const found = item.payloads.find(x => x.key === key);\n  return found ? found.value : defaultVal;\n}\n\nexport default { payload };","import React, { Fragment } from 'react';\nimport { Item } from '../../items/item';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport Slider from \"react-slick\";\nimport { TopHeader } from '../../../layout/topHeader/topHeader';\n\nexport function BannerPanel(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  const type = props.type || \"\"; // menu\n\n  //console.log('item', item, subItems);\n\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n\n  const slides = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n\n  var settings = {\n    dots: false,\n    infinite: true,\n    speed: 1500,\n    autoplaySpeed: 3000,\n    fade: true,\n    autoplay: true,\n    slidesToShow: 1,\n    slidesToScroll: 1\n  };\n\n  const cssClass = utils.classNames('cms_item', 'bannerPanel', `bannerWrapperSize--${heightSet}`, item.cssClass || item.anchorName || '');\n\n  return (\n    <Fragment>\n      <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n        <Slider {...settings} >\n          {slides}\n        </Slider>\n      </div>\n      {\n        type === \"menu\" &&\n        <TopHeader type=\"menu\"></TopHeader>\n      }\n    </Fragment>\n  );\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\n\nexport function BannerItem(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const bgUrl = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n  const captionTitle = cmsUtils.payload(item, 'CaptionTitle2') || cmsUtils.payload(item, 'CaptionTitle');\n  const captionButton = cmsUtils.payload(item, 'CaptionButton') && cmsUtils.payload(item, 'CaptionButton') !== \"\" ? cmsUtils.payload(item, 'CaptionButton') : \"READ MORE\";\n  \n  const linkUrl = cmsUtils.payload(item, 'LinkUrl2') || cmsUtils.payload(item, 'LinkUrl');\n\n  const titlePanel = captionTitle ? (\n    linkUrl ? (<div>\n      <div className=\"banner-item__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>\n      <SiteLink to={linkUrl} className=\"banner-item__link\"> { captionButton } </SiteLink>\n    </div>\n    ) : (<div className=\"banner-item__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>)\n  ) : null;\n\n  const linkOverlay = linkUrl && !captionTitle ? (\n    <SiteLink className=\"bannerItem__overlay\" to={linkUrl}></SiteLink>\n  ) : null;\n\n  const cssClass = utils.classNames('cms_item', 'banner-item', 'bannerSize', item.cssClass || item.anchorName || '', titlePanel && 'bannerHasTitlePanel');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n      style={{ backgroundImage: utils.css.bgUrlStyle(bgUrl) }}>\n      {titlePanel && <div className=\"banner_item__text\">{titlePanel}</div>}\n      {linkOverlay && linkOverlay}\n    </div>\n  );\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport { Item } from '../../items/item';\nimport  utils from '../../../utils';\n\nexport function Panel(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, subItems);\n  \n  const bgColor = cmsUtils.payload(item, 'BgColor');\n  //const textColorTheme = cmsUtils.payload(item, 'TextColorTheme');\n  const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n  const backgroundTile = cmsUtils.payload(item, 'BackgroundTile');\n  const bgTheme = cmsUtils.payload(item, 'TextColorTheme') || 'white';\n  //console.log(bgTheme)\n\n\n  let bgUrl = null;\n  if (imageUrl)\n    bgUrl = utils.site.resourcePath(imageUrl);\n  else if (backgroundTile)\n    bgUrl = utils.site.resourcePath(`/dist/transparent-textures/textures/${backgroundTile}`);\n\n  const cssClass = utils.classNames('cms_item', 'contentPanel', 'contentPanel--' + bgTheme, item.cssClass || item.anchorName || '');\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n\n  return (\n    <section className={cssClass} style={{\n      backgroundColor: `${bgColor}`,\n      backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl)\n      }} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <div className=\"contentPanel__bg\"></div>\n      <div className=\"container\">\n        {subItemsElts}\n      </div>\n    </section>\n  );\n}\n","import React, { useLayoutEffect, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\n\nimport { useRouter } from '../../../components';\n\nimport { handleElementLink } from '../../../components';\nimport env from '../../../env';\n\n//import { Document, Page } from 'react-pdf'\n//import { Document, Page } from 'react-pdf/dist/entry.webpack';\n\nexport function Html(props) {\n  const ver = env.ver;\n  const item = props.item;\n  //const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  const { history } = useRouter();\n  //const [ pdfViewPath, setPdfViewPath ] = React.useState(null)\n  //console.log('item', item, cmsOption);\n\n  const year = (new Date()).getFullYear();\n  let content = cmsOption.isCmsEdit? \n    cmsUtils.payload(item, 'Content'): \n    cmsUtils.payload(item, 'Content')\n      .replace(/__year__/g, year)\n      .replace(\"__version__\", \"<a href = '/app' class = 'app_version'> PWA \"+ ver +\"</a>\");\n\n\n  const cssClass = utils.classNames('cms_item', 'htmlPanel', cmsOption.isCmsEdit && 'html', item.cssClass || item.anchorName || '');\n\n  //let itemElt = (<div dangerouslySetInnerHTML={{ __html: content }}></div>);\n\n  function handleClick(e) {\n    \n    let target = \"\";\n    if(e.target.closest('a')){\n      target = e.target.closest('a').getAttribute('target');\n    }\n    const processed = (target === \"_blank\" ? handleElementLink(e.target, null) : handleElementLink(e.target));\n    //const link = utils.url.getLinkFromElement(e.target);\n    //console.log('clicked', e, e.target, processed);\n    \n    if (processed.handled) {\n      e.preventDefault();\n      e.stopPropagation();\n    } else if (processed.linkInfo && processed.linkInfo.type === 'internal') {\n      e.preventDefault();\n      e.stopPropagation();\n      history.push(processed.linkInfo.url)\n    } else {\n      //e.preventDefault();\n      //e.stopPropagation();\n      // setPdfViewPath(utils.site.resourcePath(link))\n\n      if(e.target.closest('a')){\n        let href = e.target.closest('a').getAttribute('href') + \"\";\n          if(href.indexOf('#') !== -1){\n          let _href = href.split('#');\n          console.log(\"_href\", _href);\n          let el = document.querySelector('section[data-cms-item-anchor=\"' + _href[1] + '\"]');\n          let anchorStatus = el.getAttribute('data-anchor-status');\n          if(anchorStatus === \"collapse\"){\n            el.setAttribute('data-anchor-status', 'expand');\n            el.classList.add(\"expand\");\n          }\n          else{\n            el.setAttribute('data-anchor-status', 'collapse');\n            el.classList.remove(\"expand\");\n          }\n          e.preventDefault();\n          e.stopPropagation(); \n        }\n      }\n\n    }\n  }\n  //console.log(pdfViewPath)\n  const pdfView = \n    // pdfViewPath ? \n    // <Document file={pdfViewPath}><Page pageIndex={1}/></Document> : \n    null;\n\n  const htmlBlock = useRef(null);\n  // function iframeSizer() {\n  //   //console.log('iframesizer')\n  //   let iframesContainer = htmlBlock.current.querySelectorAll('iframe.youtube, .ytvideo iframe');\n  //   //console.log('iframesizer', iframesContainer)\n  //   if (iframesContainer && iframesContainer.length) {\n  //     iframesContainer.forEach(element => {\n  //       let height = (element.parentElement.offsetWidth * 9) / 16\n  //       //console.log(height, element.parentElement.offsetWidth)\n  //       element.style.height = height + 'px';\n  //     });\n  //   }\n  // }\n\n\n  useLayoutEffect(() => {\n    //console.log(cmsOption.isCmsEdit)\n    if (!cmsOption.isCmsEdit || cmsOption.cmsViewMode === 'viewonly') {\n      replaceEmbedCodes(htmlBlock.current, cmsOption);\n    }\n      \n    const buttons = htmlBlock.current.querySelectorAll('.button');\n    for (let i = 0; buttons && i < buttons.length; i++) {\n      restructureButton(buttons[i])\n    }\n\n    // iframeSizer();\n    // window.addEventListener('resize', iframeSizer)\n    // return (): void => {\n    //   window.removeEventListener('resize', iframeSizer)\n    // }\n\n  }, [cmsOption])\n\n  return (\n    <>\n    <div ref={htmlBlock} className={cssClass} data-cms-html=\"true\"\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n      dangerouslySetInnerHTML={{ __html: content }} onClick={(e) => handleClick(e)}></div>\n    {pdfView}\n    </>\n  )\n}\n\n\nfunction restructureButton(el) {\n  if (!el.querySelector('span')) {\n    const span = document.createElement('span');\n    span.innerHTML = el.innerHTML;\n    el.innerHTML = '';\n    el.appendChild(span);\n  }\n}\n\n\nfunction replaceEmbedCodes(block, cmsOption) {\n  const embedDataList = cmsOption?.pageData?.embedDataList;\n  const embedCodes = block.querySelectorAll('[data-embed-jaba]')\n  embedCodes.forEach(embed => {\n    const id = embed.getAttribute(\"data-embed-jaba\");\n    const found = utils.array.find(embedDataList, x => x.id === id);\n    if (found){\n      //console.log(found)\n      ReactDOM.render(<div className={`codeType_${found.codeType}`} dangerouslySetInnerHTML={{ __html: found.code }}></div>, embed);\n    }\n  })\n  //console.log(embedCodes, embedDataList)\n}\n\n","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\n\nexport function ImagePanel(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n  //console.log(cmsOption)\n  //console.log('item', item);\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n  \n  const cssClass = utils.classNames('cms_item', 'imagePanel', 'parallax', `bannerSize--${heightSet}`, item.cssClass || item.anchorName || '');\n  \n  const bgUrl = cmsOption.pageOptions && cmsOption.pageOptions.imagePath ?\n    utils.site.resourcePath(cmsOption.pageOptions.imagePath):\n    utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n  const htmlBlock = React.useRef(null);\n  const cssClass2 = utils.classNames('cms_item', 'htmlPanel', cmsOption.isCmsEdit && 'html', item.cssClass || item.anchorName || '');\n  const content = cmsUtils.payload(item, 'Content');\n\n  return (\n    <div className={cssClass} data-pxh={heightSet}\n      style={{ backgroundImage: utils.css.bgUrlStyle(bgUrl) }}>\n      <div ref={htmlBlock} className={cssClass2} data-cms-html=\"true\" data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n        dangerouslySetInnerHTML={{ __html: content }}>\n      </div>\n    </div>\n  );\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\n\nimport Slider from \"react-slick\";\n\nexport function PageTiles(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n  const useSlider = cmsUtils.payload(item, 'UseSlider') === 'slider';\n  const pages = getPages(cmsUtils.payload(item, 'PageObjects'))\n  //console.log(pages);\n  const pageTileElts = pages.map((page, index) =>\n    <Tile page={page} key={index} disableLink={cmsOption.isCmsEdit}></Tile>\n  );\n\n  var settings = {\n    dots: false,\n    infinite: true,\n    speed: 500,\n    autoplaySpeed: 3000,\n    fade: false,\n    autoplay: true,\n    slidesToShow: 3,\n    slidesToScroll: 1,\n    responsive: [\n      {\n        breakpoint: 992,\n        settings: {\n          slidesToShow: 2,\n          slidesToScroll: 1\n        }\n      },\n      {\n        breakpoint: 576,\n        settings: {\n          slidesToShow: 1,\n          slidesToScroll: 1\n        }\n      }\n      // You can unslick at a given breakpoint now by adding:\n      // settings: \"unslick\"\n      // instead of a settings object\n    ]\n  };\n\n  const cssClass = utils.classNames('cms_item', 'pageTiles tiles', useSlider && 'useSlider', item.cssClass || item.anchorName || '');\n\n  if (useSlider) {\n    return (\n      <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n        <Slider {...settings} >\n          {pageTileElts}\n        </Slider>\n      </div>\n    );\n  } else {\n    return (\n      <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n        {pageTileElts}\n      </div>\n    );\n  }\n}\n\nfunction getPages(pagesSerialized) {\n  if (pagesSerialized) {\n    return JSON.parse(pagesSerialized);\n  }\n  return [];\n}\n\nfunction Tile(props) {\n  const page = props.page;\n  const imageUrl = utils.site.resourcePath(page.imageUrl);\n  const disableLink = props.disableLink;\n  return (\n    <div className=\"pageTile tile\">\n      <SiteLink className=\"pageTile__content tile__content\" to={disableLink ? '' : page.pageUrl}>\n        <div className=\"tile__bg\" style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}></div>\n        <div className={`pageTile_details_container`}>\n          <div className=\"pageTile_details tile__details\">\n            <div className=\"pageTile__title new-style\">\n              {page.pageTitle}\n            </div>\n            <hr className=\"pageTile__dot__style\" />\n            <div className=\"pageTile_desc\">\n              {page.tileDesc || page.description}\n            </div>\n          </div>\n          <div className=\"pageTile__bottom__read__more\">\n            READ MORE\n          </div>\n        </div>\n      </SiteLink>\n    </div>\n  )\n}","//import { css, keyframes  } from '@emotion/core'\n//import { variables, mq } from 'cssInJs'\n\nimport { css } from '@emotion/core'\nimport { mq, variables } from '../../../cssInJs'\n\nexport default {\n    pageTiles : css({\n         display: 'flex',\n         justifyContent: 'flex-start',\n         flexWrap: 'wrap',\n         margin: '2rem -10px',\n         overflow:'hidden'\n    }),\n    pageTile__tile : css(mq({\n         flex: '0 0 100%',\n         maxWidth: '100%',\n         padding: '10px',\n         '&:nth-of-type(even)' : {\n               '.pageTile__bsyc__bg' : mq({\n                    order: ['0',null,'2'],\n               }),\n               '.pageTile__bsyc__content__details' : mq({\n                    order: '1'\n               })\n         }\n    })),\n\n    tile__content : css({\n     //     display: 'flex',\n     //     flexDirection: 'row',\n     //     justifyContent: 'space-between',\n     //     width: '100%',\n     //     height: '100%',\n     //     cursor: 'pointer',\n     //     position: 'relative',\n     //     flexWrap: 'wrap',\n         '&:hover' : {\n            textDecoration: 'none',\n            '& .pageTile__bsyc__content__details' : {\n               color: 'white',\n               backgroundColor: 'rgba(170, 150, 119,1)'\n               // '&.default' : css({\n               //      backgroundColor: 'rgba(0,113,188,1)'\n               // }),\n               // '&.red' : css({\n               //      backgroundColor: 'rgba(211,61,2,1)'\n               // }),\n               // '&.green' : css({\n               //      backgroundColor: 'rgba(0, 146, 69,1)'\n               // })\n            },\n            '& .pageTile__bsyc__bg2' : {\n               //transform: scale(1.05)\n               transform : 'scale(1.05)'\n            }\n         }\n    }),\n\n    tile__flip__wrapper : css({\n          zIndex:'-1', \n          display: 'flex',\n          flexDirection: 'row',\n          justifyContent: 'space-between',\n          width: '100%',\n          height: '100%',\n          cursor: 'pointer',\n          position: 'relative',\n          flexWrap: 'wrap'\n    }),\n\n//     tile__bg : css(mq({\n//          height: '0',\n//          //paddingTop: '30%',\n//          paddingTop: ['50%','35%','30%'],\n//          backgroundPosition: '50%',\n//          backgroundRepeat: 'no-repeat',\n//          backgroundSize: 'cover',\n//          flex: '1 1 300px'\n//     })),\n\ntile__bg : css(mq({\n     height: '0',\n     paddingTop: ['50%','35%','30%'],\n     //height: ['50%','35%','30%'],\n     flex: '1 1 300px',\n     overflow:'hidden',\n     position:'relative'\n})),\n\ntile__bg2 : css(mq({\n    height: '100%',\n    backgroundPosition: '50%',\n    backgroundRepeat: 'no-repeat',\n    backgroundSize: 'cover',\n    //overflow:'hidden',\n    transition:'all .2s',\n    position:'absolute',\n    top:'0px',\n    width:'100%'\n})),\n\n    tile__details : css({\n         overflow: 'hidden',\n         flexGrow: '1',\n         textAlign: 'center',\n         width: '100%',\n         bottom: '0',\n         backgroundColor: variables.primaryColor,\n     //     '&.default' : css({\n     //           backgroundColor: 'rgba(0, 113, 188,.5)'\n     //     }),\n     //     '&.red' : css({\n     //           backgroundColor: 'rgba(211, 61, 2,.5)'\n     //      }),\n     //      '&.green' : css({\n     //           backgroundColor: 'rgba(0, 146, 69,.5)'\n     //      }),\n         //backgroundColor : '#77cf22',\n         flex: '1 1 300px',\n         transition: 'all .2s ease-in-out',\n         color: '#ebebeb',\n         position:'relative',\n         '& .pageTile__bsyc__container' : mq({\n            //position: 'absolute',\n            position: ['static,',null,'absolute'],\n            top: '50%',\n            left:'50%',\n            transform: ['none',null,'translate(-50%, -50%)'],\n            width:['100%',null,'90%'],\n            padding:['1rem',null,'0px'],\n            '& .pageTile__bsyc__title' : {\n                //fontFamily: 'proxima-soft, sans-serif',\n                fontSize: '2rem',\n                //textTransform: 'uppercase',\n                //fontWeight: '700',\n                lineHeight: '1',\n                margin: '0',\n                paddingTop: '.5rem',\n                paddingBottom: '.5rem',\n                color:'inherit'\n            },\n            '& .pageTile__bsyc__desc' : {\n                lineHeight: '1.3',\n                fontSize: '.9rem',\n                //color: '#3d3d3d',\n                minHeight: '70px',\n                color:'inherit'\n             }\n         })\n    })\n}","//import React from 'react';\nimport cmsUtils from '../../../cms/utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\n\n/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './style';\n\nexport function PageTilesBsyc(props) {\n  const item = props.item;\n  //const detailHoverBgColor = props.detailHoverBgColor ? props.detailHoverBgColor : \"black\";\n  const cmsOption = props.cmsOption || {};\n  const pages = getPages(cmsUtils.payload(item, 'PageObjects'))\n  const pageTileElts = pages.map((page, index) =>\n    <Tile page={page} key={index} disableLink={cmsOption.isCmsEdit} idx = {index}></Tile>\n  );\n\n  //const cssClass = utils.classNames('cms_item', 'pageTiles tiles', item.cssClass || item.anchorName || '');\n  const cssClass = utils.classNames('cms_item', 'pageTiles__bsyc', item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n     css = {style.pageTiles}>\n      {pageTileElts}\n    </div>\n  );\n}\n\nfunction getPages(pagesSerialized) {\n  if (pagesSerialized) {\n    return JSON.parse(pagesSerialized);\n  }\n  return [];\n}\n\nfunction Tile(props) {\n  const page = props.page;\n  const imageUrl = utils.site.resourcePath(page.imageUrl);\n  const disableLink = props.disableLink;\n  const colorTheme = page.colorTheme;\n  const index = props.idx;\n  return (\n    \n    <div css = {style.pageTile__tile} className=\"pageTile__bsyc\">\n      <SiteLink className=\"pageTile__bsyc__content\" css = {style.tile__content} to={disableLink ? '' : page.pageUrl}>\n      <div css={style.tile__flip__wrapper}>\n\n        <div className=\"pageTile__bsyc__bg\" data-aos={index % 2 === 0 ? 'fade-up-right' : 'fade-up-left'} css = {style.tile__bg}>\n          <div className=\"pageTile__bsyc__bg2\" css = {style.tile__bg2} style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}></div>\n        </div>\n        \n        <div css = {style.tile__details} className={`pageTile__bsyc__content__details ${colorTheme}`} data-aos={index % 2 === 0 ? 'fade-up-left' : 'fade-up-right'}>  \n          <div className=\"pageTile__bsyc__container\">\n            \n            {\n              (page.pageTitle && page.pageTitle !== '') &&\n              <div className=\"pageTile__bsyc__title\">\n                {page.pageTitle}\n              </div>\n            }\n\n            <div className=\"pageTile__bsyc__desc\">\n              {page.tileDesc || page.description}\n            </div>\n          </div>\n        </div>\n        </div>\n      </SiteLink>\n    </div>\n  )\n}","import React, { Fragment, useEffect } from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\nimport { TopHeader } from '../../../layout/topHeader/topHeader';\n\nexport function SingleBanner(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n  const type = props.type || \"\"; // menu\n\n  //console.log('item', item);\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n  const alignV = cmsUtils.payload(item, 'AlignV') || '50%';\n\n  const cssClass = utils.classNames('cms_item', 'single-banner', 'banner-item', type, `bannerSize--${heightSet}`, item.cssClass || item.anchorName || '');\n  const bgUrl = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n  const captionTitle = cmsUtils.payload(item, 'CaptionTitle2') || cmsUtils.payload(item, 'CaptionTitle');\n  const linkUrl = cmsUtils.payload(item, 'LinkUrl2') || cmsUtils.payload(item, 'LinkUrl');\n\n  const titlePanel = captionTitle ? (\n    linkUrl ? (<SiteLink to={linkUrl} className=\"banner-item__link\">\n      <div className=\"banner-item__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>\n    </SiteLink>) : (<div className=\"banner-item__title\" dangerouslySetInnerHTML={{ __html: captionTitle }}></div>)\n  ) : null;\n\n  useEffect(() => {\n    const _none__menuHeader = document.querySelector(\"#top.none__menu\");\n      if(_none__menuHeader){\n        _none__menuHeader.style.display = 'none';\n      }\n  }, []);\n\n  return (\n    <Fragment>\n      <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n        style={{ backgroundImage: utils.css.bgUrlStyle(bgUrl), backgroundPositionY: alignV }}>\n        {titlePanel && <div className=\"banner_item__text\">{titlePanel}</div>}\n      </div>\n      {\n        type === \"menu\" &&\n        <TopHeader type=\"menu\"></TopHeader>\n      }\n    </Fragment>\n  );\n}","import React from 'react';\nimport env from '../../../env';\nimport { usePost } from '../../../components';\nimport { useForm } from '../../../form';\nimport { Button, ErrorMessage } from '../../../components';\nimport { getContactModel } from './contactFormModel';\nimport { gtm } from '../../../lib/tracking';\n\nexport function Contact(props) {\n\n  const emailReceiver = props.emailReceiver;\n  const fileAttachment = props.fileAttachment || 'false';\n  const mailchimpApiKey = props.mailchimpApiKey;\n  const mailchimpAudienceKey = props.mailchimpAudienceKey;\n  \n  const model = getContactModel({});\n  const form = useForm(model, { usePlaceholder: true });\n  const [sendingStatus, setSendingStatus] = React.useState(null);\n  const [mailChimpError, setMailChimpError] = React.useState();\n  const post = usePost();\n\n  const mailChimpErrorMemo = React.useMemo(() => {\n    return mailChimpError\n  }, [mailChimpError]);\n\n  // function onSubmit(e) {\n  //   setMailChimpError(null);\n  //   form.validateForm(e, () => {\n  //     const value = { \n  //       ...form.getValue(),\n  //        emailReceiver: emailReceiver,\n  //        mailchimpApiKey : mailchimpApiKey,\n  //        mailchimpAudienceKey : mailchimpAudienceKey\n  //     };\n  //     var files = form.getFiles();\n  //     var formData = new FormData();\n  //     formData.append('jsonData', JSON.stringify(value))\n  //     files.forEach(file => {\n  //       (file.files || []).forEach(uploadFile => {\n  //         formData.append(file.name, uploadFile)\n  //       })\n  //     });\n  //     //post.send(env.apiBase + \"/api/contact/send\", value);\n  //     post.sendFormData(env.apiBase + \"/api/contact/send\", formData);\n  //     setSendingStatus('pending')\n  //   })\n\n  //   console.log('submitting')\n  // }\n\n  function onSubmit(e) {\n    setMailChimpError(null);\n    form.validateForm(e, () => {\n      window.grecaptcha.ready(function () {\n        window.grecaptcha.execute('6LdbhoMjAAAAAO-96W4tgIwlHmSEYcAHlXbC_rFV', { action: 'submit' }).then(function (token) {\n\n          const value = {\n            ...form.getValue(),\n            emailReceiver: emailReceiver,\n            mailchimpApiKey: mailchimpApiKey,\n            mailchimpAudienceKey: mailchimpAudienceKey,\n            grecaptchaToken : token\n          };\n          \n          var files = form.getFiles();\n          var formData = new FormData();\n          formData.append('jsonData', JSON.stringify(value))\n          files.forEach(file => {\n            (file.files || []).forEach(uploadFile => {\n              formData.append(file.name, uploadFile)\n            })\n          });\n          post.sendFormData(env.apiBase + \"/api/contact/send\", formData);\n          setSendingStatus('pending');\n\n        });\n      });\n\n    })\n    \n  }\n\n  // if (status === 'done') {\n  //   //navigate(`/task/view/${taskId}`)\n  //   window.location.reload();\n  // }\n\n  if (post.done() && sendingStatus === 'pending') {\n    var value = form.getValue();\n    gtm.sendEvent('contactFormSubmitted', {contactEmail: value.email} )\n    form.reset(model);\n    setSendingStatus(null);\n\n    if(post.response.results && (post.response.results.MailChimpError && post.response.results.MailChimpError !== \"\")){\n      setMailChimpError(\"Mail Chimp Error : \" + post.response.results.MailChimpError);\n    }\n  }\n\n  const render = (name) => form.renderControl(name, null);\n\n  return (\n    <form className=\"contactForm\">\n      <div className=\"form-row\">\n        <div className=\"col-md-4 mb-2\">{render('name')}</div>\n        <div className=\"col-md-4 mb-2\">{render('phone')}</div>\n        <div className=\"col-md-4 mb-2\">{render('email')}</div>\n      </div>\n      <div className=\"form-row\">\n        <div className=\"col-md-12 mb-2\">{render('enquiry')}</div>\n      </div>\n\n      { fileAttachment === 'true' &&\n        <div className=\"form-row\">\n          <div className=\"col-md-12 mb-2\"> {render('attachments')} </div>\n        </div>\n      }\n\n      <div className=\"form-row\">\n        <div className=\"col-md-12 mb-2\">\n          <div className=\"actions contact__form__button\">\n            <Button onClick={onSubmit} status={post.status}>Send Message</Button>\n            <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n            <ErrorMessage errors={post.errors} />\n            <ErrorMessage errors={mailChimpErrorMemo} />\n            {post.done() && <span style={{marginLeft: '1.5rem', color:'red', fontWeight: 'bold'}}>Successfully sent!</span>}\n          </div>\n        </div>\n      </div>\n    </form>\n  );\n}","import { fb, validators } from '../../../lib/form';\n\nexport function getContactModel(data) {\n  const model = fb.group({\n    name: [data.name || '', [validators.Required()], { label: 'Name', type: 'text' }],\n    phone: [data.phone || '', [validators.Required()], { label: 'Phone', type: 'text' }],\n    email: [data.email || '', [validators.Required(), validators.Email()], { label: 'Email', type: 'email' }],\n    enquiry: [data.enquiry || '', [validators.Required()], { label: 'Your Message', type: 'textarea' }],\n    attachments: [data.attachments || '', [], { label: 'Attachments', type: 'file' }]\n  }); \n  return model;\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport  utils from '../../../utils';\nimport { Contact } from './contactForm';\n\nexport function ContactForm(props) {\n  const item = props.item;\n  console.log('item', item);\n  //const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, cmsOption);\n\n  const emailReceiver = cmsUtils.payload(item, 'EmailReceiver');\n  const fileAttachment = cmsUtils.payload(item, 'FileAttachment') || \"false\";\n\n  const mailchimpApiKey = cmsUtils.payload(item, 'MailchimpApiKey');\n  const mailchimpAudienceKey = cmsUtils.payload(item, 'MailchimpAudienceKey');\n\n  const cssClass = utils.classNames('cms_item', 'htmlPanel', cmsOption.isCmsEdit && 'html', item.cssClass || item.anchorName || '');\n\n  //let itemElt = (<div dangerouslySetInnerHTML={{ __html: content }}></div>);\n\n  return (\n    <div className={cssClass} data-cms-html=\"true\"\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n\n      <div className=\"container contact-wrapper\" id=\"contactForm\">\n        <Contact emailReceiver={emailReceiver} fileAttachment = {fileAttachment} mailchimpApiKey = {mailchimpApiKey} mailchimpAudienceKey = {mailchimpAudienceKey} />\n      </div>\n\n    </div>\n  )\n}","import React from 'react';\n// import { Item } from '../../items/item';\n// import { SiteLink } from 'shared/link/siteLink';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { YoutubeBannerMobilePopup } from '../../../lib/youtube/youtubeBanner--mobilePopup';\n//import env from '../../../env';\n//import Slider from 'modules/slider/slider';\n//import {BannerPanel} from '../bannerPanel/view';\n\nexport function VideoPanel(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const heightSet = cmsUtils.payload(item, 'HeightSet') || 'standard';\n  const videoCode = cmsUtils.payload(item, 'YoutubeCode');\n  const playerId = 'ytBanner-' + (item.itemId).substr(0, 8);\n\n  const video = {\n    heightSet: heightSet,\n    videoLinkOrId: videoCode,\n    playerId: playerId\n  }\n\n  //const enableYoutube = env.isProd;\n  const canPlayVideo = () => utils.css.screenWidth() >= 1200\n\n  const cssClass = utils.classNames('cms_item', 'youtubePanel', item.cssClass || item.anchorName || '');\n\n  //console.log(window.innerWidth, canPlayVideo())\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      {/* {canPlayVideo() ? <YoutubeBanner video={video} /> : <BannerPanel item={item}></BannerPanel>} */}\n      <YoutubeBannerMobilePopup video={video} canPlayVideo={canPlayVideo} />\n    </div>\n  );\n}\n\n// function MobileSlider(props) {\n//   const item = props.item;\n//   const subItems = item.items || [];\n  \n//   const slides = subItems.map((subItem, index) =>\n//     <SlideItem item={subItem} key={subItem.itemId}></SlideItem>\n//   );\n\n//   useLayoutEffect(() => {\n//     setTimeout(() => {\n//       console.log(window.innerWidth);\n//     const slider = new Slider('.contSlider');\n//     slider.init();\n//     }, 100)\n//   }, [])\n\n//   return (\n//     <div className=\"contSlider bannerSize\">\n//       {slides}\n//     </div>\n//   );\n// }\n\n// function SlideItem(props){\n//   const item = props.item;\n//   const bgUrl = utils.site.resourcePath(cmsUtils.payload(item, 'ImageUrl'));\n\n//   return (\n//     <div className=\"contSlide bannerSize\">\n//       <img className=\"contSlide__img\" src={bgUrl} alt=\"Banner\" />\n//     </div>\n//   );\n\n// }","import React from 'react';\nimport env from '../../env';\nimport { SiteLink} from '../../components';\nimport { usePost } from '../../components';\nimport { ErrorPopup, Loading } from '../../components';\nimport { useRouter } from '../../components';\n\nexport function SearchResult(props) {\n  const { query } = useRouter();\n  const post = usePost();\n  const keyword = query.q;\n  //console.log(keyword);\n\n  React.useEffect(() => {\n    post.send(env.apiBase + '/api/search/search', { keyword: keyword });\n    // eslint-disable-next-line\n  }, [keyword]);\n\n  if (post.loading()) {\n    return <Loading />\n  } else if (post.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={post.errors} />\n  }\n\n  console.log(post)\n  const data = post.response;\n\n  const pages = data.pages;\n\n  if (pages.length === 0) return (\n    <div className=\"alert alert-danger\" role=\"alert\">\n      No result found.\n    </div>\n  )\n  return (\n    <>\n      {pages.length > 0 && <div>\n      <h3 style={{marginTop: '2rem'}}>Pages</h3>\n      <PageList pages={pages} />\n      </div>}\n    </>\n  );\n}\n\nfunction PageList({pages}) {\n  return (\n    <div className=\"pageList row\">\n      {pages.map((page, index) =>\n        <div className=\"pageListItem col-md-6 col-lg-4\" key={index}>\n          <div className=\"pageListItem__inner\">\n            <SiteLink className=\"pageListItem__title\" to={page.pageUrl}>{page.pageTitle}</SiteLink>\n            <div className=\"pageListItem__highlight\" dangerouslySetInnerHTML={{ __html: page.searchHighlight }}></div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport cmsUtils from '../../cms/utils/cmsUtils';\nimport { useEffect } from 'react';\n//import style from './style';\n\nexport function TextWithJavScript(props){\n    \n    const item = props.item;\n    const cssClass = props.cssClass;\n    const code = cmsUtils.payload(item, 'Code') || '';\n\n    const javaScriptCode = code.substring(code.indexOf(\"<script\"), (code.indexOf(\"</script>\") + 9)).trim();\n    const nonjavaScriptCode = code.replace(javaScriptCode, '').trim();\n    console.log('nonjavaScriptCode', nonjavaScriptCode);\n\n    useEffect(() => {\n        \n        const javaScriptTopCode = javaScriptCode.substring(javaScriptCode.indexOf(\"<script\"), (javaScriptCode.indexOf(\">\") + 1)).trim();\n        const javaScriptInsideCode = javaScriptCode.substring((javaScriptCode.indexOf(\">\") + 1), (javaScriptCode.indexOf(\"</script>\"))).trim();\n\n        const script = document.createElement('script');\n        script.type = `text/javascript`;\n        \n        if(javaScriptInsideCode !== ''){\n            script.text = javaScriptInsideCode;\n        }\n\n        if(javaScriptTopCode.includes(\"src=\")){\n            let _src = javaScriptTopCode.indexOf('src=\"') === -1 ? '' : javaScriptTopCode.substring(javaScriptTopCode.indexOf('src=\"')).trim();\n            let src = _src.substring((_src.indexOf('src=\"') + 5), _src.indexOf('\"',5));\n            script.src = src;\n        }\n\n        if(javaScriptTopCode.includes(\"async\")){\n            script.async = true;\n        }\n\n        if(javaScriptTopCode.includes(\"defer\")){\n            script.defer = true;\n        }\n\n        if(javaScriptTopCode.includes(\"onload=\")){\n            \n            let _functionName = javaScriptTopCode.substring(javaScriptTopCode.indexOf('onload=') + 8);\n            let functionName = _functionName.substring(0, _functionName.indexOf('\"')-1).replace('()','');\n            script.onload = function(){\n                window[functionName]();\n            };\n        }\n\n        document.body.appendChild(script);\n    }, [javaScriptCode]);\n\n    return(\n        <div className={cssClass} id={item.anchorName}\n            dangerouslySetInnerHTML={{ __html: nonjavaScriptCode }}>\n        </div>\n    )\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SearchResult } from '../../../site/searchResult/searchResult';\nimport { InstagramFeed } from '../../../components';\nimport { AppVersion } from '../../../components';\nimport { TextWithJavScript } from '../../../components/TextWithJavaScript/view';\n\nexport function Code(props) {\n  const item = props.item;\n  //const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, cmsOption);\n\n  const code = cmsUtils.payload(item, 'Code');\n  const codeType = cmsUtils.payload(item, 'CodeType');\n  let controls = null;\n  if (codeType === 'Json') {\n    const codeJson = JSON.parse(code);\n    if (codeJson.control === 'search-results') {\n      controls = <SearchResult />\n    } else if(codeJson.control === 'app'){\n      controls = <AppVersion />\n    } else if (codeJson.control === 'instagram') {\n      controls = <InstagramFeed />\n    }\n  }\n\n  const cssClass = utils.classNames('cms_item', item.cssClass || item.anchorName || '');\n\n  //let itemElt = (<div dangerouslySetInnerHTML={{ __html: content }}></div>);\n\n  if (cmsOption.isCmsEdit)\n    return (\n      <div className={cssClass}\n        data-cms-item-id={item.itemId} \n        id={item.anchorName}>\n        <pre style={{ fontSize: '12px', margin: '5px', padding: '10px', background: '#eee', border: '1px solid #ccc' }}>\n          <b>Code Type: {codeType}</b>\n          {code}</pre>\n        </div>\n    )\n  else if (codeType === 'Text')\n    return (\n      <div className={cssClass} id={item.anchorName}\n        dangerouslySetInnerHTML={{ __html: code }}></div>\n    )\n  else if(codeType === 'TestWithJs'){\n      return(\n        <TextWithJavScript item = {item} cssClass = {cssClass}/>\n      )\n  }\n  else\n    return (\n      <div className={cssClass} id={item.anchorName}>{controls}</div>\n    )\n}\n","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\n\nexport function BlogPosts(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const posts = getPages(cmsUtils.payload(item, 'BlogPosts'));\n  const numOfTileLines = parseInt(cmsUtils.payload(item, 'NumOfTileLines', '2'));\n  //console.log(numOfPost, parseInt(numOfPost));\n  //console.log(posts);\n  const bp = utils.ui.getCurrentBreakpoint();\n  const tilesPerLine = {xs:1, sm:1, md:2, lg:2, xl:3, xxl:4}\n  const numOfPost = numOfTileLines * (tilesPerLine[bp] || 3);\n  const step = numOfPost;\n  console.log(bp, numOfTileLines, tilesPerLine, numOfPost)\n\n  const [tilesToShow, setTilesToShow] = React.useState(numOfPost);\n\n  const displayingPosts = posts.length > tilesToShow ? posts.slice(0, tilesToShow) : posts;\n  const showMore = posts.length > displayingPosts.length;\n\n  const pageTileElts = displayingPosts.map((page, index) =>\n    <Tile page={page} key={index} disableLink={cmsOption.isCmsEdit}></Tile>\n  );\n\n  const cssClass = utils.classNames('cms_item', 'blogTiles tiles', item.cssClass || item.anchorName || '');\n\n  return (\n    <>\n      <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n        {pageTileElts}\n      </div>\n      {showMore && (<div className=\"blogTiles__loadMore\">\n        <span className=\"thinBtn\" onClick={(e) => { setTilesToShow(tilesToShow + step) }}>LOAD MORE</span></div>)}\n    </>\n  );\n}\n\nfunction getPages(pagesSerialized) {\n  if (pagesSerialized) {\n    return JSON.parse(pagesSerialized);\n  }\n  return [];\n}\n\nfunction Tile(props) {\n  const page = props.page;\n  const imageUrl = utils.site.resourcePath(page.imageUrl);\n  const disableLink = props.disableLink;\n  return (\n    <div className=\"blogTile\">\n      <SiteLink className=\"blogTile__link\" to={disableLink ? '' : page.pageUrl}>\n        <div className=\"blogTile__bg\" style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}></div>\n        <div className=\"blogTile__content\">\n          <div className=\"blogTile__contentInner\">\n            <div className=\"blogTile__title\">\n              {page.pageTitle}\n            </div>\n            <div className=\"blogTile__desc\">\n              {page.tileDesc || page.description}\n            </div>\n            <div className=\"blogTile__readMore thinBtn\">READ MORE</div>\n          </div>\n        </div>\n      </SiteLink>\n    </div>\n  )\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\n\nexport function BlogPostTitle(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item);\n\n  const title = cmsUtils.payload(item, 'PageTitle');\n  const postDate = cmsUtils.payload(item, 'PostDate');\n\n  const cssClass = utils.classNames('blogView__titleContainer', 'cms_item', item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <div className=\"blogView__date\">\n        {postDate}\n      </div>\n      <h1 className=\"blogView__title\">\n        {title}\n      </h1>\n    </div>\n  );\n}\n","import React from 'react';\n//import cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { Item } from '../../items/item';\n\nexport function VideoHolder(props) {\n  const item = props.item;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, subItems);\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n\n  const cssClass = utils.classNames('cms_item', 'videoHolder', item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      {subItemsElts}\n    </div>\n  );\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { YoutubeEmbedPopup } from '../../../components';\n\nexport function VideoItem(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  console.log('item', item);\n\n  const youtubeCode = cmsUtils.payload(item, 'YoutubeCode');\n  const posterFrameUrl = cmsUtils.payload(item, 'PosterFrameUrl');\n  const captionTitleYoutube = cmsUtils.payload(item, 'CaptionTitleYoutube');\n  const shortDesc = cmsUtils.payload(item, 'ShortDesc');\n\n  const cssClass = utils.classNames('cms_item', 'videoItem', item.cssClass || item.anchorName || '');\n\n  return (\n    <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <div className=\"row video\">\n        <div className=\"col-md-5\">\n          <YoutubeEmbedPopup url={youtubeCode} title={captionTitleYoutube} posterUrl={posterFrameUrl} />\n        </div>\n        <div className=\"col-md-7\">\n          <h4>{captionTitleYoutube}</h4>\n          <div dangerouslySetInnerHTML={{ __html: shortDesc }}></div>\n        </div>\n      </div>\n    </div>\n  );\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport { Item } from '../../items/item';\nimport  utils from '../../../utils';\n\nexport function MultiColumnPanel(props){\n    const item = props.item;\n    const mobileReverse = cmsUtils.payload(item, 'MobileReverse', 'no');\n    //const subItems = item.items || [];\n    const subItems = (mobileReverse === \"yes\" && utils.css.screenWidth() <= 550) ? item.items.reverse() || [] : item.items || [];\n    const cmsOption = props.cmsOption || {};\n    const columnWidths = cmsUtils.payload(item, 'ColumnWidths').split(\",\");\n    const mobileColumnWidths = cmsUtils.payload(item, 'MobileColumnWidths').split(\",\");\n    const countItem = {countD : 0, countM : 0, col : \"\"};\n\n    const bgColor = cmsUtils.payload(item, 'BgColor');\n    //const textColorTheme = cmsUtils.payload(item, 'TextColorTheme');\n    const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n    const backgroundTile = cmsUtils.payload(item, 'BackgroundTile');\n    const bgTheme = cmsUtils.payload(item, 'TextColorTheme') || 'white';\n    \n    let bgUrl = null;\n    if (imageUrl)\n        bgUrl = utils.site.resourcePath(imageUrl);\n    else if (backgroundTile)\n        bgUrl = utils.site.resourcePath(`/dist/transparent-textures/textures/${backgroundTile}`);\n\n    const cssClass = utils.classNames('cms_item', 'contentPanel', 'multiColumnPanel', 'contentPanel--' + bgTheme, item.cssClass || item.anchorName || ''); \n\n    function setupClass(index){ \n        countItem.col = \"\";\n        if(columnWidths.length === countItem.countD){\n            countItem.countD = 0;\n        }\n\n        if(mobileColumnWidths.length === countItem.countM){\n            countItem.countM = 0;\n        }\n        \n        countItem.col = \"col-sm\" + (columnWidths[countItem.countD] === \"13\" ? \"\" : \"-\" + columnWidths[countItem.countD]) + \" col-\" + mobileColumnWidths[countItem.countM];\n        countItem.countD  ++;\n        countItem.countM  ++;\n    };\n\n    const subItemsElts = subItems.map((subItem, index) => {\n            setupClass();\n            return <div className = {countItem.col} key={subItem.itemId}>\n                        <Item item={subItem} cmsOption={cmsOption}></Item>\n                    </div> \n        }  \n    );\n    return (\n        <section className={cssClass} style={{\n            backgroundColor: `${bgColor}`,\n            backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl)\n            }} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n            <div className=\"container\">\n              <div className = \"row\">\n                {subItemsElts}\n              </div> \n            </div>\n        </section>\n    );\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport { FaChevronDown } from \"react-icons/fa\";\nimport React, { useLayoutEffect, useRef } from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { useRouter } from '../../../components';\nimport { handleElementLink } from '../../../components';\nimport env from '../../../env';\n\nexport function ExpandableHtml(props) {\n  const cmsOption = props.cmsOption || {};\n  const [open, setOpen] = React.useState(cmsOption.isCmsEdit);\n  const ver = env.ver;\n  const item = props.item;\n  //const subItems = item.items || [];\n  const { history } = useRouter();\n  //console.log('item', item, cmsOption);\n  //console.log(open)\n  let content = cmsOption.isCmsEdit? \n    cmsUtils.payload(item, 'Content'): \n    cmsUtils.payload(item, 'Content').replace(\"__version__\", \"<a href = '/app' class = 'app_version'> PWA \"+ ver +\"</a>\");\n\n  const buttonTitle = cmsUtils.payload(item, 'ButtonTitle');\n\n\n  const cssClass = utils.classNames('cms_item', 'htmlPanel exHtml', cmsOption.isCmsEdit && 'html', item.cssClass || item.anchorName || '');\n\n  //let itemElt = (<div dangerouslySetInnerHTML={{ __html: content }}></div>);\n\n  function handleClick(e) { \n    \n    let target = \"\";\n    if(e.target.closest('a')){\n      target = e.target.closest('a').getAttribute('target');\n    }\n    const processed = (target === \"_blank\" ? handleElementLink(e.target, null) : handleElementLink(e.target));\n    //const link = utils.url.getLinkFromElement(e.target);\n    //console.log('clicked', e, e.target, processed);\n    \n    if (processed.handled) {\n      e.preventDefault();\n      e.stopPropagation();\n    } else if (processed.linkInfo && processed.linkInfo.type === 'internal') {\n      e.preventDefault();\n      e.stopPropagation();\n      history.push(processed.linkInfo.url)\n    } else {\n      // e.preventDefault();\n      // e.stopPropagation();\n      // setPdfViewPath(utils.site.resourcePath(link))\n    }\n  }\n\n  const htmlBlock = useRef(null);\n  // function iframeSizer() {\n  //   //console.log('iframesizer')\n  //   let iframesContainer = htmlBlock.current.querySelectorAll('iframe.youtube, .ytvideo iframe');\n  //   //console.log('iframesizer', iframesContainer)\n  //   if (iframesContainer && iframesContainer.length) {\n  //     iframesContainer.forEach(element => {\n  //       let height = (element.parentElement.offsetWidth * 9) / 16\n  //       //console.log(height, element.parentElement.offsetWidth)\n  //       element.style.height = height + 'px';\n  //     });\n  //   }\n  // }\n\n  useLayoutEffect(() => {\n    const buttons = htmlBlock.current.querySelectorAll('.button');\n    for (let i = 0; buttons && i < buttons.length; i++) {\n      restructureButton(buttons[i])\n    }\n\n    // const youtubes = htmlBlock.current.querySelectorAll('iframe[src*=\"youtube\"]');\n    // console.log(youtubes)\n\n    // iframeSizer();\n    // window.addEventListener('resize', iframeSizer)\n    // return (): void => {\n    //   window.removeEventListener('resize', iframeSizer)\n    // }\n\n  }, [])\n\n\n  const style = {\n    icon: {\n      marginLeft: '0.5rem',\n      width: 'auto !important',\n      fontSize: '80%',\n      transition: 'all 0.5s'\n    },\n    iconOpen: {\n      transform: 'translateY(-0.1rem) rotate(-180deg)'\n    },\n    iconClosed: {\n      transform: 'translateY(-0.1rem) rotate(0)'\n    },\n    panelCollapsed: {\n      maxHeight: 0,\n      transition: 'all 0.6s',\n      opacity: 0,\n      overflow: 'hidden'\n    },\n    panelOpen: {\n      opacity: 1,\n      maxHeight: '2000px',\n      transition: 'all 1s'\n    }\n  }\n\n  const toggleExPanel = (e) => {\n    e.preventDefault()\n    e.stopPropagation()\n    setOpen(!open)\n  }\n\n\n  if (cmsOption.isCmsEdit)\n  return (\n    <div ref={htmlBlock} className={cssClass}\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName} onClick={(e) => handleClick(e)}>\n        <div css={{textAlign: 'center'}}>\n          <a className=\"button\" href=\"/\" onClick={(e) => {e.preventDefault(); e.stopPropagation();}}><strong>{buttonTitle}</strong> <span css={[style.icon, open? style.iconOpen : style.iconClosed]}><FaChevronDown /></span> </a>\n          <div css={{color: 'chocolate'}}>To edit the button title, please double click or open item editor</div>\n        </div>\n        \n        <div data-cms-html=\"true\"\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} css={[{margin: '1rem 0'}, open? style.panelOpen: style.panelCollapsed ]}\n      dangerouslySetInnerHTML={{ __html: content }}></div>\n      </div>\n  )\n\n  return (\n    <div ref={htmlBlock} className={cssClass} data-cms-html=\"true\"\n      data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName} onClick={(e) => handleClick(e)}>\n        <div css={{textAlign: 'center'}}>\n          <a className=\"button\" href=\"/\" onClick={toggleExPanel}><strong>{buttonTitle}</strong> <span css={[style.icon, open? style.iconOpen : style.iconClosed]}><FaChevronDown /></span> </a>\n        </div>\n        \n        <div css={[{margin: '1rem 0'}, open? style.panelOpen: style.panelCollapsed ]}\n      dangerouslySetInnerHTML={{ __html: content }}></div>\n      </div>\n  )\n}\n\n\nfunction restructureButton(el) {\n  if (!el.querySelector('span')) {\n    const span = document.createElement('span');\n    span.innerHTML = el.innerHTML;\n    el.innerHTML = '';\n    el.appendChild(span);\n  }\n}","// //import { css, keyframes  } from '@emotion/core'\n// //import { variables, mq } from 'cssInJs'\n\nimport { css } from '@emotion/core'\nimport { mq } from '../../cssInJs'\n\nexport default {\n    photoGallery : css({\n        maxWidth : '960px',\n        margin: 'auto'\n    }),\n    thumbnails : css({\n        display:'flex',\n        flexWrap:'wrap',\n        marginLeft:'-5px',\n        marginRight:'-5px'\n    }),\n    thumbnail : css(mq({\n        //flexBasis: ['50%','25%','33.33%'],\n        flexBasis: ['50%','25%','16.66%'],\n        //padding: ['5px']\n        padding:'5px',\n        cursor: 'pointer'\n    })),\n    bg : {\n        paddingBottom: '100%',\n        backgroundSize: 'cover',\n        backgroundPosition: 'center',\n        backgroundRepeat: 'no-repeat',\n    }\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './style';\nimport { useState, useEffect } from 'react';\n\nimport utils from '../../utils';\nimport cmsUtils from '../../cms/utils/cmsUtils';\nimport FsLightbox from 'fslightbox-react';\nimport { createPortal } from \"react-dom\";\n\nfunction Portal({children}){\n    const [el] = useState(document.createElement('div'));\n    useEffect(() => {\n        let mount = document.getElementById(\"portal-root\");\n        mount.appendChild(el);\n      return () => mount.removeChild(el);\n    }, [el]);\n    return createPortal(children, el);\n}\n\nexport function PhotoGallery(props){\n    const item = props.item;\n    const cmsOption = props.cmsOption || {};\n    const cssClass = utils.classNames('cms_item', 'photoGallery', item.cssClass || item.anchorName || '');\n    const _images = cmsUtils.payload(item, 'ImageUrl') ? cmsUtils.payload(item, 'ImageUrl').split(\"|\") : [];\n    const _thumbImages = [];\n\n    // _images.forEach(el => {\n    //     let a = el.split(\"/\");\n    //     console.log('e',e);\n    // });\n\n    //let a = _images[0].split(\"/\");\n    \n    if(_images.length > 0){\n        _images.forEach(el => {\n            let _texts = el.split('/');\n            let _text = el.replace(_texts[_texts.length-1], \"@thumb/\" + _texts[_texts.length-1]);\n            _thumbImages.push(_text);\n        });\n        //console.log('222', _images2);\n    }\n\n    //const _images = ['https://jaba.com.au/sites/jaba/media/images/multicolour-services-min.jpg'];\n    const [toggler, setToggler] = useState(false);\n    const [popupIndex, setPopupIndex] = useState(0);\n    \n    return(\n        <div css={style.photoGallery} className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n            {/* <FsLightbox\n                toggler={ toggler }\n                sources={_images}\n            /> */}\n            <Portal>\n                <div style={{display:'none'}}>\n                    PhotoGallery\n                </div>\n                <FsLightbox\n                    toggler={ toggler }\n                    sources={_images}\n                    sourceIndex={popupIndex}\n                />  \n            </Portal>\n\n            <div css={style.thumbnails}>\n                {\n                    _thumbImages.map((item, index) =>\n                     <div css={style.thumbnail} className=\"thumbnail\" key={index} onClick={(e)=> {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        setToggler(!toggler);\n                        setPopupIndex(index);\n                     }}>\n                         <div css={style.bg} style={{ backgroundImage: utils.css.bgUrlStyle(item) }}></div>\n                     </div>\n                    )\n                    \n                }\n            </div>\n        </div>\n    );   \n}","import { css } from '@emotion/core'\n//import { mq } from 'cssInJs'\n\nexport default{\n    testimonialPanel : css({\n        marginTop: '20px',\n        marginBottom: '20px',\n        backgroundColor: 'transparent',\n        '& .slick-prev:before, .slick-next:before' : {\n            color : 'black'\n        },\n        '& .slick-next' : {\n            right : '-2%'\n        },\n        '& .slick-prev' : {\n            left : '-2%'\n        }\n    })\n}","import { css } from '@emotion/core'\nimport { mq } from '../../../cssInJs'\n\nexport default{\n    testimonialItem : css(mq({\n        maxWidth : '300px',\n        backgroundColor: '#f8f8ff',\n        opacity: '.9',\n        textAlign: 'center',\n        color: '#000',\n        padding: '10px',\n        //height: '100%',\n        display: 'flex',\n        flexDirection: 'column',\n        justifyContent: 'space-between',\n        margin: 'auto',\n        height: ['400px', '430px']\n    })),\n\n\n    testimonialItem_title : css(mq({\n        marginBottom: '0px',\n        fontSize: ['2rem', '1.72rem']\n    })),\n\n    testimonialItem_desc :css(mq({\n        flex: '1 1 auto',\n        fontSize: ['1.2rem', '1rem']   \n        //flexGrow: '1',\n        //flexShrink: '1'\n    })),\n\n    testimonialItem_bottom : css(mq({\n        fontSize : ['1rem', '0.86rem']\n    }))\n}","import utils from '../../../utils';\nimport cmsUtils from '../../../cms/utils/cmsUtils';\nimport { IoIosStar } from \"react-icons/io\";\n\n/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './style';\n\nexport function TestimonialItem(props){\n\n    const item = props.item;\n    //const cmsOption = props.cmsOption || {};\n    const cssClass = utils.classNames('cms_item', 'testimonialItem', item.cssClass || item.anchorName || '');\n    \n    const startRatingColor = (props.startRatingColor && props.startRatingColor !== \"\") ? props.startRatingColor : \"black\";\n    \n    const title = cmsUtils.payload(item, 'Title');\n    const desc = cmsUtils.payload(item, 'Desc');\n    const bottom = cmsUtils.payload(item, 'BottomText');\n    const ratingValue = parseInt(cmsUtils.payload(item, 'RatingStar'));\n    \n    var rating = [];\n\n    for(var i = 0; i < ratingValue; i++ ){\n        rating.push(\n            <IoIosStar key = {i} style = {{ color : startRatingColor }}/>\n        );\n    }\n\n    return(\n        // data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}\n        <div css={style.testimonialItem} className={cssClass} >\n            <h4 css={style.testimonialItem_title} className=\"title\">\n                { title }\n            </h4>\n            <div className = \"rating\">\n                { rating }\n            </div>\n            {/* style={{ flexBasis: props.desH + \"px\" }} */}\n            <div css={style.testimonialItem_desc} className = \"desc\" >\n                { desc }\n            </div>\n            <h5 css={style.testimonialItem_bottom} className = \"bottom\">\n                { bottom }\n            </h5>\n        </div>\n    );\n}","//import { Item } from 'cms/items/item';\nimport Slider from \"react-slick\";\nimport utils from '../../../utils';\n//import cmsUtils from 'cms/utils/cmsUtils';\n\n/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport style from './style';\n//import { useState, useEffect } from 'react';\n\nimport { TestimonialItem } from '../testimonialItem/view';\n\nexport function TestimonialPanel(props){\n    const item = props.item;\n    //const defaultDesH = 220;\n    const startRatingColor = props.startRatingColor;\n    const subItems = item.items || [];\n    //console.log(subItems.length);\n    const cmsOption = props.cmsOption || {};\n    const cssClass = utils.classNames('cms_item', 'testimonialPanel', item.cssClass || item.anchorName || '');\n    \n    //const [desH, setDesH] = useState(defaultDesH);\n\n    //var maxDesTextLength = 0;\n    const testimonialItems = subItems.map((subItem, index) => {\n            // let subItemDes = cmsUtils.payload(subItem, \"Desc\");\n            // if(maxDesTextLength < subItemDes.length){\n            //     maxDesTextLength = subItemDes.length\n            // }\n            //return <TestimonialItem item={subItem} key={subItem.itemId} cmsOption={cmsOption} desH = {desH} startRatingColor = {startRatingColor} ></TestimonialItem>\n            return <TestimonialItem item={subItem} key={subItem.itemId} cmsOption={cmsOption} startRatingColor = {startRatingColor} ></TestimonialItem>\n        }\n    );\n    \n    // useEffect(() => {\n    //     if(defaultDesH < maxDesTextLength){\n    //         setDesH(maxDesTextLength);\n    //     }\n    // }, [maxDesTextLength]);\n\n    var settings = {\n        dots: false,\n        infinite: true,\n        speed: 1700,\n        autoplaySpeed: 3000,\n        ////fade: true,\n        autoplay: true,\n        slidesToShow: (subItems.length >= 3 ? 3 : subItems.length),\n        //slidesToShow: 3,\n        slidesToScroll: 1,\n        responsive : [\n            {breakpoint : 1024, settings : { slidesToShow: (subItems.length >= 2 ? 2 : subItems.length) }},\n            {breakpoint : 800, settings : { slidesToShow: 1 }}\n        ]\n    };\n\n    return(\n        <div css = {style.testimonialPanel} className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n            <Slider {...settings}>\n                { testimonialItems }\n            </Slider>\n        </div>\n    );\n}","import { css } from '@emotion/core'\n//import { mq } from '../../cssInJs'\nexport default{\n    exTextItem : css({\n        overflow:'hidden',\n        maxHeight:'0',\n        transition: 'all 0.8s',\n        padding: '0px',\n        '&.expand' : {\n            maxHeight:'40000px',\n            padding: '1rem 0'\n        }\n    })\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\n//import React from 'react';\nimport cmsUtils from '../../cms/utils/cmsUtils';\nimport utils from '../../utils';\nimport style from './style';\nimport { Item } from '../../cms/items/item';\n\nexport function ExpandablePanel(props){\n    const item = props.item;\n    const subItems = item.items || [];\n    const cmsOption = props.cmsOption || {};\n\n    const bgColor = cmsUtils.payload(item, 'BgColor');\n    const imageUrl = cmsUtils.payload(item, 'ImageUrl');\n    const backgroundTile = cmsUtils.payload(item, 'BackgroundTile');\n    \n    let bgUrl = null;\n\n    if (imageUrl){\n        bgUrl = utils.site.resourcePath(imageUrl);\n    }\n    else if (backgroundTile){\n        bgUrl = utils.site.resourcePath(`/dist/transparent-textures/textures/${backgroundTile}`);\n    }\n\n    const cssClass = utils.classNames('cms_item', 'contentPanel', 'expandablePanel', cmsOption.isCmsEdit && 'expandablePanel_item_cms', item.cssClass || item.anchorName || '');\n    const subItemsElts = subItems.map((subItem, index) =>\n        <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n    );\n    //id={item.anchorName}\n    return (\n            <section className={cssClass} style={{\n                backgroundColor: `${bgColor}`,\n                backgroundImage: bgUrl && utils.css.bgUrlStyle(bgUrl)\n                }} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} css={!cmsOption.isCmsEdit && style.exTextItem} data-anchor-status = \"collapse\" data-cms-item-anchor = {item.anchorName}>\n                <div className=\"contentPanel__bg\"></div>\n                <div className=\"container\">\n                  {subItemsElts}\n                </div>\n              </section> \n    )\n}","import { css } from '@emotion/core';\nimport { variables, mq } from '../../../cssInJs';\n\nconst numberOfTiles = [1, 2, 3, 4]\n//const marginLR = [14, 14, 14, 14]\nconst marginTB = [14, 14, 14, 14]\n\nconst widthPercent = (index) => 100 / numberOfTiles[index] + '%'\n\nconst linkText = {\n  color: variables.fontColor,\n  fontSize: '0.8rem',\n  //padding: '0 20px',\n  // '&:hover': {\n  //   color: variables.fontColor,\n  // }\n}\n\nexport const tileListStyle = {\n  tiles: mq({\n    display: 'flex',\n    justifyContent: 'flex-start',\n    flexWrap: 'wrap',\n    //marginLeft: [-marginLR[0] / 2, -marginLR[1] / 2, -marginLR[2] / 2, -marginLR[3] / 2],\n    //marginRight: [-marginLR[0] / 2, -marginLR[1] / 2, -marginLR[2] / 2, -marginLR[3] / 2],\n    marginTop: [marginTB[0] / 2, marginTB[1] / 2, marginTB[2] / 2, marginTB[3] / 2],\n    marginBottom: [marginTB[0] / 2, marginTB[1] / 2, marginTB[2] / 2, marginTB[3] / 2],\n    marginLeft: '-15px',\n    marginRight: '-15px'\n    //maxWidth:['960px'],\n    //margin: 'auto'\n  }),\n  categoryList : mq({\n    marginTop: [marginTB[0] / 2, marginTB[1] / 2, marginTB[2] / 2, marginTB[3] / 2],\n    marginBottom: [marginTB[0] / 2, marginTB[1] / 2, marginTB[2] / 2, marginTB[3] / 2],\n    //maxWidth:['960px'],\n    //margin: 'auto',\n    'div.ff.form-group' : {\n      maxWidth: '250px'\n    }\n  }),\n  container : mq({\n    maxWidth: '960px',\n    margin: 'auto'\n  })\n}\n\nexport const tileStyle = {\n  tile: mq({\n    //paddingLeft: [marginLR[0] / 2, marginLR[1] / 2, marginLR[2] / 2, marginLR[3] / 2],\n    //paddingRight: [marginLR[0] / 2, marginLR[1] / 2, marginLR[2] / 2, marginLR[3] / 2],\n    paddingLeft : '15px',\n    paddingRight : '15px',\n    paddingTop: [marginTB[0] / 2, marginTB[1] / 2, marginTB[2] / 2, marginTB[3] / 2],\n    paddingBottom: [marginTB[0] / 2, marginTB[1] / 2, marginTB[2] / 2, marginTB[3] / 2],\n    maxWidth: [widthPercent(0), widthPercent(1), widthPercent(2), widthPercent(3)],\n    flexBasis: [widthPercent(0), widthPercent(1), widthPercent(2), widthPercent(3)],\n    flexGrow: 0,\n    flexShrink: 0\n  }),\n  tileLink: {\n    background: '#fff',\n    height: '100%',\n    display: 'flex',\n    flexDirection: 'column',\n    //padding: 5,\n    //border: '1px solid red',\n    '&:hover': {\n      textDecoration: 'none',\n      //background: '#f3f3f3'\n      '& .buyNowBtn' : {\n        backgroundColor: variables.blueGray,\n        color: 'white',\n        fontWeight: 700\n      },\n      '& .bgImage' : {\n        transform: 'scale(1.02)'\n      }\n    }\n  },\n  prdImage: {\n    //padding: '0 5px',\n    //maxWidth: '190px',\n    //margin: 'auto',\n    //width: '100%',\n    //backgroundColor: 'grey',\n    //overflow: 'hidden'\n  },\n  bg: {\n    //height: 0,\n    //paddingBottom: '100%',\n    //paddingTop: '210px',\n    paddingTop: '100%',\n    //backgroundPosition: 'center top',\n    backgroundPosition: 'center',\n    //backgroundSize: 'cover',\n    backgroundSize: 'contain',\n    backgroundRepeat: 'no-repeat',\n    transition: 'all .2s ease-in-out'\n  },\n  shortDes : css({\n    //textAlign:'center',\n    //marginTop: '0.8rem',\n    fontSize:'0.7rem',\n    marginTop: '0.5rem',\n    marginBottom : '0.5rem',\n    color : variables.fontColor,\n    lineHeight: '1'\n  }),\n  name: css(linkText, {\n    //fontWeight: 'bold',\n    fontFamily: variables.familyHeader,\n    //textAlign:'center',\n    lineHeight: '1',\n    //marginTop: '0.5rem',\n    //color:variables.primaryColor,\n    color: variables.blueGray,\n    fontSize:'1.25rem'\n  }),\n  price: css(linkText, {\n    //marginTop: 'auto',\n    //textAlign:'center',\n    //marginBottom:'1rem',\n    //fontWeight:'700',\n    fontSize:'1rem',\n    flex:'1 0 auto',\n    color:variables.darkGray\n  }),\n  desContainer : {\n    backgroundColor: '#f8f8f8',\n    padding: '0.8rem',\n    flexDirection: 'column',\n    height: '100%',\n    display: 'flex',\n    marginTop: '0.5rem',\n    textAlign:'center'\n  },\n  buyNowButton : {\n    border: '1px solid ' + variables.blueGray,\n    color:variables.blueGray,\n    textAlign: 'center',\n    marginTop: '0.5rem',\n    paddingTop: '0.1rem',\n    paddingBottom:'0.1rem',\n    fontWeight: 700\n  }\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport utils from '../../../utils';\nimport { SiteLink } from '../../../components';\nimport { tileStyle } from './productTileStyle';\n//import utils from '../../../utils';\n\nexport function ProductTile({ product }) {\n  const s = tileStyle;\n  const imageUrl = product.thumbnailUrl ? utils.site.resourcePath(product.thumbnailUrl) : '/assets/product-empty.png';\n  //console.log(\"product : \", product)\n  const productUrl = product.productUrl ? product.productUrl : `/shop/${product.productSlug}`;\n  return (\n    <div css={[s.tile]}>\n      <SiteLink css={s.tileLink} to={productUrl}>\n        \n        <div css={s.prdImage}>\n          <div className=\"bgImage\" css={s.bg} style={{ backgroundImage: utils.css.bgUrlStyle(imageUrl) }}></div>\n        </div>\n        \n        <div css={s.desContainer}>\n          \n          <div css={s.name}>\n            {product.productName}\n          </div>\n          \n          <div css={s.shortDes}>\n            {/* {product.shortDesc} */}\n          </div>\n          \n          <div css={s.price}>\n            {\n              product.productStatus !== 0 ? product.productStatusText :\n                product.priceTextOveriding ? product.priceTextOveriding : 'AU' + utils.money.formatMoney(product.priceIncTax)\n            }\n          </div>\n\n          {\n            product.productStatus === 0 &&\n            <div className=\"buyNowBtn\" css={s.buyNowButton}>\n              BUY NOW\n            </div>\n          }\n\n        </div>\n\n      </SiteLink>\n    </div>\n  )\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core';\nimport React, { Fragment, useState } from 'react';\nimport env from '../../../env';\nimport { Loading, ErrorPopup, usePost } from '../../../components';\nimport { useForm } from '../../../form'\nimport { ProductTile } from './productTile';\nimport { tileListStyle } from './productTileStyle';\nimport { getCategoryListModel } from './categoryListModel';\n\nexport function ProductItems({ categories }) {\n\n  const post = usePost();\n  React.useEffect(() => {\n    post.send(env.apiBase + \"/api/product/getProducts\", { categories: categories });\n    // eslint-disable-next-line\n  }, [categories]);\n\n  // React.useEffect(() => {  \n  //   if (post.done()) {\n  //     setProduct(post.response);\n  //   }\n  // }, [post])\n\n  if (post.loading()) {\n    return <Loading />\n  } else if (post.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={post.errors} />\n  }\n\n  const data = post.response;\n  //console.log('product List', data);\n\n  return data.items && data.items.length > 0 ?\n    <Items items={data.items} categories={data.categories} defaultCategories={categories} /> :\n    <div>No products</div>;\n}\n\nfunction Items({ items, categories, defaultCategories }) {\n  const s = tileListStyle;\n  const defaultCategoriesArray = (defaultCategories && defaultCategories !== '') ? defaultCategories.split(',') : [];\n\n  const model = getCategoryListModel(categories, defaultCategoriesArray);\n  const categoryListForm = useForm(model, { usePlaceholder: true, onControlChanged: orderItemChanged });\n\n  const [showProducts, setShowProducts] = useState(() => {\n    if (defaultCategoriesArray.length === 1) {\n      let _items = [];\n      let _items2 = JSON.parse(JSON.stringify(items));\n      _items = _items2.filter(item => {\n        for (let i in item.productCategories) {\n          if (item.productCategories[i].categoryId === defaultCategoriesArray[0]) {\n            item.seqInCategory = item.productCategories[i].seq;\n            return true;\n          }\n        }\n        return false;\n      });\n\n      sortProudcts(_items);\n      return _items;\n    }\n    return items;\n  });\n\n  function orderItemChanged(e, control) {\n    if (control && control.name === 'categoryList') {\n      console.log('controll value', control.value);\n      let _items = [];\n      if (control.value && control.value !== '') {\n        _items = items.filter(item => {\n          if (control.value === '_favourites_') {\n            if (localStorage.favorites !== \"\") {\n              if (localStorage.favorites.includes(item.productId)) {\n                return true;\n              }\n            }\n          }\n          else {\n            for (let i in item.productCategories) {\n              if (item.productCategories[i].categoryId === control.value) {\n                item.seqInCategory = item.productCategories[i].seq;\n                return true;\n              }\n            }\n          }\n          return false;\n        });\n      }\n      else {\n        _items = items;\n      }\n      //sort\n      sortProudcts(_items);\n      setShowProducts(_items);\n    }\n  }\n\n  const render = (name) => categoryListForm.renderControl(name, null);\n  return (\n    <Fragment>\n      <div css={s.categoryList}>\n        {render('categoryList')}\n      </div>\n      <div css={s.tiles}>\n        {/* {items.map((item, index) => <ProductTile key={index} product={item} />)} */}\n        {\n          showProducts.length > 0 ? showProducts.map((item, index) => <ProductTile key={index} product={item} />)\n            : <div style={{ margin: 'auto' }}> No product </div>\n        }\n      </div>\n    </Fragment>\n  )\n}\n\nfunction sortProudcts(items) {\n  items.sort((a, b) => {\n    return a.seqInCategory - b.seqInCategory;\n  });\n}","import { fb } from '../../../lib/form';\nexport function getCategoryListModel(data, defaultCategories) {\n\n  var options = []; //{name : 'Favourites', value : '_favourites_'}\n\n  if (data.length > 0) {\n    \n    let _allCategory = null;\n    data.forEach(el => {\n      if (el.categoryName.toLowerCase() !== 'hair products' && el.categoryName.toLowerCase() !== 'all') {\n        options.push({ name: el.categoryName, value: el.categoryId });\n      }\n\n      if(el.categoryName.toLowerCase() === 'all'){\n        _allCategory = { name: el.categoryName, value: el.categoryId };\n      }\n\n    });\n\n    if(_allCategory !== null){\n      options.unshift(_allCategory);\n    }\n\n  }\n\n  let categoryList = \"\";\n  if (defaultCategories.length > 0) {\n    categoryList = defaultCategories[0];\n  }\n\n  const model = fb.group({\n    categoryList: [categoryList, [], {\n      label: 'FILTER BY',\n      type: 'select',\n      options: options\n    }]\n  });\n  return model;\n}","import { css  } from '@emotion/core'\nimport { mq } from '../../../cssInJs'\n\nconst step = css(mq({\n  flex: '0 0 100%',\n  opacity: 0,\n  padding: '2rem 1rem 2rem',\n  // maxHeight: '300px',\n  transition: 'all 0.3s',\n}))\n\nexport default {\n  cart: css({\n    position: 'relative',\n    margin: 'auto',\n    marginBottom: '3rem',\n    textAlign: 'left'\n  }),\n\n  stepsWrapper: css({\n    overflow: 'hidden',\n  }),\n  steps: css({\n    display: 'flex',\n    transition: 'all 1s cubic-bezier(0.22, 0.61, 0.36, 1)',\n    '& h3, & h4': {\n      textTransform: 'uppercase'\n    }\n  }),\n  step,\n  stepCurrent: css(step, {\n    // maxHeight: '2000px',\n    opacity: 1,\n    background: 'rgba(255,255,255,0.5)',\n  }),\n  stepPrev: css(step, {}),\n  stepNext: css(step, {}),\n  stepLast: css({\n    //maxHeight: '1000px',\n    opacity: 1\n  }),\n\n}\n","import { css  } from '@emotion/core'\nimport { mq } from '../../../cssInJs'\n\nconst navs = {\n  navs: css(mq({\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    borderBottom: 'solid 1px #ccc',\n    marginBottom: 8,\n    background: 'rgba(255,255,255,0.9)',\n    //background: 'linear-gradient(0deg, rgba(153,153,153,1) 0%, rgba(255,255,255,1) 100%)',\n  })),\n  nav: css(mq({\n    //width: 20,\n    //height: 30,\n    padding: '0.9rem 1rem',\n    fontSize: '1.1rem',\n    position: 'relative',\n    flex: '1 1 auto',\n    textAlign: 'center',\n  })),\n  navArrow: {\n  },\n  navCurrent: css({\n    //color: 'white',\n    //backgroundColor: variables.primaryColor\n    //background: 'linear-gradient(0deg, rgba(34,45,100,1) 0%, rgba(89,102,166,1) 100%)',\n    //borderBottom: 'solid 2px ' + variables.primaryColor\n    //background: '#ddd',\n    fontWeight: 'bold',\n    //background: 'linear-gradient(0deg, rgba(0,0,0,0.08) 0%, rgba(255,255,255,1) 100%)',\n    backgroundColor:'#eee',\n    color:'#3b3b3b'\n    //borderBottom: 'solid 2px ' + variables.primaryColor\n  }),\n  navFilled: css({\n    //backgroundColor: '#666'\n  }),\n  navClickable: css({\n    cursor: 'pointer'\n  })\n}\n\nexport default {\n\n  arrow: css(mq({\n    position: \"absolute\",\n    cursor: 'pointer',\n    color: '#aaa',\n    transition: 'all 0.3s',\n    zIndex: '1',\n    // xs, sm(>=576), md(>=768), lg(>=992), xl(>=1200), xxl(>=1600)\n    top: 0,\n    // [mqMax.md]: {\n    //   width: 100\n    // },\n    width: [20, 25, 30, 40],\n    '&:hover': {\n      color: '#666'\n    }\n  })),\n  arrowPrev: css(mq({\n    left: [-15, 0]\n  })),\n  arrowNext: css(mq({\n    right: [-15, 0]\n  })),\n\n  ...navs\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './stepStyle';\nimport React from 'react';\n\nimport { FaAngleRight } from 'react-icons/fa';\n\t\n\n\nexport function StepNav({ stepInfo }) {\n  const { steps, currentStep, moveTo, canGo } = stepInfo;\n\n  //if (currentStep === steps.length - 1) return null;\n  return <div css={style.navs}>\n    {steps.filter(x => x.id !== 'thanks').map((step, index) =>\n      <React.Fragment key={step.id}>\n        <div\n          css={[style.nav,\n          step.filled && style.navFilled,\n          index === currentStep ? style.navCurrent : null,\n          canGo(index) && style.navClickable\n          ]}\n          onClick={() => moveTo(index)}\n        >\n          {step.title}\n\n        </div>\n        {index < steps.length - 1 && <span css={style.navArrow}><FaAngleRight /></span>}\n      </React.Fragment>\n    )}\n  </div>\n}\n\n","export default {\n  items: {\n    marginBottom: '2rem'\n  },\n  item: {\n    display: 'flex',\n    justifyContent: 'space-between',\n    borderBottom: 'solid 1px #ccc',\n    padding: '0.5rem',\n    transition: 'all 0.5s',\n    '&:hover': {\n      background: '#f3f3f3'\n    }\n  },\n  // imgContainer: {\n  //   flex: '1 1 auto',\n  // },\n  product: {\n    flex: '1 1 auto',\n  },\n  details: {\n    flex: '0 1 auto',\n    display: 'flex',\n  },\n  optionName: {\n    fontSize: '0.9rem',\n  },\n  optionValue: {\n    fontSize: '0.9rem',\n    fontWeight: 'bold',\n  },\n  qty: {\n    margin: '0 0.5rem',\n    '.form-group': {\n      display: 'inline-block',\n    },\n    'input': {\n      width: '3.5rem'\n    }\n  },\n  amount: {\n    margin: '0 0.5rem',\n    paddingTop: '0.3rem',\n    minWidth: '5rem',\n    textAlign: 'right'\n  },\n  remove: {\n    //margin: '0 0.5rem',\n    //paddingTop: '0.1rem',\n    'button' : {\n      display: 'block',\n    }\n  }\n  \n}\n","import { mq } from '../../../cssInJs'\nexport default {\n  summary: mq({\n    marginLeft: [0, null, 30],\n    border: 'solid 1px #333',\n    padding: '0.5rem',\n    color: 'white',\n    borderRadius: ' 0.5rem',\n    background: '#555',\n    marginBottom: '0.5rem'\n  }),\n\n  totalHdr: {\n    fontSize: '1.1rem',\n    marginBottom: '0.5rem'\n  },\n\n  totalAmount: {\n    fontSize: '1.2rem',\n    fontWeight: 'bold'\n  }\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './summaryStyle';\n\nimport utils from '../../../utils';\nimport { Fragment } from 'react';\n\nexport function CartSummary({ cart }) { \n  //console.log('cart', cart); \n  const formatMoney = utils.money.formatMoney;\n  return <div css={style.summary}>\n    {\n      cart.shippingMethod === \"Standard\" &&\n      <Fragment>\n        <div css={style.totalHdr}> Shipping </div>\n        <div css={style.totalAmount}> AU {formatMoney(cart.shippingAmount)} </div>\n        <hr style={{borderTop:'1px solid white'}} />\n      </Fragment>\n    }\n    <div css={style.totalHdr}> Total Amount </div>\n    <div css={style.totalAmount}> AU {formatMoney(cart.totalAmount)} </div>\n  {/* <div class=\"row\">\n    <div class=\"col-md-6\">Total:</div>\n    <div class=\"col-md-6\">AU {formatMoney(cart.itemAmount)}</div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col-md-6\">GST:</div>\n    <div class=\"col-md-6\">AU {formatMoney(cart.taxAmount)}</div>\n  </div> */}\n  {/* <div class=\"row\">\n    <div class=\"col-md-6\">Shipping:</div>\n    <div class=\"col-md-6\">\n      <span *ngIf=\"!shippingMethod\">Method not selected yet</span>\n      <span *ngIf=\"shippingMethod == 'Pickup'\">Pickup - FREE</span>\n      <span *ngIf=\"shippingMethod == 'Shipping'\">{{cart.shippingAmount > 0? 'AU ' + formatMoney(cart.shippingAmount) : 'FREE'}}</span>\n    </div>\n  </div>\n  <div class=\"row total\">\n    <div class=\"col-md-6\"></div>\n    <div class=\"col-md-6\">\n      <span>{{cart.shippingMethod == ''? 'Please select Shipping Option.': 'AU ' + formatMoney(cart.totalAmount)}}</span>\n    </div>\n  </div>\n */}\n</div>\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './orderItemStyle';\nimport React from 'react';\n\nimport { Button, ErrorMessage } from '../../../components';\nimport utils from '../../../utils';\n\nimport { CartSummary } from '../cartSummary/summary';\n\nexport function OrderItems({ cart, form, moveNext, post, remove }) {\n  //const model = form.model;\n  const items = form.findControl('items').controls;\n  const render = (name, parent = null) => form.renderControl(name, parent);\n\n  function itemAmount(item, orderItem) {\n    const val = item.getValue()\n    return (val.quantity * (orderItem.unitPrice * 100)) / 100;\n  }\n\n  const next = (e) => {\n    form.validateForm(e, () => {\n      moveNext();\n    })\n  }\n\n  function ItemVariantSummary({ orderItem }) {\n    if (!orderItem.variantOptionsSerialised) return null;\n    const options = JSON.parse(orderItem.variantOptionsSerialised);\n    return <div>{\n      options\n        .map(x => \n          <span>\n            <span css={style.optionName}>{x.Name}:</span> \n            <span css={style.optionValue}>{x.Value}</span>\n          </span>\n        )\n        .reduce((acc, x) => acc === null ? x : <React.Fragment>{acc}, {x}</React.Fragment>, null)\n    }</div>\n  }\n\n  const orderItems = cart.orderItems.filter(x => x.orderItemType === 0)\n  const taxLines = cart.orderItems.filter(x => x.orderItemType === 1)\n\n  return <div>\n    <div className=\"row\" >\n      <div className=\"col-md-9\">\n        <form css={style.items}>\n          {orderItems.map((orderItem, index) => <div key={orderItem.orderItemId} css={style.item}>\n\n            <div className = \"row\">\n              <div className = \"col-sm-2\">\n                <img src={ orderItem.thumbnailUrl} alt = \"immmm\" />\n              </div>\n\n              <div className = \"col-sm-6\">\n                <b dangerouslySetInnerHTML={{ __html: orderItem.itemName }}></b>\n                <ItemVariantSummary orderItem={orderItem} />\n              </div>\n\n              <div className = \"col-sm-2\">\n                Qty: {render('quantity', items[index])}\n              </div>\n\n              <div className = \"col-sm-2\" css={style.remove}>\n                <b>{utils.money.formatMoney(itemAmount(items[index], orderItem))}</b>\n                <Button btnStyle=\"outline-dark\" className=\"btn-sm\" onClick={(e) => remove(e, index)} status={form.status}>Remove</Button>\n              </div>\n\n            </div>\n\n          </div>)}\n          {taxLines.map((orderItem, index) => <div key={orderItem.orderItemId} css={style.item}>\n            <div css={style.product}>\n              Tax: {orderItem.itemName}\n            </div>\n            <div css={style.details}>\n              <div css={style.qty}>\n               \n              </div>\n              <div css={style.amount}>\n                <b>{utils.money.formatMoney(orderItem.unitPrice)}</b>\n\n              </div>\n              <div css={style.remove}>\n                \n              </div>\n            </div>\n          </div>)}\n          \n        </form>\n\n      </div>\n      <div className=\"col-md-3\">\n        <CartSummary cart={cart} />\n      </div>\n      <div className=\"col-md-9 form__actions\" style={{textAlign:'center'}}>\n        <Button onClick={next} status={form.status}>Next</Button>\n        <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n      </div>\n    </div>\n  </div>\n}","import { fb } from '../../../form';\n\nexport function getOrderItemFormData(cart) {\n  const model = fb.group({\n    items: fb.array([]),\n  });\n\n  const itemArray = model.find('items').controls;\n  (cart.orderItems || []).forEach(item => {\n    itemArray.push(orderItemData(item))\n  })\n  return model;\n}\n\n\nexport function orderItemData(item) {\n  return fb.group({\n    quantity: [item.quantity || '', [], { label: null, type: 'number' }]\n  })\n}\n\n// addedUnitPrice: 0\n// discountUnitPrice: 0\n// extSerialized: null\n// itemDesc: \"\"\n// itemDescHtml: \"\"\n// itemName: \"Donation\"\n// orderItemDescriptions: []\n// orderItemId: \"031283cd-dbf2-4d62-aaf7-4134231f27a6\"\n// orderItemOptions: []\n// productCode: \"Donation\"\n// productId: \"dbdc9aad-16ab-47a0-97c7-ac2c13cf01a6\"\n// quantity: 1\n// shippingFeeType: 1\n// shppingFee: 0\n// subTitle: null\n// taxType: 2\n// thumbnailUrl: null\n// unitPrice: 0","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport { Fragment } from 'react';\n//import style from './shippingStyle';\nimport { Button, ErrorMessage } from '../../../components';\nimport { CartSummary } from '../cartSummary/summary';\nimport utils from '../../../utils';\n\nexport function Shipping({ cart, form, saveShipping, post }) {\n  const model = form.model;\n  const render = (name) => form.renderControl(name);\n\n  const val = form.getValue();\n  const billingInfo = model.find('billingInfo');\n  const shippingInfo = model.find('shippingInfo');\n\n  const next = (e) => {\n    form.validateForm(e, () => {\n      saveShipping();\n      utils.ui.scrollTo('#ecmcart');\n    })\n  }\n  \n  if (billingInfo){\n    billingInfo.disableValidators = val.useSameAddress;\n  }\n  \n  shippingInfo.disableValidators = false;\n\n  if(val.shippingMethod === 'Pickup' || val.shippingMethod === '0'){\n    shippingInfo.disableValidators = true;\n  }\n\n  return <div>\n    <div className=\"row\" >\n      <div className=\"col-md-9\">\n        <form>\n          <h3>Delivery Method</h3>\n          {render('shippingMethod')} \n          {\n            val.shippingMethod !== '' &&\n            <Fragment> \n              {\n                val.shippingMethod === 'Standard' &&\n                <Fragment>\n                  {/* <h3>Shipping Country</h3>\n                  {render('shippingCountry')} */}\n                  <h3>Shipping Address</h3>\n                  <Address form={form} addressModel={shippingInfo} />\n                </Fragment> \n              }\n              <h3>Billing Address</h3>\n              {\n                val.shippingMethod === 'Standard' &&\n                <Fragment>\n                  {render('useSameAddress')}\n                </Fragment> \n              }\n              { \n                !val.useSameAddress &&\n                <Address form={form} addressModel={billingInfo} />\n              }\n            </Fragment>\n          }\n\n        </form>\n      </div>\n\n      <div className=\"col-md-3\">\n        <CartSummary cart={cart} />\n      </div>\n    </div>\n    \n    {\n      val.shippingMethod !== '' &&\n      <Fragment>\n        <div className=\"form__actions\">\n          <Button onClick={next} status={form.status}>Next</Button>\n          <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n          <ErrorMessage errors={post.errors}/>\n        </div>\n      </Fragment>\n    }\n\n  </div>\n}\n\nfunction Address({form, addressModel}) {\n  const render = (name) => form.renderControl(name, addressModel);\n  return <div>\n    <div className=\"row\">\n      <div className=\"col-12 col-md-6\">\n        {render('firstName')}\n      </div>\n      <div className=\"col-12 col-md-6\">\n        {render('surname')}\n      </div>\n    </div>\n    <div className=\"row\">\n      <div className=\"col-12\">\n        {render('street1')}{render('street2')}\n      </div>\n    </div>\n    <div className=\"row\">\n      <div className=\"col-12 col-md-4\">\n        {render('suburb')}\n      </div>\n      <div className=\"col-12 col-md-4\">\n        {render('state')}\n      </div>\n      <div className=\"col-12 col-md-4\">\n        {render('postcode')}\n      </div>\n    </div>\n    <div className=\"row\">\n      <div className=\"col-12 col-md-6\">\n        {render('email')}\n      </div>\n      <div className=\"col-12 col-md-6\">\n        {render('mobile')}\n      </div>\n    </div>\n  </div>\n}","import { fb, validators } from '../../../form';\n\nexport function getShippingFormData(cart) {\n  const data = cart || {}\n\n  const shippingMethods = [\n    { name: 'Shipping', value: \"Standard\" },\n    { name: 'Click and Collect', value: \"Pickup\" }\n  ];\n\n  const shippingCountry = [\n    { name: 'Australia', value: \"Australia\" },\n    { name: 'International', value: \"International\" }\n  ];\n\n  const model = fb.group({\n    billingInfo: address(data.billingAddress),\n    shippingInfo: address(data.shippingAddress),\n    //shippingMethod: [data.shippingMethod || '', [], { label: 'Shipping Method', type: 'text' }],\n    shippingMethod: [data.shippingMethod || '', [], { label: null, type: 'radioList', options : shippingMethods, style : {inline : true} }],\n    shippingCountry: [data.shippingCountry || 'Australia', [], { label: null, type: 'radioList', options : shippingCountry, style : {inline : true} }],\n    useSameAddress: [data.useSameAddress || false, [], { label: `Use the same address`, type: 'checkbox' }],\n  });\n  return model;\n}\n\nexport function address(model) {\n  const data = model || {}\n  return fb.group({\n    firstName: [data.firstName || '', [validators.Required()], { label: 'First Name', type: 'text' }],\n    surname: [data.surname || '', [validators.Required()], { label: 'Surname', type: 'text' }],\n    street1: [data.street1 || '', [validators.Required()], { label: 'Street', type: 'text' }],\n    street2: [data.street2 || '', [], { label: null, type: 'text' }],\n    suburb: [data.suburb || '', [validators.Required()], { label: 'Suburb', type: 'text' }],\n    state: [data.state || '', [validators.Required()], { label: 'State', type: 'text' }],\n    postcode: [data.postcode || '', [validators.Required()], { label: 'Postcode', type: 'text' }],\n    email: [data.email || '', [validators.Required(), validators.Email()], { label: 'Email Address', type: 'email' }],\n    mobile: [data.mobile || '', [validators.Required()], { label: 'Mobile', type: 'tel' }],\n  })\n}\n\n// public AddressModel ShippingInfo { get; set; }\n// public AddressModel BillingInfo { get; set; }\n// public string ShippingMethod { get; set; }\n// public bool UseSameAddress { get; set; }\n// public string SpecialRequest { get; set; }\n\n// public string FirstName { get; set; }\n// public string Surname { get; set; }\n// public string AddressLine { get; set; }\n// public string Suburb { get; set; }\n// public string State { get; set; }\n// public string Postcode { get; set; }\n// public string Country { get; set; }\n// public string CountryCode { get; set; }\n// public string Email { get; set; }\n// public string Phone { get; set; }\n// public string Mobile { get; set; }","import { mq } from \"../../../cssInJs\";\n\nexport default {\n  pay: {\n    'h3': {\n      marginTop: 0\n    }\n  },\n  stripeWrapper: {\n    margin: '1rem 0 1rem',\n    maxWidth: 500,\n    padding: '1rem',\n    backgroundColor: '#999999'\n  },\n  formActions: {\n    marginTop: '2rem'\n  },\n  paymentInfoText : mq({\n    fontSize: ['0.6rem', '0.5rem'],\n    marginTop: '1rem',\n    '.contact-link' : {\n      color: 'white'\n    }\n  })\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './payStyle';\nimport React from 'react';\n\nimport { SiteLink, usePost } from '../../../components';\nimport { Button, ErrorMessage } from '../../../components';\nimport env from '../../../env';\nimport { useRouter } from '../../../components';\nimport { initStripe } from './payStripe';\n\nimport { CartSummary } from '../cartSummary/summary';\n\nexport function Pay({ cart, model, form, payStripe }) {\n\n  const [stripe, setStripe] = React.useState(null);\n  const [card, setCard] = React.useState(null);\n  const [error, setError] = React.useState(null);\n\n  const post = usePost();\n  const { Redirect } = useRouter()\n\n  React.useEffect(() => {\n    const { stripe, card } = initStripe(setError)\n    setStripe(stripe);\n    setCard(card);\n  }, [])\n\n  function payNow() {\n    if (error) return;\n    stripe.createToken(card).then(function (result) {\n      if (result.error) {\n        setError(result.error.message);\n      } else {\n        setError(null);\n        // Send the token to your server.\n        onSubmit(result.token.id);\n      }\n    });\n  }\n\n  function onSubmit(tokenId) {\n    console.log(tokenId)\n    post.send(env.apiBase + \"/api/cart/payStripe\", { tokenId: tokenId, itemTotalAmount: cart.itemTotalAmount, cartId: env.getDevCartId() });\n  }\n\n  if (post.done()) {\n    env.setDevCartId(null);\n    return <Redirect to={`/order-thankyou?o=${post.response.results.OrderIdToken}`} />\n  }\n\n  return <div css={style.pay}>\n    <div className=\"row\" >\n      <div className=\"col-md-9\">\n        <h3>Pay by Credit Card</h3>\n\n        <div css={style.stripeWrapper}>\n          <div className=\"stripe-wrapper\">\n            <div id=\"card-element\"></div>\n          </div>\n          <div css = {style.paymentInfoText}>\n            Payment through encrypted gateway can be made by Visa, Mastercard or AMEX.  Please enter your credit card details to complete your order. \n            For alternative payment methods please <SiteLink to = \"#contactForm\" className=\"contact-link\"> contact us </SiteLink>\n          </div>\n        </div>\n\n      </div>\n\n      <div className=\"col-md-3\">\n        <CartSummary cart={cart} />\n      </div>\n    </div>\n    <div css={style.formActions}>\n      <Button onClick={payNow} status={post.status}>Pay Now</Button>\n      <ErrorMessage errors={error} />\n      <ErrorMessage errors={post.errors} />\n    </div>\n  </div>\n}\n","import env from '../../../env';\n\nexport function initStripe(setError) {\n  // Create a Stripe client.\n  const stripe = window.Stripe(env.stripeKey);\n\n\n  // Create an instance of Elements.\n  const elements = stripe.elements();\n\n  // Custom styling can be passed to options when creating an Element.\n  // (Note that this demo uses a wider set of styles than the guide below.)\n  const elStyle = {\n    base: {\n      color: '#32325d',\n      fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\n      fontSmoothing: 'antialiased',\n      fontSize: '18px',\n      '::placeholder': {\n        //color: '#aab7c4'\n        color: '#000000'\n      }\n    },\n    invalid: {\n      color: '#fa755a',\n      iconColor: '#fa755a'\n    }\n  };\n\n  // Create an instance of the card Element.\n  const card = elements.create('card', { style: elStyle });\n\n  // Add an instance of the card Element into the `card-element` <div>.\n  card.mount('#card-element');\n\n  // Handle real-time validation errors from the card Element.\n  card.addEventListener('change', function (event) {\n    if (event.error) {\n      setError(event.error.message);\n    } else {\n      setError(null);\n    }\n  });\n\n  return { stripe, card };\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './cartStyle';\nimport React from 'react';\n\n//import { SiteLink } from '../../../components';\n\nimport env from '../../../env';\nimport { useGet, usePost } from '../../../components';\nimport { useForm } from '../../../form';\nimport { Loading, ErrorPopup } from '../../../components';\n\nimport { useStep } from './useStep';\nimport { StepNav } from '../cartStep/stepNav';\n\nimport { OrderItems } from '../cartOrderItems/orderItems';\nimport { getOrderItemFormData } from '../cartOrderItems/orderItemFormData'\nimport { Shipping } from '../cartShipping/shipping'\nimport { getShippingFormData } from '../cartShipping/shippingFormData';\nimport { Pay } from '../cartPayment/pay';\nimport utils from '../../../utils';\n\nexport function Cart() {\n  const [sendingStatus, setSendingStatus] = React.useState(null);\n  const [cart, setCart] = React.useState(null);\n\n  const get = useGet();\n\n  React.useEffect(() => {\n    get.send(env.apiBase + '/api/cart/getCart/' + env.getDevCartId());\n    setSendingStatus('pending')\n    // eslint-disable-next-line\n  }, []);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  if (sendingStatus === 'pending') {\n    setCart(get.response)\n    setSendingStatus(null)\n  }\n\n  if (!cart || cart.cartInfo.totalQuantity === 0){\n    return <EmptyCart/>\n  }\n  return <CartView cart={cart} setCart={setCart} />\n}\n\nfunction CartView({ cart, setCart }) {\n  const [sendingStatus, setSendingStatus] = React.useState(null);\n  const [goNext, setGoNext] = React.useState(false);\n  const post = usePost();\n  const stepInfo = useStep([\n    { id: 'orderItems', title: 'Cart' },\n    { id: 'shipping', title: 'Your Details' },\n    { id: 'payment', title: 'Pay' }\n  ])\n  const { steps, currentStep, lastStep, moveNext, markAsFilled } = stepInfo;\n\n  const orderItemForm = useForm(getOrderItemFormData(cart), { onControlChanged: orderItemChanged });\n  const shippingForm = useForm(getShippingFormData(cart), { onControlChanged: orderItemChanged });\n\n  function orderItemChanged(e, control) {\n    if (control && control.name === 'quantity') {\n      const index = orderItemForm.findControl('items').findIndexById(control.parent.id);\n      const orderItem = cart.orderItems[index]\n      const value = { qty: control.value, orderItemId: orderItem.orderItemId, cartId: env.getDevCartId() };\n      post.send(env.apiBase + \"/api/cart/updateQty\", value);\n      setSendingStatus('pending')\n      setGoNext(false)\n    }\n    else if(control && (control.name === 'shippingMethod' || control.name === 'shippingCountry')){\n      shippingForm.findControl(\"useSameAddress\").value = false;\n      if(control.value === 'Standard'){\n        shippingForm.findControl(\"useSameAddress\").value = true;\n      }\n      const value = { ...shippingForm.getValue(), cartId: env.getDevCartId() };\n      post.send(env.apiBase + \"/api/cart/saveShippingInfo\", value);\n      setSendingStatus('pending');\n      setGoNext(false);\n    }\n  }\n\n  function remove(e, index) {\n    console.log(index)\n    const orderItem = cart.orderItems[index]\n    const value = { orderItemId: orderItem.orderItemId, cartId: env.getDevCartId() };\n    post.send(env.apiBase + \"/api/cart/removeItem\", value);\n    setSendingStatus('pending')\n    setGoNext(false)\n  }\n\n  function saveShipping(e) {\n    //const value = { ...shippingForm.getValue(), useSameAddress: true, cartId: env.getDevCartId() };\n    const value = { ...shippingForm.getValue(), cartId: env.getDevCartId() };\n    //console.log(\"valu\", value);\n    post.send(env.apiBase + \"/api/cart/saveShippingInfo\", value);\n    setSendingStatus('pending');\n    setGoNext(true);\n  }\n  \n  React.useEffect(() => {  \n    if (post.done() && sendingStatus === 'pending') {\n      const cart = post.response.results.cartModel;\n      setSendingStatus(null)\n      setCart(cart);\n      if (goNext) {\n        markAsFilled(currentStep);\n        moveNext();\n      }\n    }\n    // eslint-disable-next-line\n  }, [post, currentStep])\n\n  const stepStyle = (index) => {\n    const locStyle = index === currentStep ? style.stepCurrent : (\n      index === currentStep - 1 ? style.stepPrev : (\n        index === currentStep + 1 ? style.stepNext : style.step))\n    const movingStyle = index === lastStep ? style.stepLast : null;\n    return [locStyle, movingStyle];\n  }\n\n\n  const next = () => {\n    markAsFilled(currentStep);\n    moveNext();\n    utils.ui.scrollTo('#ecmcart');\n  }\n  \n  return <div css={style.cart} id=\"ecmcart\">\n    <div css={style.stepsWrapper}>\n      <StepNav stepInfo={stepInfo} />\n      <div css={style.steps} style={{ transform: `translateX(${-100 * currentStep}%)` }}>\n        {steps.map((step, index) => {\n          let stepView = null\n          switch (step.id) {\n            case 'orderItems': stepView = <OrderItems cart={cart}\n              form={orderItemForm}\n              moveNext={next}\n              post={post}\n              remove={remove} />; break;\n            case 'shipping': stepView = <Shipping cart={cart}\n              form={shippingForm}\n              saveShipping={saveShipping}\n              post={post} />; break;\n            case 'payment': stepView = <Pay cart={cart}\n              post={post} />; break;\n            default: break;\n          }\n          return (\n            <div css={stepStyle(index)} key={step.id}>\n              {stepView}\n            </div>\n          )\n        })}\n      </div>\n    </div>\n  </div>;\n}\n\nfunction EmptyCart() {\n  return <div css={style.cart}>\n    <div css={style.stepsWrapper}>\n      <h3>Your cart is empty.</h3>\n    </div>\n  </div>;\n}","import React from 'react';\n\nexport function useStep(initialSteps){\n  const [steps, setSteps] = React.useState(initialSteps);\n  const [currentStep, setCurrentStep] = React.useState(0);\n  const [lastStep, setLastStep] = React.useState(0);\n\n  const moveNext = () => {\n    moveTo(currentStep < steps.length ? currentStep + 1 : currentStep)\n  }\n\n  const movePrev = () => {\n    moveTo(currentStep > 0 ? currentStep - 1 : 0)\n  }\n\n  const moveTo = (index) => {\n    if (!canGo(index)) return\n    setLastStep(currentStep)\n    setCurrentStep(index)\n    // if (!utils.ui.isElementInViewport(navEl.current)) {\n    //   utils.ui.scrollTo(navEl.current)\n    // }\n  }\n\n  const markAsFilled = (index) => {\n    if (!steps[index]) return;\n    steps[index].filled = true;\n    setSteps(steps);\n  }\n  \n  function canGo(index) {\n    if (steps[index] && steps[index].filled) return true;\n    const maxIndexFilled = Math.max(...steps.map((x, i) => x.filled ? i : -1));\n    return index <= maxIndexFilled + 1\n  }\n\n  function canGoNext() {\n    return currentStep < steps.length && canGo(currentStep + 1)\n  }\n\n  function canGoPrev() {\n    return currentStep > 0 && canGo(currentStep - 1)\n  }\n\n  return { steps, setSteps, currentStep, lastStep, moveTo, moveNext, movePrev, markAsFilled, canGo, canGoNext, canGoPrev}\n}","import React from 'react';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { ProductItems } from '../../../site/ecm/productList/productItems';\nimport { Cart } from '../../../site/ecm/cart/cart';\n\nexport function EcmItems(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  console.log('item', item);\n\n  const cssClass = utils.classNames('cms_item', 'ecm', item.cssClass || item.anchorName || '');\n\n  return cmsOption.isCmsEdit ? <pre style={{ fontSize: '12px', margin: '5px', padding: '10px', backgroundColor: '#eee', border: 'border: 1px solid #ccc;' }}>\n    <b>Type: {item?.itemTypeCode}</b>\n  </pre> : <div className={cssClass} data-cms-item-id={cmsOption.isCmsEdit && item.itemId} id={item.anchorName}>\n      <ItemBranch item={item} />\n    </div>;\n}\n\nfunction ItemBranch({ item }) {\n  const typeCode = item?.itemTypeCode;\n\n  if (typeCode === 'Ecm-ShoppingCart') {\n    return <Cart />\n  }\n  else if (typeCode === 'Ecm-ProductList') {\n    const categories = cmsUtils.payload(item, 'SelectedCategories');\n    return <ProductItems categories={categories} />\n  }\n  return <div></div>;\n}","import React from 'react';\nimport utils from '../../utils';\nimport { items } from '../../site/_cmsItems/items-generated';\nimport cmsUtils from '../utils/cmsUtils'\nimport { BannerPanel } from './bannerPanel/view';\nimport { BannerItem } from './bannerItem/view';\nimport { Panel } from './panel/view';\nimport { Html } from './html/view';\n// import { TestimonialPanel } from './testimonialPanel/view';\n// import { TestimonialItem } from './testimonialItem/view';\nimport { ImagePanel } from './imagePanel/view';\nimport { PageTiles } from './pageTiles/view';\nimport { PageTilesBsyc } from '../../components/tiles/bsyc/view';\nimport { SingleBanner } from './singleBanner/view';\nimport { ContactForm } from './contactForm/view';\nimport { VideoPanel } from './VideoPanel/view';\nimport { Code } from './code/view';\nimport { BlogPosts } from './blogPosts/view';\nimport { BlogPostTitle } from './blogPostTitle/view';\nimport { VideoHolder } from './videoHolder/view';\nimport { VideoItem } from './videoItem/view';\nimport { MultiColumnPanel } from './multiColumnPanel/view';\nimport { ExpandableHtml } from './expandableHtml/view';\nimport { PhotoGallery } from '../../components/photoGallery/view';\nimport { TestimonialPanel } from '../../components/testimonial/index';\nimport { ExpandablePanel } from '../../components/expandablePanel/view';\nimport { EcmItems } from './ecm/view';\n\n//import { PrintShare } from './printShare/view';\n\nexport function Item(props) {\n  const item = props.item;\n  const cmsOption = props.cmsOption || {};\n\n  //console.log('item', item, cmsOption);\n\n  let itemElt = null;\n\n  const found = utils.array.find(items, (x) => x.match(item, cmsOption))\n  //console.log(found)\n  if (found) {\n    return found.itemElt(item, cmsOption)\n  }\n\n  if (item.itemTypeCode === 'Panel') {\n    itemElt = (<Panel item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'Html') {\n    itemElt = (<Html item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'BannerPanel') {\n    itemElt = (<BannerPanel item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'BannerPanelWithMenu') {\n    itemElt = (<BannerPanel item={item} cmsOption={cmsOption} type=\"menu\" />);\n  } else if (item.itemTypeCode === 'BannerItem') {\n    itemElt = (<BannerItem item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'TestimonialPanel') {\n    const setting = {\n      startRatingColor: '#2b707d'\n    };\n    itemElt = (<TestimonialPanel item={item} cmsOption={cmsOption} {...setting} />);\n  } else if (item.itemTypeCode === 'ImagePanel') {\n    itemElt = (<ImagePanel item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'PageTiles') {\n    let _tileType = cmsUtils.payload(item, 'TileType');\n    const tileType = (_tileType && _tileType !== '') ? _tileType : '1';\n    if (tileType === \"2\") {\n      itemElt = (<PageTiles item={item} cmsOption={cmsOption} />);\n    }\n    else {\n      itemElt = (<PageTilesBsyc item={item} cmsOption={cmsOption} />);\n    }\n  } else if (item.itemTypeCode === 'SingleBanner') {\n    itemElt = (<SingleBanner item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'SingleBannerWithMenu') {\n    itemElt = (<SingleBanner item={item} cmsOption={cmsOption} type=\"menu\" />);\n  } else if (item.itemTypeCode === 'ContactForm') {\n    itemElt = (<ContactForm item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'VideoPanel') {\n    itemElt = (<VideoPanel item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'Code') {\n    itemElt = (<Code item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'Blog-Posts') {\n    itemElt = (<BlogPosts item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'Blog-PostTitle') {\n    itemElt = (<BlogPostTitle item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'MultiColumnPanel') {\n    itemElt = (<MultiColumnPanel item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'ExpandableHtml') {\n    itemElt = (<ExpandableHtml item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'VideoHolder') {\n    itemElt = (<VideoHolder item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'VideoItem') {\n    itemElt = (<VideoItem item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'PhotoGallery') {\n    itemElt = (<PhotoGallery item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode === 'ExpandablePanel') {\n    itemElt = (<ExpandablePanel item={item} cmsOption={cmsOption} />);\n  } else if (item.itemTypeCode?.indexOf('Ecm-') === 0) {\n    itemElt = (<EcmItems item={item} cmsOption={cmsOption} />);\n  } else {\n    itemElt = (<div>{item.itemTypeCode}</div>);\n  }\n\n  // const subItemsElts = subItems.map((subItem, index) =>\n  //   <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  // );\n  return itemElt\n}\n","import React, { useState, useEffect } from 'react';\nimport { useRouter } from '../../../components';\nimport { useGet } from '../../../components';\nimport { Item } from '../../items/item';\nimport { NotFound } from '../../../components';\nimport env from '../../../env';\nimport { useStore } from '../../../store';\nimport { ErrorPopup, Loading } from '../../../components';\nimport { useInstagram } from '../../../components';\nimport { MetaTag } from '../../../components';\nimport cmsUtils from '../../utils/cmsUtils';\nimport utils from '../../../utils';\nimport { gtm } from '../../../lib/tracking';\n\nconst log = (...args) => {\n  //console.log(args);\n}\nconst areEqual = (prevProps, nextProps) => {\n  return (prevProps.pageData === nextProps.pageData)\n};\nconst PageMemo = React.memo(Page, areEqual)\n\nexport function ViewPage() {\n  const { dispatch } = useStore();\n  const [pageLoaded, setPageLoaded] = useState(false);\n  const [data, setData] = useState(null);\n  //const path = usePath();\n  //log('view page', path);\n  const { pathname, Redirect } = useRouter();\n  useInstagram();\n\n  const get = useGet();\n  log('0. viewpage ready');\n\n  useEffect(() => {\n    log('*. start loading')\n    setPageLoaded(false);\n    get.send(env.apiBase + \"/api/cms/GetPublishedPage?path=\" + pathname);\n    // eslint-disable-next-line\n  }, [pathname]);\n\n  useEffect(() => {\n    if (data){\n      dispatch({ type: 'SET_PAGE', payload: data.data })\n      dispatch({ type: 'SET_MENU', payload: data.menu })\n    }\n    // eslint-disable-next-line\n  }, [data]);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  //log(router.pathname);\n  //log(get.loading());\n  log('1. viewpage component', pageLoaded, get.response);\n  \n  const pageData = get.response.data;\n  //const menuData = get.response.menu;\n  const redirectTo = get.response.redirectTo;\n\n  const cmsOption = {};\n  log(pageLoaded, !pageLoaded && !!pageData)\n  if (!pageLoaded && pageData) {\n    //log(pageLoaded, pageData, menuData)\n    log('2. dispatching page & menu')\n    setPageLoaded(true);\n    setData(get.response);\n    document.title = pageData.pageTitle;\n    gtm.pageView(pathname, pageData.pageTitle);\n    return null;\n  } else if (redirectTo) {\n    if (redirectTo.indexOf('http') >= 0 && typeof window !== `undefined`) {\n      return window.location.href = redirectTo;\n    } else {\n      return <Redirect to={redirectTo} />\n    }\n  } else if (!pageLoaded && !pageData) {\n    setPageLoaded(true);\n    setData(get.response);\n    return (<NotFound />)\n  }\n\n  log('3. call rendering memo')\n  if (pageData)\n  return <PageMemo pageData={pageData} cmsOption={cmsOption} />;\n  else\n    return <NotFound />\n}\n\n\nfunction Page(props) {\n  const pageData = props.pageData;\n  const cmsOption = props.cmsOption;\n  cmsOption.pageData = pageData;\n  // document.title = pageData.pageTitle;\n  log('4. page rendering', pageData, cmsOption)\n  const sectionItems = pageData.sections.map((section, index) => {\n    return (\n      <Section item={section} key={section.sectionName + index} cmsOption={cmsOption}></Section>\n    )\n  }\n  );\n  return (\n    <>\n      <MetaTag data={getMetaTag(pageData)} />\n      <div className={`cmsPage cmsPage--${pageData.pageTypeCode}`}>\n        {sectionItems}\n      </div>\n    </>\n  );\n}\n\nfunction Section(props) {\n  log('5. section rendering')\n  const item = props.item;\n  //const sectionName = item.sectionName;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  if (!subItems || subItems.length === 0)\n    return (<></>);\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n  return (\n    <>\n      {subItemsElts}\n    </>\n  );\n}\n\nfunction getMetaTag(pageData) {\n  //const country = utils.site.isNZ? 'New Zealand' : 'Australia'\n  const country = \"Australia\";\n  const siteName = env.siteName;\n  const titleSuffix = env.titleSuffix;\n\n  return {\n    title: pageData.pageTitle + ' | ' + titleSuffix,\n    description: cmsUtils.payload(pageData, 'Description'),\n    keywords: cmsUtils.payload(pageData, 'Keyword'),\n    heroImageUrl: utils.site.fullUrl(cmsUtils.payload(pageData, 'ImageUrl')),\n    language: 'English',\n    country: country,\n    siteName: siteName,\n    url: utils.site.fullUrl(pageData.pageUrl),\n    //canonical: utils.site.resourcePath(pageData.pageUrl)\n  }\n}","import React from 'react';\r\nimport { loadJs } from '../../lib/net-loader';\r\n\r\nexport function useInstagram() {\r\n  const [embedStatus, setEmbedStatus] = React.useState(null);\r\n\r\n  React.useEffect(() => {\r\n    loadEmbedJs()\r\n  })\r\n\r\n  function loadEmbedJs() {\r\n    if (typeof window !== `undefined`) {\r\n      //console.log('instgrm effect', embedStatus, window.instgrm);\r\n      if (window.instgrm) {\r\n        window.instgrm.Embeds.process();\r\n      }\r\n      else if (!embedStatus && embedStatus !== 'loading') {\r\n        setEmbedStatus('loading');\r\n        loadJs(\"https://www.instagram.com/embed.js\").then(data => {\r\n          //console.log('instgrm loaded', data);\r\n          if (window.instgrm) {\r\n            window.instgrm.Embeds.process();\r\n            setEmbedStatus('loaded');\r\n          }\r\n        })\r\n      }\r\n    }\r\n  }\r\n\r\n  return { loadEmbedJs: loadEmbedJs }\r\n}","//import { CmsPageController } from './cms-page-controller'\n\nexport class CmsRadioSender {\n  controller;//: CmsPageController;\n  constructor(controller) {\n    this.controller = controller;\n  }\n\n  sendMessageToParent(action: string, data: any) {\n    var cloned = JSON.parse(JSON.stringify(data));\n    if (typeof window !== `undefined`) {\n      window.parent.postMessage({\n        action: action,\n        data: cloned\n      }, \"*\");\n    }\n  }\n\n  saveAllDirtyHtml(htmlChanges) {\n    // skip another unneccesary round trip\n    this.sendMessageToParent('return-all-dirty-html', {\n      returnTo: '_saveAllDirtyHtml',\n      htmlChanges: htmlChanges\n    });\n  }\n\n  selectControllerItem(data) {\n    this.sendMessageToParent(\"select-controller-item\", data);\n  }\n\n  returnAllDirtyHtml(returnTo, htmlChanges) {\n    this.sendMessageToParent('return-all-dirty-html', {\n      returnTo: returnTo,\n      htmlChanges: htmlChanges\n    });\n  }\n\n  returnHtml(id, html) {\n    this.sendMessageToParent('return-html', {\n      id: id,\n      html: html\n    });\n  }\n\n  markDirtyHtml(id) {\n    this.sendMessageToParent(\"mark-dirty-html-item\", { id: id });\n  }\n}\n","//declare var CKEDITOR: any;\n//import { CmsPageController } from './cms-page-controller'\n\nexport class CmsRadioReceiver {\n  controller;//: CmsPageController;\n  constructor(controller) {\n    this.controller = controller;\n    this.init();\n  }\n\n  init() {\n    if (typeof window !== `undefined`) {\n      var self = this;\n      window.addEventListener(\"message\", function (e) {\n\n        var action = e.data.action;\n        var data = e.data.data;\n\n        // console.log(e, \"cms-action-received: \" + action, data);\n\n        if (action === 'select-item') {\n          self.selectItem(data.itemId)\n        } else if (action === 'media-selected-ckeditor') {\n          self.mediaSelectedCKEditor(data)\n        } else if (action === 'get-all-dirty-html') {\n          var htmlChanges = self.controller.getAllDirtyHtml();\n          self.controller.sender.returnAllDirtyHtml(data.returnTo, htmlChanges);\n        } else if (action === 'get-html') {\n          var html = self.controller.getHtml(data.id, data.itemName);\n          self.controller.sender.returnHtml(data.id, html);\n        } else if (action === 'page-reload') {\n          window.location.reload();\n        }\n      }, false);\n    }\n  }\n\n  mediaSelectedCKEditor(data) {\n    const CKEDITOR = window['CKEDITOR'] || {};\n    CKEDITOR.tools.callFunction(data.funcNum, data.selectedPath);\n  }\n\n  selectItem(itemId) {\n    this.controller.selectItemFromController(itemId);\n  }\n}\n","import { CmsRadioSender } from './cms-radio-sender'\n// //import * as $ from 'jquery';\n// declare var CKEDITOR: any;\n// import * as $ from 'jquery';\n\nexport class CmsHtmlEditor {\n  ckeditorConfig;\n  ckeditorStylesSet;\n  sender;\n  constructor(cmsEndpoint: string, sender: CmsRadioSender) {\n    this.ckeditorConfig = {\n      startupFocus: true,\n      filebrowserBrowseUrl: cmsEndpoint + '/cms41helper/browse/selectpageormedia', //'/cms/browse',//'/cms/resource/selectfileckeditor',\n      filebrowserImageBrowseUrl: cmsEndpoint + '/cms41helper/browse/selectmedia', //'/cms/browse?type=rc',//'/cms/resource/selectfileckeditor?type=Images',\n      extraPlugins: 'sourcedialog,youtubejaba,lineutils,widget,embedjaba,image2',\n      toolbar: [{\n        name: 'basicstyles',\n        groups: ['basicstyles', 'cleanup'],\n        items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']\n      },\n      {\n        name: 'paragraph',\n        groups: ['list', 'align'],\n        items: ['NumberedList', 'BulletedList', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight',\n          'JustifyBlock'\n        ]\n      },\n      {\n        name: 'links',\n        items: ['Link', 'Unlink', 'Anchor']\n      },\n      {\n        name: 'insert',\n        items: ['Image', 'Table', 'HorizontalRule', 'PageBreak', 'Iframe', 'Youtube', 'EmbedJaba']\n      },\n        '/',\n      {\n        name: 'document',\n        groups: ['mode'],\n        items: ['Sourcedialog']\n      },\n      {\n        name: 'clipboard',\n        groups: ['clipboard', 'undo'],\n        items: ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']\n      },\n      {\n        name: 'styles',\n        items: ['Styles', 'Format']\n      },\n      {\n        name: 'colors',\n        items: ['TextColor', 'BGColor']\n      },\n      {\n        name: 'tools',\n        items: ['Maximize', 'ShowBlocks']\n      }\n      ],\n      extraAllowedContent: 'style;span;*[id,rel,data-*](*){*}'\n    }\n\n    this.ckeditorStylesSet = [\n      /* Block Styles */\n\n      // These styles are already available in the \"Format\" combo (\"format\" plugin),\n      // so they are not needed here by default. You may enable them to avoid\n      // placing the \"Format\" combo in the toolbar, maintaining the same features.\n      /*\n      { name: 'Paragraph',\t\telement: 'p' },\n      { name: 'Heading 1',\t\telement: 'h1' },\n      { name: 'Heading 2',\t\telement: 'h2' },\n      { name: 'Heading 3',\t\telement: 'h3' },\n      { name: 'Heading 4',\t\telement: 'h4' },\n      { name: 'Heading 5',\t\telement: 'h5' },\n      { name: 'Heading 6',\t\telement: 'h6' },\n      { name: 'Preformatted Text',element: 'pre' },\n      { name: 'Address',\t\t\telement: 'address' },\n      */\n        { name: 'Title', attributes: { 'class': 'title' } },\n        // { name: 'Heading 3', element: 'h1', attributes: { 'class': 'h3' } },\n        // { name: 'Super paragraph',\t\telement: 'p', attributes: { 'class': 'superparagraph' } },\n\n      //{ name: 'Italic Title',\t\telement: 'h2', styles: { 'font-style': 'italic' } },\n      //{ name: 'Subtitle',\t\t\telement: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } },\n      //{\n      //\tname: 'Special Container',\n      //\telement: 'div',\n      //\tstyles: {\n      //\t\tpadding: '5px 10px',\n      //\t\tbackground: '#eee',\n      //\t\tborder: '1px solid #ccc'\n      //\t}\n      //},\n\n      /* Inline Styles */\n\n      // These are core styles available as toolbar buttons. You may opt enabling\n      // some of them in the Styles combo, removing them from the toolbar.\n      // (This requires the \"stylescombo\" plugin)\n      /*\n      { name: 'Strong',\t\t\telement: 'strong', overrides: 'b' },\n      { name: 'Emphasis',\t\t\telement: 'em'\t, overrides: 'i' },\n      { name: 'Underline',\t\telement: 'u' },\n      { name: 'Strikethrough',\telement: 'strike' },\n      { name: 'Subscript',\t\telement: 'sub' },\n      { name: 'Superscript',\t\telement: 'sup' },\n      */\n\n      //{ name: 'Marker',\t\t\telement: 'span', attributes: { 'class': 'marker' } },\n\n      //{ name: 'Big',\t\t\t\telement: 'big' },\n      //{ name: 'Small',\t\t\telement: 'small' },\n      //{ name: 'Typewriter',\t\telement: 'tt' },\n\n      //{ name: 'Computer Code',\telement: 'code' },\n      //{ name: 'Keyboard Phrase',\telement: 'kbd' },\n      //{ name: 'Sample Text',\t\telement: 'samp' },\n      //{ name: 'Variable',\t\t\telement: 'var' },\n\n      //{ name: 'Deleted Text',\t\telement: 'del' },\n      //{ name: 'Inserted Text',\telement: 'ins' },\n\n      //{ name: 'Cited Work',\t\telement: 'cite' },\n      //{ name: 'Inline Quotation',\telement: 'q' },\n\n      //{ name: 'Language: RTL',\telement: 'span', attributes: { 'dir': 'rtl' } },\n      //{ name: 'Language: LTR',\telement: 'span', attributes: { 'dir': 'ltr' } },\n\n      /* Object Styles */\n        { name: 'Button', element: 'a', attributes: { 'class': 'button' } },\n        { name: 'Primary Button', element: 'a', attributes: { 'class': 'p-button' } },\n        { name: 'Secondary Button', element: 'a', attributes: { 'class': 's-button' } },\n        { name: 'More link', element: 'a', attributes: { 'class': 'more' } }\n      //{\n      //\tname: 'Styled image (left)',\n      //\telement: 'img',\n      //\tattributes: { 'class': 'left' }\n      //},\n\n      //{\n      //\tname: 'Styled image (right)',\n      //\telement: 'img',\n      //\tattributes: { 'class': 'right' }\n      //},\n\n      //{\n      //\tname: 'Compact table',\n      //\telement: 'table',\n      //\tattributes: {\n      //\t\tcellpadding: '5',\n      //\t\tcellspacing: '0',\n      //\t\tborder: '1',\n      //\t\tbordercolor: '#ccc'\n      //\t},\n      //\tstyles: {\n      //\t\t'border-collapse': 'collapse'\n      //\t}\n      //},\n\n      //{ name: 'Borderless Table',\t\telement: 'table',\tstyles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } },\n      //{ name: 'Square Bulleted List',\telement: 'ul',\t\tstyles: { 'list-style-type': 'square' } }\n    ]\n\n    this.sender = sender;\n  }\n\n  show($editor) {\n    const CKEDITOR = window['CKEDITOR'] || {};\n    //for ckeditor\n    // console.log('ckeditor show');\n    try {\n      // We need to turn off the automatic editor creation first.\n      CKEDITOR.disableAutoInline = true;\n    } catch (e) { }\n\n    var editor = CKEDITOR.inline('cmsCurrentEditor', this.ckeditorConfig);\n    if (!CKEDITOR.stylesSet.get('default'))\n    CKEDITOR.stylesSet.add('default', this.ckeditorStylesSet);\n\n    var self = this;\n    editor.on('change', function (evt) {\n      // getData() returns CKEditor's HTML content.\n      //$(\"#cmsCurrentEditor\").addClass(\"dirtyHtml\");\n      //const itemId = $(\"#cmsCurrentEditor\").data('cms-item-id');\n      const ed = document.querySelector('#cmsCurrentEditor');\n      ed.classList.add('dirtyHtml');\n      const itemId = ed.getAttribute('data-cms-item-id');\n\n      //console.log(itemId);\n      self.sender.markDirtyHtml(itemId);\n      //console.log('Total bytes: ' + evt.editor.getData().length);\n    });\n    editor.on('paste', function (evt) {\n      //console.log(evt.data.dataValue);\n      //evt.data.dataValue = evt.data.dataValue.replace(/&nbsp;/g, '');\n      //evt.data.dataValue = evt.data.dataValue.replace(/<p><\\/p>/g, '');\n      //editor.insertHtml(evt.data.dataValue); return false;\n      setTimeout(function () {\n        CKEDITOR.instances.cmsCurrentEditor.setData(CKEDITOR.instances.cmsCurrentEditor.getData());\n      }, 100);\n    }, null, null, 9);\n  }\n\n  close($editor = null) {\n    const CKEDITOR = window['CKEDITOR'] || {};\n    //console.log('ckeditor close');\n    if (typeof CKEDITOR.instances.cmsCurrentEditor != \"undefined\")\n      CKEDITOR.instances.cmsCurrentEditor.destroy();\n\n    //for (var instance in CKEDITOR.instances) {\n    //    CKEDITOR.instances[instance].destroy();\n    //}\n\n  }\n}\n","import { CmsRadioSender } from './cms-radio-sender';\nimport { CmsRadioReceiver } from './cms-radio-receiver';\nimport { CmsHtmlEditor } from './cms-html-editor';\nimport env from '../../env';\n\n// declare var CKEDITOR: any;\n// import * as $ from 'jquery';\n\nexport class CmsPageController {\n  settings; //: any;\n  sender; //: CmsRadioSender;\n  receiver; //: CmsRadioReceiver;\n  htmlEditor; //: CmsHtmlEditor;\n\n  constructor() {\n    this.settings = { root: 'body', viewOnly: false };\n    this.sender = new CmsRadioSender(this);\n    this.receiver = new CmsRadioReceiver(this);\n    this.htmlEditor = new CmsHtmlEditor(env.cmsEndpoint, this.sender);\n  }\n  init(options) {\n    const $ = window['jQuery'];\n    this.settings = Object.assign(\n      {},\n      /*default*/ { root: 'body', viewOnly: false },\n      options\n    );\n    this.initGlobalVars();\n\n    var self = this;\n    $('[onclick]').prop('onclick', null);\n    $('[dblclick]').prop('dblclick', null);\n    $(self.settings.root).off('click dblclick', '*');\n    $(self.settings.root).on('click dblclick', '*', function (e) {\n      //$(\".cms_html_editor_img_selected\").removeClass(\"cms_html_editor_img_selected\");\n      //                console.log($(e.target).hasClass(\"allowClick\"));\n      //                console.log(e.target);\n\n      if (!$(e.target).hasClass('allowClick')) {\n        e.stopPropagation();\n        e.preventDefault();\n      }\n\n      if (\n        $(this).attr('contenteditable') === 'true' ||\n        $('#cms_html_editor_source_id').is(':visible')\n      ) {\n        e.stopPropagation();\n        return;\n      }\n      if (!self.settings.viewOnly)\n        self.selectItem($(this), false, e.type === 'dblclick');\n\n      //Add noreferrer noopener when new window\n      $('#cke_108_select').change(function () {\n        let _value = $(this).val();\n        $('#cke_215_textInput').val('');\n        if (_value === '_blank') {\n          $('#cke_215_textInput').val('noreferrer noopener');\n        }\n      });\n    });\n\n    if (self.settings.viewOnly) return; // stop the editing logic for viewonly mode.\n\n    // ctrl + s for html block\n    $(self.settings.root).on('keydown', '#cmsCurrentEditor', function (e) {\n      if (e.ctrlKey && e.which === 83) {\n        //var itemId = $(this).data(\"cms-item-id\");\n        //if (!itemId)\n        //    itemId = $(this).closest(\"[data-cms-item-id]\").data(\"cms-item-id\");\n        //window.parent.cms.site.saveHtml(itemId);\n        //e.preventDefault();\n\n        self.sender.saveAllDirtyHtml(self.getAllDirtyHtml());\n        return false;\n      }\n    });\n  }\n\n  selectItemFromController(id) {\n    const $ = window['jQuery'];\n    var item = $(\".cms_item[data-cms-item-id='\" + id + \"']\");\n    this.scrollTo(item);\n    this.selectItem(item, true);\n  }\n\n  selectItem($item, fromController, doubleclicked = false) {\n    //console.log(\"select item - \" + fromController + \" - \" + doubleclicked);\n    //console.log($item);\n    var editor = $item.closest('[contenteditable]');\n    if (editor.length > 0) return;\n    var cke_top = $item.closest('.cke_top');\n    if (cke_top.length > 0) return;\n\n    this.closeEditingItem();\n    //console.log($item);\n    if (typeof $item === 'undefined') return;\n    if ($item.length === 0) return;\n    this.findItem($item, fromController, 0, doubleclicked);\n  }\n\n  closeEditingItem() {\n    const $ = window['jQuery'];\n    //console.log(\"close editing item\");\n    $('[contenteditable]').removeAttr('contenteditable');\n    $('#cms_hovermenu').remove();\n    $('.cms_editing_item').removeClass('cms_editing_item');\n  }\n\n  findItem($item, fromController, depth, doubleclicked) {\n    const $ = window['jQuery'];\n    if (depth > 100) return false;\n    // console.log($item, fromController, depth, doubleclicked)\n    if (\n      typeof $item.attr('data-cms-html') !== 'undefined' &&\n      $item.attr('data-cms-html') === 'true'\n    ) {\n      $item.attr('contenteditable', 'true');\n      this.showHtmlEditor($item);\n    }\n    if (typeof $item.attr('data-cms-item-id') !== 'undefined') {\n      //$item.attr(\"contenteditable\", \"true\");\n      $item.addClass('cms_editing_item');\n      if ($item.hasClass('multiColumnPanelv2')) {\n        //$(\".cms_item[data-cms-item-id='\" + itemid + \"']\")\n        $item.find('div.new__multicolumn__panel__html').each(function (index) {\n          $(this).addClass('cms_editing_item');\n        });\n      }\n\n      if (!fromController) {\n        //window.parent.cms.site.selectControllerItem($item.attr(\"data-cms-item-id\"),\n        //    typeof doubleclicked != \"undefined\" && doubleclicked == true\n        //);\n        this.sender.selectControllerItem({\n          id: $item.attr('data-cms-item-id'),\n          openEdit:\n            typeof doubleclicked !== 'undefined' && doubleclicked === true,\n        });\n      }\n      //show_hovermenu($item);\n    } else {\n      var editableParent = $item.parents(\n        '.cms_item[data-cms-item-id], [data-cms-html]'\n      );\n      if (editableParent.length > 0)\n        this.findItem(\n          editableParent.first(),\n          fromController,\n          depth + 1,\n          doubleclicked\n        );\n    }\n  }\n\n  sameContent(a, b) {\n    return a === b;\n  }\n\n  showHtmlEditor($item) {\n    const $ = window['jQuery'];\n    var editor = $item;\n    //console.log(editor);\n    //var $menu = $(\"#cms_html_editor_ctrl\");\n    ////$menu.css(\"top\", $item.offset().top - 40);\n    ////$menu.css(\"left\", $item.offset().left);\n    //$menu.show();\n    //initHtmlEditor($item);\n\n    if (editor.attr('id') === 'cmsCurrentEditor') return;\n\n    $('#cmsCurrentEditor').attr('id', '');\n    this.htmlEditor.close(editor);\n\n    if (editor.hasClass('new__multicolumn__panel__html')) {\n      //$item.attr(\"data-cms-item-id\")\n      var dataCmsItemId2 = editor.attr('data-cms-item-id2');\n      $(\"div.cms_item[data-cms-item-id2='\" + dataCmsItemId2 + \"']\").attr(\n        'data-cms-item-id',\n        ''\n      );\n      editor.attr('data-cms-item-id', dataCmsItemId2);\n    }\n\n    editor.attr('id', 'cmsCurrentEditor');\n    //editor.data(\"current-content\", editor.html());\n\n    this.htmlEditor.show(editor);\n    //setHandlers($item);\n  }\n\n  initGlobalVars() {\n    const $ = window['jQuery'];\n    window['cmsPage'] = $.extend({}, window['cmsPage'] || {}, {\n      htmleditor: {\n        // cmsPage.htmleditor.getAnchors();\n        getAnchors: function (opt) {\n          //var options = $.extend({}, opt);\n          //console.log(options);\n          var anchors = [];\n\n          $('a[name]').each(function (inx, obj) {\n            anchors.push({ id: $(obj).attr('id'), name: $(obj).attr('name') });\n          });\n\n          $('[data-cms-item-name],[data-cms-anchor]').each(function (inx, obj) {\n            if (\n              typeof $(obj).attr('data-cms-anchor') !== 'undefined' &&\n              $(obj).attr('data-cms-anchor') !== '' &&\n              $(obj).parents('.owl-item').length === 0\n            ) {\n              anchors.push({ id: null, name: $(obj).attr('data-cms-anchor') });\n            } else if (\n              $(obj).attr('data-cms-item-name') !== '' &&\n              $(obj).parents('.owl-item').length === 0\n            ) {\n              anchors.push({\n                id: null,\n                name: $(obj).attr('data-cms-item-name'),\n              });\n            }\n          });\n\n          return anchors;\n        },\n      },\n    });\n  }\n\n  scrollTo(target) {\n    const $ = window['jQuery'];\n    if (typeof target === 'undefined') return;\n    if ($(target).length === 0) return;\n    var htmlbody = $('html,body');\n    var top = 0;\n    if ($(target).height() > $(window).height()) top = $(target).offset().top;\n    else {\n      top =\n        $(target).offset().top -\n        Math.floor(($(window).height() - $(target).height()) / 2);\n    }\n    //console.log(top);\n    //htmlbody.animate({ scrollTop: top }, 500, 'easeInOutQuint');\n    htmlbody.animate({ scrollTop: top }, 500);\n  }\n\n  getCurrentHtml() {\n    const CKEDITOR = window['CKEDITOR'] || {};\n    try {\n      return CKEDITOR.instances.cmsCurrentEditor.getData();\n    } catch (e) {\n      return '';\n    }\n  }\n\n  getAllDirtyHtml() {\n    const $ = window['jQuery'];\n    var self = this;\n    var htmlChanges = [];\n    $('.dirtyHtml').each(function (inx, obj) {\n      var $section = $(obj);\n      var content = $section.is('#cmsCurrentEditor') // if the html editor is active, it needs to get the html from the editor.\n        ? self.getCurrentHtml()\n        : $section.html();\n      if ($section.is('[data-cms-section-id]')) {\n        // section level?\n        let $item = $section.closest('[data-cms-item-id]');\n        htmlChanges.push({\n          ItemId: $item.data('cms-item-id'),\n          SectionId: $section.data('cms-section-id'),\n          Content: content,\n        });\n      } else if ($section.is('[data-cms-item-id]')) {\n        // section level?\n        let $item = $section;\n        if ($item.hasClass('new__multicolumn__panel__html')) {\n          htmlChanges.push({\n            ItemId: $item.data('cms-item-id'),\n            SectionId: 'Content',\n            SectionId2: 'Content2',\n            Content: $(\n              \".cms_item.item__01[data-cms-item-id2='\" +\n                $item.data('cms-item-id2') +\n                \"']\"\n            ).html(),\n            Content2: $(\n              \".cms_item.item__02[data-cms-item-id2='\" +\n                $item.data('cms-item-id2') +\n                \"']\"\n            ).html(),\n          });\n        } else {\n          htmlChanges.push({\n            ItemId: $item.data('cms-item-id'),\n            SectionId: 'Content',\n            Content: content,\n          });\n        }\n      }\n    });\n    return htmlChanges;\n  }\n\n  getHtml(itemid: any) {\n    const $ = window['jQuery'];\n    this.htmlEditor.close();\n    var self = this;\n\n    var item = $(\".cms_item[data-cms-item-id='\" + itemid + \"']\");\n    var formvals = { Content: this.cms_replace_item_html(item) };\n\n    if (item.hasClass('new__multicolumn__panel__html')) {\n      formvals = {\n        Content: this.cms_replace_item_html(\n          $(\".cms_item.itme__01[data-cms-item-id='\" + itemid + \"']\")\n        ),\n        Content2: this.cms_replace_item_html(\n          $(\".cms_item.itme__02[data-cms-item-id='\" + itemid + \"']\")\n        ),\n      };\n    }\n\n    //cms_msg_progressing(\"#save_message\", \"Saving...\");\n    if ($('[data-cms-section-id]', item).length > 0) {\n      $('[data-cms-section-id]', item).each(function (inx, section) {\n        var closestItemId = $(section).closest('.cms_item').data('cms-item-id');\n        if (closestItemId === itemid) {\n          var id = $(section).attr('data-cms-section-id');\n          formvals[id] = self.cms_replace_item_html($(section)); //.find(\">:first-child\")().html();\n        }\n      });\n    }\n    return formvals;\n  }\n\n  cms_replace_item_html(item) {\n    return item.html();\n    // var $tmp = $(\"<div></div>\").html(item.html());\n    // if ($tmp.find('.cms-skeleton').length > 0)\n    //   return $tmp.find('.cms-skeleton').html();\n    // else\n    //   return item.html();\n    //tmp.find(\".cms_ctrl_in_editor\").each(function (inx, obj) {\n    //    var ctrlid = $(obj).attr(\"data-cms-ctrl-id\");\n    //    $(obj).replaceWith(\"__cms__ctrl:\" + ctrlid + \"__\");\n    //});\n    //return tmp.html();\n  }\n}\n","import React, { useEffect } from 'react';\nimport { useRouter } from '../../../components';\nimport { useGet } from '../../../components';\nimport { Item } from '../../items/item';\nimport env from '../../../env';\nimport { loadJs } from '../../../lib/net-loader';\nimport { CmsPageController } from '../../services/cms-page-controller';\nimport { ErrorPopup, Loading } from '../../../components';\n\n// function useQuery() {\n//   return new URLSearchParams(useLocation().search);\n// }\n\nexport function EditPage(props) {\n  //const [page, setPage] = useState(null);\n\n  //const pageId = props.pageId;\n  const { query } = useRouter();\n  const { cmsViewMode = 'edit', id, publishVer, editVer } = query;\n  const pageId = id;\n\n  //console.log(pageId, cmsViewMode, env.apiBase, env)\n\n  const get = useGet();\n  useEffect(() => {\n    get.send(env.apiBase + '/api/cms/GetPage/' + pageId + '?cmsViewMode=' + cmsViewMode\n      + (publishVer ? '&publishVer=' + publishVer : '')\n      + (editVer ? '&editVer=' + editVer : '')\n    );\n    // eslint-disable-next-line\n  }, [pageId]);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  //console.log(router.pathname);\n  //console.log(res);\n\n  const pageData = get.response.data;\n  const cmsOption = { isCmsEdit: true, cmsViewMode: cmsViewMode };\n  cmsOption.pageData = pageData;\n\n  const cmsPageController = new CmsPageController();\n  if (cmsViewMode !== 'viewonly') {\n    const ver = 1;\n    loadJs(\n      env.resourceBase + '/dist/jquery-3.4.1/jquery.min.js?v=' + ver\n    ).then(data => {\n      return loadJs(\n        env.resourceBase + '/dist/cms/ckeditor/ckeditor.js?v=' + ver\n      )\n    }).then(data => {\n      // console.log('script loaded ', data);\n      cmsPageController.init({});\n      document.querySelector('body').classList.add('cmsedit');\n    }).catch(error => console.log(error));\n  } else {\n    const ver = 1;\n    loadJs(\n      env.resourceBase + '/dist/jquery-3.4.1/jquery.min.js?v=' + ver\n    ).then(data => {\n      cmsOption.isCmsEdit = false;\n      cmsPageController.init({ viewOnly: true });\n    }).catch(error => console.log(error));\n  }\n\n  //setPage(res.response.data);\n  const sectionItems = pageData.sections.map((section, index) =>\n    <Section item={section} key={section.sectionName + index} cmsOption={cmsOption}></Section>\n  );\n  return (\n    <div className={`cmsPage cmsPage--${pageData.pageTypeCode}`}>\n      {sectionItems}\n    </div>\n  );\n}\n\n\nfunction Section(props) {\n  const item = props.item;\n  //const sectionName = item.sectionName;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n\n  if (!subItems || subItems.length === 0)\n    return (<></>);\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n  return (\n    <>\n      {subItemsElts}\n    </>\n  );\n}\n\n","import React from 'react';\nimport { useRouter } from '../../components';\nimport { SiteLink } from '../../components';\n//import BottomDrawer from '../../components/bottomDrawer'\n\nexport function BottomDock(props) {\n  const links = [\n    // { url: '/dare-chisel', title: 'DARE CHISEL', icon: 'dare-chisel.png', iconHover: 'dare-chisel.png' },\n    // { url: '/about', title: 'ABOUT', icon: 'about.png', iconHover: 'about.png' },\n    // { url: '/products', title: 'PRODUCTS', icon: 'products.png', iconHover: 'products.png' },\n    // { url: '/services', title: 'SERVICES', icon: 'services.png', iconHover: 'services.png' },\n    // { url: '/contact', title: 'CONTACT', icon: 'contact.png', iconHover: 'contact.png' }\n    { url: '/about', title: 'DARE', icon: 'dare-icon.png', iconHover: 'dare-icon.png' },\n    { url: '/shop', title: 'SHOP', icon: 'shop-icon.png', iconHover: 'shop-icon.png' },\n    { url: '/cart', title: 'CART', icon: 'cart-icon.png', iconHover: 'cart-icon.png' },\n    { url: '/services', title: 'SERVICES', icon: 'services-icon.png', iconHover: 'services-icon.png' },\n    { url: '/contact', title: 'CONTACT', icon: 'contact-icon.png', iconHover: 'contact-icon.png' }\n  ];\n\n  //const path = usePath();\n  const { pathname } = useRouter();\n\n  const isCurrent = (link) => {\n    return pathname && pathname.toLowerCase() === link.toLowerCase();\n  }\n\n  const linkElts = links.map((link, index) =>\n    <li key={index} className={`bottomMenu__li ${isCurrent(link.url) ? 'selected' : ''}`}>\n      <SiteLink to={link.url} className={`bottomMenu__link bottomMenu__link--${index}`}>\n        <div className=\"icon\">\n          <img className=\"normal\" src={`/assets/navicons/${link.icon}`} alt={link.title} />\n          <img className=\"selected\" src={`/assets/navicons/${link.iconHover}`} alt={link.title} />\n        </div>\n        <div>{link.title}</div>\n      </SiteLink>\n    </li>\n  );\n\n  // const bottomMenu = useRef(null);\n  // useLayoutEffect(() => {\n  //   //console.log('useLayoutEffect');\n  //   const slider = new BottomDrawer(bottomMenu.current);\n  //   setTimeout(() => slider.init(), 1000)\n  // }, [])\n\n  return (\n    <>\n      <nav className=\"bottomMenu\">\n        {/* <div className=\"bottomMenu__bar\">\n          <div className=\"bottomMenu__line1\"></div>\n          <div className=\"bottomMenu__line2\"></div>\n        </div> */}\n        {/* <div className=\"bottomMenu__bg\"></div> */}\n        <ul className=\"bottomMenu__links\">\n          {linkElts}\n        </ul>\n      </nav>\n      {/* <div className=\"bottomMenuPadding\"></div> */}\n    </>\n  );\n}\n","import React from 'react';\nimport { useStore } from '../../store';\nimport FsLightbox from 'fslightbox-react';\n\nexport function CommonVideoPopup(props) {\n  const { state } = useStore();\n\n  const [toggler, setToggler] = React.useState(false);\n  const [sources, setSources] = React.useState([]);\n  const [popupIndex, setPopupIndex] = React.useState(0);\n\n  const popup = state.popup;\n  //console.log(popup, JSON.stringify((popup && popup.sources) || []), JSON.stringify(sources), (popup && popup.popupIndex), popupIndex)\n  if (JSON.stringify((popup && popup.sources) || []) !== JSON.stringify(sources) ||\n    ((popup && popup.popupIndex) || 0) !== popupIndex) {\n    setSources(popup.sources);\n    setPopupIndex(popup.popupIndex);\n    setTimeout(() => { setToggler(!toggler) }, 10)\n  } else {\n\n  }\n  //console.log(toggler, popupIndex, sources)\n  return (\n    <div className=\"\">\n      <FsLightbox\n\n        toggler={toggler}\n        sources={sources}\n        key={popupIndex}\n        onOpen={(e) => {\n        }}\n      />\n    </div>\n\n  );\n}","import React from \"react\";\nimport { useRouter } from \"./components\";\nimport { useHistoryStore } from \"./components\";\nimport { useParallax } from \"./components\";\nimport utils from \"./utils\";\n// import debounce from \"lodash/debounce\";\n\nexport function AppRouteChanged() {\n  const { path } = useRouter();\n  const parallax = useParallax();\n  const history = useHistoryStore();\n\n  React.useLayoutEffect(() => {\n    //console.log('route changed', path)\n    // const scrolled = debounce((e) => saveScrollPosition(e, path), 100)\n\n    history.push({ path: path });\n    if (typeof window !== `undefined`) {\n      parallax.reset();\n\n      const pos = getPreviousPostition(path);\n      // console.log('pos', pos)\n      if (pos) {\n        setTimeout(() => {\n          window.scrollTo(pos.scrollLeft, pos.scrollTop);\n        }, 500);\n      } else {\n        const hash = window.location.hash;\n\n        if (hash) {\n          setTimeout(() => {\n            const anchor = utils.ui.findElement(hash);\n            if (anchor) utils.ui.scrollTo(anchor, 500);\n          }, 500);\n        } else {\n          window.scrollTo(0, 0);\n        }\n      }\n    }\n\n    // window.addEventListener('scroll', scrolled)\n    // return () => {\n    //   window.removeEventListener('scroll', scrolled)\n    // }\n    // eslint-disable-next-line\n  }, [path]);\n\n  return null;\n}\n\n//#region scroll position store\n\n// function saveScrollPosition(e, path) {\n//   if (typeof window === `undefined`) return;\n//   const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft\n//   const scrollTop = window.pageYOffset || document.documentElement.scrollTop\n//   // console.log('save position', path, scrollTop, scrollLeft)\n//   setPositionData(path, scrollLeft, scrollTop)\n// }\n\nfunction getPreviousPostition(path) {\n  const dataArr = getPositionData() || [];\n  // console.log(dataArr.length)\n  const pos = getPreviousPostitionInArray(dataArr, path);\n  return pos;\n}\n\nfunction getPositionData() {\n  const dataStr = localStorage.getItem(\"scrollPosRouter\");\n  // console.log(dataStr)\n  if (dataStr) {\n    let data;\n    try {\n      data = JSON.parse(dataStr);\n    } catch (e) {\n      return null;\n    }\n    return data;\n  }\n  return null;\n}\n\n// function setPositionData(path, scrollLeft, scrollTop) {\n//   const dataArr = getPositionData() || []\n//   setCurrentPositionInArray(dataArr, path, scrollLeft, scrollTop)\n//   // console.log(dataArr)\n//   localStorage.setItem('scrollPosRouter', JSON.stringify(dataArr))\n// }\n\n// const MAX_SIZE = 5\n// function setCurrentPositionInArray(dataArr, path, scrollLeft, scrollTop) {\n//   const same = dataArr.length > 0 && dataArr[dataArr.length - 1].path === path\n//   if (same) {\n//     const found = dataArr[dataArr.length - 1]\n//     found.scrollLeft = scrollLeft\n//     found.scrollTop = scrollTop\n//     found.ts = new Date()\n//   } else {\n//     if (dataArr.length >= MAX_SIZE) dataArr.shift()\n//     dataArr.push({\n//       path: path,\n//       scrollLeft: scrollLeft,\n//       scrollTop: scrollTop,\n//       ts: new Date()\n//     })\n//   }\n// }\n\nfunction getPreviousPostitionInArray(dataArr, path) {\n  const foundIndex = findIndexReverse(dataArr, (x) => x.path === path);\n  // console.log(foundIndex, dataArr.length - 1)\n  if (foundIndex >= 0 && foundIndex >= dataArr.length - 2) {\n    // remove after the index\n    if (foundIndex < dataArr.length - 1) {\n      dataArr.splice(foundIndex + 1);\n      localStorage.setItem(\"scrollPosRouter\", JSON.stringify(dataArr));\n    }\n    return dataArr[foundIndex];\n  }\n  return null;\n}\n\nfunction findIndexReverse(list, fn) {\n  if (!list) return -1;\n  for (let i = list.length - 1; i >= 0; i--) {\n    if (fn(list[i])) {\n      return i;\n    }\n  }\n  return -1;\n}\n//#endregion\n","//import { css } from '@emotion/core';\nimport variables from '../../../cssInJs/variables';\nimport { mq } from '../../../cssInJs';\nexport default {\n  desc: {\n    'p': {\n      fontSize: '1rem !important',\n      fontFamily: variables.familyBase + ' !important',\n      marginBottom: '0.5rem !important',\n      lineHeight: '1.1 !important'\n    }\n  },\n  heroImageContainer : mq({\n    //textAlign: 'center',\n    height: ['320px', '480px'],\n    position: 'relative',\n  }),\n  heroImage : mq({\n    //maxWidth: '350px !important',\n    //height: '100% !important'\n    //maxHeight: ['180px', '340px'],\n    height : '100%',\n    width : '100%',\n    position: 'absolute',\n    top: '50%',\n    left: '50%',\n    transform: 'translate(-50%, -50%)',\n  }),\n  productPageCol : mq({\n    paddingLeft: '45px',\n    paddingRight: '45px'\n  }),\n  productFavorite : {\n    cursor: 'pointer',\n    '&.checked' : {\n      color: 'red'\n    }\n  },\n  productBreadCrumbs : mq({\n    padding: '0px',\n    listStyle: 'none',\n    marginBottom:'0.5rem',\n    display: 'block',\n    'li' : mq({\n      display:'inline-block',\n      marginRight:'1.5rem',\n      position: 'relative',\n      fontSize:'0.7rem',\n      '&:not(:last-child)::after, &.breadCrumb.last-item::after' : {\n        content: '\">\"',\n        position: 'absolute',\n        right: '-1rem'\n      },\n      '&.breadCrumb::after' : {\n        content: '\"|\"',\n        position: 'absolute',\n        right: '-1rem'\n      }\n    })\n  }),\n  productViewImageBg : mq({\n    backgroundPosition: 'center',\n    backgroundSize: 'contain',\n    paddingTop: ['80px', '120px'],\n    backgroundRepeat: 'no-repeat',\n    marginLeft: '5px',\n    marginRight: '5px' \n  }),\n  productViewImages : mq({\n    marginTop: ['1rem', '2rem'],\n    paddingBottom: ['1rem', '2rem'],\n    marginLeft: '-5px',\n    marginRight: '-5px',\n    '.slick-prev, .slick-next' : {\n      transform: 'none',\n      top: '150px',\n      '&:before' : {\n        color: '#999999'\n      }\n    },\n    '.slick-prev' : {\n      left: '150px'\n    },\n    '.slick-next' : {\n      right: '150px'\n    }\n  }),\n\n  productViewImage : {\n    //paddingLeft: '5px',\n    //paddingRight: '5px'\n    outline: 'none',\n    cursor: 'pointer'\n  },\n\n  productViewShortDes : mq({\n    fontSize:['1rem'],\n    textAlign: 'center',\n  }),\n\n  productViewTitle : mq({\n    fontSize:['1.3rem'],\n    textAlign: 'left',\n    marginTop:'0px',\n    marginBottom:'1rem'\n  }),\n\n  addToCartBtn : {\n    //width: '100%'\n    'button, .btn' : {\n      width: '100%',\n      fontWeight: 600\n      //transform: 'skewX(-12deg)'\n    },\n    // 'button.gotocartbtn' : {\n    //   marginTop: '1rem'\n    // }\n  },\n  priceText : {\n    fontSize: '0.8rem'\n  },\n  socialMedia : {\n    '.social-icon-text' : {\n      fontSize: '0.8rem'\n    }\n  },\n  attributesRow : {\n    cursor: 'pointer',\n    //marginTop: '0.5rem',\n    //marginBottom: '0.5rem',\n    paddingTop: '0.2rem',\n    paddingBottom: '0.2rem',\n    '&:hover' : {\n      backgroundColor: '#999999',\n      color: 'white'\n    },\n    '.svgContainer svg' : {\n      transition: 'all 0.5s'\n    },\n    '.svgContainer.open svg' : {\n      transform: 'rotate(180deg)'\n    }\n  },\n\n  attrContainer : {\n    maxHeight: '0px',\n    transition: 'all 0.3s',\n    overflow: 'hidden',\n    '&.open' : {\n      maxHeight: '1000px'\n    }\n  },\n\n  desktopMobile : {\n    '&.mobile' : mq({\n      display: ['block', 'none']\n    }),\n    '&.desk__top' : mq({\n      display: ['none', 'block']\n    })\n  },\n  quoteContainer : {\n    marginBottom: '1rem',\n    '.quote__text' : {\n      fontSize: '0.8rem',\n      marginBottom: '1rem'\n    },\n    button : {\n      //transform: 'skewX(-12deg)'\n    }\n  },\n  enquiryFormContainer : {\n      backgroundColor:'rgba(0,0,0,0.3)',\n      position: 'fixed',\n      top:'0px',\n      left:'0px',\n      width:'100%',\n      height: '100%',\n      zIndex:'9999',\n      'form.contactForm' : {\n        position: 'absolute',\n        width: '100%',\n        maxWidth: '900px',\n        top: '50%',\n        left: '50%',\n        transform: 'translate(-50%, -50%)',\n        backgroundColor: 'grey',\n        //paddingTop: '2rem',\n        paddingLeft: '1rem',\n        paddingRight: '1rem',\n        margin: '0px',\n        '.closeButton' : {\n          textAlign: 'right',\n          //margin: '1rem 0px',\n          cursor: 'pointer',\n          color: 'white',\n          marginTop: '0.5rem'\n        },\n        '.enquireNowText' : {\n          marginBottom: '0.5rem',\n          color: 'white'\n        }\n      }\n  },\n\n  ecm__button__container : {\n    marginTop : '2rem'\n  }\n\n}","import React, { useState, useEffect } from 'react';\nimport { useGet } from '../../../components';\nimport { Item } from '../../items/item';\nimport { NotFound } from '../../../components';\nimport env from '../../../env';\nimport { useStore } from '../../../store';\nimport { ErrorPopup, Loading } from '../../../components';\n\nconst log = (...args) => {\n  //console.log(args);\n}\nconst areEqual = (prevProps, nextProps) => {\n  return (prevProps.pageData === nextProps.pageData)\n};\nconst PageMemo = React.memo(Page, areEqual)\n\nexport function ViewPartial({pageOptions = null}) {\n  const { dispatch } = useStore();\n  const [pageLoaded, setPageLoaded] = useState(false);\n  const [data, setData] = useState(null);\n  //const path = usePath();\n  //log('view page', path);\n  const pathname = '/partials/common-footer';\n\n  const get = useGet();\n  log('0. viewpage ready');\n\n  useEffect(() => {\n    log('*. start loading')\n    setPageLoaded(false);\n    get.send(env.apiBase + \"/api/cms/GetPublishedPage?path=\" + pathname);\n    // eslint-disable-next-line\n  }, [pathname]);\n\n  useEffect(() => {\n    if (data){\n      dispatch({ type: 'SET_PAGE', payload: data.data })\n      dispatch({ type: 'SET_MENU', payload: data.menu })\n    }\n    // eslint-disable-next-line\n  }, [data]);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  //log(router.pathname);\n  //log(get.loading());\n  log('1. viewpage component', pageLoaded, get.response);\n\n\n  const pageData = get.response.data;\n  //const menuData = get.response.menu;\n  const cmsOption = { pageOptions: pageOptions};\n  log(pageLoaded, !pageLoaded && !!pageData)\n  if (!pageLoaded && pageData) {\n    //log(pageLoaded, pageData, menuData)\n    log('2. dispatching page & menu')\n    setPageLoaded(true);\n    setData(get.response);\n\n    //document.title = pageData.pageTitle;\n    return null;\n  } else if (!pageData) {\n    return (<NotFound />)\n  }\n\n  log('3. call rendering memo')\n  return <PageMemo pageData={pageData} cmsOption={cmsOption} />;\n}\n\n\nfunction Page(props) {\n  const pageData = props.pageData;\n  const cmsOption = props.cmsOption;\n  // document.title = pageData.pageTitle;\n  log('4. page rendering', pageData, cmsOption)\n  const sectionItems = pageData.sections.map((section, index) => {\n    return (\n      <Section item={section} key={section.sectionName + index} cmsOption={cmsOption}></Section>\n    )\n  }\n  );\n  return (\n    <>\n      {sectionItems}\n    </>\n  );\n}\n\nfunction Section(props) {\n  log('5. section rendering')\n  const item = props.item;\n  //const sectionName = item.sectionName;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  if (!subItems || subItems.length === 0)\n    return (<></>);\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n  return (\n    <>\n      {subItemsElts}\n    </>\n  );\n}\n\n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport { useState } from 'react';\nimport env from '../../../env';\nimport { SiteLink } from '../../../components'; //useRouter\n//import { useHistory } from \"react-router-dom\";\nimport { useForm } from '../../../form';\nimport { fb, validators } from '../../../form';\nimport { Button, ErrorMessage } from '../../../components';\nimport { usePost } from '../../../components';\nimport utils from '../../../utils';\nimport style from './productViewStyle';\nimport { MdKeyboardArrowDown } from \"react-icons/md\";\nimport { useStore } from '../../../store';\n//import {ProductAttributes} from './productAttributes';\n\nexport function AddToCart({ product }) {\n  //console.log('product', product);\n  const post = usePost();\n  //const { Redirect } = useRouter();\n  //const history = useHistory();\n  const render = (name, parent = null) => form.renderControl(name, parent);\n  const model = getFormModel(product, {});\n  const form = useForm(model, { usePlaceholder: true, onControlChanged: onControlChanged });\n\n  const [attributesEx, setAttributesEx] = useState(() => {\n    let _array = [];\n    for(let n in product.variantAttributes){\n      console.log(n);\n      _array.push(false);\n    }\n    return _array;\n  });\n\n  const [checkGoToCartBtn, setCheckGoToCartBtn] = useState(false);\n  const { dispatch } = useStore();\n\n  function onControlChanged(e, control) {\n    if (!(control.type === 'select' && control.parent)) return;\n    const newModel = getFormModel(product, form.getValue())\n    form.reset(newModel)\n  }\n\n  function addToCart(e) {\n    form.validateForm(e, () => {\n      const formVal = form.getValue();\n      let _variantOptions = [];\n      for(let i in formVal.variantOptions){\n        let _item = {\n          name : formVal.variantOptions[i].name,\n          value : formVal.variantOptions[i][Object.keys(formVal.variantOptions[i])[1]]\n        };\n        _variantOptions.push(_item);\n      }\n      //const value = { ...formVal, productId: product.productId, cartId: env.getDevCartId() };\n      let _cartId = env.getDevCartId();\n      const value = { \n        quantity : formVal.quantity,\n        variantOptions : _variantOptions,\n        productId: product.productId,\n        cartId: _cartId === 'null' ? null : _cartId\n      };\n      //console.log('value', value);\n      post.send(env.apiBase + \"/api/cart/addToCart\", value);\n    })\n  }\n\n  if (post.done()) {\n    env.setDevCartId(post.response.results.cartInfo.cartId);\n    //console.log('dfdlsjflskdfj',post.response);\n    if(post.response.errors.length < 1){\n      setTimeout(() => {\n        dispatch({type:'SET_STATE', payload : {cartInfo : post.response.results.cartInfo.totalQuantity === 0 ? 0 : (post.response.results.cartInfo.totalQuantity)-1}});\n        setCheckGoToCartBtn(true);\n      }, 500); \n    }\n    post.reset();\n    // return <Redirect to=\"/cart\" />\n  }\n  const attributes = form.findControl('variantOptions');\n  return <div style={{ marginBottom: '3rem' }}>\n    {/* <div className=\"productView__price\">\n      Price: <b>{product.priceText ? product.priceText : 'AU ' + utils.money.formatMoney(product.price)}</b>\n    </div> */}\n\n    {/* <ProductAttributes product={product} /> */}\n    \n     {\n      attributes.controls.map(\n        (item, index) =>\n        {\n          //console.log('item', item);\n          return(\n            <div className=\"row\" key={index}>\n              \n              <div className=\"col-12\">\n                <div className=\"row\" css = {style.attributesRow} onClick = {(e) =>{\n                  setAttributesEx(pre => {\n                    let _new = {...pre};\n                    _new[index] = !_new[index];\n                    return _new;\n                  });\n                }}>\n                  <div className=\"col-6\">\n                    {item.controls[0].value}\n                  </div>\n                  <div className=\"col-4\">\n                    {item.controls[1].value}\n                  </div>\n                  <div className={`col-2 svgContainer ${attributesEx[index] === true ? 'open' : 'close'}`}>\n                    <MdKeyboardArrowDown></MdKeyboardArrowDown>\n                  </div>\n                </div>\n              </div>\n\n              <div css={style.attrContainer} className = {`col-sm-12 ${attributesEx[index] === true ? 'open' : 'close'}`}>\n                {render(item.controls[0].value.toLowerCase(), item)}\n                {/* {render('value', item)} */}\n              </div>\n\n              {/* <div className=\"col-md-12\">{render('value', item)}</div> */}\n            </div>\n          )\n        }\n      )\n    }\n\n    <form onSubmit={addToCart} style={{ textAlign: 'left', marginBottom: '2rem' }}>\n      <div className=\"form-row\" style={{marginTop:'1rem', marginBottom: '0.5rem'}}>\n        <div className=\"col-md-8\" css={style.priceText}>\n          All prices shown in AUD\n        </div>\n        <div className=\"col-md-4\">\n          <div className=\"productView__price\">\n            <b>{product.priceTextOveriding ? product.priceTextOveriding : 'AU ' + utils.money.formatMoney(product.priceIncTax)}</b>\n          </div>\n        </div>\n      </div>\n\n      <div className=\"form-row\">\n        <div className=\"qty col-md-4\">\n          {render('quantity')}\n        </div>\n        <div className=\"col-md-8\" css={style.addToCartBtn}>\n          <Button onClick={addToCart} status={form.status}> ADD TO CART </Button>\n          {\n            checkGoToCartBtn === true &&\n            <SiteLink className = \"btn-primary btn\" to = \"/cart\" style = {{marginTop: '0.5rem'}}> GO TO CART </SiteLink>\n          }\n        </div>\n      </div>\n      \n      <div>\n        {/* <Button onClick={addToCart} status={form.status}>Add to cart</Button> */}\n        <ErrorMessage errors={form.errors} summaryMessage=\"Please review the errors.\" />\n        <ErrorMessage errors={post.errors} />\n      </div>\n    </form>\n  </div>\n}\n\nfunction getFormModel(product, formValues /* for reset */) {\n  const variantAttributes = product.variantAttributes;\n\n  const model = fb.group({\n    //quantity: [formValues.quantity || 1, [validators.Required()], { label: 'Quantity', type: 'number' }],\n    quantity: [formValues.quantity || 1, [validators.Required()], { label: 'Quantity', type: 'number' }],\n    variantOptions: fb.array([]),\n  });\n  const variantOptionArray = model.find('variantOptions').controls;\n  (variantAttributes || []).forEach(attr => {\n    variantOptionArray.push(newVariantAttribute(attr, formValues, product.variants))\n  })\n  return model;\n}\n\n// function newVariantAttribute(attr, formValues, variants) {\n//   //console.log(attr, formValues, variants)\n//   const optionsSelected = formValues.variantOptions || [];\n//   const currentSelection = utils.array.find(optionsSelected, x => attr.name === x.name);\n//   const filtered = variants\n//     .filter(x => matchVariantOptions(optionsSelected, x.variantOptions, attr.name))\n//   const availableOptions = getAvailableOptionValues(filtered, attr.name);\n//   const options = attr.options.map(x => { return { ...x, ...{ disabled: !availableOptions.some(o => o === x.value) } } })\n//   return fb.group({\n//     name: [attr.name, [], { type: 'hidden' }],\n//     value: [(currentSelection && currentSelection.value) || attr.value || '',\n//     [validators.Required()], {\n//       //label: attr.name,\n//       label: null,\n//       type: 'select',\n//       options: [{ displayName: 'Select ...', value: '' }, ...options].map(x => {\n//         return {\n//           name: (x.displayName || x.value) + (x.disabled || false ? ' - not available' : ''),\n//           value: x.value,\n//           disabled: x.disabled || false\n//         }\n//       })\n//     }]\n//   })\n// }\n\nfunction newVariantAttribute(attr, formValues, variants) {\n  \n  // const choices = [\n  //   { name: 'Yes, please!', value: 'Yes' },\n  //   { name: 'No, thanks', value: 'No' }\n  // ]\n\n  const dyName =  attr.name.toLowerCase();\n  const optionsSelected = formValues.variantOptions || [];\n  const currentSelection = utils.array.find(optionsSelected, x => attr.name === x.name);\n\n  const filtered = variants\n    .filter(x => matchVariantOptions(optionsSelected, x.variantOptions, attr.name))\n  const availableOptions = getAvailableOptionValues(filtered, attr.name);\n  const options = attr.options.map(x => { return { ...x, ...{ disabled: !availableOptions.some(o => o === x.value) } } });\n\n  return fb.group({\n    name: [attr.name, [], { type: 'hidden' }],\n    [dyName] : [(currentSelection && currentSelection.value) || attr.value || options[0].value,\n    [validators.Required()], {\n      //label: attr.name,\n      label: null,\n      type: 'radioList',\n      //options : choices\n      options: [...options].map(x => {\n        return {\n          name: (x.displayName || x.value) + (x.disabled || false ? ' - not available' : ''),\n          value: x.value,\n          disabled: x.disabled || false\n        }\n      })\n    }]\n  })\n}\n\nfunction getAvailableOptionValues(variants, name) {\n  const values = variants.map(x => {\n    const options = x.variantOptions.filter(o => o.name === name)\n    return options && options[0].value\n  }).filter(x => x);\n\n  return Array.from(new Set(values));\n}\n\nfunction matchVariantOptions(optionsSelected, optionsInVariant, currentControlName) {\n  //console.log(optionsSelected, optionsInVariant, currentControlName)\n  for (let i = 0; i < optionsSelected.length; i++) {\n    let optionSelected = optionsSelected[i];\n    if (optionSelected.value === '') {\n      // skip match test\n      continue;\n    }\n    if (optionSelected.name === currentControlName) {\n      // skip match test for the just selected value\n      continue;\n    }\n    let found = false;\n    for (let j = 0; j < optionsInVariant.length; j++) {\n      let optionInVariant = optionsInVariant[j];\n      if (optionSelected.name === optionInVariant.name && optionSelected.value === optionInVariant.value) {\n        found = true;\n        break;\n      }\n    }\n    if (!found) return false;\n  }\n  return true;\n}","import React, { useState, useEffect } from 'react';\nimport { useGet } from '../../../components';\nimport { Item } from '../../items/item';\nimport { NotFound } from '../../../components';\nimport env from '../../../env';\n//import { useStore } from '../../../store';\nimport { ErrorPopup, Loading } from '../../../components';\n\nconst log = (...args) => {\n  //console.log(args);\n}\nconst areEqual = (prevProps, nextProps) => {\n  return (prevProps.pageData === nextProps.pageData)\n};\nconst PageMemo = React.memo(Page, areEqual)\n\nexport function ProductPagePartial({pageOptions = null}) {\n  //const { dispatch } = useStore();\n  const [pageLoaded, setPageLoaded] = useState(false);\n  //const [data, setData] = useState(null);\n  //const path = usePath();\n  //log('view page', path);\n  const pathname = '/partials/common-product-page-footer';\n  const get = useGet();\n  log('0. viewpage ready');\n\n  useEffect(() => {\n    log('*. start loading')\n    setPageLoaded(false);\n    get.send(env.apiBase + \"/api/cms/GetPublishedPage?path=\" + pathname);\n    // eslint-disable-next-line\n  }, [pathname]);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  //log(router.pathname);\n  //log(get.loading());\n  log('1. viewpage component', pageLoaded, get.response);\n\n\n  const pageData = get.response.data;\n  //const menuData = get.response.menu;\n  const cmsOption = { pageOptions: pageOptions};\n  log(pageLoaded, !pageLoaded && !!pageData)\n  if (!pageLoaded && pageData) {\n    //log(pageLoaded, pageData, menuData)\n    log('2. dispatching page & menu')\n    setPageLoaded(true);\n    //document.title = pageData.pageTitle;\n    return null;\n  } else if (!pageData) {\n    return (<NotFound />)\n  }\n\n  log('3. call rendering memo')\n  return <PageMemo pageData={pageData} cmsOption={cmsOption} />;\n}\n\n\nfunction Page(props) {\n  const pageData = props.pageData;\n  const cmsOption = props.cmsOption;\n  // document.title = pageData.pageTitle;\n  log('4. page rendering', pageData, cmsOption)\n  const sectionItems = pageData.sections.map((section, index) => {\n    return (\n      <Section item={section} key={section.sectionName + index} cmsOption={cmsOption}></Section>\n    )\n  }\n  );\n  return (\n    <>\n      {sectionItems}\n    </>\n  );\n}\n\nfunction Section(props) {\n  log('5. section rendering')\n  const item = props.item;\n  //const sectionName = item.sectionName;\n  const subItems = item.items || [];\n  const cmsOption = props.cmsOption || {};\n  if (!subItems || subItems.length === 0)\n    return (<></>);\n\n  const subItemsElts = subItems.map((subItem, index) =>\n    <Item item={subItem} key={subItem.itemId} cmsOption={cmsOption}></Item>\n  );\n  return (\n    <>\n      {subItemsElts}\n    </>\n  );\n}\n\n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './productViewStyle';\nimport React, { useState, useEffect } from 'react';\nimport env from '../../../env';\nimport utils from '../../../utils';\nimport { ErrorPopup, Loading, Button, ErrorMessage, useGet, usePost, useRouter, SiteLink } from '../../../components';\nimport { ViewPartial } from '../../../cms/pages/partials/viewPartial';\n//import { CommonProductBottom } from '../../../cms/pages/partials/commonProductBottom';\nimport { ProductTile } from '../productList/productTile';\nimport FsLightbox from 'fslightbox-react';\nimport { MetaTag } from '../../../components';\nimport { AddToCart } from './addToCart';\nimport Slider from \"react-slick\";\n//import { MdFavorite } from \"react-icons/md\";\n\n//import { debounce } from '../../../lib/utils-core/debounce';\nimport { gtm } from '../../../lib/tracking';\n//import { FacebookShareButton, FacebookIcon, PinterestShareButton, PinterestIcon } from \"react-share\";\nimport { createPortal } from \"react-dom\";\nimport { getEnquiryFormModel } from './enquiryFormModel';\nimport { useForm } from '../../../form';\nimport { ProductPagePartial } from '../../../cms/pages/partials/productPagePartial';\nimport { TopHeader } from '../../../layout/topHeader/topHeader';\n\nfunction Portal({ children }) {\n  const [el] = useState(document.createElement('div'));\n  useEffect(() => {\n    let mount = document.getElementById(\"portal-root\");\n    mount.appendChild(el);\n    return () => mount.removeChild(el);\n  }, [el]);\n  return createPortal(children, el);\n}\n\nexport function ProductView(props) {\n\n  const { query } = useRouter();\n  const [loaded, setLoaded] = React.useState(false);\n  const get = useGet();\n  const productCode = query.id || '';\n  const category = query.category || '';\n  const slug = query.slug || '';\n  //console.log(category, slug, productCode)\n  React.useEffect(() => {\n    console.log('productview use effect');\n    //const url = productCode ? `/api/product/getProduct/${productCode}` : `/api/product/getProductByUrl?category=${category}&slug=${slug}`\n    const url = `/api/product/getProduct/${slug}`;\n    get.send(env.apiBase + url);\n    setLoaded(false);\n    // eslint-disable-next-line\n  }, [productCode, slug]);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n\n  const data = get.response;\n\n  if (get.done() && !loaded) {\n    setLoaded(true);\n    const pageUrl = productCode ? `/product/${productCode}` : `/products/${category}/${slug}`;\n    const pageTitle = data.totalCnt === 0 ? 'No product found' : data.productName;\n    gtm.pageView(pageUrl, pageTitle);\n  }\n\n  if (data.totalCnt === 0) return <div>No product found.</div>\n  return (\n    <React.Fragment>\n      <div className=\"single-banner banner-item bannerSize--thin\"\n        style={{ backgroundImage: utils.css.bgUrlStyle(utils.site.resourcePath('/assets/products-masthead.jpg')) }}>\n      </div>\n      <TopHeader />\n      <Product product={data} />\n      {/* <CommonProductBottom /> */}\n      <ProductPagePartial />\n      <ViewPartial />\n    </React.Fragment>\n  );\n}\n\nfunction Product({ product }) {\n  console.log(\"product\", product);\n  //product.productImages = [];\n  // const mainPhoto = product.productImages.length > 0 ? product.productImages[0] : { imageUrl: '/assets/product-empty.png', alt: product.productName };\n  //const mainPhoto = {imageUrl: utils.site.resourcePath('/sites/beehive-react/media/products/coastal-flora-1k-hexjar.jpg'), alt: product.productName};\n\n  const mainPhoto = product.productImages.length > 0 ?\n    { imageUrl: product.productImages[0].imageUrl, alt: product.productImages[0].alt ? product.productImages[0].alt : product.productName } :\n    { imageUrl: '/assets/logos/logo.png', alt: product.productName };\n\n  const allPhotos = product.productImages || [];\n  //console.log(\"aaa\", allPhotos);\n  //const otherPhotos = product.productImages.length > 0 ? product.productImages.filter(x => !x.isPackage) : [];\n  const popupImages = allPhotos.map(x => x.imageUrl);\n\n  const [heroImage, setHeroImage] = React.useState(mainPhoto);\n  const [openPopup, setOpenPopup] = useState(false);\n\n  const [toggler, setToggler] = React.useState(false);\n  //const [popupImages, setPopupImages] = React.useState();\n  const [popupIndex, setPopupIndex] = React.useState(0);\n  //const shareUrl = utils.site.resourcePath('/product/' + product.productSlug);\n  //const heroImageUrl = utils.site.resourcePath(mainPhoto.imageUrl);\n\n  const enquiryFormModel = getEnquiryFormModel({});\n  const enquiryForm = useForm(enquiryFormModel, { usePlaceholder: true });\n\n  const enquiryFormRender = (name) => enquiryForm.renderControl(name, null);\n  const post = usePost();\n  const [sendingStatus, setSendingStatus] = React.useState(null);\n\n  // const [favorite, setFavorite] = React.useState(() => {\n  //   if (localStorage.favorites.includes(product.productId)) {\n  //     return true;\n  //   }\n  //   return false;\n  // });\n\n  const breadCrumbs = product.breadCrumbs;\n\n  //console.log('favorite', favorite);\n  //const [isMobile, setIsMobile] = React.useState(utils.site.isMobile())\n\n  // React.useEffect(() => {\n  //   const resized = debounce(() => {\n  //     setIsMobile(utils.site.isMobile())\n  //   }, 1000)\n  //   if (typeof window !== `undefined`) {\n  //     window.addEventListener('resize', resized)\n  //   }\n  //   return () => {\n  //     if (typeof window !== `undefined`) {\n  //       window.removeEventListener('resize', resized)\n  //     }\n  //   }\n\n  // })\n\n\n  function openPopupImage(imageUrl) {\n    const inx = utils.array.findIndex(popupImages, x => x === imageUrl);\n    setPopupIndex(inx >= 0 ? inx : 0)\n    setToggler(!toggler)\n  }\n\n  var settings = {\n    dots: false,\n    infinite: allPhotos.length > 2 ? true : false,\n    speed: 1500,\n    autoplaySpeed: 3000,\n    //fade: true,\n    autoplay: false,\n    slidesToShow: allPhotos.length >= 3 ? 3 : allPhotos.length,\n    slidesToScroll: 1\n  };\n\n  const slides = allPhotos.map((photo, index) => <div css={style.productViewImage} key={index}\n    className={`productView__image ${heroImage.imageUrl === photo.imageUrl ? 'current' : ''}`}>\n    <div css={style.productViewImageBg} className={`productView__imageBg`}\n      style={{\n        backgroundImage: utils.css.bgUrlStyle(photo.imageUrl)\n      }}\n      onClick={() =>\n        setHeroImage(photo)}\n    >\n    </div>\n    {/* <img src={utils.site.resourcePath(photo.imageUrl)} alt={photo.alt} onClick={() => setHeroImage(photo)} /> */}\n  </div>\n  );\n\n  function onSubmit(e) {\n    enquiryForm.validateForm(e, () => {\n      const value = { ...enquiryForm.getValue(), productName: product.productName, emailReceiver: '' };\n      //var files = form.getFiles();\n      var formData = new FormData();\n      formData.append('jsonData', JSON.stringify(value));\n      //post.send(env.apiBase + \"/api/contact/send\", value);\n      post.sendFormData(env.apiBase + \"/api/cart/sendenquire\", formData);\n      setSendingStatus('pending');\n    })\n    //console.log('submitting');\n  }\n\n  if (post.done() && sendingStatus === 'pending') {\n    //var value = enquiryForm.getValue();\n    //gtm.sendEvent('contactFormSubmitted', {contactEmail: value.email} )\n    enquiryForm.reset(enquiryFormModel);\n    setSendingStatus(null);\n    setTimeout(() => {\n      setOpenPopup(false);\n      document.body.style.overflow = \"unset\";\n    }, 1500);\n  }\n\n  return (\n    <div className=\"contentPanel productViewPanel\">\n\n      <Portal>\n        {\n          openPopup &&\n          <div className=\"product__enquiry__form__container\" css={style.enquiryFormContainer}>\n            <form className=\"contactForm\">\n              <div className=\"closeButton\" onClick={() => {\n                setOpenPopup(false);\n                document.body.style.overflow = \"unset\";\n              }}>\n                CLOSE\n              </div>\n              <div className=\"enquireNowText\">\n                Enquire Now\n              </div>\n              <div className=\"form-row\">\n                <div className=\"col-md-4 mb-2\">{enquiryFormRender('name')}</div>\n                <div className=\"col-md-4 mb-2\">{enquiryFormRender('phone')}</div>\n                <div className=\"col-md-4 mb-2\">{enquiryFormRender('email')}</div>\n              </div>\n              <div className=\"form-row\">\n                <div className=\"col-md-12 mb-2\">{enquiryFormRender('enquiry')}</div>\n              </div>\n\n              <div className=\"form-row\">\n                <div className=\"col-md-12 mb-2\">\n                  <div className=\"actions\">\n                    {/* onClick={onSubmit} status={post.status} */}\n                    <Button onClick={onSubmit} status={post.status} >Send Message</Button>\n                    <ErrorMessage errors={post.errors} />\n                    {post.status === 'done' && 'Successfully sent!'}\n                  </div>\n                </div>\n              </div>\n            </form>\n          </div>\n        }\n      </Portal>\n\n      <FsLightbox\n        toggler={toggler}\n        sources={popupImages}\n        sourceIndex={popupIndex}\n      />\n      <MetaTag data={getMetaTag(product, mainPhoto)} />\n\n      <div className=\"contentPanel__bg\">\n      </div>\n      <div className=\"container\">\n        {/* <Breadcrumb breadcrumb={product.breadcrumb} /> */}\n        <div className=\"productView\">\n          <div itemScope={true} itemType=\"http://schema.org/Product\">\n            <meta itemProp=\"name\" content={product.productName} />\n            <div itemProp=\"brand\" itemType=\"http://schema.org/Brand\" itemScope>\n              <meta itemProp=\"name\" content={env.siteName} />\n            </div>\n\n            {product.description && <meta itemProp=\"description\" content={product.description} />}\n            {/* {barcodeCleaned && <meta itemProp=\"sku\" content={barcodeCleaned} />} */}\n            {heroImage && heroImage.imageUrl && <link itemProp=\"image\" href={env.baseOrigin + heroImage.imageUrl} />}\n\n            <div className=\"row\">\n\n              <div className=\"col-md-10\" css={style.productPageCol}>\n                {/* {breadCrumbs.map((item, index) => {\n\n              })} */}\n                \n                {/* <ul className=\"breadCrumbs\" css={style.productBreadCrumbs}>\n                  <li> <SiteLink to=\"/\"> Home </SiteLink> </li>\n                  <li> <SiteLink to=\"/shop\"> Shop </SiteLink> </li>\n                  {\n                    breadCrumbs.map((item, index) =>\n                      <li key={index} className={`breadCrumb ${index === (breadCrumbs.length - 1) ? 'last-item' : ''}`}>\n                        <SiteLink to={item.categoryPageUrl}> {item.categoryPageTitle} </SiteLink>\n                      </li>\n                    )\n                  }\n                  <li>{product.productName}</li>\n                </ul> */}\n\n              </div>\n\n              <div className=\"col-md-2\" css={style.productPageCol} style={{ textAlign: 'right' }}>\n                {/* <MdFavorite css={style.productFavorite} className={`${favorite === true ? 'checked' : ''}`} onClick={() => {\n                  setFavorite(pre => {\n                    let _localStorageFavorites = localStorage.favorites.replace(product.productId + \"|\", \"\");\n                    let _new = !pre;\n                    if (_new === true) {\n                      _localStorageFavorites = _localStorageFavorites + product.productId + \"|\";\n                    }\n                    localStorage.setItem(\"favorites\", _localStorageFavorites);\n                    return _new;\n                  });\n                }}></MdFavorite> */}\n              </div>\n\n              <div className=\"col-md-6 col-12\" css={style.productPageCol}>\n                <div css={style.heroImageContainer} className=\"productView__hero__container\">\n                  <img css={style.heroImage} className=\"productView__hero\" src={heroImage.imageUrl} alt={heroImage.alt} onClick={() => openPopupImage(heroImage.imageUrl)} />\n                </div>\n\n                {\n                  slides && slides.length > 1 &&\n                  <div css={style.productViewImages} className=\"productView__images\">\n                    <Slider {...settings} >\n                      {slides}\n                    </Slider>\n                  </div>\n                }\n\n                {/* <div className=\"desk__top\" css={style.desktopMobile}>\n                  <div className=\"quote__container\" css={style.quoteContainer}>\n                    <div className=\"quote__text\">\n                      Like this product but doesn't match your specifications? Click for a custom quote.\n                    </div>\n                    <Button onClick={() => {\n                      setOpenPopup(true);\n                      document.body.style.overflow = \"hidden\";\n                    }}> CUSTOM QUOTE </Button>\n                  </div>\n\n                  <div className=\"social-media\" css={style.socialMedia}>\n                    <div className=\"social-icon-text\"> SHARE THIS PRODUCT:</div>\n                    <FacebookShareButton url={shareUrl} title=\"Sharing with Facebook\">\n                      <FacebookIcon size={50} round={true} />\n                    </FacebookShareButton>\n                    <PinterestShareButton url={shareUrl} media={heroImageUrl} title=\"Sharing with Pinterest\" style={{ marginLeft: '10px' }}>\n                      <PinterestIcon size={50} round={true} />\n                    </PinterestShareButton>\n                  </div>\n                </div> */}\n\n              </div>\n              <div className=\"col-md-6 col-12\" css={style.productPageCol}>\n\n                {/* <div className=\"productView__shortDes\" css={style.productViewShortDes}>\n                  {product.shortDesc}\n                </div> */}\n\n                <h1 className=\"productView__title\" style={{ textTransform: 'uppercase' }} css={style.productViewTitle}>\n                  <strong>{product.productName}</strong>\n                </h1>\n\n                <div css={style.desc} dangerouslySetInnerHTML={{ __html: product.description }}></div>\n\n                {/* <hr/> */}\n\n                {/* <div className=\"productView__productCode\">\n                  Product code: <b>{product.productCode}</b>\n                </div> */}\n\n                {\n                  product.productStatus === 0 &&\n                  <AddToCart product={product} />\n                }\n\n                {\n                  product.productStatus === 100 &&\n                  <div className='ecm__button__container' css={style.ecm__button__container}>\n                    <Button onClick={() => {\n                      setOpenPopup(true);\n                      document.body.style.overflow = \"hidden\";\n                    }}> ENQUIRE NOW </Button>\n                  </div>\n                }\n\n                {\n                  product.productStatus === 1 &&\n                  <div className='ecm__button__container' css={style.ecm__button__container}>\n                    <Button disabled> SOLD OUT </Button>\n                  </div>\n\n                }\n\n                {\n                  product.productStatus === 98 &&\n                  <div className='ecm__button__container' css={style.ecm__button__container}>\n                    <Button disabled> NOT AVAILABLE </Button>\n                  </div>\n                }\n\n                {/* <div className=\"mobile\" css={style.desktopMobile}>\n                  <div className=\"quote__container\" css={style.quoteContainer}>\n                    <div className=\"quote__text\">\n                      Like this product but doesn't match your specifications? Click for a custom quote.\n                    </div>\n                    <Button onClick={() => {\n                      setOpenPopup(true);\n                      document.body.style.overflow = \"hidden\";\n                    }}> CUSTOM QUOTE </Button>\n                  </div>\n\n                  <div className=\"social-media\" css={style.socialMedia}>\n                    <div className=\"social-icon-text\"> SHARE THIS PRODUCT:</div>\n                    <FacebookShareButton url={shareUrl} title=\"Sharing with Facebook\">\n                      <FacebookIcon size={50} round={true} />\n                    </FacebookShareButton>\n                    <PinterestShareButton url={shareUrl} title=\"Sharing with Pinterest\" style={{ marginLeft: '10px' }}>\n                      <PinterestIcon size={50} round={true} />\n                    </PinterestShareButton>\n                  </div>\n                </div> */}\n\n              </div>\n            </div>\n            <RelatedProducts products={product.relatedProducts} />\n          </div>\n        </div>\n\n      </div>\n    </div>\n  )\n}\n\nfunction getMetaTag(product, mainPhoto) {\n  return {\n    title: product.productName,\n    description: product.metaDesc || product.intro,\n    keywords: '',\n    heroImageUrl: utils.site.resourcePath(mainPhoto.imageUrl),\n    language: 'English',\n    country: 'Australia',\n    siteName: env.siteName,\n    url: utils.site.resourcePath('/product/' + product.productSlug),\n    //canonical: utils.site.resourcePath(pageData.pageUrl)\n  }\n}\n\nfunction RelatedProducts({ products }) {\n  //console.log(products)\n  if (!products || products.length === 0) return null;\n  return <div className=\"productView__relatedProducts\">\n    <h3>RELATED PRODUCTS</h3>\n    <div className=\"productList\">\n      {products.map((product, index) =>\n        <ProductTile product={product} key={product.productCode}>\n        </ProductTile>\n      )}\n    </div>\n  </div>\n}","import { fb, validators } from '../../../lib/form';\nexport function getEnquiryFormModel(data) {\n  const model = fb.group({\n    name: [data.name || '', [validators.Required()], { label: 'Name', type: 'text' }],\n    phone: [data.phone || '', [validators.Required()], { label: 'Phone', type: 'text' }],\n    email: [data.email || '', [validators.Required(), validators.Email()], { label: 'Email', type: 'email' }],\n    enquiry: [data.enquiry || '', [validators.Required()], { label: 'Enquiry', type: 'textarea' }]\n    //attachments: [data.attachments || '', [], { label: 'Attachments', type: 'file' }]\n  }); \n  return model;\n}","import { mq } from '../../../cssInJs'\n\nexport default {\n  orderDetails: {\n    textAlign: 'left',\n    marginBottom: '3rem',\n    paddingLeft: '1rem',\n    paddingRight: '1rem'\n  },\n  summary: {\n\n  },\n\n  fn: mq({\n    minWidth: ['7rem', null, '10em'],\n    margin: 0\n  }),\n  fv: {\n\n  },\n\n  orderItems: {},\n  orderItem: {\n    padding: '0.5rem 0',\n    margin: '0.5rem 0',\n    borderBottom: 'solid 1px #ccc'\n  },\n  total: {\n    //marginLeft: 15,\n    fontWeight: 'bold',\n    color: 'chocolate'\n  }\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/core'\nimport style from './orderDetailsStyle';\nimport React, {Fragment} from 'react';\n\nimport env from '../../../env';\nimport { useGet } from '../../../components';\nimport { Loading, ErrorPopup } from '../../../components';\nimport { useRouter } from '../../../components';\nimport utils from '../../../utils';\nexport function OrderDetails() {\n  const get = useGet();\n  const { query } = useRouter();\n  const o = query.o || '';\n\n  React.useEffect(() => {\n    get.send(env.apiBase + '/api/order/getPaidOrder/' + o);\n    // eslint-disable-next-line\n  }, []);\n\n  if (get.loading()) {\n    return <Loading />\n  } else if (get.hasErrors()) {\n    return <ErrorPopup title=\"Loading Error\" errors={get.errors} />\n  }\n  const order = get.response;\n  return <Details order={order} />\n}\n\nfunction Details({ order }) {\n  console.log('order', order);\n  const orderItems = order.orderItems.filter(x => x.orderItemType === 0);\n  const taxLines = order.orderItems.filter(x => x.orderItemType === 1);\n  \n  function itemAmount(orderItem) {\n    return (orderItem.unitPrice * 100 + (orderItem.addedUnitPrice ? orderItem.addedUnitPrice * 100 : 0) - (orderItem.discountUnitPrice ? orderItem.discountUnitPrice * 100 : 0)) / 100;\n  }\n  // function itemTotalAmount(orderItem) {\n  //   return (orderItem.quantity * (orderItem.unitPrice * 100 + orderItem.addedUnitPrice * 100 - orderItem.discountUnitPrice * 100)) / 100;\n  // }\n\n  return <div css={style.orderDetails}>\n\n      <hr />\n      <div className=\"row\" style={{marginLeft:'0px', marginRight:'0px'}}> \n        <div className=\"col-md-12\">\n          <div><label css={style.fn}>Order Number:</label> <span css={style.fv}>{order.orderNo}</span> </div>\n          <div><label css={style.fn}>Total Amount:</label> <span css={style.fv}><b>AU {utils.money.formatMoney(order.totalAmount)}</b></span> </div>\n          <div><label css={style.fn}>Order Date:</label> <span css={style.fv}>{utils.date.formatYYYYMMDD(order.orderDate)}</span> </div>\n        </div>\n      </div>\n      <hr />\n\n      <h3>ITEMS</h3>\n      <div css={style.orderItems}>\n        {orderItems.map((orderItem, i) => <div css={style.orderItem} className=\"row\" key={orderItem.orderItemId}>\n          <div className=\"col-6\">\n            <b dangerouslySetInnerHTML={{ __html: orderItem.itemName }}></b>\n            <div dangerouslySetInnerHTML={{ __html: orderItem.itemDescHtml }}></div>\n          </div>\n          <div className=\"col-3\">\n            <div className=\"price\">Unit Price: {utils.money.formatMoney(itemAmount(orderItem))}</div>\n          </div>\n          <div className=\"col-3\">\n            Qty: {orderItem.quantity}\n          </div>\n        </div>\n        )}\n\n        <div css={style.orderItem} className=\"row\">\n            <div className=\"col-9\">\n              Shipping Fee: \n            </div>\n            <div className=\"col-3\">\n              <div css={style.amount}>\n                <b>{utils.money.formatMoney(order.shippingAmount)}</b>\n              </div>\n            </div>\n        </div>\n\n        {taxLines.map((orderItem, index) => \n          <div key={orderItem.orderItemId} css={style.orderItem} className=\"row\">\n            <div className=\"col-9\">\n              Tax: {orderItem.itemName}\n            </div>\n            <div className=\"col-3\">\n              <div css={style.amount}>\n                <b>{utils.money.formatMoney(orderItem.unitPrice)}</b>\n              </div>\n            </div>\n          </div>\n        )}\n\n        <div className=\"row\" style={{marginLeft:'0px', marginRight:'0px'}}>\n          <div className=\"col-12\">\n            <div css={style.total}>\n              Total: AU {utils.money.formatMoney(order.totalAmount)}\n              {/* <span className=\"total-price\">Item Total: {utils.money.formatMoney(order.itemAmount)}\n                <span> + Shipping Fee: {order.shippingAmount > 0 ? 'AU ' + utils.money.formatMoney(order.shippingAmount) : 'FREE'}</span>\n                <span> + GST: {utils.money.formatMoney(order.taxAmount)}</span>\n              </span>\n              <div className=\"grand-total\">Grand Total (including GST): AU {utils.money.formatMoney(order.totalAmount)}\n              </div> */}\n            </div>\n          </div>\n        </div>\n\n      </div>\n\n      <hr />\n      {/* <h3>CONTACT</h3> */}\n      <h3>\n              DELIVERY METHOD\n      </h3>\n      <div>\n              {order.shippingMethod}\n      </div>\n      {\n        (order.shippingAddress && order.shippingMethod === 'Standard') &&\n        <Address addr={order.shippingAddress} />\n      }\n      <Billing billingAddr = {order.billingAddress} useSameAddress = {order.useSameAddress} />\n    </div>;\n}\n\nfunction Address({addr}) {\n  return <div>\n    <hr />\n    <h3> SHIPPING ADDRESS </h3>\n    <div><label css={style.fn}>First Name:</label> <span css={style.fv}>{addr.firstName}</span> </div>\n    <div><label css={style.fn}>Surame:</label> <span css={style.fv}>{addr.surname}</span> </div>\n    <div>\n      <label css={style.fn}>Address:</label>\n      <span css={style.fv}>{addr.street1}</span>\n      <span css={style.fv} style={{marginLeft: '0.5rem'}}>{addr.street2}</span>\n    </div>\n    <div><label css={style.fn}>Suburb:</label> <span css={style.fv}>{addr.suburb}</span> </div>\n    <div><label css={style.fn}>State:</label> <span css={style.fv}>{addr.state}</span> </div>\n    <div><label css={style.fn}>Postcode:</label> <span css={style.fv}>{addr.postcode}</span> </div>\n    <div><label css={style.fn}>Email Address:</label> <span css={style.fv}>{addr.email}</span> </div>\n    <div><label css={style.fn}>Mobile:</label> <span css={style.fv}>{addr.mobile}</span> </div>\n  </div>\n}\n\nfunction Billing(props){\n  const billingAddr = props.billingAddr;\n  const useSameAddress = props.useSameAddress\n  return (\n    <div>\n        <hr />\n        <h3> BILLING ADDRESS </h3>\n        {\n          useSameAddress === true && \n          <div> Use the same address </div>\n        }\n        {\n          (billingAddr && useSameAddress === false) &&\n          <Fragment>\n            <div><label css={style.fn}>First Name:</label> <span css={style.fv}>{billingAddr.firstName}</span> </div>\n            <div><label css={style.fn}>Surame:</label> <span css={style.fv}>{billingAddr.surname}</span> </div>\n            <div>\n              <label css={style.fn}>Address:</label> \n              <span css={style.fv}> {billingAddr.street1} </span>\n              <span css={style.fv} style={{marginLeft: '0.5rem'}}> {billingAddr.street2} </span>\n            </div>\n            <div><label css={style.fn}>Suburb:</label> <span css={style.fv}>{billingAddr.suburb}</span> </div>\n            <div><label css={style.fn}>State:</label> <span css={style.fv}>{billingAddr.state}</span> </div>\n            <div><label css={style.fn}>Postcode:</label> <span css={style.fv}>{billingAddr.postcode}</span> </div>\n            <div><label css={style.fn}>Email Address:</label> <span css={style.fv}>{billingAddr.email}</span> </div>\n            <div><label css={style.fn}>Mobile:</label> <span css={style.fv}>{billingAddr.mobile}</span> </div>\n          </Fragment>\n        }\n    </div>\n  )\n}\n\n// eslint-disable-next-line\n{/* <h4 style=\"margin-top:1.5em;\">Delivery Method</h4>\n<div>\n  <div className=\"col-12\">\n    <div *ngIf=\"order.shippingMethod == 'Pickup'\">\n      <p style=\"margin: 1rem;\"><b>Pickup</b></p>\n      <div *ngIf=\"order.pickupLocation\">\n        <h5>Selected Location</h5>\n        <div className=\"selected-pickup-location\">\n          <div><b>{{order.pickupLocation.companyName}}</b></div>\n          <div>{{order.pickupLocation.suburb}}, {{order.pickupLocation.state}}</div>\n          <div>T: {{order.pickupLocation.phone}}</div>\n        </div>\n      </div>\n    </div>\n    <div *ngIf=\"order.shippingMethod != 'Pickup'\">\n      {{order.shippingMethod}}\n    </div>\n\n  </div>\n</div>\n\n<h4 style=\"margin-top:1.5em;\">Shipping/Billing Information</h4>\n<div className=\"addresses\">\n\n  <div className=\"row\">\n    <div className=\"col-6\" *ngIf=\"order.shippingMethod != 'Pickup'\">\n      <h5>Shipping\n        <a *ngIf=\"gmapShipping\" [href]=\"gmapShipping\" target=\"_blank\"><i className=\"material-icons\">place</i></a>\n      </h5>\n      <div className=\"fld\"><label>First Name:</label> <span>{{order.shippingAddress.firstName}}</span> </div>\n      <div className=\"fld\"><label>Surname:</label> <span>{{order.shippingAddress.surname}}</span> </div>\n      <div className=\"fld\"><label>Email:</label> <span>{{order.shippingAddress.email}}</span> </div>\n      <div className=\"fld\"><label>Phone:</label> <span>{{order.shippingAddress.phone}}</span> </div>\n      <div className=\"fld\"><label>Address:</label> <span>{{order.shippingAddress.addressLine}}</span> </div>\n      <div className=\"fld\"><label>Suburb:</label> <span>{{order.shippingAddress.suburb}}</span> </div>\n      <div className=\"fld\"><label>State:</label> <span>{{order.shippingAddress.state}}</span> </div>\n      <div className=\"fld\"><label>Postcode:</label> <span>{{order.shippingAddress.postcode}}</span> </div>\n    </div>\n    <div className=\"col-6\">\n      <h5>Billing\n        <a *ngIf=\"gmapBilling\" [href]=\"gmapBilling\" target=\"_blank\"><i className=\"material-icons\">place</i></a>\n      </h5>\n      <div *ngIf=\"order.useSameAddress\">Use the same address</div>\n      <div *ngIf=\"!order.useSameAddress\">\n        <div className=\"fld\"><label>First Name:</label> <span>{{order.billingAddress.firstName}}</span> </div>\n        <div className=\"fld\"><label>Surname:</label> <span>{{order.billingAddress.surname}}</span> </div>\n        <div className=\"fld\"><label>Email:</label> <span>{{order.billingAddress.email}}</span> </div>\n        <div className=\"fld\"><label>Phone:</label> <span>{{order.billingAddress.phone}}</span> </div>\n        <div className=\"fld\"><label>Address:</label> <span>{{order.billingAddress.addressLine}}</span> </div>\n        <div className=\"fld\"><label>Suburb:</label> <span>{{order.billingAddress.suburb}}</span> </div>\n        <div className=\"fld\"><label>State:</label> <span>{{order.billingAddress.state}}</span> </div>\n        <div className=\"fld\"><label>Postcode:</label> <span>{{order.billingAddress.postcode}}</span> </div>\n\n      </div>\n    </div>\n  </div>\n</div>\n<hr />\n<h4 style=\"margin-top:1.5em;\">Special Request</h4>\n<div className=\"row\">\n  <div className=\"col-12\">\n    <div style=\"white-space:pre-line\">\n      {{order.specialRequest? order.specialRequest : \"N/A\"}}\n    </div>\n  </div>\n</div> */}","import React, { useEffect, useRef } from 'react';\nimport { BrowserRouter as Router, Switch, Route, Redirect } from 'react-router-dom';\nimport { useRouter } from './components';\nimport { StoreProvider } from './store';\nimport { ViewPage } from './cms/pages/viewPage/viewPage';\nimport { EditPage } from './cms/pages/editPage/editPage';\n//import { TopHeader } from './layout/topHeader/topHeader';\n// import { Footer } from './layout/footer/footer';\nimport { BottomDock } from './layout/bottomDock/bottomDock';\n// import { BlogView } from './site/blog/blogView';\nimport { AppVersionPage } from './components';\nimport { MediaQueryStatus } from './components';\nimport { CommonVideoPopup } from \"./layout/popup/commonVideoPopup\";\nimport { HelmetProvider } from 'react-helmet-async';\n//import { useScrollPosition } from '@n8tb1t/use-scroll-position';\nimport { AppRouteChanged } from './AppRouteChanged';\nimport AOS from 'aos';\n\n//For ECM\nimport { ProductView } from './site/ecm/product/productView';\nimport { OrderDetails } from './site/ecm/orderDetails/orderDetails';\nimport env from './env';\nimport { useStore } from './store';\n\nfunction AppLayout(props) {\n  const { pathname } = useRouter();\n\n  //For ECM\n  const storeContext = useRef(useStore());\n\n  //const [scrolled, setScrolled] = useState(false)\n  //const path = usePath();\n  //const routeResult = useRoutes(routes);\n\n  // const parallax = useParallax();\n  // //console.log(path, routeResult);\n  // const routeChanged = (path) => {\n  //   //console.log(path);\n  //   parallax.reset();\n  // }\n\n  // useScrollPosition(({ prevPos, currPos }) => {\n  //   //console.log(currPos.x)\n  //   //console.log(currPos.y);\n  //   if (currPos.y > 90) {\n  //     document.querySelector('body').classList.add('scrolled')\n  //   } else {\n  //     document.querySelector('body').classList.remove('scrolled')\n  //   }\n  //   //setScrolled(currPos.y > 90)\n  // }, [], null, true)\n\n  //const pageChanged = useCallback(path => routeChanged(path), [])\n  //useLocationChange((path) => { routeChanged(path, history)})\n  //useLocationChange(path => routeChanged(path))\n\n  //const pathFiltered = (pathname || '').toLocaleLowerCase();\n  let specialClassName = '';\n  //  if (pathFiltered.indexOf('/digital-sensor') >= 0) specialClassName = 'digital-sensor-page';\n  //  else if (pathFiltered === '/brilliance') specialClassName = 'brilliance-page';\n\n  useEffect(() => {\n    \n    if(!localStorage.favorites){\n      localStorage.setItem(\"favorites\", \"\");\n    }\n    \n    AOS.init({\n      duration: 1200\n      //delay:400,\n      //once:true\n    });\n\n    // For ECM\n    fetch(env.apiBase + \"/api/cart/getcart/\" + env.getDevCartId())\n      .then(res => res.json())\n      .then(res => {\n          const data = res;\n          if(data){\n            storeContext.current.dispatch({type:'SET_STATE', payload : {cartInfo : data.cartInfo.totalQuantity === 0 ? 0 : (data.cartInfo.totalQuantity)-1}});\n          }\n      })\n      .catch(error =>{\n        storeContext.current.dispatch({type:'SET_STATE', payload : {cartInfo : 0}});\n    });\n\n  }, []);\n\n  return (\n    <div className={`body-content ${pathname === '/' ? 'homepage' : 'subpage'} ${specialClassName}`}>\n      <AppRouteChanged />\n      <div className=\"main-content\">\n        <div className=\"app-content\">\n          <Switch>\n            <Route path=\"/ver\" children={<AppVersionPage />} />\n            <Route path=\"/cms/page/render/:id\" children={<EditPage />} />\n            {/* <Route path=\"/blog/:id\" children={<BlogView />} /> */}\n\n            <Route path=\"/admin\">\n              <Redirect to=\"/admin\" />\n            </Route>\n\n            <Route path=\"/order-thankyou\" children = {<OrderDetails />}/>\n            <Route path=\"/shop/:slug\" children = {<ProductView />}/>\n\n            <Route path=\"/\">\n              <ViewPage />\n            </Route>\n          </Switch>\n        </div>\n        {/* <app-common-bottom-partial></app-common-bottom-partial> */}\n      </div>\n      {/* <Footer></Footer> */}\n      <BottomDock></BottomDock>\n      <MediaQueryStatus />\n      <CommonVideoPopup />\n    </div>\n  );\n}\n\nfunction App() {\n  return (\n    <StoreProvider>\n      <HelmetProvider>\n        <Router>\n          <AppLayout />\n        </Router>\n      </HelmetProvider>\n    </StoreProvider>\n  );\n}\n\nexport default App;","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\nlet serviceUpdateCheckerInterval = null;\n\nexport function register(config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit https://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker\n    .register(swUrl, {updateViaCache: 'none'})\n    .then(async registration => {\n      // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration\n      console.log('Service Worker registration successful with scope: ', registration.scope);\n      if (registration && registration.waiting) {\n        registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n      }\n      \n      // Regular checking service worker\n      if (serviceUpdateCheckerInterval) { try { clearInterval(serviceUpdateCheckerInterval) } catch (e) { } }\n      serviceUpdateCheckerInterval = setInterval(() => {\n        console.log('Checking SW updates...')\n        registration.update();\n      }, 1/*hour(s)*/ * 10/*minutes*/ * 60 * 1000);\n\n      window.updateSW = function() {\n        console.log('Checking SW updates... (force)')\n        return registration.update();\n      }\n      \n      // When the user asks to refresh the UI, we'll need to reload the window\n      var preventDevToolsReloadLoop = false;\n      \n      const oldSw = (await navigator.serviceWorker.getRegistration())?.active?.state;\n      console.log(oldSw, registration)\n      navigator.serviceWorker.addEventListener('controllerchange', async function (ev) {\n        const newSw = (await navigator.serviceWorker.getRegistration())?.active?.state;\n        console.log('Service Worker controller change', ev)\n        console.log(oldSw, newSw)\n        // Ensure refresh is only called once.\n        // This works around a bug in \"force update on reload\".\n        if (preventDevToolsReloadLoop) return;\n        \n\n        if(oldSw === 'activated' && newSw === 'activating') {\n          preventDevToolsReloadLoop = true;\n          console.log('Reloading...')\n          window.location.reload();\n        }\n\n        //window.location.reload();\n      });\n\n      // onNewServiceWorker(registration, function () {\n      //   console.log('onNewServiceWorker', registration)\n      //   alert('New Update Available');\n        \n      //   console.log('User okay to update', registration);\n      //   if (!registration.waiting) {\n      //     // Just to ensure registration.waiting is available before calling postMessage()\n      //     return;\n      //   }\n      //   registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n\n      //   console.log('show refresh')\n      // });\n      \n      registration.onupdatefound = () => {\n        console.log('registration.onupdatefound', registration.installing)\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n\n  navigator.serviceWorker.ready.then(function (registration) {\n    console.log('Service Worker ready');\n  });\n}\n\n\n// function onNewServiceWorker(registration, callback) {\n//   if (registration.waiting) {\n//     console.log('onNewServiceWorker-registration.waiting')\n//     // SW is waiting to activate. Can occur if multiple clients open and one of the clients is refreshed.\n//     return callback();\n//   }\n\n//   function listenInstalledStateChange() {\n//     console.log('listenInstalledStateChange', registration.installing)\n//     registration.installing.addEventListener('statechange', function (event) {\n//       console.log('listenInstalledStateChange - statechange', event)\n//       if (event.target.state === 'installed') {\n//         // A new service worker is available, inform the user\n//         callback();\n//       }\n//     });\n//   };\n\n//   if (registration.installing) {\n//     console.log('onNewServiceWorker-registration.installing')\n//     return listenInstalledStateChange();\n//   }\n\n//   // We are currently controlled so a new SW may be found...\n//   // Add a listener in case a new SW is found,\n//   registration.addEventListener('updatefound', listenInstalledStateChange);\n// }\n\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { 'Service-Worker': 'script' }\n  })\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type');\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            console.log('Reloading... No SW found')\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n","import 'react-app-polyfill/ie11';\nimport 'react-app-polyfill/stable';\nimport './polyfill';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport './_scss/index.scss';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(<App />, document.getElementById('root'));\n//ReactDOM.hydrate(<App />, document.getElementById('root'));\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.register({\n  onUpdate: (registration) => {\n    console.log('updated', registration);\n    const update = true;//window.confirm('New Update Available. Do you want to update? (Refresh page)');\n    if (update){\n      if (!registration.waiting) {\n        // Just to ensure registration.waiting is available before calling postMessage()\n        return;\n      }\n      registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n \n    }\n  }\n});\n","const settings = {\n  //                         xs,    sm,    md,    lg,    xl,    xxl          <-- only sample, check your breakpoints settings.\n  //                         <      576    768    992    1200   1600\n  breakpointNames:          ['xs', 'sm',  'md',  'lg',  'xl',  'xxl'],\n  numOfTilesPerBreakpoints: [1,     2,     2,     2,     3,     3],\n  marginLR:                 [14,    20,    20,    20,    20,    20],\n  marginTB:                 [14,    20,    20,    20,    20,    20],\n  slickSettings: {\n    dots: false,\n    infinite: true,\n    speed: 500,\n    autoplaySpeed: 3000,\n    //fade: false,\n    autoplay: true,\n    slidesToShow: 3,\n    slidesToScroll: 1,\n    responsive: [\n      {\n        breakpoint: 1200,\n        settings: {\n          slidesToShow: 2,\n          slidesToScroll: 1\n        }\n      },\n      {\n        breakpoint: 576,\n        settings: {\n          slidesToShow: 1,\n          slidesToScroll: 1\n        }\n      }\n      // You can unslick at a given breakpoint now by adding:\n      // settings: \"unslick\"\n      // instead of a settings object\n    ]\n  }\n}\n\nexports.settings = settings"],"sourceRoot":""}