{"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(/ /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":""}