{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./Content/javascripts/base/local-storage.js","webpack:///./Content/javascripts/vendor/polyfills/picturefill.js","webpack:///./Content/javascripts/components/bdc-kovisibilitychange.js","webpack:///./Content/javascripts/base/helpers.js","webpack:///./Content/javascripts/base/globals.js","webpack:///./Content/javascripts/content/product/product.js","webpack:///./Content/javascripts/content/product/view-models/product-choice-selector-view-model.js","webpack:///./Content/javascripts/modules/pricing/pricing-support.js","webpack:///./Content/javascripts/binding-handlers/format-money.js","webpack:///./Content/javascripts/vendor/knockout-postbox.js","webpack:///./Content/javascripts/base/cookies-factory.js","webpack:///./javascript/_shared/vendors/brightcove/index.js","webpack:///./Content/javascripts/react/estimateBuilder/helpers/globalVariables.js","webpack:///./Content/javascripts/binding-handlers/numeric.js","webpack:///./Content/javascripts/components/bdc-scroll-to-section.js","webpack:///./Content/javascripts/binding-handlers/visualizer.js","webpack:///./Content/javascripts/base/global-config.js","webpack:///./Content/javascripts/base/page-context-javascript.js","webpack:///./Content/javascripts/react/estimateBuilder/components/EstimateBanner.js","webpack:///./Content/javascripts/components/right-rails-flyout-menu.js","webpack:///./Content/javascripts/content/product-configuration/view-models/measure-and-install-view-model.js","webpack:///./Content/javascripts/base/base-view-model.js","webpack:///./Content/javascripts/content/product/product-sample-cart.js","webpack:///./Content/javascripts/components/visualizer/visualizer-view-model.js","webpack:///./Content/javascripts/components/dictionary/dictionary.js","webpack:///./Content/templates/dictionary.template.html","webpack:///./Content/javascripts/components/dictionary/bindings/dictionary-binding.js","webpack:///./Content/javascripts/components/dictionary/dictionary-controller.js","webpack:///./Content/javascripts/binding-handlers/configurator-zone.js","webpack:///./Content/javascripts/binding-handlers/stop-binding.js","webpack:///./Content/javascripts/binding-handlers/visualizer-image.js","webpack:///./Content/javascripts/content/product/view-models/product-option-view-model.js","webpack:///./Content/javascripts/binding-handlers/visibility.js","webpack:///./Content/javascripts/content/product/view-models/product-view-model.js","webpack:///./Content/javascripts/content/product/view-models/product-price-view-model.js","webpack:///./Content/javascripts/content/product/view-models/product-estimate-price-view-model.js","webpack:///./Content/javascripts/content/product/view-models/product-estimate-price-post-measure-view-model.js","webpack:///./Content/javascripts/content/product/view-models/product-gallery-view-model.js","webpack:///./node_modules/@brightcove/player-loader/dist/brightcove-player-loader.es.js","webpack:///./Content/javascripts/modules/product-reviews/product-reviews.js","webpack:///./Content/javascripts/modules/product-reviews/product-reviews-bdc.js","webpack:///./Content/javascripts/modules/product-reviews/product-reviews-bca.js","webpack:///./Content/javascripts/modules/product-reviews/product-reviews-thd.js","webpack:///./Content/javascripts/content/product/view-models/product-group-view-model.js","webpack:///./Content/javascripts/content/product/view-models/product-choice-view-model.js","webpack:///./Content/javascripts/base/binding-handlers.js","webpack:///./Content/javascripts/binding-handlers/delay-visible.js","webpack:///./Content/javascripts/binding-handlers/fade-in-text.js","webpack:///./Content/javascripts/binding-handlers/fade-visible.js","webpack:///./Content/javascripts/binding-handlers/numeric-price.js","webpack:///./Content/javascripts/binding-handlers/replace-server-template.js","webpack:///./Content/javascripts/components/bdc-scroll-to.js","webpack:///./Content/javascripts/binding-handlers/color-swatch-preview.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","57","85","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","window","oldJsonpFunction","slice","define","$","store","LocalStorage","extend","getFromLocalStorage","defaultValue","persist","set","remove","matchMedia","styleMedia","media","info","getElementsByTagName","id","parentNode","insertBefore","getComputedStyle","currentStyle","matchMedium","a","b","styleSheet","cssText","textContent","width","matches","w","g","k","expose","picturefill","HTMLPictureElement","f","srcsetSupported","sizesSupported","curSrcSupported","trim","replace","makeUrl","href","restrictsMixedContent","location","protocol","matchesMedia","getDpr","devicePixelRatio","getWidthFromLength","indexOf","parseFloat","lengthEl","style","className","body","offsetWidth","removeChild","detectTypeSupport","Image","types","initTypeDetects","implementation","hasFeature","verifyTypeSupport","getAttribute","parseSize","exec","findWidthFromSourceSize","winningLength","split","len","parsedSize","Math","max","innerWidth","documentElement","clientWidth","parseSrcset","url","search","descriptor","parseDescriptor","resCandidate","sizeDescriptor","widthInCssPixels","lastchar","isNaN","parseInt","getCandidatesFromSourceSet","formattedCandidates","resolution","dodgeSrcset","srcset","processSourceSet","sizes","candidates","nodeName","toUpperCase","backfaceVisibilityFix","WebkitBackfaceVisibility","currentZoom","zoom","setIntrinsicSize","pfStopIntrinsicSize","dims","applyBestCandidate","bestCandidate","sort","ascendingSort","substr","toLowerCase","warn","currentSrc","removeVideoShim","vsources","getAllElements","imgs","h","getMatch","match","childNodes","slen","nodeType","setInterval","test","readyState","clearInterval","reevaluate","checkResize","addEventListener","attachEvent","runPicturefill","_","element","parent","firstMatch","options","plen","elements","evaluated","ko","postal","originalVisible","bindingHandlers","visible","update","valueAccessor","ret","publish","channel","topic","globals","Array","diff","grep","this","item","inArray","Function","results","toString","getQueryString","tokenizedUrl","decodeURIComponent","queryString","re","original","replaced","originalQueryString","replacedComponent","jq_throttle","getQueryStringValue","getQueryStringWithVanillaBehavior","tryParseInt","str","retValue","String","isInt","valueOf","isFinite","throttle","delay","no_trailing","callback","debounce_mode","timeout_id","last_exec","wrapper","self","elapsed","Date","args","arguments","clear","guid","debounce","at_begin","getQueryParams","stringToParse","lastIndexOf","urlParams","pl","decode","substring","obj","toSlug","text","urlExists","http","XMLHttpRequest","open","send","status","isValidEmail","email","isBound","dataFor","globalConfig","pageContextJavascript","ssm","Cookies","scrollToSection","ReactDOM","estimateBanner","React","polyfill","EstimateBanner","default","estimateBannerRoot","getElementById","render","localStorage","getItem","ObservableState","query","observableIsActive","observable","onEnter","onLeave","addState","alert","breakpoint","dictionaryEntryForTerm","setBodyOverlay","bodyOverlay","addClass","removeClass","refreshValue","querySelector","getPropertyValue","userAgent","navigator","isIE","isIE10","atob","isIE9","require","isIOS","MSStream","ajaxSetup","beforeSend","settings","blindsCookie","C","cookies","cookie","readCookie","cacheCheck","filter","setRequestHeader","xhr","textStatus","errorThrown","newDoc","write","responseText","close","siteId","on","preventDefault","stopImmediatePropagation","output","prismicApi","ajax","then","val","ref","refs","surefitObj","items","article","forEach","index","surefitContent","page_h1","hero_h2_subtitle","colorbox","html","transition","maxWidth","maxHeight","myName","css","overflow","msViewportStyle","createTextNode","productViewModel","ProductViewModel","init","includes","visualizerViewModel","VisualizerViewModel","productId","visualizedOptions","applyBindings","ProductChoiceSelectorViewModel","ProductSampleCart","loadReviews","stickOffset","when","samplesResponse","promoResponse","promotionalData","stackablePercentOff","samplesData","Data","models","strikethroughPrice","price","originalPrice","OriginalPrice","percentOff","Percentage","promoDescription","PromoSnippet","stackablePercentage","map","promo","localVisModel","JSON","parse","detail","variantId","samplesInCart","sample","ChoiceId","isMandi","setItem","productPreview","ProductPreview","fail","log","baseViewModel","ProductOptionViewModel","siteProduct","utils","blankColor","image","selected","selectedPrimaryColorName","selectedPrimaryColorImage","selectedPrimaryColorSelected","selectedSecondaryColorName","selectedSecondaryColorImage","selectedSecondaryColorSelected","selectedColorSwatches","isColorSelected","displayColor","observableArray","colorSelectorPrice","subscribeTo","shouldShowFullSecondarySwatch","hasStrikethroughPricing","computed","pricingSubmodel","discountPrice","toFixed","strikethroughMessage","Message","promoSnippet","optionsLoaded","widthOption","heightOption","height","logMouseOver","productPageChannel","localPersistance","updateEditState","choices","simpleSelectedChoices","each","indexA","productOption","groups","indexB","group","indexC","choice","optionId","saveData","toJSON","flagUnavailableChoices","response","option","isUnavailableInSize","unavailableChoices","currentOption","find","OptionId","ChoiceIds","choiceId","unavailableChoice","toggleSelected","displayColorSelectorPrice","getSelectedChoiceByType","requestedType","selectedChoice","UpdateProductPreviewMicroApp","selectedOptions","choiceid","choiceName","optionid","mediaUrl","choiceValue","dimension","dispatchEvent","CustomEvent","bubbles","cancelable","sampleableOptions","sampleOptions","siteProductOptions","Options","siteProductOption","preSelectedColorId","selectedChoices","publishDimensionsChangedEvent","load","subscribe","selectedPrimaryColor","selectedSecondaryColor","primary","secondary","paths","context","pricingContext","done","productPrice","unwrapObservable","precision","formattedValue","defaultPrecision","Dimension","minDimension","maxDimension","defaultDimension","queryStringKey","cookieName","serializableValue","newValue","initialDimension","queryDimension","initialSearchState","valueWhole","read","floor","newValueAsInt","valueEighths","valueToString","selectedEighthsDimension","arrayFirst","getDimensionsEighths","getDimensionsWhole","wholeDimensions","setValueWhole","setValueEighths","findDimensionsEighths","setValue","setType","getType","WidthDimension","minWidth","defaultDimensions","HeightDimension","minHeight","OtherDimension","priceTemplate","prefix","cents","shouldShowCents","template","prefixText","formatMoney","allBindingsAccessor","viewModel","bindingContext","formatMoneyPrefix","templateType","formatMoneyNATitle","isValidNumber","$data","isLoadingPrices","$parent","isLoading","attr","priceCents","factory","disposeTopicSubscription","existingSubscribe","subscribable","topicCache","serializer","serialized","notifySubscribers","action","initializeWithLatestValue","subscription","current","defaultComparer","cacheItem","fn","publishOn","skipInitialOrEqualityComparer","equalityComparer","skipInitialPublish","postboxSubs","subs","dispose","stopPublishingOn","initializeWithLatestValueOrTransform","transform","isWriteableObservable","unsubscribeFrom","syncWith","postbox","getUsername","addAjaxCacheHeader","isInternalUser","checkInternal","dateAsOf","cartOnBehalfOf","userName","userNameWithoutDomainPrefix","username","last","Brightcove","baseUrl","productBrand","fetch","crossDomain","json","count","videos","tagName","omsid","videoId","sites","americanBlinds","blindsCa","blinds","justBlinds","theHomeDepot","itemTypes","unknown","doorLock","garageDoor","itemSources","autobahn","containerTypes","room","garage","numeric","keyCode","ctrlKey","metaKey","shiftKey","cssSelector","$container","scrollTop","offset","scrollOffset","headerHeight","outerHeight","position","top","animate","visualizer","unwrap","enlarge","zoomable","zoomImage","hide","zoomableContainer","fadeIn","posleft","left","pageX","postop","pageY","fadeOut","pathname","estimateName","editText","propTypes","PropTypes","shape","isRequired","string","defaultProps","cookiesFactory","integrationConfig","getValueFromCookie","content","cookieCollection","getCookie","stacked","isProfessionallyInstallable","localStore","displayModal","availableInArea","installStartingPrice","componentElement","shouldDisplayStacked","selector","getElementsByClassName","constructor","getBoundingClientRect","showModal","closeModal","startProcess","goToMWT","Localizer","getLocalizedStore","storeId","storeFullName","storeName","zipcode","pricingResponse","statusCode","installSpec","spec","specId","pricingBands","basePrice","complete","updateSampleCartCookie","size","thdCookieDomain","now","setDate","getDate","toUTCString","showBlindsSampleCartBlock","trigger","updateTHDHeaderCartCount","itemCountElement","thdCartTotalItemCount","cartChannel","samples","sampleRemove","removeSample","post","addSample","getState","thdAnalyticsEvent","category","primaryCategory","eventInfo","eventName","productInfo","sku","sampleProductId","productCategory","productName","productType","color","manufacturer","quantity","ddoEventInit","$obj","append","clone","show","scrolling","onCleanup","opacity","shouldConvertLinkToButton","sampleIds","sampleId","getSampleCart","cartArea","orderedOptions","_queryStringOptions","_zoomedQueryStringOptions","_pipPostalChannel","_pcpPostalChannel","anyVisualizableOptions","shouldShowVisualizer","visualizerURL","visualizerZoomedURL","ioshack","visualizedOptionList","sortBy","order","isOptionVisualizable","findWhere","setupSubscriptions","deselectChoiceById","setChoiceById","clearAllDependents","dependents","getDependents","dep","existing","findSelectedChoice","isEnabled","selections","getSelections","currentChoice","isSelected","selection","setChoice","deselectChoice","updateUrl","reduce","memo","matchingChoice","visualizationBaseUrl","existingDependentOptions","existingDependentSelections","depSelect","helpers","components","register","dictionaryController","dictionaryBinding","textToParse","innerHTML","dictionary","dictionaryTerms","terms","dictionaryEntries","tagMode","regexIndexOf","regex","startpos","replacementStrategyFactory","strategy","term","uri","innerText","isTHD","encodeURIComponent","addMatchIfNotExists","matchesWePlanToUse","foundOverlappingMatch","existingReplacementString","toIndex","fromIndex","getIndicesOf","dictionaryEntry","Term","IsCaseSensitive","replacementVal","replacement","next","termElement","getTerm","termData","hasVideo","stringToSearch","stringToMatch","caseSensitive","enforceWordBoundaries","originalStringToSearch","originalStringToMatch","indices","RegExp","fIndex","lastIndex","tIndex","indexMatch","dictionaryBindingIcon","loadDictionaryTermData","productLineId","path","dataType","success","loadDictionaryTermHtml","definition","video","hasImage","imageUrl","videoTag","BrightCove","getVideosForProductId","videoResults","configuratorZone","productConfiguration","groupName","$parents","ungroupedOptions","optionsByGroupName","applyBindingsToNode","controlsDescendantBindings","stopBinding","virtualElements","allowedBindings","slideVisible","toggle","slideDown","slideUp","visualizerImage","allBindings","blankImagePath","hideRollOver","visualizationUnavailableImage","elementRelativePath","shouldShowImage","ProductGroupViewModel","_groups","isSamplingEnabled","isSamplingEnabledCecOnly","ShortLabel","Type","selectedChoiceIds","hideSection","unselectAll","currentGroup","Groups","Choices","toggleSection","visibility","MandiVM","CookiesFactory","ProductPriceViewModel","EstimateProductPriceViewModel","EstimateProductPricePostMeasureViewModel","ProductGalleryViewModel","ProductReviews","scroll","prodCat","digitalData","product","prop","click","hash","analyticsContext","AnalyticsContext","pageObject","page","siteObject","site","device","sendPageLoadEvent","isMobile","hasMeasureInstallInstructionLink","mandiVM","measureAndInstallDomain","mainImage","previewGallery","productDescription","shortDescription","hideDetails","showProductSpecificationsHeader","hideSpecifications","aliasId","productReviews","reviews","vendorName","internalInfo","VendorName","customize","currentThumbnailId","$allPhotoThumbnails","inline","onClosed","empty","changeImageById","changeMainImage","Url","toggleDetails","shouldOnlyShow","toggleSpecifications","changeHomeImage","widthWhole","widthEigth","heightWhole","heightEigth","widthStorage","LocalStoragePersister","heightStorage","SetLocalStorageAndCookieToPersist","productConfigurator","applyPreviewGalleryBindings","active","hasVideos","shouldShowVideosTab","showVideo","stopVideos","mediaGallery","useReactGallery","v","startSlideshow","productDetails","ProductDescription","ShortDescription","escapeLineBreak","PromoDescription","estimateMode","pageType","Dimensions","MinWidth","MaxWidth","MinHeight","MaxHeight","initialPriceEvent","updateWholeEighths","getReviewData","numReviews","scrollToSureFitGuaranteedToFit","input","PricingSupport","parentModel","sizeOptions","defaultPrice","oldPricingContext","strikethroughPriceModel","Price","StrikethroughMessage","defaults","postMeasureCookie","postMeasureOptions","Width","Height","updatePrice","params","buildPricingContext","loadSiteProductPricingWithColors","contentType","selectedPricingContext","widthDimension","heightDimension","calculateColorChoicePrices","displayPriceFlags","SelectedPrice","ForCurrentContext","StrikethroughPrice","StackablePromo","Amount","ColorChoicePrices","colorChoicePrice","updatePriceEvent","always","isFunction","widthEighths","heightEighths","currentChoiceIds","dimensionsAdjustedByServer","dimensionsAdjusted","onDimensionsChanged","hasClass","currentWholeDimension","objEighths","formattedEighths","formattedWidthEighths","formatted","formattedHeightEighths","ready","savedState","sc","OptionType","ChoiceValue","sampleOption","optionType","contains","optionIds","numericPrice","pricing","strikeThroughPricingModel","lowPrice","LowPrice","highPrice","HighPrice","allNA","SamePricingContext","vendorToken","sessionStorage","reqHeaders","loadSiteProductPricing","headers","LowerEstimate","UpperEstimate","ChoiceDataType","newPricingContext","ProductId","ForContextOnly","newChoice","oldChoice","loadExactSiteProductPricing","ImageModel","urlAddress","mediaId","altText","caption","isVideo","hidden","ThumbnailModel","imageDesktopDimensions","imageDimensions","imagePath","imagePathMobile","imagePathDesktop","requestMainGallery","imageQueryStringParams","maxPreviewGallerySize","thumbnails","previewThumbnails","images","moreImagesAvailable","videoAccountId","brightcove","accountId","videoPlayerId","playerId","brightCove","currGalleryVideoPlayer","notify","viewVideo","checked","MediaUrl","MediaId","AltText","Caption","AlternateText","PresentationName","thumbnail","slick","changeMedia","clearCurrentVideo","changeImage","setCurrentVideo","$slideShow","$slideShowThumbnails","imagesCount","asNavFor","lazyLoad","slidesToShow","slidesToScroll","arrows","dots","focusOnSelect","focus","currentSlide","nextSlide","filterThumbnails","selectedTab","visibleImage","currentImage","thumbnailId","thumb","currentThumbnail","shouldAutoPlay","elementSelector","durationAsTime","duration","toLocaleTimeString","minute","second","refNode","embedId","onSuccess","player","playerElIngest_","classList","add","one","sendVideoEventAnalytics","pageInfo","getVideosByProductId","$mobileVideoSlideshow","videojs","players","getAllPlayers","pause","currentVideoContainer","_extends","assign","source","_typeof","iterator","JSON_ALLOWED_PARAMS","IFRAME_ALLOWED_QUERY_PARAMS","keys","qs","stringify","x","getQueryParamValue","brightcovePlayerUrl","_ref","_ref$base","base","_ref$playerId","_ref$embedId","_ref$iframe","iframe","_ref$minified","minified","_ref$queryParams","queryParams","ext","charAt","VERSION","DEFAULTS","embedType","refNodeInsert","EMBED_TAG_NAME_VIDEO","EMBED_TAG_NAME_VIDEOJS","EMBED_TYPE_IN_PAGE","EMBED_TYPE_IFRAME","REF_NODE_INSERT_APPEND","REF_NODE_INSERT_PREPEND","REF_NODE_INSERT_BEFORE","REF_NODE_INSERT_AFTER","REF_NODE_INSERT_REPLACE","JSON_ALLOWED_ATTRS","BASE_URL","urls","playerUrl","embedOptions","unminified","isEl","el","Boolean","isElInDom","wrapEmbed","embed","pip","wrapPip","responsive","right","bottom","aspectRatio","iframeHorizontalPlaylist","Number","inner","paddingTop","outer","display","wrapResponsive","createEmbed","refNodeParent","wrapped","nextElementSibling","replaceChild","firstChild","playlist","playlistTagName","legacy","insertEmbed","onEmbedCreated","createIframeEmbed","paramsToAttrs","adConfigId","applicationId","catalogSearch","catalogSequence","deliveryConfigId","playlistId","playlistVideoId","poster","createInPageEmbed","actualCache","Map","playerScriptCache","props","has","REGEX_PLAYER_EMBED","getBcGlobalKeys","bc","disposeAll","env","querySelectorAll","isFn","checkParams","isValidEmbedType","isValidRootInsert","initPlayer","bcinfo","PLAYER_LOADER","loadPlayer","resolveRefNode","async","brightcovePlayerLoader","parameters","onFailure","configurable","writable","arr","ReviewsBdc","ReviewsBca","ReviewsThd","ScrollToSection","hideReviews","$BVCheck","hasReviews","buttonText","ratingWidth","ratingValue","showContent","processReviewData","TotalReviewCount","$BVResult","history","pushState","title","starsWidth","writeReviewLink","readReviewsLink","$BV","configure","ui","partnerProductId","onEvent","attributes","urlPageName","is","avgRating","eType","eventSource","eventTarget","ProductChoiceViewModel","groupChoices","groupid","GroupId","Name","groupVisibleLimit","allVisible","makeAllVisible","unveil","isAvailable","IsAvailable","isSampleable","IsSampleable","SampleProductId","SampleVariantId","shouldDisplaySampling","priceDollars","sampleAvailable","sampleAdded","mouseoverPreview","currentTarget","prepend","mouseoutPreview","selectedSwatch","buildSwatch","swatchSelectedEvent","selectedColor","colorId","choicePrice","delayVisible","fadeInText","fadeVisible","replaceServerTemplate","offsets","testimonials","clippingPath","pathPoints","img","y","save","beginPath","moveTo","lineTo","closePath","clip","drawImage","restore","colorSwatchPreview","colorSwatches","ctx","getContext","primaryColor","secondaryColor","imagesOK","imageURLs","loadAllImages"],"mappings":"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","file":"pip-24a5fb6b3055a409cf31.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t57: 0,\n \t\t85: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"5\":\"vendors~enews~productPreview\",\"7\":\"ab_pip\",\"61\":\"productPreview\"}[chunkId]||chunkId) + \"-\" + \"24a5fb6b3055a409cf31\" + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/content/build/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([1866,0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","define([\r\n \"jquery\", \"store\"],\r\nfunction ($, store) {\r\n var LocalStorage = function () { };\r\n\r\n $.extend(LocalStorage.prototype, {\r\n\r\n getFromLocalStorage: function (key, defaultValue) {\r\n var value = store.get(key)\r\n if (value) {\r\n return value;\r\n }\r\n return defaultValue;\r\n },\r\n\r\n persist: function (key, value) {\r\n store.set(key, value);\r\n },\r\n\r\n remove: function(key) {\r\n store.remove(key);\r\n }\r\n\r\n });\r\n\r\n return LocalStorage;\r\n\r\n});\r\n","window.matchMedia||(window.matchMedia=function(){\"use strict\";var c=(window.styleMedia||window.media);if(!c){var d=document.createElement('style'),script=document.getElementsByTagName('script')[0],info=null;d.type='text/css';d.id='matchmediajs-test';script.parentNode.insertBefore(d,script);info=('getComputedStyle'in window)&&window.getComputedStyle(d,null)||d.currentStyle;c={matchMedium:function(a){var b='@media '+a+'{ #matchmediajs-test { width: 1px; } }';if(d.styleSheet){d.styleSheet.cssText=b}else{d.textContent=b}return info.width==='1px'}}}return function(a){return{matches:c.matchMedium(a||'all'),media:a||'all'}}}());(function(w,g,k){\"use strict\";function expose(a){if(typeof module===\"object\"&&typeof module.exports===\"object\"){module.exports=a}else if(typeof define===\"function\"&&define.amd){define(\"picturefill\",function(){return a})}if(typeof w===\"object\"){w.picturefill=a}}if(w.HTMLPictureElement){expose(function(){});return}g.createElement(\"picture\");var l=w.picturefill||{};var m=/\\s+\\+?\\d+(e\\d+)?w/;l.ns=\"picturefill\";(function(){l.srcsetSupported=\"srcset\"in k;l.sizesSupported=\"sizes\"in k;l.curSrcSupported=\"currentSrc\"in k})();l.trim=function(a){return a.trim?a.trim():a.replace(/^\\s+|\\s+$/g,\"\")};l.makeUrl=(function(){var b=g.createElement(\"a\");return function(a){b.href=a;return b.href}})();l.restrictsMixedContent=function(){return w.location.protocol===\"https:\"};l.matchesMedia=function(a){return w.matchMedia&&w.matchMedia(a).matches};l.getDpr=function(){return(w.devicePixelRatio||1)};l.getWidthFromLength=function(a){var b;if(!(a&&a.indexOf(\"%\")>-1===false&&(parseFloat(a)>0||a.indexOf(\"calc(\")>-1))){return false}a=a.replace(\"vw\",\"%\");if(!l.lengthEl){l.lengthEl=g.createElement(\"div\");l.lengthEl.style.cssText=\"border:0;display:block;font-size:1em;left:0;margin:0;padding:0;position:absolute;visibility:hidden\";l.lengthEl.className=\"helper-from-picturefill-js\"}l.lengthEl.style.width=\"0px\";try{l.lengthEl.style.width=a}catch(e){}g.body.appendChild(l.lengthEl);b=l.lengthEl.offsetWidth;if(b<=0){b=false}g.body.removeChild(l.lengthEl);return b};l.detectTypeSupport=function(a,b){var c=new w.Image();c.onerror=function(){l.types[a]=false;picturefill()};c.onload=function(){l.types[a]=c.width===1;picturefill()};c.src=b;return\"pending\"};l.types=l.types||{};l.initTypeDetects=function(){l.types[\"image/jpeg\"]=true;l.types[\"image/gif\"]=true;l.types[\"image/png\"]=true;l.types[\"image/svg+xml\"]=g.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#Image\",\"1.1\");l.types[\"image/webp\"]=l.detectTypeSupport(\"image/webp\",\"data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=\")};l.verifyTypeSupport=function(a){var b=a.getAttribute(\"type\");if(b===null||b===\"\"){return true}else{var c=l.types[b];if(typeof c===\"string\"&&c!==\"pending\"){l.types[b]=l.detectTypeSupport(b,c);return\"pending\"}else if(typeof c===\"function\"){c();return\"pending\"}else{return c}}};l.parseSize=function(a){var b=/(\\([^)]+\\))?\\s*(.+)/g.exec(a);return{media:b&&b[1],length:b&&b[2]}};l.findWidthFromSourceSize=function(a){var b=l.trim(a).split(/\\s*,\\s*/),winningLength;for(var i=0,len=b.length;i=0;i--){var e=d[i],lastchar=e&&e.slice(e.length-1);if((lastchar===\"h\"||lastchar===\"w\")&&!l.sizesSupported){resCandidate=parseFloat((parseInt(e,10)/widthInCssPixels))}else if(lastchar===\"x\"){var f=e&&parseFloat(e,10);resCandidate=f&&!isNaN(f)?f:1}}}return resCandidate||1};l.getCandidatesFromSourceSet=function(a,b){var c=l.parseSrcset(a),formattedCandidates=[];for(var i=0,len=c.length;i=l.getDpr()){bestCandidate=c;break}}if(bestCandidate){bestCandidate.url=l.makeUrl(bestCandidate.url);if(b.src!==bestCandidate.url){if(l.restrictsMixedContent()&&bestCandidate.url.substr(0,\"http:\".length).toLowerCase()===\"http:\"){if(window.console!==undefined){console.warn(\"Blocked mixed content image \"+bestCandidate.url)}}else{b.src=bestCandidate.url;if(!l.curSrcSupported){b.currentSrc=b.src}l.backfaceVisibilityFix(b)}}l.setIntrinsicSize(b,bestCandidate)}};l.ascendingSort=function(a,b){return a.resolution-b.resolution};l.removeVideoShim=function(a){var b=a.getElementsByTagName(\"video\");if(b.length){var c=b[0],vsources=c.getElementsByTagName(\"source\");while(vsources.length){a.insertBefore(vsources[0],c)}c.parentNode.removeChild(c)}};l.getAllElements=function(){var a=[],imgs=g.getElementsByTagName(\"img\");for(var h=0,len=imgs.length;h 1) ? results[1].trim() : \"\";\r\n },\r\n set: function(value) {}\r\n });\r\n }\r\n\r\n $.getQueryString = function() {\r\n var result = {};\r\n \r\n var tokenizedUrl = decodeURIComponent(window.location.href.split(\"#\")[0]).split(\"?\");\r\n var queryString = tokenizedUrl[tokenizedUrl.length - 1];\r\n var re = /([^&=]+)=([^&]*)/g;\r\n var m;\r\n\r\n //HACK -- Filters can totally have ampersands in them. This makes the regex above cry, so we temporarily replace filter ampersands with a series of underscores\r\n if (queryString.indexOf(\"filters\")!== -1) {\r\n var original = queryString.split(\"filters\")[1].split('}')[0];\r\n var replaced = original.replace(\"&\", \"___\");\r\n queryString = queryString.replace(original, replaced);\r\n }\r\n \r\n // HACK -- For vanity URLs we populate a script variable with the expected querystring\r\n if (typeof window.originalQueryString !== \"undefined\") {\r\n while (m = re.exec(window.originalQueryString)) {\r\n result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]).replace(/\\+/g, \" \");\r\n }\r\n }\r\n // Override with real querystrings\r\n while (m = re.exec(queryString)) {\r\n //Replace those \r\n var originalComponent = decodeURIComponent(m[2]);\r\n var replacedComponent = originalComponent.replace(\"___\", \"&\");\r\n result[decodeURIComponent(m[1])] = replacedComponent;\r\n }\r\n return result;\r\n };\r\n\r\n var toSlug = function(text) {\r\n text = (!text) ? \"\" : text;\r\n text = text.toString()\r\n .replace(/\\s+/g, \"-\") // Replace spaces with -\r\n .replace(/[^\\w\\-]+/g, \"\") // Remove all non-word chars\r\n .replace(/[_\\s]+/g, \"-\")\r\n .replace(/([A-Z])/g, \"-$1\")\r\n .replace(/\\-\\-+/g, \"-\") // Replace multiple - with single -\r\n .replace(/^-+/, \"\") // Trim - from start of text\r\n .replace(/-+$/, \"\").toLowerCase();\r\n return text;\r\n };\r\n\r\n $.getQueryStringValue = function(key) {\r\n if (key === undefined) {\r\n return;\r\n }\r\n var result = {};\r\n var tokenizedUrl = decodeURIComponent(window.location.href.split(\"#\")[0]).split(\"?\");\r\n var queryString = tokenizedUrl[tokenizedUrl.length - 1];\r\n var re = /([^&=]+)=([^&]*)/g;\r\n var m;\r\n //HACK -- For vanity URLs we populate a script variable with the expected querystring\r\n if (typeof window.originalQueryString !== \"undefined\") {\r\n while (m = re.exec(window.originalQueryString)) {\r\n result[m[1].toLowerCase()] = m[2];\r\n }\r\n }\r\n while (m = re.exec(queryString)) {\r\n result[decodeURIComponent(m[1].toLowerCase())] = decodeURIComponent(m[2]);\r\n }\r\n return result[key.toLowerCase()];\r\n };\r\n\r\n //http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript\r\n $.getQueryStringWithVanillaBehavior = function () {\r\n var a = window.location.search.substr(1).split('&');\r\n if (a == \"\") return {};\r\n var b = {};\r\n for (var i = 0; i < a.length; ++i)\r\n {\r\n var p=a[i].split('=', 2);\r\n if (p.length == 1)\r\n b[p[0]] = \"\";\r\n else\r\n b[p[0]] = decodeURIComponent(p[1].replace(/\\+/g, \" \"));\r\n }\r\n return b;\r\n };\r\n\r\n $.tryParseInt = function(str, defaultValue) {\r\n var retValue = defaultValue;\r\n if (str !== null && str !== undefined) {\r\n if (str.length > 0) {\r\n if (!isNaN(str)) {\r\n retValue = parseInt(str, 10);\r\n }\r\n }\r\n }\r\n return retValue;\r\n };\r\n\r\n String.prototype.isInt = function() {\r\n var value = this.valueOf().replace(/,/, \"\");\r\n return !isNaN(parseFloat(value)) && isFinite(value);\r\n };\r\n\r\n var jq_throttle;\r\n\r\n $.throttle = jq_throttle = function(delay, no_trailing, callback, debounce_mode) {\r\n\r\n // After wrapper has stopped being called, this timeout ensures that\r\n // `callback` is executed at the proper times in `throttle` and `end`\r\n // debounce modes.\r\n var timeout_id;\r\n\r\n // Keep track of the last time `callback` was executed.\r\n var last_exec = 0;\r\n\r\n // `no_trailing` defaults to falsy.\r\n if (typeof no_trailing !== \"boolean\") {\r\n debounce_mode = callback;\r\n callback = no_trailing;\r\n no_trailing = undefined;\r\n }\r\n\r\n // The `wrapper` function encapsulates all of the throttling / debouncing\r\n // functionality and when executed will limit the rate at which `callback`\r\n // is executed.\r\n var wrapper = function() {\r\n var self = this;\r\n var elapsed = +new Date() - last_exec;\r\n var args = arguments;\r\n\r\n // Execute `callback` and update the `last_exec` timestamp.\r\n function exec() {\r\n last_exec = +new Date();\r\n callback.apply(self, args);\r\n }\r\n\r\n // If `debounce_mode` is true(at_begin) this is used to clear the flag\r\n // to allow future `callback` executions.\r\n function clear() {\r\n timeout_id = undefined;\r\n }\r\n\r\n if (debounce_mode && !timeout_id) {\r\n // Since `wrapper` is being called for the first time and\r\n // `debounce_mode` is true(at_begin), execute `callback`.\r\n exec();\r\n }\r\n\r\n // Clear any existing timeout.\r\n timeout_id && clearTimeout(timeout_id);\r\n\r\n if (debounce_mode === undefined && elapsed > delay) {\r\n // In throttle mode, if `delay` time has been exceeded, execute\r\n // `callback`.\r\n exec();\r\n\r\n } else if (no_trailing !== true) {\r\n // In trailing throttle mode, since `delay` time has not been\r\n // exceeded, schedule `callback` to execute `delay` ms after most\r\n // recent execution.\r\n //\r\n // If `debounce_mode` is true(at_begin), schedule `clear` to execute\r\n // after `delay` ms.\r\n //\r\n // If `debounce_mode` is false(at end), schedule `callback` to\r\n // execute after `delay` ms.\r\n timeout_id = setTimeout(debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay);\r\n }\r\n };\r\n\r\n // Set the guid of `wrapper` function to the same of original callback, so\r\n // it can be removed in jQuery 1.4+ .unbind or .die by using the original\r\n // callback as a reference.\r\n if ($.guid) {\r\n wrapper.guid = callback.guid = callback.guid || $.guid++;\r\n }\r\n\r\n // Return the wrapper function.\r\n return wrapper;\r\n };\r\n\r\n $.debounce = function(delay, at_begin, callback) {\r\n return callback === undefined ?\r\n jq_throttle(delay, at_begin, false) :\r\n jq_throttle(delay, callback, at_begin !== false);\r\n };\r\n\r\n function isValidEmail(email) {\r\n var re = /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i;\r\n return re.test(email);\r\n }\r\n\r\n var isBound = function(element) {\r\n return !!ko.dataFor(element);\r\n };\r\n\r\n return {\r\n getQueryParams : getQueryParams,\r\n toSlug: toSlug,\r\n urlExists : urlExists,\r\n isValidEmail: isValidEmail,\r\n isBound: isBound\r\n };\r\n\r\n});\r\n","define([\r\n \"global-config\",\r\n \"page-context-javascript\",\r\n \"underscore\",\r\n \"knockout\",\r\n \"jquery\",\r\n \"postal\",\r\n \"ssm\",\r\n \"es6-promise\",\r\n \"js-cookie\",\r\n \"scroll-to-section\",\r\n \"react-dom\",\r\n \"../react/estimateBuilder/components/EstimateBanner\",\r\n \"react\",\r\n \"right-rails-fly-out-menu\",\r\n \"colorbox\",\r\n \"sticky-kit\",\r\n \"slick\",\r\n \"unveil\",\r\n \"jquery-validate\"\r\n], function(\r\n globalConfig,\r\n pageContextJavascript,\r\n _,\r\n ko,\r\n $,\r\n postal,\r\n ssm,\r\n promise,\r\n Cookies,\r\n scrollToSection,\r\n ReactDOM,\r\n estimateBanner,\r\n React\r\n) {\r\n \"use strict\";\r\n promise.polyfill();\r\n const EstimateBanner = estimateBanner.default;\r\n\r\n const estimateBannerRoot = document.getElementById(\"estimate-banner-root\");\r\n\r\n if (estimateBannerRoot) {\r\n ReactDOM.render(\r\n ,\r\n estimateBannerRoot\r\n );\r\n }\r\n\r\n // Configures SimpleStateManager States\r\n (function(ssm) {\r\n var ObservableState = function(id, query) {\r\n var self = this;\r\n self.id = id;\r\n self.query = query;\r\n self.observableIsActive = ko.observable(false);\r\n self.onEnter = function() {\r\n self.observableIsActive(true);\r\n };\r\n self.onLeave = function() {\r\n self.observableIsActive(false);\r\n };\r\n };\r\n\r\n ssm.addState(new ObservableState(\"mobile\", \"(max-width: 767px)\"));\r\n ssm.addState(new ObservableState(\"tablet\", \"(min-device-width: 768px)\"));\r\n ssm.addState(new ObservableState(\"desktop\", \"(min-device-width: 1024px)\"));\r\n ssm.addState(\r\n new ObservableState(\r\n \"tablet-only\",\r\n \"(min-device-width: 768px) and (max-device-width: 1024px)\"\r\n )\r\n );\r\n })(ssm);\r\n\r\n var globals = {\r\n alert: function() {\r\n return window ? window.alert : {};\r\n },\r\n breakpoint: {},\r\n ssm: ssm,\r\n dictionaryEntryForTerm:\r\n \"/DictionaryManagement/Definition/DictionaryEntryForTerm\",\r\n setBodyOverlay: function(bodyOverlay) {\r\n if (bodyOverlay) {\r\n $(\"body\").addClass(\"bdc-remove-body-scrolling\");\r\n } else {\r\n $(\"body\").removeClass(\"bdc-remove-body-scrolling\");\r\n }\r\n }\r\n };\r\n\r\n _.extend(globals, window.globalConfig);\r\n _.extend(globals, pageContextJavascript);\r\n\r\n globals.breakpoint.refreshValue = function() {\r\n this.value = window\r\n .getComputedStyle(document.querySelector(\"body\"), \":before\")\r\n .getPropertyValue(\"content\")\r\n .replace(/\\\"/g, \"\");\r\n };\r\n globals.breakpoint.refreshValue();\r\n\r\n window.addEventListener(\"resize\", function(e) {\r\n globals.breakpoint.refreshValue();\r\n });\r\n\r\n window.addEventListener(\"orientationchange\", function() {\r\n globals.breakpoint.refreshValue();\r\n });\r\n\r\n // Browser specific JavaScript\r\n var userAgent = window.navigator.userAgent;\r\n var isIE =\r\n userAgent &&\r\n (userAgent.indexOf(\"MSIE \") > 0 || userAgent.indexOf(\"Trident/\") > 0);\r\n var isIE10 = document.all && window.atob;\r\n var isIE9 = document.all && document.addEventListener && !window.atob;\r\n if (isIE) {\r\n $(\"html\").addClass(\"ie\");\r\n if (isIE9) {\r\n require([\"ie9-only\"]);\r\n } else if (isIE10) {\r\n $(\"html\").addClass(\"ie10\");\r\n require([\"ie10-only\"]);\r\n }\r\n }\r\n globals.isIOS =\r\n /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\r\n globals.isIE9 = isIE9;\r\n\r\n //exposed globally for infopages\r\n window.globals = globals;\r\n window.Cookies = Cookies;\r\n window.scrollToSection = scrollToSection;\r\n //503 means we are under construction\r\n var readCookie = function(name, c, C, i) {\r\n c = document.cookie.split(\"; \");\r\n var cookies = {};\r\n for (i = c.length - 1; i >= 0; i--) {\r\n C = c[i].split(\"=\");\r\n cookies[C[0]] = C[1];\r\n }\r\n return cookies[name];\r\n };\r\n $.ajaxSetup({\r\n beforeSend: function(request, settings) {\r\n var blindsCookie = readCookie(\"internalUser\");\r\n //Look to see if the request is mentioned in the _cacheCheck list on the page\r\n if (globals.cacheCheck !== undefined) {\r\n var hasCheck = _.filter(globals.cacheCheck, function(url) {\r\n return settings.url.toLowerCase().indexOf(url.toLowerCase()) !== -1;\r\n });\r\n //If so, we send a request header for akamai to say it should not cache this response\r\n if (hasCheck.length > 0) {\r\n if (blindsCookie !== undefined) {\r\n request.setRequestHeader(\"x-blinds-internal\", \"true\");\r\n }\r\n }\r\n }\r\n },\r\n error: function(xhr, textStatus, errorThrown) {\r\n if (xhr.status === 503) {\r\n var newDoc = document.open(\"text/html\", \"replace\");\r\n newDoc.write(xhr.responseText);\r\n newDoc.close();\r\n }\r\n }\r\n });\r\n\r\n $(function() {\r\n if (globals.siteId === 3) {\r\n $(document).on('click', 'a[href*=\"/surefit\"]', function(event) {\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n let output = '';\r\n const {\r\n globalConfig: { prismicApi },\r\n } = window;\r\n $.ajax({ url: prismicApi }).then(function(val) {\r\n var ref = val.refs[0].ref;\r\n $.ajax({\r\n url: `${prismicApi}/documents/search?ref=${ref}&q=[[at(my.contentpage.uid, \"surefit-guarantee-to-fit\")]]`\r\n }).then(function(surefitObj) {\r\n surefitObj.results[0].data.body[0].items[0].article.forEach(function (obj, index) {\r\n if (obj.type === 'paragraph') {\r\n output += `

${obj.text}

`;\r\n } else if (obj.type === 'list-item') {\r\n if (surefitObj.results[0].data.body[0].items[0].article[index - 1].type !== 'list-item') {\r\n output += '
    ';\r\n }\r\n output += `
  • ${obj.text}
  • `;\r\n if (surefitObj.results[0].data.body[0].items[0].article[index + 1] &&\r\n surefitObj.results[0].data.body[0].items[0].article[index + 1].type !== 'list-item'\r\n ) {\r\n output += '
';\r\n }\r\n }\r\n });\r\n var surefitContent = ' \\\r\n
\\\r\n
\\\r\n
\\\r\n

' + surefitObj.results[0].data.page_h1[0].text + '

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

' + surefitObj.results[0].data.hero_h2_subtitle[0].text + '

\\\r\n ' + output + ' \\\r\n
\\\r\n
';\r\n $.colorbox({\r\n html: surefitContent,\r\n transition: \"none\",\r\n width: '600px',\r\n maxWidth: '95%',\r\n maxHeight: '95%',\r\n });\r\n });\r\n });\r\n });\r\n }\r\n });\r\n\r\n // Prevents scrolling of page when any modal (colorbox) is open\r\n $(document)\r\n .on(\"cbox_open\", function(event, myName) {\r\n $(\"body\").css({\r\n overflow: \"hidden\"\r\n });\r\n })\r\n .on(\"cbox_closed\", function(event, myName) {\r\n $(\"body\").css({\r\n overflow: \"\"\r\n });\r\n });\r\n\r\n (function() {\r\n if (\r\n \"-ms-user-select\" in document.documentElement.style &&\r\n navigator.userAgent.match(/iemobile/i) === true\r\n ) {\r\n var msViewportStyle = document.createElement(\"style\");\r\n msViewportStyle.appendChild(\r\n document.createTextNode(\"@-ms-viewport{width:auto!important}\")\r\n );\r\n document.getElementsByTagName(\"head\")[0].appendChild(msViewportStyle);\r\n }\r\n })();\r\n return globals;\r\n});\r\n","import globals from 'globals';\r\nimport $ from 'jquery';\r\nimport ko from 'knockout';\r\nimport ProductViewModel from 'product-view-model';\r\nimport ProductChoiceSelectorViewModel from 'product-choice-selector-view-model';\r\nimport ProductSampleCart from 'product-sample-cart';\r\nimport VisualizerViewModel from 'visualizer-view-model';\r\nimport 'pricing-support';\r\nimport 'dictionary';\r\nimport 'slick';\r\nimport 'sticky-kit';\r\nimport 'binding-handlers';\r\nimport 'visibility';\r\nimport 'scroll-to';\r\nimport 'tappy';\r\nimport 'visualizerImage';\r\nimport 'color-swatch-preview';\r\nimport 'picturefill';\r\n\r\n$(function () {\r\n\r\n var productViewModel = new ProductViewModel();\r\n productViewModel.init();\r\n\r\n if (![1, 2].includes(pageContextJavascript.siteId)) {\r\n var visualizerViewModel = new VisualizerViewModel(globals.productId, globals.visualizedOptions);\r\n ko.applyBindings(visualizerViewModel, $('.bdc-visualizer')[0]);\r\n }\r\n\r\n var selector = new ProductChoiceSelectorViewModel(globals.productId, productViewModel);\r\n selector.init();\r\n\r\n var cart = new ProductSampleCart();\r\n cart.init();\r\n\r\n productViewModel.loadReviews();\r\n\r\n const stickOffset = globals.stickOffset || {\r\n tablet: 135,\r\n desktop: 30\r\n };\r\n\r\n // American Blinds\r\n if (pageContextJavascript.siteId === 1) {\r\n import(/* webpackChunkName: 'ab_pip' */ '../../../../javascript/ab/pages/pip');\r\n }\r\n\r\n const initializeProductPreviewMicroApp = () => {\r\n if (typeof window !== 'undefined') {\r\n $.when(\r\n $.get('/ordering/cart/getsamplecart'),\r\n $.ajax({url: `/api/promotions/${globals.siteId}/${globals.productId}`})\r\n )\r\n .then(function(samplesResponse, promoResponse) {\r\n\r\n const promotionalData = promoResponse.filter(item => item.stackablePercentOff ? item.stackablePercentOff : 0);\r\n\r\n const samplesData = samplesResponse.filter(item => item.Data);\r\n const { OriginalPrice, Percentage, PromoSnippet } = globals.models.strikethroughPrice;\r\n const price = {\r\n originalPrice: OriginalPrice,\r\n percentOff: Percentage,\r\n promoDescription: PromoSnippet,\r\n stackablePercentage: promotionalData.map((promo) => promo.stackablePercentOff ? promo.stackablePercentOff : 0),\r\n };\r\n\r\n const localVisModel = JSON.parse(localStorage.getItem('product-preview'));\r\n const detail = {\r\n ...localVisModel,\r\n price,\r\n siteId: globals.siteId,\r\n productId: globals.productId,\r\n variantId: globals.variantId,\r\n samplesInCart: samplesData[0].Data.map((sample) => sample.ChoiceId).length,\r\n isMandi: globals.isMandi ? true : false,\r\n };\r\n\r\n localStorage.setItem('product-preview', JSON.stringify(detail));\r\n\r\n const productPreview = document.getElementById('product-preview-ma-container');\r\n if (productPreview) {\r\n import(/* webpackChunkName: \"productPreview\" */ '../../../../javascript/_shared/micro-apps/product-preview').then(\r\n ({ default: ProductPreview }) => {\r\n ReactDOM.render(, productPreview);\r\n }\r\n );\r\n }\r\n })\r\n .fail(function(err) {\r\n console.log('Something went wrong', err);\r\n });\r\n }\r\n }\r\n\r\n if ([1, 2].includes(pageContextJavascript.siteId)) {\r\n initializeProductPreviewMicroApp();\r\n }\r\n});\r\n","define([\r\n \"globals\",\r\n \"base-view-model\",\r\n \"jquery\",\r\n \"knockout\",\r\n \"underscore\",\r\n \"postal\",\r\n \"product-option-view-model\",\r\n \"local-storage\",\r\n \"knockout-postbox\",\r\n \"visualizer\"],\r\nfunction(globals, baseViewModel, $, ko, _, postal, ProductOptionViewModel, LocalStorage) {\r\n\r\n function ProductChoiceSelectorViewModel(productId, siteProduct) {\r\n\r\n var self = this;\r\n ko.utils.extend(self, baseViewModel);\r\n\r\n self.blankColor = { name: ko.observable(\"\"), image: ko.observable(\"\"), selected: ko.observable(false) };\r\n self.selectedPrimaryColorName = ko.observable(\"\");\r\n self.selectedPrimaryColorImage = ko.observable(\"\");\r\n self.selectedPrimaryColorSelected = ko.observable(false);\r\n self.selectedSecondaryColorName = ko.observable(\"\");\r\n self.selectedSecondaryColorImage = ko.observable(\"\");\r\n self.selectedSecondaryColorSelected = ko.observable(false);\r\n self.selectedColorSwatches = ko.observable();\r\n self.isColorSelected = ko.observable();\r\n self.displayColor = ko.observable( false );\r\n self.options = ko.observableArray();\r\n self.siteProduct = siteProduct;\r\n self.colorSelectorPrice = ko.observable(globals.price).subscribeTo(\"colorSelectorPrice\");\r\n self.shouldShowFullSecondarySwatch = ko.observable(false);\r\n\r\n self.hasStrikethroughPricing = ko.computed(function() {\r\n return siteProduct.pricingSubmodel().discountPrice().toFixed(2) !==\r\n siteProduct.pricingSubmodel().originalPrice().toFixed(2);\r\n })\r\n self.strikethroughMessage = ko.observable(globals.models.strikethroughPrice.Message).subscribeTo(\"strikethroughMessage\");\r\n self.promoSnippet = ko.observable(globals.models.strikethroughPrice.PromoSnippet);\r\n\r\n this.optionsLoaded = ko.observable(false);\r\n this.productId = productId;\r\n self.widthOption = globals.models.widthOption;\r\n self.heightOption = globals.models.heightOption;\r\n self.width = undefined;\r\n self.height = undefined;\r\n\r\n self.logMouseOver = function ( data ) {\r\n console.log(data);\r\n }\r\n\r\n var productPageChannel = postal.channel(\"productpage\");\r\n var localPersistance = new LocalStorage();\r\n\r\n // LOCAL FUNCTIONS\r\n var getSelectedChoices = function() {\r\n var choices = [];\r\n $.each(self.options(), function(indexA, productOption) {\r\n $.each(productOption.groups(), function(indexB, group) {\r\n $.each(group.choices, function(indexC, choice) {\r\n if (choice.selected()) choices.push(choice);\r\n });\r\n });\r\n });\r\n return choices;\r\n };\r\n\r\n var updateEditState = function() {\r\n var simpleSelectedChoices = [];\r\n $.each(getSelectedChoices(), function(index, choice) {\r\n simpleSelectedChoices.push({\r\n id: choice.id,\r\n optionId: choice.optionId\r\n });\r\n });\r\n\r\n if (simpleSelectedChoices.length === 0) {\r\n localPersistance.remove(\"option-state-\" + productId);\r\n productPageChannel.publish(\"updatePrice\");\r\n } else {\r\n var saveData = ko.toJSON(simpleSelectedChoices);\r\n localPersistance.persist(\"option-state-\" + productId, saveData);\r\n productPageChannel.publish(\"updatePrice\");\r\n }\r\n };\r\n\r\n var load = function() {\r\n\r\n var sampleableOptions = globals.models.sampleOptions;\r\n if (sampleableOptions) {\r\n var siteProductOptions = [];\r\n _.each(sampleableOptions.Options, function(option) {\r\n var siteProductOption = new ProductOptionViewModel(option, globals);\r\n siteProductOptions.push(siteProductOption);\r\n });\r\n self.options.push.apply(self.options, siteProductOptions);\r\n self.optionsLoaded(true);\r\n ko.applyBindings(self, $(\".bdc-product-status\")[0]);\r\n ko.applyBindings(self, $(\".bdc-product-options-list\")[0]);\r\n //ko.applyBindings(self, $(\"\")[0]);\r\n }\r\n\r\n // get the color from the url\r\n var preSelectedColorId = $.getQueryStringValue(\"color\");\r\n // find the option where the color belongs in the current collection\r\n var option = preSelectedColorId && _.find(self.options(), function(option) {\r\n return _.find(option.groups(), function(group) {\r\n return _.find(group.choices, function(choice) {\r\n return choice.id === +preSelectedColorId;\r\n });\r\n });\r\n });\r\n\r\n if (preSelectedColorId) {\r\n var selectedChoices = [];\r\n if (option) {\r\n selectedChoices.push({id:+preSelectedColorId, optionId:option.id});\r\n }\r\n\r\n _.each(selectedChoices, function (selected) {\r\n var selectedOption = _.find(self.options(), function (currentOption) {\r\n return currentOption.id === selected.optionId;\r\n });\r\n\r\n if (selectedOption) {\r\n productPageChannel.publish(\"selection.changed\", selected);\r\n productPageChannel.publish(\"after.selection.change\", option);\r\n }\r\n });\r\n }\r\n\r\n if (siteProduct && siteProduct.pricingSubmodel) {\r\n siteProduct.pricingSubmodel().publishDimensionsChangedEvent();\r\n }\r\n self.UpdateProductPreviewMicroApp();\r\n };\r\n\r\n var flagUnavailableChoices = function(response) {\r\n\r\n _.each(this.options(), function(option) {\r\n _.each(option.groups(), function(group) {\r\n _.each(group.choices, function(choice) {\r\n choice.isUnavailableInSize(false);\r\n });\r\n });\r\n });\r\n\r\n _.each(response.Data, function(unavailableChoices) {\r\n\r\n var currentOption = _.find(this.options(), function(option) {\r\n // TODO: Check if option.id() could arrive here as an observable. If not, use only option.id\r\n var optionId = typeof option.id === \"number\" ? option.id : option.id();\r\n return optionId === unavailableChoices.OptionId;\r\n });\r\n\r\n _.each(unavailableChoices.ChoiceIds, function(choiceId) {\r\n var unavailableChoice;\r\n if (currentOption) {\r\n _.each(currentOption.groups(), function(group) {\r\n unavailableChoice = _.find(group.choices, function(choice) {\r\n return choice.id === choiceId;\r\n });\r\n if (unavailableChoice) {\r\n unavailableChoice.isUnavailableInSize(true);\r\n if (unavailableChoice.selected()) unavailableChoice.toggleSelected();\r\n }\r\n }, this);\r\n }\r\n }, this);\r\n }, this);\r\n };\r\n\r\n var getUnavailableChoices = function(data) {\r\n self.width = data.width;\r\n self.height = data.height;\r\n self.UpdateProductPreviewMicroApp();\r\n\r\n $.ajax({\r\n type: \"GET\",\r\n url: globals.paths.unavailableChoices,\r\n data: {\r\n context: ko.toJSON(data.pricingContext)\r\n },\r\n context: this\r\n }).done(flagUnavailableChoices);\r\n };\r\n\r\n // GLOBAL FUNCTIONS\r\n self.displayColorSelectorPrice = ko.computed(function() {\r\n return self.optionsLoaded() && self.siteProduct.pricingSubmodel() && self.siteProduct.pricingSubmodel().price();\r\n });\r\n\r\n this.getSelectedChoiceByType = function(requestedType) {\r\n var selectedChoice;\r\n $.each(self.options(), function(indexA, productOption) {\r\n if (productOption.type === requestedType) {\r\n $.each(productOption.groups(), function(indexB, group) {\r\n $.each(group.choices, function(indexC, choice) {\r\n if (choice.selected()) {\r\n selectedChoice = choice;\r\n return selectedChoice;\r\n }\r\n });\r\n });\r\n }\r\n });\r\n return selectedChoice;\r\n };\r\n\r\n this.UpdateProductPreviewMicroApp = function() {\r\n const selectedOptions = [];\r\n // Get all options with their selected choices\r\n $.each(self.options(), function(indexA, productOption) {\r\n $.each(productOption.groups(), function(indexB, group) {\r\n $.each(group.choices, function(indexC, choice) {\r\n if (choice.selected()) {\r\n selectedOptions.push({\r\n choiceId: choice.choiceid,\r\n choiceName: choice.name,\r\n optionId: productOption.optionid,\r\n type: productOption.type,\r\n mediaUrl: choice.image,\r\n });\r\n }\r\n });\r\n });\r\n });\r\n\r\n // Width\r\n if (self.widthOption && self.width) {\r\n selectedOptions.push({\r\n choiceId: self.widthOption.ChoiceId,\r\n optionId: self.widthOption.OptionId,\r\n type: \"Width\",\r\n choiceValue: self.width.dimension.value()\r\n });\r\n }\r\n\r\n // Height\r\n if (self.heightOption && self.height) {\r\n selectedOptions.push({\r\n choiceId: self.heightOption.ChoiceId,\r\n optionId: self.heightOption.OptionId,\r\n type: \"Height\",\r\n choiceValue: self.height.dimension.value()\r\n });\r\n }\r\n\r\n const detail = {\r\n selectedOptions,\r\n };\r\n\r\n // Keep local storage up to date\r\n // Load almost never happens before this fires with defaults.\r\n var localVisModel = JSON.parse(localStorage.getItem('product-preview'));\r\n localVisModel = {\r\n ...localVisModel,\r\n selectedOptions,\r\n }\r\n localStorage.setItem('product-preview', JSON.stringify(localVisModel));\r\n\r\n window.dispatchEvent(new CustomEvent('product-preview', { bubbles: false, cancelable: true, detail }));\r\n }\r\n\r\n this.init = function() {\r\n return load();\r\n };\r\n\r\n // SUBSCRIPTIONS\r\n productPageChannel.subscribe(\"after.selection.change\", function() {\r\n\r\n updateEditState();\r\n self.displayColor( true );\r\n var selectedPrimaryColor = self.getSelectedChoiceByType( \"Primary Color\" );\r\n var selectedSecondaryColor = self.getSelectedChoiceByType( \"Secondary Color\" );\r\n\r\n self.selectedPrimaryColorName(selectedPrimaryColor ? selectedPrimaryColor.name : \"\");\r\n self.selectedPrimaryColorImage(selectedPrimaryColor ? selectedPrimaryColor.image + \"?mode=crop&width=50&height=50\" : \"\");\r\n self.selectedPrimaryColorSelected(selectedPrimaryColor ? selectedPrimaryColor.selected() : false);\r\n self.selectedSecondaryColorName(selectedSecondaryColor ? selectedSecondaryColor.name : \"\");\r\n self.selectedSecondaryColorImage(selectedSecondaryColor ? selectedSecondaryColor.image + \"?mode=crop&width=50&height=50\" : \"\");\r\n self.selectedSecondaryColorSelected(selectedSecondaryColor ? selectedSecondaryColor.selected() : false);\r\n\r\n self.selectedColorSwatches({ primary: self.selectedPrimaryColorImage(), secondary: self.selectedSecondaryColorImage() });\r\n\r\n if (self.selectedPrimaryColorSelected() === false && self.selectedSecondaryColorSelected() === true) {\r\n self.shouldShowFullSecondarySwatch(true);\r\n } else {\r\n self.shouldShowFullSecondarySwatch(false);\r\n }\r\n\r\n if (self.selectedPrimaryColorSelected() || self.selectedSecondaryColorSelected()) {\r\n self.isColorSelected(true);\r\n } else {\r\n self.isColorSelected(false);\r\n }\r\n self.UpdateProductPreviewMicroApp();\r\n });\r\n\r\n postal.subscribe({\r\n topic: \"dimensions.changed\",\r\n callback: getUnavailableChoices\r\n }).context(this);\r\n\r\n }\r\n\r\n return ProductChoiceSelectorViewModel;\r\n\r\n});\r\n","define([\r\n \"globals\",\r\n \"jquery\",\r\n \"knockout\",\r\n \"js-cookie\",\r\n \"format-money\"],\r\nfunction (globals, $, ko, Cookies) {\r\n\r\n \"use strict\";\r\n\r\n //usage productPrice: field\r\n //if there is a decimal portion, show two decimal places. If not, show 0 decimal places.\r\n ko.bindingHandlers.productPrice = {\r\n update: function(element, valueAccessor) {\r\n var value = ko.utils.unwrapObservable(valueAccessor());\r\n var precision = value !== undefined && value !== null && typeof (value) !== \"string\" && value % 1 === 0 ? 0 : 2;\r\n var formattedValue = value !== undefined && value !== null && typeof (value) !== \"string\" ? value.toFixed(precision) : value;\r\n ko.bindingHandlers.text.update(element, function() {\r\n return formattedValue;\r\n });\r\n },\r\n defaultPrecision: 1\r\n };\r\n\r\n var Dimension = function (minDimension, maxDimension, defaultDimension, queryStringKey, cookieName) {\r\n var self = this;\r\n\r\n self.minDimension = minDimension;\r\n self.maxDimension = maxDimension;\r\n self.serializableValue = undefined;\r\n self.value = ko.observable();\r\n\r\n self.value.subscribe( function ( newValue ) {\r\n self.serializableValue = newValue;\r\n } );\r\n\r\n var constrainValue = function ( newValue ) {\r\n if (newValue < minDimension) { return minDimension; }\r\n if (newValue > maxDimension) { return maxDimension; }\r\n return newValue;\r\n };\r\n\r\n function persist() {\r\n if (cookieName) {\r\n Cookies.set(cookieName, self.value());\r\n }\r\n };\r\n\r\n var initialDimension = cookieName ? Cookies.get(cookieName) : undefined;\r\n var queryDimension = $.getQueryStringValue( queryStringKey );\r\n\r\n // If not from querystring, the merchandising page might have something to say about it\r\n if ( ( !queryDimension || isNaN( queryDimension ) ) &&\r\n window.initialSearchState !== undefined ) {\r\n queryDimension = window.initialSearchState[queryStringKey];\r\n }\r\n\r\n // Either the querystring or the initialSearchState gave us something. Better constrain it to make sure it's valid and update our cookie\r\n if ( queryDimension !== undefined && !isNaN( queryDimension ) && queryDimension != \"\" ) {\r\n queryDimension = constrainValue( parseFloat(queryDimension) );\r\n self.value( queryDimension );\r\n\r\n } else {\r\n var initialDimension = initialDimension === undefined || initialDimension === 'NaN' ? defaultDimension : initialDimension;\r\n\r\n if ( initialDimension > self.maxDimension ) {\r\n self.value( maxDimension );\r\n } else if ( initialDimension < minDimension ) {\r\n self.value( minDimension );\r\n } else {\r\n self.value( initialDimension );\r\n }\r\n }\r\n\r\n persist();\r\n\r\n self.valueWhole = ko.computed({\r\n read:\r\n function () {\r\n return Math.floor(self.value());\r\n },\r\n write:\r\n function (newValue) {\r\n if (typeof newValue === \"undefined\") return;\r\n\r\n var newValueAsInt = $.tryParseInt(newValue.toString());\r\n if (newValueAsInt === undefined) {\r\n throw \"New value could not be parsed as an int.\";\r\n }\r\n\r\n var newValue = newValueAsInt + (self.valueEighths() / 8);\r\n self.value(newValue);\r\n\r\n persist();\r\n }\r\n });\r\n\r\n self.valueEighths = ko.computed({\r\n read:\r\n function () {\r\n return (self.value() % 1) * 8;\r\n },\r\n write:\r\n function (newValue) {\r\n if (typeof newValue === 'undefined') return;\r\n\r\n var newValueAsInt = $.tryParseInt(newValue.toString());\r\n if (newValueAsInt === undefined) {\r\n throw \"New value could not be parsed as an int.\";\r\n }\r\n if (newValueAsInt < 0 || newValueAsInt > 8) {\r\n throw \"New value must be between 0 and 8.\";\r\n }\r\n\r\n self.value(self.valueWhole() + (newValueAsInt / 8));\r\n\r\n persist();\r\n }\r\n });\r\n\r\n self.valueToString = function () {\r\n\r\n var selectedEighthsDimension = ko.utils.arrayFirst(self.getDimensionsEighths, function (item) {\r\n return self.valueEighths() === item.value;\r\n } );\r\n\r\n if ( selectedEighthsDimension != null)\r\n return self.valueWhole() + ' ' + selectedEighthsDimension.name;\r\n return self.valueWhole() + ' 0/0';\r\n };\r\n\r\n // This function is used to return a list of all whole number values from the minimum dimension to the maximum...use for dropdowns and such.\r\n self.getDimensionsWhole = function () {\r\n var wholeDimensions = [];\r\n for (var width = self.minDimension; width <= self.maxDimension; width++) {\r\n wholeDimensions.push(Math.floor(width));\r\n }\r\n return wholeDimensions;\r\n };\r\n\r\n // This function is used to return a list of all eighth number values from the dimensions...use for dropdowns and such.\r\n self.getDimensionsEighths = [\r\n { name: \"0/0\", value: 0 }, { name: \"1/8\", value: 1 }, { name: \"1/4\", value: 2 },\r\n { name: \"3/8\", value: 3 }, { name: \"1/2\", value: 4 }, { name: \"5/8\", value: 5 },\r\n { name: \"3/4\", value: 6 }, { name: \"7/8\", value: 7 }];\r\n\r\n var setValue = function ( newValue ) {\r\n self.value = newValue;\r\n };\r\n\r\n self.setValueWhole = function ( newValue ) {\r\n\r\n var newValueAsInt = $.tryParseInt( newValue.toString() );\r\n if ( newValueAsInt === undefined ) {\r\n throw \"New value could not be parsed as an int.\";\r\n }\r\n self.serializableValue = newValueAsInt + ( self.valueEighths() / 8 );\r\n self.value = newValueAsInt + ( self.valueEighths() / 8 );\r\n\r\n if (cookieName) {\r\n Cookies.set(cookieName, self.value);\r\n }\r\n };\r\n\r\n self.setValueEighths = function ( newValue ) {\r\n var newValueAsInt = $.tryParseInt( newValue.toString() );\r\n if ( newValueAsInt === undefined ) {\r\n newValueAsInt = self.findDimensionsEighths( newValue );\r\n if ( newValueAsInt === undefined ) {\r\n throw \"New value could not be parsed as an int.\";\r\n }\r\n\r\n }\r\n if ( newValueAsInt < 0 || newValueAsInt > 8 ) {\r\n throw \"New value must be between 1 and 8.\";\r\n }\r\n\r\n setValue( self.valueWhole() + ( newValueAsInt / 8 ) );\r\n\r\n //persist();\r\n };\r\n\r\n\r\n self.type = 'Dimension';\r\n self.setType = function(type) {\r\n self.type = type;\r\n }\r\n\r\n self.getType = function() {\r\n return self.type;\r\n }\r\n\r\n return self;\r\n };\r\n\r\n var WidthDimension = function (minWidth, maxWidth) {\r\n var self = this;\r\n\r\n if (minWidth === undefined) { minWidth = 30; }\r\n if (maxWidth === undefined) { maxWidth = 300; }\r\n self.dimension = new Dimension( minWidth, maxWidth, globals.defaultDimensions.width, \"width\", \"widthz\" );\r\n self.dimension.setType( 'WidthDimension' );\r\n };\r\n\r\n var HeightDimension = function (minHeight, maxHeight) {\r\n var self = this;\r\n\r\n if (minHeight === undefined) { minHeight = 30; }\r\n if (maxHeight === undefined) { maxHeight = 300; }\r\n self.dimension = new Dimension(minHeight, maxHeight, globals.defaultDimensions.height, \"height\", \"hghtz\");\r\n self.dimension.setType( 'HeightDimension' );\r\n };\r\n\r\n var OtherDimension = function (minHeight, maxHeight) {\r\n\r\n var self = this;\r\n self.dimension = new Dimension(minHeight, maxHeight, 0, \"SELECTED_OTHERDIMENSION_STORAGE_KEY\", \"otherdimension\");\r\n };\r\n\r\n return {\r\n Dimension: Dimension,\r\n WidthDimension: WidthDimension,\r\n HeightDimension: HeightDimension,\r\n OtherDimension: OtherDimension\r\n };\r\n\r\n});\r\n","define([\r\n 'jquery',\r\n 'knockout'],\r\n function ($, ko) {\r\n 'use strict';\r\n\r\n function priceTemplate(prefix, price, cents, shouldShowCents, template) {\r\n let prefixText = prefix !== '' ? `${prefix}-` : '';\r\n let ret;\r\n switch (template) {\r\n case 'thd':\r\n ret = `\r\n $\r\n ${price}\r\n ${\r\n shouldShowCents\r\n ? `${cents}`\r\n : ``\r\n }`;\r\n break\r\n case 'plain':\r\n ret = `$${price}${shouldShowCents ? `.${cents}` : ``}`\r\n break;\r\n default:\r\n ret = `$${price}${\r\n shouldShowCents\r\n ? `.${cents}`\r\n : ``\r\n }`;\r\n break;\r\n }\r\n return ret;\r\n }\r\n\r\n ko.bindingHandlers.formatMoney = {\r\n update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n var formatMoneyPrefix = allBindingsAccessor().formatMoneyPrefix || '';\r\n var shouldShowCents = allBindingsAccessor().shouldShowCents === false ? false : true;\r\n const templateType = allBindingsAccessor().templateType;\r\n var formattedValue = ko.utils.unwrapObservable(valueAccessor());\r\n var formatMoneyNATitle = allBindingsAccessor().formatMoneyNATitle || '';\r\n ko.bindingHandlers.html.update(element, function () {\r\n if (formattedValue !== undefined) {\r\n var regexForThousands = /\\B(?=(\\d{3})+(?!\\d))/g;\r\n var isValidNumber = !isNaN(formattedValue) && formattedValue !== '';\r\n var context = bindingContext.$data.isLoadingPrices ?\r\n bindingContext.$data :\r\n (bindingContext.$parent && bindingContext.$parent.isLoadingPrices) ?\r\n bindingContext.$parent :\r\n undefined;\r\n var isLoading = context ? context.isLoadingPrices() : false;\r\n if (isValidNumber || isLoading) {\r\n // Prevents flashing \"N/A\" while loading price\r\n if (isLoading) {\r\n if ($(element).attr('data-current-price') === undefined || $(element).attr('data-current-price') === 'N/A') {\r\n $(element).attr('data-current-price', '0.00');\r\n }\r\n formattedValue = parseFloat($(element).attr(\"data-current-price\"));\r\n }\r\n if (typeof formattedValue === 'string') {\r\n formattedValue = parseFloat(formattedValue);\r\n }\r\n formattedValue = formattedValue.toFixed(2).toString().replace(regexForThousands, ',');\r\n var priceCents = formattedValue.split(\".\");\r\n return priceTemplate(formatMoneyPrefix, priceCents[0], priceCents[1], shouldShowCents, templateType);\r\n } else if (formattedValue === \"\") {\r\n return priceTemplate(formatMoneyPrefix, 0, \"\", shouldShowCents, templateType);\r\n } else {\r\n return `${formattedValue}`;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n });\r\n","// knockout-postbox 0.4.2 | (c) 2013 Ryan Niemeyer | http://www.opensource.org/licenses/mit-license\r\n;(function(factory) {\r\n //CommonJS\r\n if (typeof require === \"function\" && typeof exports === \"object\" && typeof module === \"object\") {\r\n factory(require(\"knockout\"), exports);\r\n //AMD\r\n } else if (typeof define === \"function\" && define.amd) {\r\n define([\"knockout\", \"exports\"], factory);\r\n //normal script tag\r\n } else {\r\n factory(ko, ko.postbox = {});\r\n }\r\n}(function(ko, exports, undefined) {\r\n var disposeTopicSubscription, existingSubscribe;\r\n\r\n //create a global postbox that supports subscribing/publishing\r\n ko.subscribable.call(exports);\r\n\r\n //keep a cache of the latest value and subscribers\r\n exports.topicCache = {};\r\n\r\n //allow customization of the function used to serialize values for the topic cache\r\n exports.serializer = ko.toJSON;\r\n\r\n //wrap notifySubscribers passing topic first and caching latest value\r\n exports.publish = function(topic, value) {\r\n if (topic) {\r\n //keep the value and a serialized version for comparison\r\n exports.topicCache[topic] = {\r\n value: value,\r\n serialized: exports.serializer(value)\r\n };\r\n exports.notifySubscribers(value, topic);\r\n }\r\n };\r\n\r\n //provide a subscribe API for the postbox that takes in the topic as first arg\r\n existingSubscribe = exports.subscribe;\r\n exports.subscribe = function(topic, action, target, initializeWithLatestValue) {\r\n var subscription, current;\r\n\r\n if (topic) {\r\n if (typeof target === \"boolean\") {\r\n initializeWithLatestValue = target;\r\n target = undefined;\r\n }\r\n\r\n subscription = existingSubscribe.call(exports, action, target, topic);\r\n\r\n if (initializeWithLatestValue) {\r\n current = exports.topicCache[topic];\r\n\r\n if (current !== undefined) {\r\n action.call(target, current.value);\r\n }\r\n }\r\n\r\n return subscription;\r\n }\r\n };\r\n\r\n //by default publish when the previous cached value does not equal the new value\r\n exports.defaultComparer = function(newValue, cacheItem) {\r\n return cacheItem && exports.serializer(newValue) === cacheItem.serialized;\r\n };\r\n\r\n //augment observables/computeds with the ability to automatically publish updates on a topic\r\n ko.subscribable.fn.publishOn = function(topic, skipInitialOrEqualityComparer, equalityComparer) {\r\n var skipInitialPublish;\r\n if (topic) {\r\n //allow passing the equalityComparer as the second argument\r\n if (typeof skipInitialOrEqualityComparer === \"function\") {\r\n equalityComparer = skipInitialOrEqualityComparer;\r\n } else {\r\n skipInitialPublish = skipInitialOrEqualityComparer;\r\n }\r\n\r\n equalityComparer = equalityComparer || exports.defaultComparer;\r\n\r\n //remove any existing subs\r\n disposeTopicSubscription.call(this, topic, \"publishOn\");\r\n\r\n //keep a reference to the subscription, so we can stop publishing\r\n this.postboxSubs[topic].publishOn = this.subscribe(function(newValue) {\r\n if (!equalityComparer.call(this, newValue, exports.topicCache[topic])) {\r\n exports.publish(topic, newValue);\r\n }\r\n }, this);\r\n\r\n //do an initial publish\r\n if (!skipInitialPublish) {\r\n exports.publish(topic, this());\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n //handle disposing a subscription used to publish or subscribe to a topic\r\n disposeTopicSubscription = function(topic, type) {\r\n var subs = this.postboxSubs = this.postboxSubs || {};\r\n subs[topic] = subs[topic] || {};\r\n\r\n if (subs[topic][type]) {\r\n subs[topic][type].dispose();\r\n }\r\n };\r\n\r\n //discontinue automatically publishing on a topic\r\n ko.subscribable.fn.stopPublishingOn = function(topic) {\r\n disposeTopicSubscription.call(this, topic, \"publishOn\");\r\n\r\n return this;\r\n };\r\n\r\n //augment observables/computeds to automatically be updated by notifications on a topic\r\n ko.subscribable.fn.subscribeTo = function(topic, initializeWithLatestValueOrTransform, transform) {\r\n var initializeWithLatestValue, current, callback,\r\n self = this;\r\n\r\n //allow passing the filter as the second argument\r\n if (typeof initializeWithLatestValueOrTransform === \"function\") {\r\n transform = initializeWithLatestValueOrTransform;\r\n } else {\r\n initializeWithLatestValue = initializeWithLatestValueOrTransform;\r\n }\r\n\r\n if (topic && ko.isWriteableObservable(this)) {\r\n //remove any existing subs\r\n disposeTopicSubscription.call(this, topic, \"subscribeTo\");\r\n\r\n //if specified, apply a filter function in the subscription\r\n callback = function(newValue) {\r\n self(transform ? transform.call(self, newValue) : newValue);\r\n };\r\n\r\n //keep a reference to the subscription, so we can unsubscribe, if necessary\r\n this.postboxSubs[topic].subscribeTo = exports.subscribe(topic, callback);\r\n\r\n if (initializeWithLatestValue) {\r\n current = exports.topicCache[topic];\r\n\r\n if (current !== undefined) {\r\n callback(current.value);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n //discontinue receiving updates on a topic\r\n ko.subscribable.fn.unsubscribeFrom = function(topic) {\r\n disposeTopicSubscription.call(this, topic, \"subscribeTo\");\r\n\r\n return this;\r\n };\r\n\r\n // both subscribe and publish on the same topic\r\n // -allows the ability to sync an observable/writeable computed/observableArray between view models\r\n // -subscribeTo should really not use a filter function, as it would likely cause infinite recursion\r\n ko.subscribable.fn.syncWith = function(topic, initializeWithLatestValue, skipInitialOrEqualityComparer, equalityComparer) {\r\n this.subscribeTo(topic, initializeWithLatestValue).publishOn(topic, skipInitialOrEqualityComparer, equalityComparer);\r\n\r\n return this;\r\n };\r\n\r\n ko.postbox = exports;\r\n}));\r\n","(function (root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD\r\n define(['underscore'], factory);\r\n } else if (typeof exports === 'object') {\r\n // Node, CommonJS-like\r\n module.exports = factory(require('underscore'));\r\n } else {\r\n // Browser globals (root is window)\r\n root.returnExports = factory(root._);\r\n }\r\n}(this, function (_) {\r\n // methods\r\n var readCookie = function(name, c, C, i) {\r\n c = document.cookie.split(\"; \");\r\n var cookies = {};\r\n for (i = c.length - 1; i >= 0; i--) {\r\n C = c[i].split(\"=\");\r\n cookies[C[0]] = C[1];\r\n }\r\n return cookies[name];\r\n };\r\n\r\n var getCartOnBehalfOf = function() {\r\n var blindsCookie = readCookie(\"CartOnBehalfOf\");\r\n return blindsCookie;\r\n }\r\n\r\n var getDateAsOf = function() {\r\n var blindsCookie = readCookie(\"dateAsOf\");\r\n if (blindsCookie === undefined) {\r\n return undefined;\r\n }\r\n //TODO: remove this entire feature!!!\r\n //var fullDateTime = blindsCookie.substr(0, blindsCookie.indexOf(\"|\"));\r\n // HACK - Spit away the time from the view\r\n return undefined;\r\n };\r\n\r\n var getUsername = function() {\r\n var blindsCookie = readCookie(\"internalUser\");\r\n if (blindsCookie === undefined) {\r\n return undefined;\r\n }\r\n return blindsCookie.substr(0, blindsCookie.indexOf(\":\"));\r\n };\r\n\r\n return {\r\n\r\n addAjaxCacheHeader: function(xhr, settings) {\r\n return addAjaxCacheHeader(xhr, settings);\r\n },\r\n\r\n isInternalUser: function() {\r\n return getUsername() !== undefined;\r\n },\r\n checkInternal: function(callback) {\r\n var name = getUsername();\r\n if (name === undefined) {\r\n callback(false);\r\n return;\r\n }\r\n callback(true);\r\n },\r\n\r\n dateAsOf: function() {\r\n return getDateAsOf();\r\n },\r\n\r\n cartOnBehalfOf: function() {\r\n return getCartOnBehalfOf();\r\n },\r\n\r\n userName: function() {\r\n return getUsername();\r\n },\r\n\r\n userNameWithoutDomainPrefix: function () {\r\n var username = getUsername();\r\n if ( username && username.indexOf( '\\\\' ) > -1 ) {\r\n username = _.last( username.split( '\\\\' ) );\r\n }\r\n return username;\r\n }\r\n };\r\n}));\r\n","/* eslint-disable */\r\nclass Brightcove {\r\n constructor() {}\r\n\r\n baseUrl = '/api/brightcove/videos';\r\n\r\n async getVideosByProductBrand(productBrand) {\r\n const url = `${this.baseUrl}?limit=100&q=product_brand:${productBrand}`;\r\n const response = await fetch(url, {\r\n crossDomain: true,\r\n });\r\n const data = await response.json();\r\n const { count, videos } = data;\r\n\r\n return (count > 0) ? videos : null; \r\n }\r\n\r\n async getVideosByProductId(productId) {\r\n const url = `${this.baseUrl}?limit=100&q=product_id:${productId}`;\r\n const response = await fetch(url, {\r\n crossDomain: true,\r\n });\r\n\r\n const data = await response.json();\r\n const { count, videos } = data;\r\n\r\n return (count > 0) ? videos : null; \r\n }\r\n\r\n async getVideosByTag(tagName) {\r\n const url = `${this.baseUrl}?limit=100&q=tags:${tagName}`;\r\n const response = await fetch(url, {\r\n crossDomain: true,\r\n });\r\n const data = await response.json();\r\n const { count, videos } = data;\r\n\r\n return (count > 0) ? videos : null; \r\n }\r\n\r\n async getVideosByOMSID(omsid) {\r\n const url = `${this.baseUrl}?limit=100&q=omsid:${omsid}`;\r\n const response = await fetch(url, {\r\n crossDomain: true,\r\n });\r\n const data = await response.json();\r\n const { count, videos } = data;\r\n\r\n return (count > 0) ? videos : null; \r\n }\r\n\r\n async getVideoByVideoId(videoId) {\r\n const url = `${this.baseUrl}?limit=100&q=id:${videoId}`;\r\n const response = await fetch(url, {\r\n crossDomain: true,\r\n });\r\n const data = await response.json();\r\n const { count, videos } = data;\r\n\r\n return (count > 0) ? videos : null; \r\n }\r\n}\r\n\r\nexport default Brightcove;\r\n","export const sites = {\r\n americanBlinds: 1,\r\n blindsCa: 2,\r\n blinds: 3,\r\n justBlinds: 5,\r\n theHomeDepot: 11,\r\n};\r\n\r\nexport const itemTypes = {\r\n unknown: 0,\r\n window: 1,\r\n doorLock: 2,\r\n garageDoor: 3,\r\n};\r\n\r\nexport const itemSources = {\r\n unknown: 0,\r\n autobahn: 1,\r\n theHomeDepot: 2,\r\n};\r\n\r\nexport const containerTypes = {\r\n unknown: 0,\r\n room: 1,\r\n garage: 2,\r\n};\r\n\r\n","define([\r\n \"jquery\",\r\n \"knockout\"],\r\nfunction($, ko) {\r\n\r\n \"use strict\";\r\n\r\n ko.bindingHandlers.numeric = {\r\n init: function(element) {\r\n $(element).on(\"keydown\", function(event) {\r\n\r\n // Allow: backspace, delete, tab, escape, and enter\r\n if (event.keyCode === 46 || event.keyCode === 8 || event.keyCode === 9 || event.keyCode === 27 || event.keyCode === 13 ||\r\n // Allow: Ctrl+A\r\n (event.keyCode === 65 && event.ctrlKey === true) ||\r\n // Allow: home, end, left, right\r\n (event.keyCode >= 35 && event.keyCode <= 39) ||\r\n // Allow: command key on Mac\r\n (event.metaKey)) {\r\n\r\n // let it happen, don't do anything\r\n return;\r\n\r\n } else {\r\n // Ensure that it is a number and stop the keypress\r\n if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n});\r\n","define([\r\n 'jquery'],\r\nfunction ($) {\r\n var scrollToSection = function (cssSelector, callback) {\r\n let $container, scrollTop;\r\n const globals = window.globals;\r\n let offset = globals.scrollOffset || 0;\r\n if ($('#gcc-site-container').length > 0) {\r\n let headerHeight = 0;\r\n $container = $('#gcc-site-container');\r\n if (globals.breakpoint.value === 'small' || globals.breakpoint.value === 'medium') {\r\n headerHeight = ($('#gcc-header').outerHeight() + $('#gcc-header-search').outerHeight() + $('#gcc-header-banner').outerHeight());\r\n } else {\r\n headerHeight = ($('#gcc-header').outerHeight() + $('#gcc-header-banner').outerHeight());\r\n }\r\n scrollTop = $(cssSelector).position().top + offset + headerHeight;\r\n } else {\r\n $container = $('html, body');\r\n scrollTop = $(cssSelector).offset().top + offset;\r\n }\r\n $container.animate({\r\n scrollTop: scrollTop\r\n }, 1000, function() {\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n }\r\n return scrollToSection;\r\n});\r\n","define([\r\n \"jquery\",\r\n \"knockout\",\r\n \"globals\"\r\n],\r\nfunction ($, ko, globals) {\r\n\r\n \"use strict\";\r\n\r\n ko.bindingHandlers.visualizer = {\r\n init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n var options = ko.unwrap(valueAccessor());\r\n\r\n var enlarge = $(options.zoomable);\r\n var zoomW = 1.2;\r\n var zoomH = 1.2;\r\n\r\n if (!globals.isIOS) {\r\n $(element).on(\"mouseover\", function(e) {\r\n if (options.url() !== undefined) {\r\n $(\".bdc-visualizer-zoom\").css(\"background-image\", 'url(' + ko.unwrap(options.url) + ')');\r\n var zoomImage = new Image();\r\n zoomImage.onerror = function () {\r\n $(\".bdc-visualizer-zoom-container\").hide();\r\n };\r\n\r\n zoomImage.onload = function () {\r\n if (options.url() !== undefined && $($(this)[0]).data(\"visualizerZoom\",\"true\")) {\r\n $(options.zoomableContainer).fadeIn(\"fast\");\r\n }\r\n };\r\n zoomImage.src = ko.unwrap(options.url);\r\n }\r\n });\r\n\r\n $(element).on(\"mousemove\", function(e) {\r\n if (options.url() !== undefined) {\r\n var offset = $(this).offset();\r\n var posleft = offset.left - e.pageX;\r\n var postop = offset.top - e.pageY;\r\n postop += 0;\r\n $(enlarge).css(\"background-position\", ( ( posleft ) * zoomW + 30 ) + \"px \" + ( ( postop ) * zoomH + 30 ) + \"px\");\r\n $(enlarge).css(\"background-image\", \"url(\" + options.url() + \")\");\r\n }\r\n \r\n });\r\n\r\n $(element).on(\"mouseout\", function(e) {\r\n if (options.url() !== undefined) {\r\n $(options.zoomableContainer).fadeOut(\"fast\");\r\n }\r\n });\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n});\r\n","define(function () {\r\n return {};\r\n});\r\n","define( function () {\r\n return window.pageContextJavascript;\r\n} );\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst EstimateBanner = ({ location, data }) => {\r\n if (!location || !data) return null;\r\n if (location.pathname.toLowerCase().indexOf('estimatebuilder') !== -1) return null;\r\n\r\n const { action, estimateName } = JSON.parse(data);\r\n const editText = action === 'edit' ? 'editing' : 'adding to';\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nEstimateBanner.propTypes = {\r\n location: PropTypes.shape({}).isRequired,\r\n data: PropTypes.string,\r\n};\r\n\r\nEstimateBanner.defaultProps = {\r\n data: undefined,\r\n};\r\n\r\nexport default EstimateBanner;\r\n","define( [\r\n \"jquery\",\r\n \"cookies-factory\"],\r\n function ( $,cookiesFactory ) {\r\n \r\n if ( cookiesFactory.isInternalUser() ) {\r\n // hide the right rails layout menu \r\n $( \".bdc-rrf\" ).hide();\r\n $( \".slider-icons\" ).hide();\r\n }\r\n\r\n } );","import Localizer from 'thdlocalizer';\r\n\r\ndefine(\r\n ['knockout', 'jquery'],\r\n function (ko, $) {\r\n\r\n var integrationConfig = {};\r\n\r\n var isNumber = function (value) {\r\n return !isNaN(value) &&\r\n isFinite(value) &&\r\n Math.floor(value) === value;\r\n };\r\n\r\n var getCookie = function (name) {\r\n var cookieName = name + \"=\";\r\n\r\n var cookieCollection = document.cookie.split(';');\r\n\r\n for (var i = 0; i < cookieCollection.length; i++) {\r\n var cookie = cookieCollection[i];\r\n if (cookie.lastIndexOf(cookieName) > -1)\r\n return cookie.replace(cookieName, \"\").trim();\r\n }\r\n\r\n return null;\r\n };\r\n\r\n var getValueFromCookie = function (key) {\r\n var content = getCookie(integrationConfig.cookie);\r\n\r\n if (content !== null && content !== \"\" && isNumber(+content))\r\n return content;\r\n\r\n return \"\";\r\n }\r\n\r\n var getStoreFromLocalizer = () => {\r\n const localStore = Localizer.getLocalizedStore();\r\n const defaultStore = {\r\n storeId: 121,\r\n storeFullName: 'Cumberland - Atlanta, GA',\r\n storeName: 'Cumberland',\r\n zipcode: '30339',\r\n }\r\n\r\n return localStore === null || localStore === undefined ? defaultStore : localStore;\r\n }\r\n\r\n var getZipcodeFromCookie = function () {\r\n return getValueFromCookie('C24');\r\n };\r\n\r\n function ViewModel(baseUrl, stacked, isProfessionallyInstallable) {\r\n var self = this;\r\n self.displayModal = ko.observable(false);\r\n self.availableInArea = ko.observable(false);\r\n // https://www.pivotaltracker.com/story/show/160360337\r\n self.installStartingPrice = ko.observable(99);\r\n self.componentElement = undefined;\r\n\r\n this.shouldDisplayStacked = ko.computed(function () {\r\n //the item can come back as an array per Thang.\r\n if (stacked)\r\n return true;\r\n if ((self.componentElement === undefined) || (self.componentElement && self.componentElement.length == 0)) {\r\n var selector = document.getElementsByClassName(\"measure-and-install\");\r\n\r\n if (selector == null) {\r\n return false;\r\n } else if (selector.length > 0) {\r\n self.componentElement = selector[0];\r\n } else {\r\n self.componentElement = selector;\r\n }\r\n }\r\n\r\n if ((Object.keys(self.componentElement).length === 0 && self.componentElement.constructor === Object) ||\r\n (self.componentElement && self.componentElement.length == 0)) {\r\n return false;\r\n }\r\n\r\n // get the width\r\n var data = self.componentElement.getBoundingClientRect();\r\n\r\n return data.width < 400;\r\n });\r\n\r\n this.showModal = function () {\r\n self.displayModal(true);\r\n }\r\n\r\n this.closeModal = function () {\r\n self.displayModal(false);\r\n }\r\n\r\n this.startProcess = function () {\r\n window.location.href = integrationConfig.baseUrl + 'schedule?ismobile=false';\r\n }\r\n\r\n this.goToMWT = function () {\r\n window.location.href = integrationConfig.baseUrl + 'mywindowtreatments';\r\n }\r\n\r\n if (!isProfessionallyInstallable) return;\r\n\r\n //verify availability\r\n try {\r\n //for some reason these are not always on the page any more.\r\n integrationConfig.baseUrl = baseUrl;\r\n integrationConfig.cookie = \"THD-LOC-STORE\"; //document.getElementById(\"m_icookieStore\").value;\r\n\r\n var store = getStoreFromLocalizer();\r\n var zipcode = getZipcodeFromCookie() || \"30339\";\r\n\r\n // TODO: hardcoded servicetype to 1 = measure\r\n var queryString = 'api/service-providers/check-store-availability?storeNumber=' + store.storeId + '&service=1';\r\n\r\n $.ajax({\r\n url: integrationConfig.baseUrl + queryString,\r\n type: \"GET\"\r\n })\r\n .done(function (response) {\r\n $.ajax({\r\n url: integrationConfig.baseUrl + 'api/pricing/bands?zipcode=' + zipcode + '&serviceType=2',\r\n type: 'GET'\r\n })\r\n .done(function (pricingResponse) {\r\n if (pricingResponse.statusCode === 200) {\r\n var specs = pricingResponse.result;\r\n var installSpec = specs.filter(function (spec) { return spec.specId === 'installation' });\r\n if (installSpec && installSpec[0].pricingBands && installSpec[0].pricingBands[0]) {\r\n self.installStartingPrice(installSpec[0].pricingBands[0].basePrice);\r\n }\r\n }\r\n })\r\n .complete(function () {\r\n self.availableInArea(response.statusCode === 200 && response.result);\r\n })\r\n });\r\n\r\n } catch (e) {\r\n //ignore life.\r\n }\r\n }\r\n\r\n return ViewModel;\r\n }\r\n);\r\n","define([],\r\nfunction(ko) {\r\n return {\r\n }\r\n});\r\n","define([\r\n \"globals\",\r\n \"knockout\",\r\n \"postal\",\r\n \"jquery\",\r\n \"underscore\",\r\n \"cookies-factory\",\r\n \"colorbox\",\r\n], function(globals, ko, postal, $, _, cookiesFactory) {\r\n\r\n var updateSampleCartCookie = function(size) {\r\n var thdCookieDomain = globals.thdCookieDomain;\r\n if (thdCookieDomain === undefined) {\r\n return; //don't set cookie unless we are on THD\r\n }\r\n\r\n var now = new Date();\r\n now.setDate(now.getDate() + 30);\r\n document.cookie = \"Blinds_ComCartSamplesCount=\" + size + \";path=/;expires=\" + now.toUTCString() + \";domain=\" + thdCookieDomain;\r\n if (window.showBlindsSampleCartBlock !== undefined && typeof(window.showBlindsSampleCartBlock) === \"function\") {\r\n showBlindsSampleCartBlock();\r\n }\r\n\r\n $(document).trigger({\r\n type: \"cartUpdated\"\r\n });\r\n };\r\n\r\n var updateTHDHeaderCartCount = function(action) {\r\n var thdCookieDomain = globals.thdCookieDomain;\r\n var itemCountElement = $(\".MyCart__itemCount\");\r\n if (thdCookieDomain !== undefined) {\r\n var thdCartTotalItemCount = parseInt($(\".MyCart__itemCount\").text());\r\n if (!isNaN(thdCartTotalItemCount)) {\r\n if (action === \"add\") {\r\n itemCountElement.text(thdCartTotalItemCount + 1);\r\n } else if (action === \"remove\") {\r\n if ((thdCartTotalItemCount - 1) === 0) {\r\n $(\"#headerCart\").removeClass(\"headerCart__button--replete\");\r\n itemCountElement.text(\"0\");\r\n } else {\r\n itemCountElement.text(thdCartTotalItemCount - 1);\r\n }\r\n }\r\n } else {\r\n if (action === \"add\") {\r\n itemCountElement.text(\"1\");\r\n $(\"#headerCart\").addClass(\"headerCart__button--replete\");\r\n } else if (action === \"remove\") {\r\n itemCountElement.text(\"0\");\r\n $(\"#headerCart\").removeClass(\"headerCart__button--replete\");\r\n }\r\n }\r\n }\r\n };\r\n\r\n var sampleCart = function() {\r\n\r\n var self = this;\r\n var channel = postal.channel(\"productpage\");\r\n var cartChannel = postal.channel(\"cart\");\r\n\r\n self.samples = ko.observableArray();\r\n\r\n self.sampleRemove = function(sample) {\r\n if (globals.paths.removeSample !== undefined) {\r\n $.post(globals.paths.removeSample, sample, function() {\r\n self.samples.remove(sample.choiceId);\r\n updateSampleCartCookie(self.samples().length);\r\n updateTHDHeaderCartCount(\"remove\");\r\n channel.publish(\"sample.removed\", sample.choiceId);\r\n cartChannel.publish(\"cart.list.updated\");\r\n self.UpdateProductPreviewMicroApp();\r\n });\r\n } else {\r\n self.samples.remove(sample.choiceId);\r\n updateSampleCartCookie(self.samples().length);\r\n updateTHDHeaderCartCount(\"remove\");\r\n channel.publish(\"sample.removed\", sample.choiceId);\r\n cartChannel.publish(\"cart.list.updated\");\r\n self.UpdateProductPreviewMicroApp();\r\n }\r\n };\r\n\r\n self.addSample = function(sample) {\r\n var isMobile = globals.ssm.getState(\"mobile\").options.observableIsActive();\r\n var isDesktop = globals.ssm.getState(\"desktop\").options.observableIsActive();\r\n $.post(globals.paths.addSample, sample, function() {\r\n self.samples.push(sample.choiceId);\r\n updateSampleCartCookie(self.samples().length);\r\n channel.publish(\"sample.added\", sample.choiceId);\r\n cartChannel.publish(\"cart.list.updated\");\r\n updateTHDHeaderCartCount(\"add\");\r\n self.UpdateProductPreviewMicroApp();\r\n\r\n var thdAnalyticsEvent = {\r\n category: {\r\n primaryCategory: \"button submission\"\r\n },\r\n eventInfo: {\r\n eventName: \"cart add\"\r\n },\r\n item: [{\r\n productInfo: {\r\n sku: sample.sampleProductId,\r\n productCategory: \"\", // samples category shall be empty string\r\n productName: sample.productName,\r\n productType: \"sample\",\r\n option: {\r\n color: sample.name,\r\n price: 0 // samples option price shall be zero\r\n },\r\n manufacturer: \"\" // samples manufacturer shall be empty string\r\n },\r\n quantity: 1,\r\n price: {\r\n basePrice: 0 // samples base price shall be zero\r\n }\r\n }]\r\n };\r\n\r\n if (window.ddoEventInit) {\r\n window.ddoEventInit(thdAnalyticsEvent);\r\n };\r\n\r\n if (globals.thdCookieDomain !== undefined && !cookiesFactory.isInternalUser()) {\r\n var $obj = $('
').append($('.bdc-product-samples-cart').clone());\r\n $obj.find('.bdc-product-samples-cart').removeClass('dn');\r\n const $sampleCount = $obj.find('[data-testid=orderSamplesCount]');\r\n $sampleCount.css('opacity', 1);\r\n $obj.find('[data-id=\"free-samples-continue\"]').show();\r\n $.colorbox({\r\n html: $obj.html(),\r\n transition: 'none',\r\n width: '400px',\r\n maxWidth: '300px',\r\n className: 'thd-sample-cart-modal',\r\n scrolling: false,\r\n onCleanup: function() {\r\n var offset = $('.bdc-product-samples-cart').offset();\r\n for (var i = 0; i < 2; i++) {\r\n $('#colorbox').animate({\r\n position: 'absolute',\r\n left: offset.left,\r\n top: offset.top,\r\n opacity: 0,\r\n });\r\n }\r\n },\r\n });\r\n }\r\n });\r\n };\r\n\r\n self.UpdateProductPreviewMicroApp = function() {\r\n const detail = {\r\n samplesInCart: self.samples().length,\r\n };\r\n window.dispatchEvent(new CustomEvent('product-preview', { bubbles: false, cancelable: true, detail }));\r\n };\r\n\r\n self.shouldConvertLinkToButton = ko.computed(function() {\r\n var isMobile = globals.ssm.getState(\"mobile\").options.observableIsActive();\r\n if (isMobile && (globals.siteId == 3 || globals.siteId == 2)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n });\r\n\r\n cartChannel.subscribe(\"cart.contains.samples\", function(samples) {\r\n var sampleIds = [];\r\n _.each(samples, function(sampleId) {\r\n sampleIds.push(sampleId);\r\n });\r\n self.samples.push.apply(self.samples, sampleIds);\r\n updateSampleCartCookie(samples.length);\r\n });\r\n\r\n cartChannel.subscribe(\"cart.samples.purchased\", function() {\r\n updateSampleCartCookie(0);\r\n });\r\n\r\n channel.subscribe(\"sample.add\", function(sample) {\r\n self.addSample(sample);\r\n });\r\n\r\n channel.subscribe(\"sample.remove\", function(sample) {\r\n self.sampleRemove(sample);\r\n });\r\n\r\n cartChannel.subscribe(\"sample.add\", function(sample) {\r\n self.addSample(sample);\r\n });\r\n\r\n cartChannel.subscribe(\"sample.remove\", function(sample) {\r\n self.sampleRemove(sample);\r\n });\r\n\r\n this.init = function() {\r\n $.get(globals.paths.getSampleCart, {}, function(data) {\r\n updateSampleCartCookie(data.Data.length);\r\n _.each(data.Data, function(item) {\r\n self.samples.push(item.ChoiceId);\r\n channel.publish(\"sample.added\", item.ChoiceId);\r\n });\r\n });\r\n var cartArea = $(\".bdc-product-samples-cart\");\r\n if (cartArea.length > 0) {\r\n ko.applyBindings(self, cartArea.get(0));\r\n }\r\n };\r\n };\r\n\r\n return sampleCart;\r\n\r\n});\r\n","define(['knockout', 'underscore', 'postal', 'globals'], function (ko, _, postal, globals) {\r\n function VisualizerViewModel(productId, orderedOptions) {\r\n\r\n var self = this;\r\n self._queryStringOptions = \"?fmt=jpeg&fit=constrain,1&wid=176&hei=300\";\r\n self._zoomedQueryStringOptions = \"?fmt=jpeg&fit=constrain,1&wid=600&hei=800\";\r\n self._pipPostalChannel = postal.channel('productpage');\r\n self._pcpPostalChannel = postal.channel('ProductConfigurator');\r\n\r\n self.productId = productId; //Never changes\r\n self.anyVisualizableOptions = ko.observable(orderedOptions != null && orderedOptions.length > 0);\r\n self.shouldShowVisualizer = ko.observable(orderedOptions != null && orderedOptions.length > 0);\r\n\r\n self.selectedChoices = ko.observableArray();\r\n self.visualizerURL = ko.observable();\r\n self.visualizerZoomedURL = ko.observable();\r\n self.ioshack = globals.isIOS;\r\n\r\n self.visualizedOptionList = _.sortBy(orderedOptions, function (item) {\r\n return item.order;\r\n });\r\n\r\n self.isOptionVisualizable = function (optionId) {\r\n var foundOption = _.findWhere(self.visualizedOptionList, { OptionId: optionId });\r\n if (foundOption === undefined) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n self.setupSubscriptions = function () {\r\n //PRODUCT PAGE SUBSCRIPTION\r\n self._pipPostalChannel.subscribe(\"selection.changed\", function (choice) {\r\n if (typeof choice.selected === 'function') {\r\n //This comes from selection/deselection of a choice by the user\r\n if (!choice.selected()) {\r\n self.setChoiceById(choice.optionId, choice.choiceid);\r\n } else {\r\n self.deselectChoiceById(choice.optionId);\r\n }\r\n } else {\r\n ///This comes from page load -- the use choice.id instead of choiceId\r\n self.setChoiceById(choice.optionId, choice.id);\r\n }\r\n });\r\n\r\n self.clearAllDependents = function (option) {\r\n var dependents = option.getDependents();\r\n _.each(dependents, function (dep) {\r\n var existing = self.findSelectedChoice(dep.id());\r\n self.selectedChoices.remove(existing);\r\n })\r\n }\r\n //CONFIGURATOR PAGE SUBSCRIPTION\r\n self._pcpPostalChannel.subscribe(\"option-changed\", function (data) {\r\n if (data !== undefined && data.option !== undefined && data.isEnabled !== undefined) {\r\n self.clearAllDependents(data.option);\r\n var selections = data.option.getSelections();\r\n const selected = (data.currentChoice && data.currentChoice.selected()) || data.isSelected;\r\n\r\n if (selected && data.isEnabled) {\r\n _.each(selections, function (selection) {\r\n if (self.isOptionVisualizable(selection.id()) && selection.selectedChoice()) {\r\n self.setChoice(selection, selection.selectedChoice().id());\r\n }\r\n });\r\n } else {\r\n _.each(selections, function (selection) {\r\n if (self.isOptionVisualizable(selection.id() && selection.selectedChoice())) {\r\n self.deselectChoice(selection, selection.selectedChoice().id());\r\n }\r\n });\r\n }\r\n }\r\n });\r\n self._pcpPostalChannel.subscribe(\"option-disabled\", function (data) {\r\n if (data !== undefined && data.option !== undefined && data.isEnabled !== undefined) {\r\n self.deselectChoice(data.option);\r\n }\r\n });\r\n self._pcpPostalChannel.subscribe(\"option-enabled\", function (data) {\r\n if (data !== undefined && data.option !== undefined && data.isEnabled !== undefined) {\r\n self.setChoice(data.option, data.currentChoice);\r\n }\r\n });\r\n };\r\n\r\n\r\n self.findSelectedChoice = function (optionId) {\r\n return _.find(self.selectedChoices(), function (selection) {\r\n return selection.optionId === optionId;\r\n });\r\n };\r\n\r\n self.updateUrl = function () {\r\n if (self.selectedChoices().length === 0) {\r\n //No choices means show a blank\r\n self.visualizerURL(\"/Content/Images/visualizer-blank.png\");\r\n self.visualizerZoomedURL(undefined);\r\n } else {\r\n var url = _.reduce(self.visualizedOptionList, function(memo, option) {\r\n var matchingChoice = self.findSelectedChoice(option.OptionId);\r\n if (matchingChoice) {\r\n return memo + '_' + matchingChoice.choiceId;\r\n }\r\n return memo;\r\n }, self.productId);\r\n self.visualizerURL(globals.visualizationBaseUrl + url + self._queryStringOptions);\r\n self.visualizerZoomedURL(globals.visualizationBaseUrl + url + self._zoomedQueryStringOptions);\r\n }\r\n };\r\n\r\n //Method used to set the individual choices -- may need to subscribe\r\n // to postal in the end\r\n\r\n self.setChoiceById = function (optionId, choiceId) {\r\n var existing = self.findSelectedChoice(optionId);\r\n self.selectedChoices.remove(existing);\r\n self.selectedChoices.push({ 'optionId': optionId, 'choiceId': choiceId });\r\n\r\n self.updateUrl();\r\n };\r\n self.setChoice = function (option, choiceId) {\r\n var existing = self.findSelectedChoice(option.id());\r\n if (existing) {\r\n var existingDependentOptions = existing.choice.options();\r\n var existingDependentSelections = [];\r\n _.each(existingDependentOptions, function (dep) {\r\n _.each(dep.getDependents(), function (depSelect) {\r\n existingDependentSelections.push(depSelect);\r\n });\r\n });\r\n _.each(existingDependentSelections, function (selection) {\r\n if (self.isOptionVisualizable(selection.id())) {\r\n self.deselectChoice(selection);\r\n }\r\n });\r\n self.selectedChoices.remove(existing);\r\n }\r\n\r\n self.selectedChoices.push({'optionId': option.id(), 'choiceId': choiceId, 'choice': option.selectedChoice()});\r\n\r\n self.updateUrl();\r\n };\r\n self.deselectChoiceById = function (optionId) {\r\n var existing = self.findSelectedChoice(optionId);\r\n self.selectedChoices.remove(existing);\r\n self.updateUrl();\r\n }\r\n self.deselectChoice = function(option) {\r\n var existing = self.findSelectedChoice(option.id());\r\n self.selectedChoices.remove(existing);\r\n self.updateUrl();\r\n };\r\n\r\n self.setupSubscriptions();\r\n }\r\n\r\n return VisualizerViewModel;\r\n});\r\n\r\n","define([\r\n \"knockout\",\r\n \"jquery\",\r\n \"helpers\",\r\n \"globals\",\r\n \"text!dictionary-template\",\r\n \"dictionary-binding\"\r\n ],\r\nfunction(ko, $, helpers, globals, template) {\r\n \"use strict\";\r\n\r\n ko.components.register(\"dictionary\", {\r\n template: template\r\n });\r\n});\r\n","module.exports = \"
\\r\\n
\\r\\n
\\r\\n

Helpful Definitions

\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\"","define([\r\n \"knockout\",\r\n \"jquery\",\r\n \"underscore\",\r\n \"globals\",\r\n \"dictionary-controller\",\r\n \"slick\"],\r\n function (ko, $, _, globals, dictionaryController) {\r\n\r\n \"use strict\";\r\n\r\n var slickSlider = function (additionalContentObservable) {\r\n var slickSliderContainer = $(\".bdc-dictionary-slick-slider\");\r\n var options = {\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n arrows: false,\r\n dots: true\r\n };\r\n\r\n if (slickSlider.isInitialized) return;\r\n\r\n slickSliderContainer.slick(options);\r\n\r\n additionalContentObservable.subscribe(function (newValue) {\r\n slickSliderContainer.slick(\"unslick\");\r\n\r\n var additionalContentSlide = $(\".bdc-definition-additional-content\");\r\n\r\n additionalContentSlide.empty().append(newValue);\r\n slickSliderContainer.slick(options);\r\n });\r\n\r\n slickSlider.isInitialized = true;\r\n };\r\n slickSlider.isInitialized = false;\r\n\r\n ko.bindingHandlers.dictionaryBinding = {\r\n\r\n init: function (element, valueAccessor) {\r\n\r\n var textToParse = element.innerHTML;\r\n if (valueAccessor() && valueAccessor().textToParse) {\r\n textToParse = ko.utils.unwrapObservable(valueAccessor().textToParse);\r\n }\r\n\r\n var dictionary = globals.dictionaryTerms.terms;\r\n if (valueAccessor() && valueAccessor().dictionaryEntries) {\r\n dictionary = ko.utils.unwrapObservable(valueAccessor().dictionaryEntries);\r\n }\r\n\r\n var tagMode = \"hover\";\r\n if (valueAccessor() && valueAccessor().tagMode) {\r\n tagMode = ko.utils.unwrapObservable(valueAccessor().tagMode);\r\n }\r\n\r\n String.prototype.regexIndexOf = function (regex, startpos) {\r\n var indexOf = this.substring(startpos || 0).search(regex);\r\n return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;\r\n };\r\n\r\n var replacementStrategyFactory = function (strategy) {\r\n\r\n var hoverStrategy = function (term, uri, innerText) {\r\n\r\n return \" \\\r\n \" + innerText + \" \\\r\n \";\r\n };\r\n\r\n var staticStrategy = function (term, uri, innerText) {\r\n const isTHD = globals.siteId === 11\r\n return `\r\n \r\n \r\n ${isTHD ? 'i' : ''}\r\n \r\n ${innerText}\r\n \r\n `;\r\n };\r\n\r\n var noChangeStrategy = function (term, uri, innerText) {\r\n return innerText;\r\n };\r\n\r\n switch (strategy) {\r\n case \"static\":\r\n return staticStrategy;\r\n case \"noChange\":\r\n return noChangeStrategy;\r\n default:\r\n return hoverStrategy;\r\n }\r\n\r\n };\r\n\r\n function addMatchIfNotExists(matches, matchesWePlanToUse) {\r\n _.each(matches, function (match) {\r\n var foundOverlappingMatch = false;\r\n _.each(matchesWePlanToUse, function (existingReplacementString) {\r\n if (existingReplacementString.toIndex > match.fromIndex && existingReplacementString.fromIndex < match.toIndex) {\r\n foundOverlappingMatch = true;\r\n }\r\n });\r\n\r\n if (!foundOverlappingMatch) {\r\n matchesWePlanToUse.push(match);\r\n }\r\n });\r\n }\r\n\r\n if (!dictionary || !dictionary.length) {\r\n element.innerHTML = textToParse;\r\n return;\r\n }\r\n\r\n if (!textToParse) {\r\n return;\r\n }\r\n\r\n function isEmptyOrWhiteSpace(str) {\r\n return str === null || str.match(/^ *$/) !== null;\r\n }\r\n\r\n function getIndicesOf(stringToSearch, stringToMatch, caseSensitive, strategy, enforceWordBoundaries) {\r\n var originalStringToSearch = stringToSearch;\r\n var originalStringToMatch = stringToMatch;\r\n var indices = [];\r\n var match;\r\n\r\n if (isEmptyOrWhiteSpace(stringToMatch)) { return indices; }\r\n\r\n if (enforceWordBoundaries) {\r\n stringToMatch = \"\\\\b\" + stringToMatch + \"\\\\b\";\r\n }\r\n\r\n var flags = (caseSensitive) ? \"g\" : \"gi\";\r\n var re = new RegExp(stringToMatch, flags);\r\n\r\n while ((match = re.exec(stringToSearch)) !== null) {\r\n var fIndex = re.lastIndex - match[0].length;\r\n var tIndex = re.lastIndex;\r\n var indexMatch = {\r\n fromIndex: fIndex,\r\n toIndex: tIndex,\r\n replacement: strategy(originalStringToMatch, globals.dictionaryEntryForTerm, originalStringToSearch.substring(fIndex, tIndex))\r\n };\r\n indices.push(indexMatch);\r\n }\r\n\r\n return indices;\r\n }\r\n\r\n var matchesWePlanToUse = [];\r\n\r\n // Find and add all of the HTML tags to the list of matches\r\n var tags = getIndicesOf(textToParse, \"<[^>]+>\", false, replacementStrategyFactory(\"noChange\"), false);\r\n addMatchIfNotExists(tags, matchesWePlanToUse);\r\n\r\n _.each(dictionary, function (dictionaryEntry) {\r\n var terms = getIndicesOf(textToParse, dictionaryEntry.Term, dictionaryEntry.IsCaseSensitive, replacementStrategyFactory(tagMode), true);\r\n addMatchIfNotExists(terms, matchesWePlanToUse);\r\n });\r\n\r\n matchesWePlanToUse.sort(function (a, b) {\r\n return b.toIndex - a.toIndex;\r\n });\r\n\r\n _.each(matchesWePlanToUse, function (replacementVal) {\r\n textToParse = textToParse.substring(0, replacementVal.fromIndex) + replacementVal.replacement + textToParse.substring(replacementVal.toIndex);\r\n });\r\n\r\n element.innerHTML = textToParse;\r\n\r\n $(element).find(\".video-click\").each(function () {\r\n if ($(this).html() === \"\") {\r\n $(this).next().find(\".bdc-dictionary-term-caller\").remove();\r\n }\r\n });\r\n\r\n var termElements = $(element).find(\".bdc-dictionary-term\");\r\n\r\n // Check if the term is a video term\r\n termElements.each(function () {\r\n var termElement = $(this);\r\n var href = termElement.attr(\"href\");\r\n dictionaryController.getTerm(href).then(function (termData) {\r\n if (termData.hasVideo) {\r\n termElement.addClass('bdc-dictionary-video-term');\r\n }\r\n });\r\n });\r\n }\r\n };\r\n\r\n ko.bindingHandlers.dictionaryBindingIcon = {\r\n init: function (element, valueAccessor) {\r\n var dictionary = globals.dictionaryTerms.terms;\r\n var textToParse = valueAccessor().textToParse;\r\n var id = valueAccessor().id;\r\n var term;\r\n var i = 0;\r\n\r\n while (i < dictionary.length) {\r\n if (dictionary[i].IsCaseSensitive) {\r\n if (textToParse.indexOf(dictionary[i].Term) > -1) {\r\n term = dictionary[i].Term;\r\n }\r\n }\r\n else {\r\n if (textToParse.toLowerCase().indexOf(dictionary[i].Term.toLowerCase()) > -1) {\r\n term = dictionary[i].Term;\r\n }\r\n }\r\n\r\n if (term) {\r\n i = dictionary.length;\r\n }\r\n else {\r\n i++;\r\n }\r\n }\r\n\r\n if (term) {\r\n element.innerHTML = element.innerHTML + `\r\n \r\n \r\n \r\n `;\r\n\r\n var termElements = $(element).find(\".bdc-dictionary-term\");\r\n\r\n // Check if the term is a video term\r\n termElements.each(function () {\r\n var termElement = $(this);\r\n var href = termElement.attr(\"href\");\r\n dictionaryController.getTerm(href).then(function (termData) {\r\n if (termData.hasVideo) {\r\n termElement.addClass('bdc-dictionary-video-term');\r\n }\r\n });\r\n });\r\n };\r\n\r\n }\r\n }\r\n });\r\n","import BrightCove from '_shared/vendors/brightcove';\r\ndefine([\r\n 'globals',\r\n 'jquery',\r\n 'helpers',\r\n], function(globals, $, helpers) {\r\n\r\n 'use strict';\r\n\r\n const loadDictionaryTermHtml = (href) => {\r\n var { term } = helpers.getQueryParams(href, 'term');\r\n var productLineId = globals.productLineId;\r\n return new Promise((resolve) => {\r\n $.ajax({\r\n url: globals.dictionaryTerms.path,\r\n data: {\r\n term,\r\n productLineId: productLineId,\r\n },\r\n dataType: 'json',\r\n success: (data) => {\r\n resolve(data);\r\n },\r\n });\r\n });\r\n };\r\n\r\n const loadDictionaryTermData = (href) => {\r\n return loadDictionaryTermHtml(href).then((data) => {\r\n const { definition, image, term, video } = data\r\n return $.when({\r\n term,\r\n definition,\r\n hasImage: !!image,\r\n imageUrl: image,\r\n videoTag: video,\r\n });\r\n });\r\n };\r\n\r\n const loadDictionaryTermAndVideoData = (href) => {\r\n return loadDictionaryTermData(href).then((termData) => {\r\n // No live clicker video tag for this dictionary term, so no videos to load\r\n if (!termData.videoTag) return $.when($.extend(termData, { hasVideo: false, videos: [] }));\r\n // Call out to Brightcove to see if we have a video for this tag\r\n return new BrightCove().getVideosForProductId(termData.videoTag)\r\n .then((videoResults) => {\r\n // Merge the Brightcove video results in to our term data\r\n return $.when($.extend(termData, { hasVideo: !!videoResults && !!videoResults.length, videos: videoResults }));\r\n });\r\n });\r\n };\r\n\r\n return {\r\n getTerm: loadDictionaryTermAndVideoData\r\n };\r\n});\r\n","define([\r\n \"helpers\",\r\n \"jquery\",\r\n \"knockout\"],\r\nfunction(helpers, $, ko) {\r\n\r\n \"use strict\";\r\n\r\n ko.bindingHandlers.configuratorZone = {\r\n\r\n init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n\r\n var groupName = valueAccessor();\r\n var options;\r\n var template = \"option-groups/\" + groupName;\r\n var productConfiguration;\r\n if (bindingContext.$parents.length === 0) {\r\n //in this scenario, currently only on the two override templates for blinds ca install (502796-7) we are the root view model\r\n productConfiguration = bindingContext.$data;\r\n } else {\r\n productConfiguration = bindingContext.$parent;\r\n }\r\n\r\n if (groupName === \"Ungrouped\") {\r\n options = productConfiguration.ungroupedOptions();\r\n } else {\r\n options = productConfiguration.optionsByGroupName(groupName);\r\n if (options.length < 1) {\r\n $(element).hide();\r\n }\r\n }\r\n\r\n ko.applyBindingsToNode(element, {\r\n template: {\r\n name: template,\r\n data: options\r\n }\r\n }, bindingContext);\r\n return { controlsDescendantBindings: true };\r\n }\r\n };\r\n\r\n});\r\n","define([\r\n \"jquery\",\r\n \"knockout\"],\r\nfunction($, ko) {\r\n\r\n \"use strict\";\r\n\r\n // Use stopBinding to allow for nested bindings.\r\n // See http://www.knockmeout.net/2012/05/quick-tip-skip-binding.html for more information.\r\n ko.bindingHandlers.stopBinding = {\r\n init: function() {\r\n return {\r\n controlsDescendantBindings: true\r\n };\r\n }\r\n };\r\n ko.virtualElements.allowedBindings.stopBinding = true;\r\n\r\n ko.bindingHandlers.slideVisible = {\r\n init: function (element, valueAccessor) {\r\n var value = valueAccessor();\r\n $(element).toggle(ko.utils.unwrapObservable(value));\r\n },\r\n update: function (element, valueAccessor) {\r\n var value = valueAccessor();\r\n if (ko.utils.unwrapObservable(value)) {\r\n $(element).slideDown();\r\n } else {\r\n $(element).slideUp();\r\n }\r\n }\r\n };\r\n\r\n});\r\n","define([\r\n \"knockout\",\r\n \"globals\",\r\n \"jquery\"\r\n ],\r\n function(ko, globals, $) {\r\n\r\n ko.bindingHandlers.visualizerImage = {\r\n update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {\r\n\r\n var blankImagePath = \"/Content/Images/visualizer-blank.png\";\r\n\r\n var preloadBlank = new Image();\r\n preloadBlank.src = blankImagePath;\r\n\r\n element.onerror = function() {\r\n element.src = globals.visualizationUnavailableImage;\r\n $(element).data(\"visualizerZoom\", \"false\");\r\n hideRollOver();\r\n };\r\n\r\n element.onload = function() {\r\n var elementRelativePath = element.src.replace(/^(?:\\/\\/|[^\\/]+)*\\//, \"/\");\r\n if (elementRelativePath !== blankImagePath && elementRelativePath !== globals.visualizationUnavailableImage) {\r\n showRollOver();\r\n } else {\r\n hideRollOver();\r\n }\r\n };\r\n\r\n if (bindingContext.$data.anyVisualizableOptions()) {\r\n if (ko.unwrap(valueAccessor()) === undefined || ko.unwrap(valueAccessor()) === blankImagePath) {\r\n if (bindingContext.$parent && bindingContext.$parent.shouldShowImage()) {\r\n element.src = blankImagePath;\r\n bindingContext.$data.shouldShowVisualizer(true);\r\n } else if (bindingContext.$parent) {\r\n bindingContext.$data.shouldShowVisualizer(true);\r\n } else {\r\n bindingContext.$data.shouldShowVisualizer(false);\r\n }\r\n $(element).data(\"visualizerZoom\", \"false\");\r\n } else {\r\n element.src = ko.unwrap(valueAccessor());\r\n if (bindingContext.$data.anyVisualizableOptions()) {\r\n bindingContext.$data.shouldShowVisualizer(true);\r\n $(element).data(\"visualizerZoom\", \"true\");\r\n }\r\n }\r\n }\r\n\r\n function showRollOver() {\r\n if (!globals.isIOS) {\r\n $(\".bdc-visualizer-roll-over\").show();\r\n }\r\n }\r\n\r\n function hideRollOver() {\r\n $(\".bdc-visualizer-roll-over\").hide();\r\n }\r\n }\r\n };\r\n });\r\n","define([\r\n \"base-view-model\",\r\n \"jquery\",\r\n \"knockout\",\r\n \"product-group-view-model\",\r\n \"cookies-factory\"],\r\nfunction (baseViewModel, $, ko, ProductGroupViewModel, cookiesFactory) {\r\n\r\n function ProductOptionViewModel(data, globals) {\r\n\r\n const { isSamplingEnabled, isSamplingEnabledCecOnly } = globals;\r\n var self = this;\r\n ko.utils.extend(self, baseViewModel);\r\n\r\n // This field is used for serverTemplate as Id\r\n this.optionid = data.OptionId;\r\n this.id = data.OptionId;\r\n this.name = data.ShortLabel;\r\n this.type = data.Type;\r\n self.groups = ko.observableArray([]);\r\n this.selectedChoiceIds = ko.observableArray();\r\n self.hideSection = ko.observable(false);\r\n self.isSamplingEnabled = ko.observable((isSamplingEnabled && !isSamplingEnabledCecOnly) || (cookiesFactory.isInternalUser() && isSamplingEnabledCecOnly)); \r\n\r\n this.unselectAll = function () {\r\n $.each(self.groups(), function (index, currentGroup) {\r\n currentGroup.unselectAll();\r\n });\r\n };\r\n\r\n var load = function () {\r\n var _groups = [];\r\n $.each(data.Groups, function (index, value) {\r\n _groups.push(new ProductGroupViewModel(value, value.Choices, data.OptionId));\r\n });\r\n self.groups.push.apply(self.groups, _groups);\r\n };\r\n\r\n load();\r\n\r\n this.toggleSection = function() {\r\n self.hideSection(!self.hideSection());\r\n };\r\n\r\n }\r\n\r\n return ProductOptionViewModel;\r\n\r\n});\r\n","define([\r\n \"knockout\"],\r\nfunction(ko) {\r\n\r\n \"use strict\";\r\n\r\n ko.bindingHandlers.visibility = {\r\n\r\n init: function(element, valueAccessor) {\r\n var value = valueAccessor();\r\n if (ko.utils.unwrapObservable(value)) {\r\n $(element).removeClass(\"invisible\");\r\n } else {\r\n $(element).addClass(\"invisible\");\r\n }\r\n },\r\n\r\n update: function(element, valueAccessor) {\r\n var value = valueAccessor();\r\n if (ko.utils.unwrapObservable(value)) {\r\n $(element).removeClass(\"invisible\");\r\n } else {\r\n $(element).addClass(\"invisible\");\r\n }\r\n }\r\n };\r\n\r\n});\r\n","import {\r\n set,\r\n} from 'lodash';\r\nimport {\r\n AnalyticsContext,\r\n} from '@gcc/adobe-analytics';\r\nimport { sites } from '../../../react/estimateBuilder/helpers/globalVariables';\r\n\r\ndefine([\r\n \"globals\",\r\n \"base-view-model\",\r\n \"helpers\",\r\n \"jquery\",\r\n \"knockout\",\r\n \"underscore\",\r\n \"postal\",\r\n \"measure-and-install\",\r\n \"local-storage\",\r\n \"cookies-factory\",\r\n \"product-price-view-model\",\r\n \"product-estimate-price-view-model\",\r\n \"product-estimate-price-post-measure-view-model\",\r\n \"product-gallery-view-model\",\r\n \"feature!product-reviews\",\r\n \"cookies-factory\",\r\n \"scroll-to-section\",\r\n \"es6-promise\"\r\n], function (\r\n globals,\r\n baseViewModel,\r\n helpers,\r\n $,\r\n ko,\r\n _,\r\n postal,\r\n MandiVM,\r\n LocalStorage,\r\n CookiesFactory,\r\n ProductPriceViewModel,\r\n EstimateProductPriceViewModel,\r\n EstimateProductPricePostMeasureViewModel,\r\n ProductGalleryViewModel,\r\n ProductReviews,\r\n cookiesFactory,\r\n scroll\r\n) {\r\n var SetLocalStorageAndCookieToPersist = function () {\r\n var localStorage = new LocalStorage();\r\n var widthWhole = $(\"#SelectedWidth\").val();\r\n var widthEigth = $(\"#SelectedWidthEigth\").val();\r\n var heightWhole = $(\"#SelectedHeight\").val();\r\n var heightEigth = $(\"#SelectedHeightEigth\").val();\r\n\r\n if (widthEigth == undefined) {\r\n widthEigth = 0;\r\n }\r\n if (heightEigth == undefined) {\r\n heightEigth = 0;\r\n }\r\n\r\n var width = parseFloat(widthWhole) + parseFloat(widthEigth / 8);\r\n var height = parseFloat(heightWhole) + parseFloat(heightEigth / 8);\r\n\r\n var minWidth = $(\"#SelectedWidth option:first\").val();\r\n var maxWidth = $(\"#SelectedWidth option:last\").val();\r\n var minHeight = $(\"#SelectedHeight option:first\").val();\r\n var maxHeight = $(\"#SelectedHeight option:last\").val();\r\n\r\n var widthStorage = {\r\n LocalStoragePersister: {},\r\n minDimension: minWidth,\r\n maxDimension: maxWidth,\r\n serializableValue: width,\r\n getDimensionsEighths: [{ name: \"0/0\", value: 0 }, { name: \"1/8\", value: 1 }, { name: \"1/4\", value: 2 }, { name: \"3/8\", value: 3 }, { name: \"1/2\", value: 4 }, { name: \"5/8\", value: 5 }, { name: \"3/4\", value: 6 }, { name: \"7/8\", value: 7 }]\r\n };\r\n var heightStorage = {\r\n LocalStoragePersister: {},\r\n minDimension: minWidth,\r\n maxDimension: maxWidth,\r\n serializableValue: height,\r\n getDimensionsEighths: [{ name: \"0/0\", value: 0 }, { name: \"1/8\", value: 1 }, { name: \"1/4\", value: 2 }, { name: \"3/8\", value: 3 }, { name: \"1/2\", value: 4 }, { name: \"5/8\", value: 5 }, { name: \"3/4\", value: 6 }, { name: \"7/8\", value: 7 }]\r\n };\r\n\r\n localStorage.persist(\"SELECTED_WIDTH_STORAGE_KEY\", widthStorage);\r\n localStorage.persist(\"SELECTED_HEIGHT_STORAGE_KEY\", heightStorage);\r\n Cookies.set(\"widthz\", width);\r\n Cookies.set(\"hghtz\", height);\r\n };\r\n\r\n var ProductViewModel = function () {\r\n var self = this;\r\n ko.utils.extend(self, baseViewModel);\r\n self.isInternalUser = cookiesFactory.isInternalUser();\r\n var siteProductMedia;\r\n var MAIN_IMAGE_QUERY_STRING_PARAMS =\r\n \"?quality=90&mode=crop&anchor=middlecenter&width=400&height=400&\";\r\n\r\n self.isMobile = ko.computed(function () {\r\n var isMobile = globals.ssm\r\n .getState(\"mobile\")\r\n .options.observableIsActive();\r\n return isMobile;\r\n });\r\n\r\n self.hasMeasureInstallInstructionLink = ko.computed(function () {\r\n if ($(\"#site-product-quick-links ul li > a:first\")[0] === undefined)\r\n return false;\r\n var measureInstallLink = $(\"#site-product-quick-links ul li > a:first\")[0]\r\n .href;\r\n return measureInstallLink !== \"\";\r\n });\r\n\r\n if (globals.siteId === 11) {\r\n self.mandiVM = new MandiVM(\r\n globals.paths.measureAndInstallDomain,\r\n true,\r\n globals.isProfessionallyInstallable\r\n );\r\n }\r\n\r\n self.mainImage = ko.observable();\r\n self.previewGallery = null;\r\n self.productDescription = ko.observable();\r\n self.shortDescription = ko.observable();\r\n self.productName = ko.observable();\r\n self.promoDescription = ko.observable();\r\n self.pricingSubmodel = ko.observable();\r\n self.dictionary = ko.observable();\r\n self.hideDetails = ko.observable(self.isMobile());\r\n self.showProductSpecificationsHeader = ko.observable(self.isMobile());\r\n self.hideSpecifications = ko.observable(self.isMobile());\r\n self.aliasId = globals.aliasId;\r\n\r\n var productReviews = new ProductReviews(globals.productId, globals.aliasId);\r\n self.reviews = ko.observable(productReviews);\r\n\r\n ko.applyBindings(self.reviews(), $(\".bdc-product-customer-reviews\")[0]);\r\n\r\n self.vendorName = ko.observable();\r\n\r\n if (self.isInternalUser === true) {\r\n $.get(globals.paths.internalInfo, {\r\n productId: globals.productId,\r\n siteId: globals.siteId\r\n })\r\n .done(function (data) {\r\n self.vendorName(data.VendorName);\r\n })\r\n .fail(function () {\r\n self.vendorName(\"\");\r\n });\r\n }\r\n\r\n var channel = postal.channel(\"productpage\");\r\n\r\n channel.subscribe(\"product.customize\", function () {\r\n self.customize();\r\n });\r\n\r\n channel.subscribe(\"show.main.gallery\", function (currentThumbnailId) {\r\n const $allPhotoThumbnails = $(\".gcc-product-gallery-thumbnails-photo\").find(\"img\");\r\n $(\".bdc-current-video-caption\").hide();\r\n $allPhotoThumbnails.colorbox({\r\n transition: \"none\",\r\n inline: true,\r\n width: \"900px\",\r\n close: \"\",\r\n height: \"595px\",\r\n href: \"#gcc-product-gallery-detail\",\r\n onClosed: function () {\r\n $(\"#gcc-product-gallery-detail\").hide();\r\n },\r\n onCleanup: function () {\r\n $(\"#gcc-product-gallery-detail\").hide();\r\n $(\"#bcVideoPlayerWrapper-Modal\").empty();\r\n }\r\n });\r\n $($allPhotoThumbnails.get(0)).trigger(\"click\");\r\n self.previewGallery.changeImageById(currentThumbnailId);\r\n $(\"#gcc-product-gallery-detail\").show();\r\n });\r\n\r\n self.changeMainImage = function (data) {\r\n self.mainImage(data.media.Url);\r\n };\r\n\r\n self.toggleDetails = function (shouldOnlyShow) {\r\n if (shouldOnlyShow !== undefined && shouldOnlyShow === \"true\") {\r\n self.hideDetails(false);\r\n if (globals.siteId === 3) {\r\n scroll(\"#bdc-product-details\");\r\n }\r\n } else {\r\n self.hideDetails(!self.hideDetails());\r\n }\r\n };\r\n\r\n self.toggleSpecifications = function () {\r\n self.hideSpecifications(!self.hideSpecifications());\r\n };\r\n\r\n self.changeHomeImage = function () {\r\n self.mainImage();\r\n };\r\n\r\n self.customize = function () {\r\n if (globals.siteId == '1') {\r\n SetLocalStorageAndCookieToPersist();\r\n\r\n let path = globals.paths.productConfigurator;\r\n path += window.location.href.indexOf('utm_medium=pla') > 0 ? \"&pla=true\" : \"\";\r\n window.location = path;\r\n }\r\n else {\r\n let path = globals.paths.productConfigurator;\r\n window.location = path;\r\n }\r\n };\r\n\r\n self.applyPreviewGalleryBindings = function () {\r\n if ($(\".bdc-product-slideshow\").length > 0) {\r\n ko.applyBindings(self.previewGallery, $(\".bdc-product-slideshow\")[0]);\r\n }\r\n if (globals.ssm.getState(\"tablet\").active || globals.isIE9) {\r\n if ($(\".bdc-product-slideshow-thumbnails-container\").length > 0) {\r\n ko.applyBindings(\r\n self.previewGallery,\r\n $(\".bdc-product-slideshow-thumbnails-container\")[0]\r\n );\r\n }\r\n if ($(\".bdc-product-image-see-more\").length > 0) {\r\n ko.applyBindings(\r\n self.previewGallery,\r\n $(\".bdc-product-image-see-more\")[0]\r\n );\r\n ko.applyBindings(\r\n self.previewGallery,\r\n $(\"#gcc-product-gallery-detail\")[0]\r\n );\r\n }\r\n }\r\n };\r\n\r\n self.hasVideos = ko.observable(false);\r\n\r\n self.shouldShowVideosTab = ko.observable(false);\r\n\r\n self.showVideo = function () {\r\n self.previewGallery.showVideo(self.previewGallery.videos()[0]);\r\n return true;\r\n };\r\n\r\n self.stopVideos = function() {\r\n $(\"#bcVideoPlayerWrapper-Gallery\").empty();\r\n return true;\r\n };\r\n\r\n var load = function () {\r\n siteProductMedia = globals.models.mediaGallery;\r\n if (window.pageContextJavascript.useReactGallery !== true) {\r\n self.previewGallery = new ProductGalleryViewModel(\r\n globals.models.mediaGallery,\r\n MAIN_IMAGE_QUERY_STRING_PARAMS\r\n );\r\n\r\n self.applyPreviewGalleryBindings();\r\n\r\n self.previewGallery.hasVideos.subscribe(function (v) {\r\n self.hasVideos(v);\r\n });\r\n self.previewGallery.shouldShowVideosTab.subscribe(function (v) {\r\n self.shouldShowVideosTab(v);\r\n });\r\n self.previewGallery.startSlideshow();\r\n }\r\n\r\n var productDetails = globals.models.productDetails;\r\n self.productDescription(productDetails.ProductDescription);\r\n self.shortDescription(productDetails.ShortDescription);\r\n try {\r\n self.productName(window.digitalData.product[0].productInfo.productName);\r\n } catch (e) { }\r\n self.promoDescription(\r\n escapeLineBreak(productDetails.PromoDescription) || null\r\n );\r\n var productPrice;\r\n if (globals.estimateMode === true) {\r\n if (globals.pageType === 5) {\r\n productPrice = new EstimateProductPricePostMeasureViewModel(self, {\r\n minWidth: productDetails.Dimensions.MinWidth,\r\n maxWidth: productDetails.Dimensions.MaxWidth,\r\n minHeight: productDetails.Dimensions.MinHeight,\r\n maxHeight: productDetails.Dimensions.MaxHeight\r\n });\r\n } else {\r\n productPrice = new EstimateProductPriceViewModel(self, {\r\n minWidth: productDetails.Dimensions.MinWidth,\r\n maxWidth: productDetails.Dimensions.MaxWidth,\r\n minHeight: productDetails.Dimensions.MinHeight,\r\n maxHeight: productDetails.Dimensions.MaxHeight\r\n });\r\n }\r\n } else {\r\n productPrice = new ProductPriceViewModel(self, {\r\n minWidth: productDetails.Dimensions.MinWidth,\r\n maxWidth: productDetails.Dimensions.MaxWidth,\r\n minHeight: productDetails.Dimensions.MinHeight,\r\n maxHeight: productDetails.Dimensions.MaxHeight\r\n });\r\n\r\n // initial price for sticky header\r\n var initialPriceEvent = new CustomEvent(\"price-loaded\", {\r\n detail: {\r\n price: productPrice.discountPrice(),\r\n }\r\n });\r\n dispatchEvent(initialPriceEvent);\r\n }\r\n\r\n self.pricingSubmodel(productPrice);\r\n\r\n ko.applyBindings(self, $(\".bdc-product\")[0]);\r\n\r\n if (globals.estimateMode !== true) {\r\n productPrice.updateWholeEighths(\r\n self.pricingSubmodel(),\r\n $(\".gcc-dimension-whole\")\r\n );\r\n }\r\n\r\n if (location.hash === \"#bdc-product-details\") {\r\n self.hideDetails(false);\r\n }\r\n };\r\n\r\n self.init = function () {\r\n return load();\r\n };\r\n\r\n self.loadReviews = function () {\r\n productReviews.getReviewData(function (numReviews) {\r\n self.reviews().numReviews(numReviews);\r\n });\r\n };\r\n\r\n self.scrollToSureFitGuaranteedToFit = function () {\r\n if (this.hideDetails()) {\r\n this.toggleDetails();\r\n }\r\n if ($(\".bdc-product-details .bdc-surefit\").length > 0) {\r\n scroll(\".bdc-product-details .bdc-surefit\");\r\n } else if (\r\n $(\".bdc-product-details .bdc-font-guaranteed-to-fit\").length > 0\r\n ) {\r\n scroll(\".bdc-product-details .bdc-font-guaranteed-to-fit\");\r\n }\r\n };\r\n\r\n self.scrollToSection = function (hash) {\r\n scroll(hash);\r\n };\r\n var escapeLineBreak = function (input) {\r\n if (input !== null) {\r\n return input.replace(/\\/n/gi, \"\");\r\n } else {\r\n return null;\r\n }\r\n };\r\n };\r\n\r\n if (globals.siteId === sites.americanBlinds) {\r\n var groupAGuide = ['bamboo shades', 'cellular shades', 'fabric blinds', 'faux wood blinds', 'mini blinds', 'pleated shades', 'roman shades', 'vinyl blinds', 'wood blinds'];\r\n var groupBGuide = ['dual sheer shades', 'outdoor shades', 'roller shades', 'sheer shades', 'solar shades'];\r\n var groupCGuide = ['panel track blinds', 'sheer vertical blinds', 'sheer vertical shades', 'vertical blinds', 'vertical cellular shades'];\r\n var prodCat = '';\r\n try {\r\n prodCat = window.digitalData.product[0].productInfo.productCategory;\r\n } catch (e) { }\r\n if ($.inArray(prodCat, groupAGuide) !== -1) {\r\n $(\".gcc-measure-guide-w\").css(\"background-image\", \"url(//media.blinds.com/infopages/images/measure-guide/group-a-width.png)\");\r\n $(\".gcc-measure-guide-h\").css(\"background-image\", \"url(//media.blinds.com/infopages/images/measure-guide/group-a-height.png)\");\r\n } else if ($.inArray(prodCat, groupBGuide) !== -1) {\r\n $(\".gcc-measure-guide-w\").css(\"background-image\", \"url(//media.blinds.com/infopages/images/measure-guide/group-b-width.png)\");\r\n $(\".gcc-measure-guide-h\").css(\"background-image\", \"url(//media.blinds.com/infopages/images/measure-guide/group-b-height.png)\");\r\n } else if ($.inArray(prodCat, groupCGuide) !== -1) {\r\n $(\".gcc-measure-guide-w\").css(\"background-image\", \"url(//media.blinds.com/infopages/images/measure-guide/group-c-width.png)\");\r\n $(\".gcc-measure-guide-h\").css(\"background-image\", \"url(//media.blinds.com/infopages/images/measure-guide/group-c-height.png)\");\r\n }\r\n\r\n if ($(\".gcc-measure-guide-w\").css(\"background-image\") != \"none\") {\r\n $(document).on(\"mouseenter mouseleave\", \".gcc-prd-prcupd-w\", function (e) {\r\n if (e.type == \"mouseenter\") {\r\n $(\".gcc-measure-guide-w\").css({ \"width\": $(\".gcc-prd-media\").width(), \"height\": $(\".gcc-prd-media\").height() });\r\n $(\".gcc-measure-guide-w\").show();\r\n $(\".gcc-product-gallery\").css(\"display\", \"none\");\r\n } else {\r\n $(\".gcc-measure-guide-w\").hide();\r\n $(\".gcc-product-gallery\").css(\"display\", \"block\");\r\n }\r\n });\r\n\r\n $(document).on(\"mouseenter mouseleave\", \".gcc-prd-prcupd-h\", function (e) {\r\n if (e.type == \"mouseenter\") {\r\n $(\".gcc-measure-guide-h\").css({ \"width\": $(\".gcc-prd-media\").width(), \"height\": $(\".gcc-prd-media\").height() });\r\n $(\".gcc-measure-guide-h\").show();\r\n $(\".gcc-product-gallery\").css(\"display\", \"none\");\r\n } else {\r\n $(\".gcc-measure-guide-h\").hide();\r\n $(\".gcc-product-gallery\").css(\"display\", \"block\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n $(function () {\r\n $(\"#gcc-product-gallery-type-photos\").prop(\"checked\", true);\r\n if ($(\"#site-product-quick-links ul li > a:first\")[0] !== undefined) {\r\n $(\"#bdc-product-measure-install-instructions\").show();\r\n $(\"#bdc-product-measure-install-instructions\").click(function () {\r\n scroll(\"#site-product-quick-links\");\r\n });\r\n }\r\n // Scroll to Section\r\n if (location.hash !== \"\") {\r\n try {\r\n var element = $.find(location.hash);\r\n if (element.length > 0) {\r\n scroll(location.hash);\r\n }\r\n } catch (e) { }\r\n }\r\n });\r\n\r\n // The server sets some properties for the page and site objects, so we are just grabbing them\r\n // and setting the experienceType, and then fire the page load event.\r\n if (globals.siteId === sites.theHomeDepot || globals.siteId === sites.blinds) {\r\n const analyticsContext = new AnalyticsContext(globals.siteId);\r\n const pageObject = window.digitalData.page;\r\n const siteObject = window.digitalData.site;\r\n set(siteObject, 'experienceType', window.device.type);\r\n set(siteObject, 'siteId', globals.siteId);\r\n analyticsContext.sendPageLoadEvent(pageObject, siteObject);\r\n }\r\n\r\n return ProductViewModel;\r\n});\r\n","define([\r\n \"globals\",\r\n \"base-view-model\",\r\n \"jquery\",\r\n \"knockout\",\r\n \"underscore\",\r\n \"postal\",\r\n \"pricing-support\",\r\n \"local-storage\",\r\n \"js-cookie\",\r\n \"knockout-postbox\"],\r\n function (globals, baseViewModel, $, ko, _, postal, PricingSupport, LocalStorage, Cookies) {\r\n\r\n var productPageChannel = postal.channel(\"productpage\");\r\n\r\n var ProductPriceViewModel = function (parentModel, sizeOptions) {\r\n\r\n var self = this;\r\n var parent = parentModel;\r\n ko.utils.extend(self, baseViewModel);\r\n\r\n self.defaultPrice = globals.price;\r\n self.productId = globals.productId;\r\n self.widthOption = globals.models.widthOption;\r\n self.heightOption = globals.models.heightOption;\r\n self.sampleOptions = globals.models.sampleOptions;\r\n self.oldPricingContext = undefined;\r\n\r\n var strikethroughPriceModel = globals.models.strikethroughPrice;\r\n /*\r\n Not really sure how to introduce strike through price model as an observable withouth disrupting PriceSubModel.\r\n Therefore I ended up with creating individual properties against product price view model.\r\n */\r\n\r\n if (strikethroughPriceModel) {\r\n self.discountPrice = ko.observable(strikethroughPriceModel.Price);\r\n self.originalPrice = ko.observable(strikethroughPriceModel.OriginalPrice);\r\n self.strikethroughMessage = ko.observable(strikethroughPriceModel.StrikethroughMessage);\r\n self.stackablePercentage = ko.observable();\r\n }\r\n\r\n self.defaults = {\r\n minWidth: 7,\r\n maxWidth: 156,\r\n minHeight: 10,\r\n maxHeight: 160\r\n };\r\n\r\n if (globals.isMandi) {\r\n let postMeasureCookie = Cookies.get(\"postMeasureOptions\");\r\n if (postMeasureCookie) {\r\n let postMeasureOptions = JSON.parse(postMeasureCookie);\r\n Cookies.set(\"widthz\", postMeasureOptions.Width);\r\n Cookies.set(\"hghtz\", postMeasureOptions.Height);\r\n }\r\n }\r\n\r\n self.sizeOptions = $.extend({}, self.defaults, sizeOptions);\r\n self.widthDimension = new PricingSupport.WidthDimension(self.sizeOptions.minWidth, self.sizeOptions.maxWidth);\r\n self.heightDimension = new PricingSupport.HeightDimension(self.sizeOptions.minHeight, self.sizeOptions.maxHeight);\r\n\r\n self.price = ko.observable(globals.price).publishOn(\"colorSelectorPrice\");\r\n self.widthWhole = ko.observable(self.widthDimension.dimension.valueWhole());\r\n self.widthEighths = ko.observable(self.widthDimension.dimension.valueEighths());\r\n self.heightWhole = ko.observable(self.heightDimension.dimension.valueWhole());\r\n self.heightEighths = ko.observable(self.heightDimension.dimension.valueEighths());\r\n self.currentChoiceIds = ko.observableArray();\r\n self.dimensionsAdjustedByServer = ko.observable(globals.dimensionsAdjusted);\r\n\r\n self.widthWhole.subscribe(function (newValue) {\r\n self.widthDimension.dimension.valueWhole(newValue);\r\n });\r\n self.widthEighths.subscribe(function (newValue) {\r\n self.widthDimension.dimension.valueEighths(newValue);\r\n });\r\n self.heightWhole.subscribe(function (newValue) {\r\n self.heightDimension.dimension.valueWhole(newValue);\r\n });\r\n self.heightEighths.subscribe(function (newValue) {\r\n self.heightDimension.dimension.valueEighths(newValue);\r\n });\r\n self.isLoadingPrices = ko.observable(false);\r\n\r\n self.onDimensionsChanged = function (data, e) {\r\n\r\n self.updateWholeEighths(data, e.target);\r\n self.publishDimensionsChangedEvent();\r\n updatePrice(data, e);\r\n\r\n self.dimensionsAdjustedByServer(false);\r\n };\r\n\r\n self.updateWholeEighths = function (data, target) {\r\n // Prevent user from selecting eighths of inches past maximum whole value.\r\n if ($(target).hasClass(\"gcc-dimension-whole\")) {\r\n var maxDimension, currentWholeDimension;\r\n if ($(target).data(\"testid\") == \"heightWhole\") {\r\n maxDimension = data.heightDimension.dimension.maxDimension;\r\n currentWholeDimension = data.heightDimension.dimension.valueWhole();\r\n } else if ($(target).data(\"testid\") == \"widthWhole\") {\r\n maxDimension = data.widthDimension.dimension.maxDimension;\r\n currentWholeDimension = data.widthDimension.dimension.valueWhole();\r\n }\r\n var objEighths = $(target).parent(\".bdc-dropdown\").next(\".bdc-dropdown\").find(\".gcc-dimension-eighths\");\r\n if (maxDimension == currentWholeDimension) {\r\n if ($(target).data(\"testid\") == \"heightWhole\") {\r\n self.heightEighths(0);\r\n } else if ($(target).data(\"testid\") == \"widthWhole\") {\r\n self.widthEighths(0);\r\n }\r\n objEighths.prop(\"disabled\", \"disabled\");\r\n } else {\r\n objEighths.prop(\"disabled\", false);\r\n }\r\n }\r\n };\r\n self.formattedEighths = [{ name: \"0/0\", value: 0 }, { name: \"1/8\", value: 1 }, { name: \"1/4\", value: 2 },\r\n { name: \"3/8\", value: 3 }, { name: \"1/2\", value: 4 }, { name: \"5/8\", value: 5 },\r\n { name: \"3/4\", value: 6 }, { name: \"7/8\", value: 7 }];\r\n self.formattedWidthEighths = ko.computed(function () {\r\n if (self.widthEighths() === 0)\r\n return \"\";\r\n else {\r\n let data = _.find(self.formattedEighths, function (formatted) {\r\n return formatted.value === self.widthEighths();\r\n });\r\n if (data) {\r\n return data.name + \"\\xa0\";\r\n }\r\n return \"\";\r\n }\r\n });\r\n\r\n self.formattedHeightEighths = ko.computed(function () {\r\n if (self.heightEighths() === 0)\r\n return \"\";\r\n else {\r\n let data = _.find(self.formattedEighths, function (formatted) {\r\n return formatted.value === self.heightEighths();\r\n });\r\n if (data) {\r\n return data.name + \"\\xa0\";\r\n }\r\n return \"\";\r\n }\r\n });\r\n\r\n $(document).ready(function () {\r\n updatePrice();\r\n });\r\n\r\n function updatePrice(data, e, callback) {\r\n var params = buildPricingContext();\r\n\r\n $.ajax({\r\n url: globals.paths.loadSiteProductPricingWithColors,\r\n type: \"GET\",\r\n contentType: \"application/json; charset=utf-8\",\r\n data: {\r\n selectedPricingContext: JSON.stringify(params),\r\n productId: self.productId,\r\n siteId: globals.siteId,\r\n width: self.widthDimension.dimension.value(),\r\n height: self.heightDimension.dimension.value(),\r\n calculateColorChoicePrices: globals.displayPriceFlags\r\n }\r\n })\r\n .done(function (result, status, xhr) {\r\n if (result.Data.SelectedPrice) {\r\n if (result.Data.ForCurrentContext == \"0\") {\r\n self.price(\"N/A\");\r\n } else {\r\n var data = result.Data;\r\n self.price(data.SelectedPrice.toFixed(2));\r\n\r\n self.discountPrice(data.StrikethroughPrice.Price);\r\n self.originalPrice(data.StrikethroughPrice.OriginalPrice);\r\n self.strikethroughMessage(data.StrikethroughPrice.Message ? data.StrikethroughPrice.Message.toLowerCase() : \"\");\r\n self.stackablePercentage(data.StackablePromo ? data.StackablePromo.Amount : 0);\r\n }\r\n xhr.status = \"success\";\r\n } else {\r\n self.price(\"N/A\");\r\n xhr.status = \"failure\";\r\n }\r\n\r\n var productPageChannel = postal.channel(\"productpage\");\r\n for (var i = 0; i < result.Data.ColorChoicePrices.length; i++) {\r\n var colorChoicePrice = result.Data.ColorChoicePrices[i];\r\n productPageChannel.publish(\"choice.price.updated\", { choiceId: colorChoicePrice.ChoiceId, price: colorChoicePrice.Price });\r\n }\r\n UpdateProductPreviewMicroApp(data);\r\n })\r\n .then(function () {\r\n var price = self.price();\r\n if (isNaN(price)) {\r\n // If price if not defined, we use default price from view\r\n price = self.defaultPrice;\r\n }\r\n price = parseFloat(price).toFixed(2);\r\n postal.publish({\r\n channel: \"productpage\",\r\n topic: \"product.price.loaded\",\r\n data: {\r\n price: price\r\n }\r\n });\r\n\r\n // Update price for sticky header\r\n var updatePriceEvent = new CustomEvent(\"price-updated\", {\r\n detail: {\r\n price,\r\n }\r\n });\r\n dispatchEvent(updatePriceEvent);\r\n\r\n }).always(function () {\r\n if ($.isFunction(callback)) {\r\n callback();\r\n }\r\n }).fail(function () {\r\n self.price(\"N/A\");\r\n });\r\n }\r\n\r\n function UpdateProductPreviewMicroApp(data) {\r\n const detail = {\r\n price: {\r\n originalPrice: data.StrikethroughPrice.OriginalPrice,\r\n percentOff: data.StrikethroughPrice.Percentage,\r\n promoDescription: data.StrikethroughPrice.Message,\r\n stackablePercentOff: data.StackablePromo ? data.StackablePromo.Amount : 0,\r\n },\r\n };\r\n\r\n window.dispatchEvent(new CustomEvent('product-preview', { bubbles: false, cancelable: true, detail }));\r\n }\r\n\r\n var buildPricingContext = function () {\r\n var localPersistance = new LocalStorage();\r\n var savedState = localPersistance.getFromLocalStorage(\"option-state-\" + self.productId);\r\n if (savedState) {\r\n var selectedChoices = JSON.parse(savedState);\r\n var selectedChoiceIds = [];\r\n _.each(selectedChoices, function (sc) {\r\n // Add to the collection only the sampleable choices\r\n if (sc.id !== self.widthOption.ChoiceId && sc.id !== self.heightOption.ChoiceId) {\r\n selectedChoiceIds.push(sc.id);\r\n }\r\n });\r\n }\r\n\r\n var params = {\r\n \"ProductId\": self.productId,\r\n \"Choices\": [],\r\n \"ForContextOnly\": true\r\n };\r\n\r\n // Width\r\n if (self.widthOption !== null) {\r\n params.Choices.push({\r\n ChoiceId: self.widthOption.ChoiceId,\r\n OptionId: self.widthOption.OptionId,\r\n OptionType: \"width\",\r\n ChoiceValue: self.widthDimension.dimension.value()\r\n });\r\n }\r\n\r\n // Height\r\n if (self.heightOption !== null) {\r\n params.Choices.push({\r\n ChoiceId: self.heightOption.ChoiceId,\r\n OptionId: self.heightOption.OptionId,\r\n OptionType: \"height\",\r\n ChoiceValue: self.heightDimension.dimension.value()\r\n });\r\n }\r\n\r\n // Samples (mostly colors)\r\n if (selectedChoiceIds) {\r\n _.each(self.sampleOptions.Options, function (sampleOption) {\r\n var optionType = sampleOption.Type ? sampleOption.Type.replace(\" \", \"\").toLowerCase() : \"\";\r\n _.each(sampleOption.Groups, function (group) {\r\n _.each(group.Choices, function (choice) {\r\n if (_.contains(selectedChoiceIds, choice.ChoiceId)) {\r\n params.Choices.push({\r\n ChoiceId: choice.ChoiceId,\r\n OptionId: sampleOption.OptionId,\r\n OptionType: optionType,\r\n ChoiceValue: true\r\n });\r\n var index = selectedChoiceIds.indexOf(choice.ChoiceId);\r\n if (index > -1) selectedChoiceIds.splice(index, 1);\r\n }\r\n\r\n if (!selectedChoiceIds.length) {\r\n return params;\r\n }\r\n });\r\n });\r\n });\r\n }\r\n return params;\r\n };\r\n\r\n var getSampleOptionIds = function () {\r\n\r\n // Samples (mostlye colors)\r\n var params = [];\r\n _.each(self.sampleOptions, function (sampleOption) {\r\n params.push(sampleOption.OptionId);\r\n });\r\n\r\n return params;\r\n };\r\n\r\n var SamePricingContex = function (newPricingContext) {\r\n if (self.oldPricingContext && newPricingContext) {\r\n if (self.oldPricingContext.ProductId === newPricingContext.ProductId &&\r\n self.oldPricingContext.ForContextOnly === newPricingContext.ForContextOnly &&\r\n self.oldPricingContext.Choices.length === newPricingContext.Choices.length) {\r\n for (var i = 0, j = newPricingContext.Choices.length; i < j; i++) {\r\n var newChoice = newPricingContext.Choices[i];\r\n var oldChoice = self.oldPricingContext.Choices[i];\r\n if (newChoice.ChoiceId !== oldChoice.ChoiceId ||\r\n newChoice.OptionId !== oldChoice.OptionId ||\r\n newChoice.OptionType !== oldChoice.OptionType ||\r\n newChoice.ChoiceValue !== oldChoice.ChoiceValue) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n self.publishDimensionsChangedEvent = function () {\r\n postal.publish({\r\n topic: \"dimensions.changed\",\r\n data: {\r\n pricingContext: buildPricingContext(),\r\n optionIds: getSampleOptionIds(),\r\n productId: self.productId,\r\n width: self.widthDimension,\r\n height: self.heightDimension\r\n }\r\n });\r\n };\r\n\r\n //usage numericPrice: field\r\n //if there is a decimal portion, show two decimal places. If not, show 0 decimal places.\r\n ko.bindingHandlers.numericPrice = {\r\n update: function (element, valueAccessor, allBindingsAccessor) {\r\n var value = ko.utils.unwrapObservable(valueAccessor()),\r\n precision = value % 1 === 0 ? 0 : 2,\r\n formattedValue = value.toFixed(precision);\r\n\r\n ko.bindingHandlers.text.update(element, function () { return formattedValue; });\r\n },\r\n defaultPrecision: 1\r\n };\r\n\r\n productPageChannel.subscribe({\r\n topic: 'react.dimension.changed',\r\n callback: function (data) {\r\n var pricing = data.pricing;\r\n\r\n var price = pricing.price !== pricing.strikeThroughPricingModel.originalPrice\r\n ? pricing.strikeThroughPricingModel.originalPrice\r\n : pricing.price;\r\n\r\n self.price(price);\r\n\r\n self.discountPrice(pricing.strikeThroughPricingModel.discountPrice);\r\n self.originalPrice(pricing.strikeThroughPricingModel.originalPrice);\r\n self.strikethroughMessage(pricing.strikeThroughPricingModel.message ? pricing.strikeThroughPricingModel.message.toLowerCase() : \"\");\r\n }\r\n });\r\n\r\n productPageChannel.subscribe({\r\n topic: 'react.no.price',\r\n callback: function () {\r\n self.price('N/A');\r\n }\r\n });\r\n\r\n document.addEventListener(\"swatchSelected\", (data, e) => updatePrice(data, e));\r\n };\r\n\r\n return ProductPriceViewModel;\r\n\r\n });\r\n","define([\r\n \"globals\",\r\n \"base-view-model\",\r\n \"jquery\",\r\n \"knockout\",\r\n \"underscore\",\r\n \"postal\",\r\n \"pricing-support\",\r\n \"local-storage\",\r\n \"knockout-postbox\"],\r\nfunction(globals, baseViewModel, $, ko, _, postal, PricingSupport, LocalStorage) {\r\n\r\n var productPageChannel = postal.channel(\"productpage\");\r\n\r\n var EstimateProductPriceViewModel = function(parentModel, sizeOptions) {\r\n var self = this;\r\n var parent = parentModel;\r\n ko.utils.extend(self, baseViewModel);\r\n\r\n self.defaultPrice = globals.price;\r\n self.productId = globals.productId;\r\n self.widthOption = globals.models.widthOption;\r\n self.heightOption = globals.models.heightOption;\r\n self.sampleOptions = globals.models.sampleOptions;\r\n self.oldPricingContext = undefined;\r\n\r\n self.defaults = {\r\n minWidth: 7,\r\n maxWidth: 156,\r\n minHeight: 10,\r\n maxHeight: 160\r\n };\r\n\r\n self.sizeOptions = $.extend({}, self.defaults, sizeOptions);\r\n self.widthDimension = new PricingSupport.WidthDimension(self.sizeOptions.minWidth, self.sizeOptions.maxWidth);\r\n self.heightDimension = new PricingSupport.HeightDimension(self.sizeOptions.minHeight, self.sizeOptions.maxHeight);\r\n\r\n self.lowPrice = ko.observable(globals.productPrice.LowPrice).publishOn(\"colorSelectorLowPrice\");\r\n self.highPrice = ko.observable( globals.productPrice.HighPrice ).publishOn( \"colorSelectorHighPrice\" );\r\n self.allNA = ko.computed(function() {\r\n return self.lowPrice() == \"N/A\" && self.highPrice() == \"N/A\";\r\n } );\r\n self.widthWhole = ko.observable(self.widthDimension.dimension.valueWhole());\r\n self.heightWhole = ko.observable(self.heightDimension.dimension.valueWhole());\r\n self.currentChoiceIds = ko.observableArray();\r\n self.dimensionsAdjustedByServer = ko.observable(globals.dimensionsAdjusted);\r\n\r\n self.widthWhole.subscribe(function(newValue) {\r\n self.widthDimension.dimension.valueWhole(newValue);\r\n });\r\n self.heightWhole.subscribe(function(newValue) {\r\n self.heightDimension.dimension.valueWhole(newValue);\r\n });\r\n self.isLoadingPrices = ko.observable(false);\r\n\r\n self.onDimensionsChanged = function (data, e) {\r\n self.publishDimensionsChangedEvent();\r\n self.updatePrice(data, e);\r\n self.dimensionsAdjustedByServer(false);\r\n };\r\n\r\n productPageChannel.subscribe( \"updatePrice\", function ( data ) {\r\n\r\n self.updatePrice();\r\n });\r\n\r\n self.updatePrice = function (data, e, callback) {\r\n\r\n\r\n\r\n var params = buildPricingContext();\r\n if (SamePricingContext(params)) {\r\n return;\r\n }\r\n\r\n self.oldPricingContext = params;\r\n\r\n var vendorToken = sessionStorage.getItem('vendorToken');\r\n var reqHeaders = {\r\n url: globals.paths.loadSiteProductPricing,\r\n type: \"GET\",\r\n contentType: \"application/json; charset=utf-8\",\r\n data: {\r\n context: JSON.stringify(params)\r\n }\r\n };\r\n if(vendorToken && vendorToken.length>0)\r\n {\r\n reqHeaders= _.extend(reqHeaders, {headers:{'vendor-token':vendorToken}});\r\n }\r\n\r\n $.ajax(reqHeaders).done(function (data, status, xhr) {\r\n self.lowPrice(\"N/A\");\r\n self.highPrice( \"N/A\" );\r\n if (data.Data.LowerEstimate != null && data.Data.UpperEstimate != null) {\r\n if (data.Data.LowerEstimate > 0) {\r\n self.lowPrice(data.Data.LowerEstimate.toFixed(2));\r\n }\r\n if (data.Data.UpperEstimate > 0) {\r\n self.highPrice(data.Data.UpperEstimate.toFixed(2));\r\n }\r\n xhr.status = \"success\";\r\n } else {\r\n xhr.status = \"failure\";\r\n }\r\n\r\n }).always(function () {\r\n if ($.isFunction(callback)) {\r\n callback();\r\n }\r\n }).fail(function () {\r\n self.lowPrice(\"N/A\");\r\n self.highPrice(\"N/A\");\r\n });\r\n };\r\n\r\n var buildPricingContext = function () {\r\n var localPersistance = new LocalStorage();\r\n var savedState = localPersistance.getFromLocalStorage(\"option-state-\" + self.productId);\r\n if (savedState) {\r\n var selectedChoices = JSON.parse(savedState);\r\n var selectedChoiceIds = [];\r\n _.each(selectedChoices, function(sc) {\r\n // Add to the collection only the sampleable choices\r\n if (sc.id !== self.widthOption.ChoiceId && sc.id !== self.heightOption.ChoiceId) {\r\n selectedChoiceIds.push(sc.id);\r\n }\r\n });\r\n }\r\n\r\n var params = {\r\n \"ProductId\": self.productId,\r\n \"Choices\": [],\r\n \"ForContextOnly\": true\r\n };\r\n\r\n // Width\r\n if (self.widthOption !== null) {\r\n params.Choices.push({\r\n ChoiceId: self.widthOption.ChoiceId,\r\n OptionId: self.widthOption.OptionId,\r\n OptionType: \"width\",\r\n ChoiceValue: self.widthDimension.dimension.value(),\r\n ChoiceDataType: \"DimensionInchesEighth\"\r\n });\r\n }\r\n\r\n // Height\r\n if (self.heightOption !== null) {\r\n params.Choices.push({\r\n ChoiceId: self.heightOption.ChoiceId,\r\n OptionId: self.heightOption.OptionId,\r\n OptionType: \"height\",\r\n ChoiceValue: self.heightDimension.dimension.value(),\r\n ChoiceDataType: \"DimensionInchesEighth\"\r\n });\r\n }\r\n\r\n // Samples (mostly colors)\r\n if ( selectedChoiceIds ) {\r\n _.each( self.sampleOptions.Options, function ( sampleOption ) {\r\n var optionType = sampleOption.Type ? sampleOption.Type.replace(\" \", \"\").toLowerCase() : \"\";\r\n _.each(sampleOption.Groups, function(group) {\r\n _.each(group.Choices, function(choice) {\r\n if (_.contains(selectedChoiceIds, choice.ChoiceId)) {\r\n params.Choices.push({\r\n ChoiceId: choice.ChoiceId,\r\n OptionId: sampleOption.OptionId,\r\n OptionType: optionType,\r\n ChoiceValue: true,\r\n ChoiceDataType: \"List\"\r\n });\r\n var index = selectedChoiceIds.indexOf(choice.ChoiceId);\r\n if (index > -1) selectedChoiceIds.splice(index, 1);\r\n }\r\n\r\n if (!selectedChoiceIds.length) {\r\n return params;\r\n }\r\n });\r\n });\r\n });\r\n }\r\n return params;\r\n };\r\n\r\n var getSampleOptionIds = function() {\r\n\r\n // Samples (mostly colors)\r\n var params = [];\r\n _.each(self.sampleOptions, function(sampleOption) {\r\n params.push(sampleOption.OptionId);\r\n });\r\n\r\n return params;\r\n };\r\n\r\n var SamePricingContext = function(newPricingContext) {\r\n if (self.oldPricingContext && newPricingContext) {\r\n if (self.oldPricingContext.ProductId === newPricingContext.ProductId &&\r\n self.oldPricingContext.ForContextOnly === newPricingContext.ForContextOnly &&\r\n self.oldPricingContext.Choices.length === newPricingContext.Choices.length) {\r\n for (var i = 0, j = newPricingContext.Choices.length; i < j; i++) {\r\n var newChoice = newPricingContext.Choices[i];\r\n var oldChoice = self.oldPricingContext.Choices[i];\r\n if (newChoice.ChoiceId !== oldChoice.ChoiceId ||\r\n newChoice.OptionId !== oldChoice.OptionId ||\r\n newChoice.OptionType !== oldChoice.OptionType ||\r\n newChoice.ChoiceValue !== oldChoice.ChoiceValue) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n self.publishDimensionsChangedEvent = function () {\r\n postal.publish({\r\n topic: \"dimensions.changed\",\r\n data: {\r\n pricingContext: buildPricingContext(),\r\n optionIds: getSampleOptionIds(),\r\n productId: self.productId,\r\n width: self.widthDimension,\r\n height: self.heightDimension\r\n }\r\n });\r\n };\r\n\r\n //usage numericPrice: field\r\n //if there is a decimal portion, show two decimal places. If not, show 0 decimal places.\r\n ko.bindingHandlers.numericPrice = {\r\n update: function(element, valueAccessor, allBindingsAccessor) {\r\n var value = ko.utils.unwrapObservable(valueAccessor()),\r\n precision = value % 1 === 0 ? 0 : 2,\r\n formattedValue = value.toFixed(precision);\r\n\r\n ko.bindingHandlers.text.update(element, function() { return formattedValue; });\r\n },\r\n defaultPrecision: 1\r\n };\r\n\r\n };\r\n\r\n return EstimateProductPriceViewModel;\r\n\r\n});\r\n","define( [\r\n \"globals\",\r\n \"base-view-model\",\r\n \"jquery\",\r\n \"knockout\",\r\n \"underscore\",\r\n \"postal\",\r\n \"pricing-support\",\r\n \"local-storage\",\r\n \"js-cookie\",\r\n \"knockout-postbox\"],\r\nfunction ( globals, baseViewModel, $, ko, _, postal, PricingSupport, LocalStorage, Cookies ) {\r\n var productPageChannel = postal.channel( \"productpage\" );\r\n\r\n var EstimateProductPricePostMeasureViewModel = function ( parentModel, sizeOptions ) {\r\n \r\n var self = this;\r\n \r\n ko.utils.extend( self, baseViewModel );\r\n \r\n self.defaultPrice = globals.price;\r\n self.productId = globals.productId;\r\n self.widthOption = globals.models.widthOption;\r\n self.heightOption = globals.models.heightOption;\r\n self.sampleOptions = globals.models.sampleOptions;\r\n self.oldPricingContext = undefined;\r\n\r\n self.defaults = {\r\n minWidth: 7,\r\n maxWidth: 156,\r\n minHeight: 10,\r\n maxHeight: 160\r\n };\r\n\r\n\r\n //at this time, we should always have cookie value\r\n var postMeasureCookie = JSON.parse( Cookies.get( 'postMeasureOptions' ) );\r\n var localPersistance = new LocalStorage();\r\n\r\n var widthStorage = {\r\n LocalStoragePersister: {},\r\n minDimension: self.defaults.minWidth,\r\n maxDimension: self.defaults.maxWidth,\r\n serializableValue: postMeasureCookie.Width,\r\n getDimensionsEighths: [{ name: \"0/0\", value: 0 }, { name: \"1/8\", value: 1 }, { name: \"1/4\", value: 2 }, { name: \"3/8\", value: 3 }, { name: \"1/2\", value: 4 }, { name: \"5/8\", value: 5 }, { name: \"3/4\", value: 6 }, { name: \"7/8\", value: 7 }]\r\n };\r\n var heightStorage = {\r\n LocalStoragePersister: {},\r\n minDimension: self.defaults.minHeight,\r\n maxDimension: self.defaults.maxHeight,\r\n serializableValue: postMeasureCookie.Height,\r\n getDimensionsEighths: [{ name: \"0/0\", value: 0 }, { name: \"1/8\", value: 1 }, { name: \"1/4\", value: 2 }, { name: \"3/8\", value: 3 }, { name: \"1/2\", value: 4 }, { name: \"5/8\", value: 5 }, { name: \"3/4\", value: 6 }, { name: \"7/8\", value: 7 }]\r\n };\r\n localPersistance.persist( \"SELECTED_WIDTH_STORAGE_KEY\", widthStorage );\r\n localPersistance.persist( \"SELECTED_HEIGHT_STORAGE_KEY\", heightStorage );\r\n Cookies.set( \"widthz\", postMeasureCookie.Width );\r\n Cookies.set( \"hghtz\", postMeasureCookie.Height );\r\n\r\n\r\n\r\n self.sizeOptions = $.extend( {}, self.defaults, sizeOptions );\r\n self.widthDimension = new PricingSupport.WidthDimension( self.sizeOptions.minWidth, self.sizeOptions.maxWidth );\r\n self.heightDimension = new PricingSupport.HeightDimension( self.sizeOptions.minHeight, self.sizeOptions.maxHeight );\r\n if (globals.productPrice.Price < 0) {\r\n self.price = ko.observable( \"N/A\" );\r\n } else {\r\n self.price = ko.observable( globals.productPrice.Price ).publishOn( \"colorSelectorPrice\" );\r\n }\r\n \r\n self.allNA = ko.computed( function () {\r\n return self.price() === \"N/A\";\r\n } );\r\n \r\n self.widthWhole = ko.observable( self.widthDimension.dimension.valueWhole() );\r\n self.heightWhole = ko.observable( self.heightDimension.dimension.valueWhole() );\r\n self.currentChoiceIds = ko.observableArray();\r\n self.dimensionsAdjustedByServer = ko.observable( globals.dimensionsAdjusted );\r\n\r\n self.widthWhole.subscribe( function ( newValue ) {\r\n self.widthDimension.dimension.valueWhole( newValue );\r\n } );\r\n self.heightWhole.subscribe( function ( newValue ) {\r\n self.heightDimension.dimension.valueWhole( newValue );\r\n } );\r\n self.isLoadingPrices = ko.observable( false );\r\n productPageChannel.subscribe( \"updatePrice\", function ( data ) {\r\n\r\n self.updatePrice();\r\n } );\r\n\r\n self.updatePrice = function ( data, e, callback ) {\r\n var params = buildPricingContext();\r\n if ( SamePricingContext( params ) ) {\r\n return;\r\n }\r\n \r\n self.oldPricingContext = params;\r\n\r\n $.ajax( {\r\n url: globals.paths.loadExactSiteProductPricing,\r\n type: \"GET\",\r\n contentType: \"application/json; charset=utf-8\",\r\n data: {\r\n context: JSON.stringify( params )\r\n }\r\n } ).done( function ( data, status, xhr ) {\r\n if ( data.ForCurrentContext !== null ) {\r\n if ( data.ForCurrentContext === \"0\" ) {\r\n self.price( \"N/A\" );\r\n } else {\r\n self.price( data.ForCurrentContext.toFixed( 2 ) );\r\n }\r\n xhr.status = \"success\";\r\n } else {\r\n self.price( \"N/A\" );\r\n xhr.status = \"failure\";\r\n }\r\n\r\n } ).always( function () {\r\n if ( $.isFunction( callback ) ) {\r\n callback();\r\n }\r\n } ).fail( function () {\r\n self.price( \"N/A\" );\r\n } );\r\n };\r\n var buildPricingContext = function () {\r\n var localPersistance = new LocalStorage();\r\n\r\n var savedState = localPersistance.getFromLocalStorage( \"option-state-\" + self.productId );\r\n if ( savedState ) {\r\n var selectedChoices = JSON.parse( savedState );\r\n var selectedChoiceIds = [];\r\n _.each( selectedChoices, function ( sc ) {\r\n // Add to the collection only the sampleable choices\r\n if ( sc.id !== self.widthOption.ChoiceId && sc.id !== self.heightOption.ChoiceId ) {\r\n selectedChoiceIds.push( sc.id );\r\n }\r\n } );\r\n }\r\n\r\n var params = {\r\n \"ProductId\": self.productId,\r\n \"Choices\": [],\r\n \"ForContextOnly\": true\r\n };\r\n\r\n // Width\r\n if ( self.widthOption !== null ) {\r\n params.Choices.push( {\r\n ChoiceId: self.widthOption.ChoiceId,\r\n OptionId: self.widthOption.OptionId,\r\n OptionType: \"width\",\r\n ChoiceValue: postMeasureCookie.Width,\r\n ChoiceDataType: \"DimensionInchesEighth\"\r\n } );\r\n }\r\n\r\n // Height\r\n if ( self.heightOption !== null ) {\r\n params.Choices.push( {\r\n ChoiceId: self.heightOption.ChoiceId,\r\n OptionId: self.heightOption.OptionId,\r\n OptionType: \"height\",\r\n ChoiceValue: postMeasureCookie.Height,\r\n ChoiceDataType: \"DimensionInchesEighth\"\r\n } );\r\n }\r\n\r\n // Samples (mostly colors)\r\n if ( selectedChoiceIds ) {\r\n _.each( self.sampleOptions.Options, function ( sampleOption ) {\r\n var optionType = sampleOption.Type ? sampleOption.Type.replace( \" \", \"\" ).toLowerCase() : \"\";\r\n _.each( sampleOption.Groups, function ( group ) {\r\n _.each( group.Choices, function ( choice ) {\r\n if ( _.contains( selectedChoiceIds, choice.ChoiceId ) ) {\r\n params.Choices.push( {\r\n ChoiceId: choice.ChoiceId,\r\n OptionId: sampleOption.OptionId,\r\n OptionType: optionType,\r\n ChoiceValue: true,\r\n ChoiceDataType: \"List\"\r\n } );\r\n var index = selectedChoiceIds.indexOf( choice.ChoiceId );\r\n if ( index > -1 ) selectedChoiceIds.splice( index, 1 );\r\n }\r\n\r\n if ( !selectedChoiceIds.length ) {\r\n return params;\r\n }\r\n } );\r\n } );\r\n } );\r\n }\r\n return params;\r\n };\r\n\r\n var getSampleOptionIds = function () {\r\n\r\n // Samples (mostly colors)\r\n var params = [];\r\n _.each( self.sampleOptions, function ( sampleOption ) {\r\n params.push( sampleOption.OptionId );\r\n } );\r\n\r\n return params;\r\n };\r\n\r\n var SamePricingContext = function ( newPricingContext ) {\r\n if ( self.oldPricingContext && newPricingContext ) {\r\n if ( self.oldPricingContext.ProductId === newPricingContext.ProductId &&\r\n self.oldPricingContext.ForContextOnly === newPricingContext.ForContextOnly &&\r\n self.oldPricingContext.Choices.length === newPricingContext.Choices.length ) {\r\n for ( var i = 0, j = newPricingContext.Choices.length; i < j; i++ ) {\r\n var newChoice = newPricingContext.Choices[i];\r\n var oldChoice = self.oldPricingContext.Choices[i];\r\n if ( newChoice.ChoiceId !== oldChoice.ChoiceId ||\r\n newChoice.OptionId !== oldChoice.OptionId ||\r\n newChoice.OptionType !== oldChoice.OptionType ||\r\n newChoice.ChoiceValue !== oldChoice.ChoiceValue ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n self.publishDimensionsChangedEvent = function () {\r\n postal.publish( {\r\n topic: \"dimensions.changed\",\r\n data: {\r\n pricingContext: buildPricingContext(),\r\n optionIds: getSampleOptionIds(),\r\n productId: self.productId,\r\n width: self.widthDimension,\r\n height: self.heightDimension\r\n }\r\n } );\r\n };\r\n\r\n \r\n };\r\n\r\n return EstimateProductPricePostMeasureViewModel;\r\n\r\n} );\r\n","import BrightCove from 'brightcove'\r\nimport brightcovePlayerLoader from '@brightcove/player-loader';\r\ndefine( [\r\n \"globals\",\r\n \"base-view-model\",\r\n \"knockout\",\r\n \"underscore\",\r\n \"postal\",\r\n \"jquery\",\r\n \"tappy\"],\r\nfunction ( globals, baseViewModel, ko, _, postal, $ ) {\r\n // \"use strict\";\r\n\r\n var ImageModel = function ( urlAddress, id, mediaId, altText, caption, isVideo ) {\r\n var self = this;\r\n self.path = urlAddress;\r\n self.id = id;\r\n self.mediaId = mediaId;\r\n self.hidden = ko.observable( false );\r\n self.altText = altText;\r\n self.caption = caption;\r\n self.isVideo = isVideo === undefined ? false : true;\r\n };\r\n\r\n var ThumbnailModel = function ( urlAddress, id, mediaId, altText, caption, isVideo ) {\r\n var imageDesktopDimensions = globals.imageDimensions || { width: 400, height: 400 };\r\n var self = this;\r\n var channel = postal.channel( \"productpage\" );\r\n self.id = id;\r\n self.mediaId = mediaId;\r\n self.imageUrl = urlAddress;\r\n self.path = self.imageUrl + \"?quality=90&mode=crop&anchor=middlecenter&width=100&height=100&format=jpg\";\r\n self.imagePath = self.imageUrl + \"?quality=90&mode=crop&anchor=middlecenter&width=\" + imageDesktopDimensions.width + \"&height=\" + imageDesktopDimensions.height + \"&format=jpg\";\r\n self.imagePathMobile = self.imageUrl + \"?quality=90&mode=crop&anchor=middlecenter&width=400&height=250&format=jpg\";\r\n self.imagePathDesktop = self.imageUrl + \"?quality=90&mode=crop&anchor=middlecenter&width=\" + imageDesktopDimensions.width + \"&height=\" + imageDesktopDimensions.height + \"&format=jpg\";\r\n self.altText = altText;\r\n self.caption = ko.observable( caption );\r\n self.requestMainGallery = function () {\r\n channel.publish( \"show.main.gallery\", self.id );\r\n };\r\n self.isVideo = isVideo === undefined ? false : true;\r\n self.changeMainImage = function () {\r\n if ( self.isVideo === true ) {\r\n return;\r\n }\r\n channel.publish( \"change.main.image\", self );\r\n };\r\n self.isSelected = ko.observable( false );\r\n };\r\n\r\n var ProductGalleryViewModel = function ( data, imageQueryStringParams ) {\r\n var self = this;\r\n ko.utils.extend( self, baseViewModel );\r\n\r\n self.maxPreviewGallerySize = 999;\r\n self.thumbnails = ko.observableArray();\r\n self.previewThumbnails = ko.observableArray();\r\n self.images = ko.observableArray();\r\n self.mainImage = ko.observable();\r\n self.moreImagesAvailable = data.length > self.maxPreviewGallerySize;\r\n self.videos = ko.observableArray();\r\n self.isMobile = globals.ssm.getState( \"mobile\" ).active;\r\n self.videoAccountId = globals.brightcove.accountId;\r\n self.videoPlayerId = globals.brightcove.playerId;\r\n self.brightCove = new BrightCove();\r\n self.currGalleryVideoPlayer = {};\r\n self.hasVideos = ko.computed( function () {\r\n if ( self.videos().length === 0 ) {\r\n return false;\r\n }\r\n return true;\r\n } ).extend( {\r\n notify: 'always'\r\n } );\r\n\r\n self.viewVideo = function () {\r\n document.getElementById( 'gcc-product-gallery-type-videos' ).checked = true;\r\n if ( self.videos().length > 0 ) {\r\n self.showVideo( self.videos()[0], true );\r\n }\r\n }\r\n\r\n self.shouldShowVideosTab = ko.computed( function () {\r\n if ( globals.ssm.getState( \"mobile\" ).active ) {\r\n return false;\r\n }\r\n if ( self.hasVideos() ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } );\r\n\r\n var channel = postal.channel( \"productpage\" );\r\n self.mainImage = ko.observable( globals.models.mainImage );\r\n\r\n if ( self.mainImage() !== undefined ) {\r\n self.images.push( new ImageModel( self.mainImage().MediaUrl + '?quality=90&mode=crop&anchor=middlecenter&width=565&height=565&format=jpg', -1, self.mainImage().MediaId, self.mainImage().AltText, self.mainImage().Caption, imageQueryStringParams ) );\r\n }\r\n\r\n _.each( data, function ( element, index ) {\r\n if ( index < self.maxPreviewGallerySize ) {\r\n // Only display the first image in Gallery Preview when we have no Main Image\r\n if ( index === 0 ) {\r\n if ( self.mainImage() === undefined ) {\r\n self.images.push( new ImageModel( element.MediaUrl, index, element.MediaId, element.AlternateText, element.Caption, imageQueryStringParams ) );\r\n }\r\n }\r\n if ( element.PresentationName !== \"Main Image\" ) {\r\n self.thumbnails.push( new ThumbnailModel( element.MediaUrl, index, element.MediaId, element.AlternateText, element.Caption ) );\r\n if ( self.previewThumbnails().length < 4 ) {\r\n self.previewThumbnails.push( new ThumbnailModel( element.MediaUrl, index, element.MediaId, element.AlternateText, element.Caption ) );\r\n }\r\n }\r\n }\r\n } );\r\n\r\n channel.subscribe( \"change.main.image\", function ( thumbnail ) {\r\n $( \".bdc-product-slideshow:first\" ).slick( \"slickGoTo\", ( parseInt( thumbnail.id ) ) );\r\n } );\r\n\r\n self.requestMainGallery = function () {\r\n channel.publish( \"show.main.gallery\" );\r\n };\r\n\r\n // This function is specific to the gallery detail modal.\r\n self.changeMedia = function ( media ) {\r\n if (media.isSelected()) return;\r\n if ( media instanceof ThumbnailModel ) {\r\n $( \".bdc-current-video-caption\" ).hide();\r\n self.clearCurrentVideo(\"#bcVideoPlayerWrapper-Modal\");\r\n self.changeImage( media );\r\n } else {\r\n $( \".bdc-current-video-caption\").show();\r\n _.each(self.thumbnails(), function(thumbnail) {\r\n thumbnail.isSelected( false );\r\n });\r\n _.each(self.images(), function(image) {\r\n image.hidden( true );\r\n });\r\n _.each(self.videos(), function(video) {\r\n video.isSelected( false );\r\n });\r\n media.isSelected( true );\r\n self.setCurrentVideo(media, \"#bcVideoPlayerWrapper-Modal\");\r\n }\r\n };\r\n\r\n self.startSlideshow = function () {\r\n var $slideShow = $( \".bdc-product-slideshow:first\" );\r\n var $slideShowThumbnails = $( \".bdc-product-slideshow-thumbnails\" );\r\n var imagesCount = $( \".bdc-product-slideshow>div\" ).length;\r\n var asNavFor = $slideShowThumbnails.length == 0 ? null : \".bdc-product-slideshow-thumbnails\";\r\n\r\n if ( imagesCount > 1 ) {\r\n if ( $slideShow.length > 0 ) {\r\n $slideShow.slick( {\r\n lazyLoad: \"ondemand\",\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n arrows: false,\r\n dots: true,\r\n asNavFor: asNavFor\r\n } );\r\n }\r\n\r\n if ( $slideShowThumbnails.length > 0 ) {\r\n $slideShowThumbnails.slick( {\r\n arrows: false,\r\n slidesToShow: ( imagesCount >= 4 ) ? 4 : imagesCount,\r\n slidesToScroll: 1,\r\n asNavFor: \".bdc-product-slideshow:first\",\r\n focusOnSelect: true\r\n } ).init( function () {\r\n // Focus on slideshow so the user can use keys to navigate.\r\n $( \"div.slick-list.draggable:last\" ).focus();\r\n } ).on( \"beforeChange\", function ( event, slick, currentSlide, nextSlide ) {\r\n } );\r\n\r\n $( \".bdc-product-slideshow-thumbnails div[data-slick-index=0]\" ).addClass( \"bdc-product-slideshow-thumbnails-active\" );\r\n $slideShow.on( \"beforeChange\", function ( event, slick, currentSlide, nextSlide ) {\r\n $( \".bdc-product-slideshow-thumbnails div[data-slick-index='\" + currentSlide + \"']\" ).removeClass( \"bdc-product-slideshow-thumbnails-active\" );\r\n $( \".bdc-product-slideshow-thumbnails div[data-slick-index='\" + nextSlide + \"']\" ).addClass( \"bdc-product-slideshow-thumbnails-active\" );\r\n } );\r\n }\r\n }\r\n\r\n $( \".bdc-product-slideshow:first figcaption\" ).show();\r\n };\r\n\r\n self.filterThumbnails = function ( viewModel, event ) {\r\n var selectedTab = event.target.id.substr( event.target.id.lastIndexOf( \"-\" ) + 1 );\r\n if ( selectedTab == \"all\" ) {\r\n $( \"#gcc-product-gallery-detail-type li\" ).show();\r\n } else if ( selectedTab == \"photos\" ) {\r\n $( \".gcc-product-gallery-detail-thumbnails-photo\" ).show();\r\n $( \".gcc-product-gallery-detail-thumbnails-video\" ).hide();\r\n } else if ( selectedTab == \"videos\" ) {\r\n $( \".gcc-product-gallery-detail-thumbnails-video\" ).show();\r\n $( \".gcc-product-gallery-detail-thumbnails-photo\" ).hide();\r\n }\r\n return true;\r\n };\r\n\r\n self.changeImage = function ( thumbnail ) {\r\n if ( !thumbnail ) {\r\n thumbnail = self.thumbnails()[0];\r\n }\r\n\r\n for ( var i = 0; i < self.thumbnails().length; i++ ) {\r\n self.thumbnails()[i].isSelected( false );\r\n }\r\n for ( var i = 0; i < self.videos().length; i++ ) {\r\n self.videos()[i].isSelected( false );\r\n }\r\n thumbnail.isSelected( true );\r\n\r\n var images = self.images;\r\n var findVisibleImage = function ( currentImage ) {\r\n return !currentImage.hidden();\r\n };\r\n var visibleImage = _.find( images(), findVisibleImage );\r\n\r\n if ( visibleImage !== undefined ) {\r\n if ( visibleImage.id === thumbnail.id ) return;\r\n visibleImage.hidden( true );\r\n }\r\n\r\n var findMatchingImage = function ( currentImage ) {\r\n return currentImage.id === thumbnail.id;\r\n };\r\n var image = _.find( images(), findMatchingImage );\r\n if ( image === undefined ) {\r\n image = new ImageModel( thumbnail.imageUrl + \"?quality=90&mode=crop&anchor=middlecenter&width=565&height=565&format=jpg\", thumbnail.id, thumbnail.mediaId, thumbnail.altText, thumbnail.caption() );\r\n images.push( image );\r\n }\r\n image.hidden( false );\r\n };\r\n\r\n self.changeImageById = function ( thumbnailId ) {\r\n var thumb = _.find( self.thumbnails(), function ( currentThumbnail ) {\r\n return currentThumbnail.id === thumbnailId;\r\n } );\r\n\r\n self.changeImage( thumb );\r\n };\r\n\r\n // This function is specific to the primary gallery.\r\n self.showVideo = function (video, shouldAutoPlay) {\r\n if (video.isSelected()) return;\r\n if (globals.ssm.getState(\"mobile\").active && $($(\".bdc-product-slideshow\")[2] ).slick(\"slickCurrentSlide\") == 0) {\r\n var $mobileVideoSlideshow = $( $(\".bdc-product-slideshow\")[2]);\r\n $mobileVideoSlideshow.slick(\"slickGoTo\", 0);\r\n $(\"#bdc-product-mobile-video-slideshow .slick-dots li:first-child\").trigger(\"click\");\r\n }\r\n for (var i = 0; i < self.videos().length; i++) {\r\n self.videos()[i].isSelected(false);\r\n }\r\n video.isSelected( true );\r\n self.setCurrentVideo(video, \"#bcVideoPlayerWrapper-Gallery\");\r\n return true;\r\n };\r\n\r\n self.setCurrentVideo = function (video, elementSelector) {\r\n self.clearCurrentVideo(elementSelector);\r\n var durationAsTime = new Date(video.duration).toLocaleTimeString([], { minute: '2-digit', second: '2-digit' });\r\n $(\".bdc-current-video-caption span\").text(video.name);\r\n $(\".bdc-current-video-caption small\").text(durationAsTime);\r\n\r\n brightcovePlayerLoader({\r\n refNode: elementSelector,\r\n videoId: video.id,\r\n accountId:self.videoAccountId,\r\n playerId:self.videoPlayerId,\r\n embedId:\"default\",\r\n onSuccess: function(success) {\r\n var player = success.ref;\r\n var playerElement = player.playerElIngest_;\r\n playerElement.classList.add(\"vjs-fill\");\r\n self.currGalleryVideoPlayer[elementSelector] = player;\r\n player.one('play', () => self.sendVideoEventAnalytics(\"video start\", video.id)); // Recomended in docs instead of first play event\r\n player.on('ended', () => self.sendVideoEventAnalytics(\"video complete\", video.id));\r\n }\r\n });\r\n };\r\n\r\n self.clearCurrentVideo = function (elementSelector) {\r\n var galleryPlayer = $(elementSelector);\r\n galleryPlayer.empty();\r\n console.log(self.currGalleryVideoPlayer, self.currGalleryVideoPlayer[elementSelector]);\r\n if (self.currGalleryVideoPlayer[elementSelector]) {\r\n self.currGalleryVideoPlayer[elementSelector].dispose();\r\n self.currGalleryVideoPlayer[elementSelector] = null;\r\n }\r\n };\r\n\r\n self.sendVideoEventAnalytics = function (eventName, videoId) {\r\n var thdAnalyticsEvent = {\r\n \"category\": {\"primaryCategory\": \"button submission\"},\r\n \"eventInfo\": {\"eventName\": eventName},\r\n \"video\": {\r\n \"id\": videoId,\r\n \"type\": digitalData.page.pageInfo.pageType}\r\n };\r\n if (window.ddoEventInit) window.ddoEventInit(thdAnalyticsEvent);\r\n else console.log('Could not send analytics event.', thdAnalyticsEvent)\r\n }\r\n\r\n self.init = function () {\r\n // Get Videos from Live Clicker\r\n self.brightCove.getVideosByProductId( globals.productId ).then( function (videos) {\r\n _.each(videos, function ( video ) {\r\n video.isSelected = ko.observable( false );\r\n self.videos.push( video );\r\n } );\r\n\r\n ko.applyBindings( self, $( \".gcc-product-gallery-type-videos-content\")[0]);\r\n\r\n if ( globals.ssm.getState( \"mobile\" ).active ) {\r\n if ( videos && videos.length > 0 ) {\r\n\r\n var $mobileVideoSlideshow = $( $( \".bdc-product-slideshow\" )[2] );\r\n\r\n $mobileVideoSlideshow.on( \"afterChange\", function ( event, slick, currentSlide, nextSlide ) {\r\n // Pause all videos\r\n if (window.videojs) {\r\n var players = window.videojs.getAllPlayers();\r\n _.each(players, function ( player ) { player.pause(); } );\r\n }\r\n // Make sure current slide has a video to show.\r\n var currentVideoContainer = $( event.target ).find( \".slick-active\" ).find( \".bdc-product-mobile-video-container\" )[0];\r\n var video = videos[currentSlide];\r\n // Check if video is injected yet\r\n if ($(currentVideoContainer).find(\"video-js\").length == 0) {\r\n // Add if needed\r\n brightcovePlayerLoader({\r\n refNode: currentVideoContainer,\r\n videoId: video.id,\r\n accountId:self.videoAccountId,\r\n playerId:self.videoPlayerId,\r\n embedId:\"default\",\r\n onSuccess: function(success) {\r\n var player = success.ref;\r\n var playerElement = player.playerElIngest_;\r\n playerElement.classList.add(\"vjs-fill\");\r\n player.one('play', () => self.sendVideoEventAnalytics(\"video start\", video.id)); // Recomended in docs instead of first play event\r\n player.on('ended', () => self.sendVideoEventAnalytics(\"video complete\", video.id));\r\n }\r\n });\r\n }\r\n } );\r\n\r\n $mobileVideoSlideshow.slick( {\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n arrows: false,\r\n dots: true\r\n } );\r\n }\r\n }\r\n } );\r\n };\r\n\r\n if (globals.siteId !== 11) {\r\n self.init();\r\n }\r\n };\r\n\r\n return ProductGalleryViewModel;\r\n} );\r\n","/*! @name @brightcove/player-loader @version 1.8.0 @license Apache-2.0 */\nimport document from 'global/document';\nimport window from 'global/window';\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nvar version = \"1.8.0\";\n\n/*! @name @brightcove/player-url @version 1.2.0 @license Apache-2.0 */\nvar version$1 = \"1.2.0\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n// The parameters that may include JSON.\nvar JSON_ALLOWED_PARAMS = ['catalogSearch', 'catalogSequence'];\n\n// The parameters that may be set as query string parameters for iframes.\nvar IFRAME_ALLOWED_QUERY_PARAMS = ['adConfigId', 'applicationId', 'catalogSearch', 'catalogSequence', 'playlistId', 'playlistVideoId', 'videoId'];\n\n/**\n * Gets the value of a parameter and encodes it as a string.\n *\n * For certain keys, JSON is allowed and will be encoded.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {string} key\n * The key in the params object.\n *\n * @return {string|undefined}\n * The encoded value - or `undefined` if none.\n */\nvar getQueryParamValue = function getQueryParamValue(params, key) {\n\n if (!params || params[key] === undefined) {\n return;\n }\n\n // If it's not a string, such as with a catalog search or sequence, we\n // try to encode it as JSON.\n if (typeof params[key] !== 'string' && JSON_ALLOWED_PARAMS.indexOf(key) !== -1) {\n try {\n return encodeURIComponent(JSON.stringify(params[key]));\n } catch (x) {\n\n // If it's not a string and we can't encode as JSON, it's ignored entirely.\n return;\n }\n }\n\n return encodeURIComponent(String(params[key]).trim()) || undefined;\n};\n\n/**\n * In some cases, we need to add query string parameters to an iframe URL.\n *\n * @private\n * @param {Object} params\n * An object of query parameters.\n *\n * @return {string}\n * A query string starting with `?`. If no valid parameters are given,\n * returns an empty string.\n */\nvar getQueryString = function getQueryString(params) {\n return Object.keys(params).filter(function (k) {\n return IFRAME_ALLOWED_QUERY_PARAMS.indexOf(k) !== -1;\n }).reduce(function (qs, k) {\n var value = getQueryParamValue(params, k);\n\n if (value !== undefined) {\n qs += qs ? '&' : '?';\n qs += encodeURIComponent(k) + '=' + value;\n }\n\n return qs;\n }, '');\n};\n\n/**\n * Generate a URL to a Brightcove Player.\n *\n * @param {Object} params\n * A set of parameters describing the player URL to create.\n *\n * @param {string} params.accountId\n * A Brightcove account ID.\n *\n * @param {string} [params.playerId=\"default\"]\n * A Brightcove player ID.\n *\n * @param {string} [params.embedId=\"default\"]\n * A Brightcove player embed ID.\n *\n * @param {boolean} [params.iframe=false]\n * Whether to return a URL for an HTML document to be embedded in\n * an iframe.\n *\n * @param {boolean} [params.minified=true]\n * When the `iframe` argument is `false`, this can be used to control\n * whether the minified or unminified JavaScript URL is returned.\n *\n * @param {string} [params.base=\"https://players.brightcove.net\"]\n * A base CDN protocol and hostname. Mainly used for testing.\n *\n * @return {string}\n * A URL to a Brightcove Player.\n */\nvar brightcovePlayerUrl = function brightcovePlayerUrl(_ref) {\n var accountId = _ref.accountId,\n _ref$base = _ref.base,\n base = _ref$base === undefined ? 'https://players.brightcove.net' : _ref$base,\n _ref$playerId = _ref.playerId,\n playerId = _ref$playerId === undefined ? 'default' : _ref$playerId,\n _ref$embedId = _ref.embedId,\n embedId = _ref$embedId === undefined ? 'default' : _ref$embedId,\n _ref$iframe = _ref.iframe,\n iframe = _ref$iframe === undefined ? false : _ref$iframe,\n _ref$minified = _ref.minified,\n minified = _ref$minified === undefined ? true : _ref$minified,\n _ref$queryParams = _ref.queryParams,\n queryParams = _ref$queryParams === undefined ? null : _ref$queryParams;\n\n var ext = '';\n\n if (iframe) {\n ext += 'html';\n } else {\n if (minified) {\n ext += 'min.';\n }\n ext += 'js';\n }\n\n if (base.charAt(base.length - 1) === '/') {\n base = base.substring(0, base.length - 1);\n }\n\n var qs = '';\n\n if (iframe && queryParams && (typeof queryParams === 'undefined' ? 'undefined' : _typeof(queryParams)) === 'object') {\n qs = getQueryString(queryParams);\n }\n\n accountId = encodeURIComponent(accountId);\n playerId = encodeURIComponent(playerId);\n embedId = encodeURIComponent(embedId);\n\n return base + '/' + accountId + '/' + playerId + '_' + embedId + '/index.' + ext + qs;\n};\n\n/**\n * The version of this module.\n *\n * @type {string}\n */\nbrightcovePlayerUrl.VERSION = version$1;\n\nvar DEFAULTS = {\n embedId: 'default',\n embedType: 'in-page',\n playerId: 'default',\n Promise: window.Promise,\n refNodeInsert: 'append'\n};\nvar DEFAULT_ASPECT_RATIO = '16:9';\nvar DEFAULT_IFRAME_HORIZONTAL_PLAYLIST = false;\nvar DEFAULT_MAX_WIDTH = '100%';\nvar EMBED_TAG_NAME_VIDEO = 'video';\nvar EMBED_TAG_NAME_VIDEOJS = 'video-js';\nvar EMBED_TYPE_IN_PAGE = 'in-page';\nvar EMBED_TYPE_IFRAME = 'iframe';\nvar REF_NODE_INSERT_APPEND = 'append';\nvar REF_NODE_INSERT_PREPEND = 'prepend';\nvar REF_NODE_INSERT_BEFORE = 'before';\nvar REF_NODE_INSERT_AFTER = 'after';\nvar REF_NODE_INSERT_REPLACE = 'replace';\nvar JSON_ALLOWED_ATTRS = ['catalogSearch', 'catalogSequence'];\n\nvar BASE_URL = 'https://players.brightcove.net/';\n/**\n * Gets the URL to a player on CDN.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @return {string}\n * A URL.\n */\n\nvar getUrl = function getUrl(params) {\n if (params.playerUrl) {\n return params.playerUrl;\n }\n\n var accountId = params.accountId,\n playerId = params.playerId,\n embedId = params.embedId,\n embedOptions = params.embedOptions;\n var iframe = params.embedType === EMBED_TYPE_IFRAME;\n return brightcovePlayerUrl({\n accountId: accountId,\n playerId: playerId,\n embedId: embedId,\n iframe: iframe,\n base: BASE_URL,\n // The unminified embed option is the exact reverse of the minified option\n // here.\n minified: embedOptions ? !embedOptions.unminified : true,\n // Pass the entire params object as query params. This is safe because\n // @brightcove/player-url only accepts a whitelist of parameters. Anything\n // else will be ignored.\n queryParams: params\n });\n};\n/**\n * Function used to get the base URL - primarily for testing.\n *\n * @private\n * @return {string}\n * The current base URL.\n */\n\n\nvar getBaseUrl = function getBaseUrl() {\n return BASE_URL;\n};\n/**\n * Function used to set the base URL - primarily for testing.\n *\n * @private\n * @param {string} baseUrl\n * A new base URL (instead of Brightcove CDN).\n */\n\n\nvar setBaseUrl = function setBaseUrl(baseUrl) {\n BASE_URL = baseUrl;\n};\n\nvar urls = {\n getUrl: getUrl,\n getBaseUrl: getBaseUrl,\n setBaseUrl: setBaseUrl\n};\n\n/**\n * Is this value an element?\n *\n * @param {Element} el\n * A maybe element.\n *\n * @return {boolean}\n * Whether or not the value is a element.\n */\n\nvar isEl = function isEl(el) {\n return Boolean(el && el.nodeType === 1);\n};\n/**\n * Is this value an element with a parent node?\n *\n * @param {Element} el\n * A maybe element.\n *\n * @return {boolean}\n * Whether or not the value is a element with a parent node.\n */\n\n\nvar isElInDom = function isElInDom(el) {\n return Boolean(isEl(el) && el.parentNode);\n};\n/**\n * Creates an iframe embed code.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @return {Element}\n * The DOM element that will ultimately be passed to the `bc()` function.\n */\n\n\nvar createIframeEmbed = function createIframeEmbed(params) {\n var el = document.createElement('iframe');\n el.setAttribute('allow', 'autoplay;encrypted-media;fullscreen');\n el.setAttribute('allowfullscreen', 'allowfullscreen');\n el.src = urls.getUrl(params);\n return el;\n};\n/**\n * Creates an in-page embed code.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @return {Element}\n * The DOM element that will ultimately be passed to the `bc()` function.\n */\n\n\nvar createInPageEmbed = function createInPageEmbed(params) {\n var embedOptions = params.embedOptions; // We DO NOT include the data-account, data-player, or data-embed attributes\n // here because we will be manually initializing the player.\n\n var paramsToAttrs = {\n adConfigId: 'data-ad-config-id',\n applicationId: 'data-application-id',\n catalogSearch: 'data-catalog-search',\n catalogSequence: 'data-catalog-sequence',\n deliveryConfigId: 'data-delivery-config-id',\n playlistId: 'data-playlist-id',\n playlistVideoId: 'data-playlist-video-id',\n poster: 'poster',\n videoId: 'data-video-id'\n };\n var tagName = embedOptions && embedOptions.tagName || EMBED_TAG_NAME_VIDEOJS;\n var el = document.createElement(tagName);\n Object.keys(paramsToAttrs).filter(function (key) {\n return params[key];\n }).forEach(function (key) {\n var value; // If it's not a string, such as with a catalog search or sequence, we\n // try to encode it as JSON.\n\n if (typeof params[key] !== 'string' && JSON_ALLOWED_ATTRS.indexOf(key) !== -1) {\n try {\n value = JSON.stringify(params[key]); // If it fails, don't set anything.\n } catch (x) {\n return;\n }\n } else {\n value = String(params[key]).trim();\n }\n\n el.setAttribute(paramsToAttrs[key], value);\n });\n el.setAttribute('controls', 'controls');\n el.classList.add('video-js');\n return el;\n};\n/**\n * Wraps an element in responsive intrinsic ratio elements.\n *\n * @private\n * @param {string} embedType\n * The type of the embed.\n *\n * @param {Object} embedOptions\n * Embed options from the params.\n *\n * @param {Element} el\n * The DOM element.\n *\n * @return {Element}\n * A new element (if needed).\n */\n\n\nvar wrapResponsive = function wrapResponsive(embedType, embedOptions, el) {\n if (!embedOptions.responsive) {\n return el;\n }\n\n el.style.position = 'absolute';\n el.style.top = '0px';\n el.style.right = '0px';\n el.style.bottom = '0px';\n el.style.left = '0px';\n el.style.width = '100%';\n el.style.height = '100%';\n\n var responsive = _extends({\n aspectRatio: DEFAULT_ASPECT_RATIO,\n iframeHorizontalPlaylist: DEFAULT_IFRAME_HORIZONTAL_PLAYLIST,\n maxWidth: DEFAULT_MAX_WIDTH\n }, embedOptions.responsive); // This value is validate at a higher level, so we can trust that it's in the\n // correct format.\n\n\n var aspectRatio = responsive.aspectRatio.split(':').map(Number);\n var inner = document.createElement('div');\n var paddingTop = aspectRatio[1] / aspectRatio[0] * 100; // For iframes with a horizontal playlist, the playlist takes up 20% of the\n // vertical space (if shown); so, adjust the vertical size of the embed to\n // avoid black bars.\n\n if (embedType === EMBED_TYPE_IFRAME && responsive.iframeHorizontalPlaylist) {\n paddingTop *= 1.25;\n }\n\n inner.style.paddingTop = paddingTop + '%';\n inner.appendChild(el);\n var outer = document.createElement('div');\n outer.style.position = 'relative';\n outer.style.display = 'block';\n outer.style.maxWidth = responsive.maxWidth;\n outer.appendChild(inner);\n return outer;\n};\n/**\n * Wraps an element in a Picture-in-Picture plugin container.\n *\n * @private\n * @param {Object} embedOptions\n * Embed options from the params.\n *\n * @param {Element} el\n * The DOM element.\n *\n * @return {Element}\n * A new element (if needed).\n */\n\n\nvar wrapPip = function wrapPip(embedOptions, el) {\n if (!embedOptions.pip) {\n return el;\n }\n\n var pip = document.createElement('div');\n pip.classList.add('vjs-pip-container');\n pip.appendChild(el);\n return pip;\n};\n/**\n * Wraps a bare embed element with necessary parent elements, depending on\n * embed options given in params.\n *\n * @private\n * @param {string} embedType\n * The type of the embed.\n *\n * @param {Object} embedOptions\n * Embed options from the params.\n *\n * @param {Element} embed\n * The embed DOM element.\n *\n * @return {Element}\n * A new element (if needed) or the embed itself.\n */\n\n\nvar wrapEmbed = function wrapEmbed(embedType, embedOptions, embed) {\n if (!embedOptions) {\n return embed;\n }\n\n return wrapPip(embedOptions, wrapResponsive(embedType, embedOptions, embed));\n};\n/**\n * Inserts a previously-created embed element into the page based on params.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {Element} embed\n * The embed DOM element.\n *\n * @return {Element}\n * The embed DOM element.\n */\n\n\nvar insertEmbed = function insertEmbed(params, embed) {\n var refNode = params.refNode,\n refNodeInsert = params.refNodeInsert;\n var refNodeParent = refNode.parentNode; // Wrap the embed, if needed, in container elements to support various\n // plugins.\n\n var wrapped = wrapEmbed(params.embedType, params.embedOptions, embed); // Decide where to insert the wrapped embed.\n\n if (refNodeInsert === REF_NODE_INSERT_BEFORE) {\n refNodeParent.insertBefore(wrapped, refNode);\n } else if (refNodeInsert === REF_NODE_INSERT_AFTER) {\n refNodeParent.insertBefore(wrapped, refNode.nextElementSibling || null);\n } else if (refNodeInsert === REF_NODE_INSERT_REPLACE) {\n refNodeParent.replaceChild(wrapped, refNode);\n } else if (refNodeInsert === REF_NODE_INSERT_PREPEND) {\n refNode.insertBefore(wrapped, refNode.firstChild || null); // Append is the default.\n } else {\n refNode.appendChild(wrapped);\n } // If the playlist embed option is provided, we need to add a playlist element\n // immediately after the embed. This has to happen after the embed is inserted\n // into the DOM (above).\n\n\n if (params.embedOptions && params.embedOptions.playlist) {\n var playlistTagName = params.embedOptions.playlist.legacy ? 'ul' : 'div';\n var playlist = document.createElement(playlistTagName);\n playlist.classList.add('vjs-playlist');\n embed.parentNode.insertBefore(playlist, embed.nextElementSibling || null);\n } // Clean up internal reference to the refNode to avoid potential memory\n // leaks in case the params get persisted somewhere. We won't need it beyond\n // this point.\n\n\n params.refNode = null; // Return the original embed element that can be passed to `bc()`.\n\n return embed;\n};\n/**\n * Handles `onEmbedCreated` callback invocation.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {Element} embed\n * The embed DOM element.\n *\n * @return {Element}\n * A possibly-new DOM element.\n */\n\n\nvar onEmbedCreated = function onEmbedCreated(params, embed) {\n if (typeof params.onEmbedCreated !== 'function') {\n return embed;\n }\n\n var result = params.onEmbedCreated(embed);\n\n if (isEl(result)) {\n return result;\n }\n\n return embed;\n};\n/**\n * Creates an embed code of the appropriate type, runs any customizations\n * necessary, and inserts it into the DOM.\n *\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @return {Element}\n * The DOM element that will ultimately be passed to the `bc()`\n * function. Even when customized or wrapped, the return value will be\n * the target element.\n */\n\n\nvar createEmbed = function createEmbed(params) {\n var embed = params.embedType === EMBED_TYPE_IFRAME ? createIframeEmbed(params) : createInPageEmbed(params);\n return insertEmbed(params, onEmbedCreated(params, embed));\n};\n\n//\n// The keys follow the format \"accountId_playerId_embedId\" where accountId is\n// optional and defaults to \"*\". This happens when we detect pre-existing\n// player globals.\n\nvar actualCache = new window.Map();\n/**\n * Get the cache key given some properties.\n *\n * @private\n * @param {Object} props\n * Properties describing the player record to cache.\n *\n * @param {string} props.playerId\n * A player ID.\n *\n * @param {string} props.embedId\n * An embed ID.\n *\n * @param {string} [props.accountId=\"*\"]\n * An optional account ID. This is optional because when we search for\n * pre-existing players to avoid downloads, we will not necessarily\n * know the account ID.\n *\n * @return {string}\n * A key to be used in the script cache.\n */\n\nvar key = function key(_ref) {\n var accountId = _ref.accountId,\n playerId = _ref.playerId,\n embedId = _ref.embedId;\n return (accountId || '*') + \"_\" + playerId + \"_\" + embedId;\n};\n/**\n * Add an entry to the script cache.\n *\n * @private\n * @param {Object} props\n * Properties describing the player record to cache.\n *\n * @param {string} props.playerId\n * A player ID.\n *\n * @param {string} props.embedId\n * An embed ID.\n *\n * @param {string} [props.accountId=\"*\"]\n * An optional account ID. This is optional because when we search for\n * pre-existing players to avoid downloads, we will not necessarily\n * know the account ID. If not given, we assume that no script was\n * downloaded for this player.\n */\n\n\nvar store = function store(props) {\n actualCache.set(key(props), props.accountId ? urls.getUrl(props) : '');\n};\n/**\n * Checks if the script cache has an entry.\n *\n * @private\n * @param {Object} props\n * Properties describing the player record to cache.\n *\n * @param {string} props.playerId\n * A player ID.\n *\n * @param {string} props.embedId\n * An embed ID.\n *\n * @param {string} [props.accountId=\"*\"]\n * An optional account ID. This is optional because when we search for\n * pre-existing players to avoid downloads, we will not necessarily\n * know the account ID.\n *\n * @return {boolean}\n * Will be `true` if there is a matching cache entry.\n */\n\n\nvar has = function has(props) {\n return actualCache.has(key(props));\n};\n/**\n * Gets a cache entry.\n *\n * @private\n * @param {Object} props\n * Properties describing the player record to cache.\n *\n * @param {string} props.playerId\n * A player ID.\n *\n * @param {string} props.embedId\n * An embed ID.\n *\n * @param {string} [props.accountId=\"*\"]\n * An optional account ID. This is optional because when we search for\n * pre-existing players to avoid downloads, we will not necessarily\n * know the account ID.\n *\n * @return {string}\n * A cache entry - a URL or empty string.\n *\n */\n\n\nvar get = function get(props) {\n return actualCache.get(key(props));\n};\n/**\n * Clears the cache.\n */\n\n\nvar clear = function clear() {\n actualCache.clear();\n};\n/**\n * Iterates over the cache.\n *\n * @param {Function} fn\n * A callback function that will be called with a value and a key\n * for each item in the cache.\n */\n\n\nvar forEach = function forEach(fn) {\n actualCache.forEach(fn);\n};\n\nvar playerScriptCache = {\n clear: clear,\n forEach: forEach,\n get: get,\n has: has,\n key: key,\n store: store\n};\n\nvar REGEX_PLAYER_EMBED = /^([A-Za-z0-9]+)_([A-Za-z0-9]+)$/;\n/**\n * Gets an array of current per-player/per-embed `bc` globals that are\n * attached to the `bc` global (e.g. `bc.abc123xyz_default`).\n *\n * If `bc` is not defined, returns an empty array.\n *\n * @private\n * @return {string[]}\n * An array of keys.\n */\n\nvar getBcGlobalKeys = function getBcGlobalKeys() {\n return window.bc ? Object.keys(window.bc).filter(function (k) {\n return REGEX_PLAYER_EMBED.test(k);\n }) : [];\n};\n/**\n * Gets known global object keys that Brightcove Players may create.\n *\n * @private\n * @return {string[]}\n * An array of global variables that were added during testing.\n */\n\n\nvar getGlobalKeys = function getGlobalKeys() {\n return Object.keys(window).filter(function (k) {\n return /^videojs/i.test(k) || /^(bc)$/.test(k);\n });\n};\n/**\n * Dispose all players from a copy of Video.js.\n *\n * @param {Function} videojs\n * A copy of Video.js.\n */\n\n\nvar disposeAll = function disposeAll(videojs) {\n if (!videojs) {\n return;\n }\n\n Object.keys(videojs.players).forEach(function (k) {\n var p = videojs.players[k];\n\n if (p) {\n p.dispose();\n }\n });\n};\n/**\n * Resets environment state.\n *\n * This will dispose ALL Video.js players on the page and remove ALL `bc` and\n * `videojs` globals it finds.\n */\n\n\nvar reset = function reset() {\n // Remove all script elements from the DOM.\n playerScriptCache.forEach(function (value, key) {\n // If no script URL is associated, skip it.\n if (!value) {\n return;\n } // Find all script elements and remove them.\n\n\n Array.prototype.slice.call(document.querySelectorAll(\"script[src=\\\"\" + value + \"\\\"]\")).forEach(function (el) {\n return el.parentNode.removeChild(el);\n });\n }); // Clear the internal cache that have been downloaded.\n\n playerScriptCache.clear(); // Dispose any remaining players from the `videojs` global.\n\n disposeAll(window.videojs); // There may be other `videojs` instances lurking in the bowels of the\n // `bc` global. This should eliminate any of those.\n\n getBcGlobalKeys().forEach(function (k) {\n return disposeAll(window.bc[k].videojs);\n }); // Delete any global object keys that were created.\n\n getGlobalKeys().forEach(function (k) {\n delete window[k];\n });\n};\n/**\n * At runtime, populate the cache with pre-detected players. This allows\n * people who have bundled their player or included a script tag before this\n * runs to not have to re-download players.\n */\n\n\nvar detectPlayers = function detectPlayers() {\n getBcGlobalKeys().forEach(function (k) {\n var matches = k.match(REGEX_PLAYER_EMBED);\n var props = {\n playerId: matches[1],\n embedId: matches[2]\n };\n\n if (!playerScriptCache.has(props)) {\n playerScriptCache.store(props);\n }\n });\n};\n\nvar env = {\n detectPlayers: detectPlayers,\n reset: reset\n};\n\nenv.detectPlayers();\n/**\n * Is this value a function?\n *\n * @private\n * @param {Function} fn\n * A maybe function.\n *\n * @return {boolean}\n * Whether or not the value is a function.\n */\n\nvar isFn = function isFn(fn) {\n return typeof fn === 'function';\n};\n/**\n * Checks whether an embedType parameter is valid.\n *\n * @private\n * @param {string} embedType\n * The value to test.\n *\n * @return {boolean}\n * Whether the value is valid.\n */\n\n\nvar isValidEmbedType = function isValidEmbedType(embedType) {\n return embedType === EMBED_TYPE_IN_PAGE || embedType === EMBED_TYPE_IFRAME;\n};\n/**\n * Checks whether an embedOptions.tagName parameter is valid.\n *\n * @private\n * @param {string} tagName\n * The value to test.\n *\n * @return {boolean}\n * Whether the value is valid.\n */\n\n\nvar isValidTagName = function isValidTagName(tagName) {\n return tagName === EMBED_TAG_NAME_VIDEOJS || tagName === EMBED_TAG_NAME_VIDEO;\n};\n/**\n * Checks whether a refNodeInsert parameter is valid.\n *\n * @private\n * @param {string} refNodeInsert\n * The value to test.\n *\n * @return {boolean}\n * Whether the value is valid.\n */\n\n\nvar isValidRootInsert = function isValidRootInsert(refNodeInsert) {\n return refNodeInsert === REF_NODE_INSERT_APPEND || refNodeInsert === REF_NODE_INSERT_PREPEND || refNodeInsert === REF_NODE_INSERT_BEFORE || refNodeInsert === REF_NODE_INSERT_AFTER || refNodeInsert === REF_NODE_INSERT_REPLACE;\n};\n/**\n * Checks parameters and throws an error on validation problems.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @throws {Error} If accountId is missing.\n * @throws {Error} If refNode is missing or invalid.\n * @throws {Error} If embedType is missing or invalid.\n * @throws {Error} If attempting to use an iframe embed with options.\n * @throws {Error} If attempting to use embedOptions.responsiveIframe with a\n * non-iframe embed.\n * @throws {Error} If refNodeInsert is missing or invalid.\n */\n\n\nvar checkParams = function checkParams(params) {\n var accountId = params.accountId,\n embedOptions = params.embedOptions,\n embedType = params.embedType,\n options = params.options,\n refNode = params.refNode,\n refNodeInsert = params.refNodeInsert;\n\n if (!accountId) {\n throw new Error('accountId is required');\n } else if (!isElInDom(refNode)) {\n throw new Error('refNode must resolve to a node attached to the DOM');\n } else if (!isValidEmbedType(embedType)) {\n throw new Error('embedType is missing or invalid');\n } else if (embedType === EMBED_TYPE_IFRAME && options) {\n throw new Error('cannot use options with an iframe embed');\n } else if (embedOptions && embedOptions.tagName !== undefined && !isValidTagName(embedOptions.tagName)) {\n throw new Error(\"embedOptions.tagName is invalid (value: \\\"\" + embedOptions.tagName + \"\\\")\");\n } else if (embedOptions && embedOptions.responsive && embedOptions.responsive.aspectRatio && !/^\\d+\\:\\d+$/.test(embedOptions.responsive.aspectRatio)) {\n throw new Error(\"embedOptions.responsive.aspectRatio must be in the \\\"n:n\\\" format (value: \\\"\" + embedOptions.responsive.aspectRatio + \"\\\")\");\n } else if (!isValidRootInsert(refNodeInsert)) {\n throw new Error('refNodeInsert is missing or invalid');\n }\n};\n/**\n * Normalizes a `refNode` param to an element - or `null`.\n *\n * @private\n * @param {Element|string} refNode\n * The value of a `refNode` param.\n *\n * @return {Element|null}\n * A DOM element or `null` if the `refNode` was given as a string and\n * did not match an element.\n */\n\n\nvar resolveRefNode = function resolveRefNode(refNode) {\n if (isElInDom(refNode)) {\n return refNode;\n }\n\n if (typeof refNode === 'string') {\n return document.querySelector(refNode);\n }\n\n return null;\n};\n/**\n * Initializes a player and returns it.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {Element} embed\n * An element that will be passed to the `bc()` function.\n *\n * @param {Function} resolve\n * A function to call if a player is successfully initialized.\n *\n * @param {Function} reject\n * A function to call if a player fails to be initialized.\n *\n * @return {Object}\n * A success object whose `ref` is a player.\n */\n\n\nvar initPlayer = function initPlayer(params, embed, resolve, reject) {\n var embedId = params.embedId,\n playerId = params.playerId;\n var bc = window.bc[playerId + \"_\" + embedId] || window.bc;\n\n if (!bc) {\n return reject(new Error(\"missing bc function for \" + playerId));\n }\n\n playerScriptCache.store(params);\n var player;\n\n try {\n player = bc(embed, params.options); // Add a PLAYER_LOADER property to bcinfo to indicate this player was\n // loaded via that mechanism.\n\n if (player.bcinfo) {\n player.bcinfo.PLAYER_LOADER = true;\n }\n } catch (x) {\n var message = 'Could not initialize the Brightcove Player.'; // Update the rejection message based on known conditions that can cause it.\n\n if (params.embedOptions.tagName === EMBED_TAG_NAME_VIDEOJS) {\n message += ' You are attempting to embed using a \"video-js\" element.' + ' Please ensure that your Player is v6.11.0 or newer in order to' + ' support this embed type. Alternatively, pass `\"video\"` for' + ' `embedOptions.tagName`.';\n }\n\n return reject(new Error(message));\n }\n\n resolve({\n type: EMBED_TYPE_IN_PAGE,\n ref: player\n });\n};\n/**\n * Loads a player from CDN and embeds it.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {Function} resolve\n * A function to call if a player is successfully initialized.\n *\n * @param {Function} reject\n * A function to call if a player fails to be initialized.\n */\n\n\nvar loadPlayer = function loadPlayer(params, resolve, reject) {\n params.refNode = resolveRefNode(params.refNode);\n checkParams(params);\n var refNode = params.refNode,\n refNodeInsert = params.refNodeInsert; // Store a reference to the refNode parent. When we use the replace method,\n // we'll need it as the location to store the script element.\n\n var refNodeParent = refNode.parentNode;\n var embed = createEmbed(params); // If this is an iframe, all we need to do is create the embed code and\n // inject it. Because there is no reliable way to hook into an iframe from\n // the parent page, we simply resolve immediately upon creating the embed.\n\n if (params.embedType === EMBED_TYPE_IFRAME) {\n resolve({\n type: EMBED_TYPE_IFRAME,\n ref: embed\n });\n return;\n } // If we've already downloaded this script or detected a matching global, we\n // should have the proper `bc` global and can bypass the script creation\n // process.\n\n\n if (playerScriptCache.has(params)) {\n return initPlayer(params, embed, resolve, reject);\n }\n\n var script = document.createElement('script');\n\n script.onload = function () {\n return initPlayer(params, embed, resolve, reject);\n };\n\n script.onerror = function () {\n reject(new Error('player script could not be downloaded'));\n };\n\n script.async = true;\n script.charset = 'utf-8';\n script.src = urls.getUrl(params);\n\n if (refNodeInsert === REF_NODE_INSERT_REPLACE) {\n refNodeParent.appendChild(script);\n } else {\n refNode.appendChild(script);\n }\n};\n/**\n * A function for asynchronously loading a Brightcove Player into a web page.\n *\n * @param {Object} parameters\n * A parameters object. See README for details.\n *\n * @return {Promise|undefined}\n * A Promise, if possible.\n */\n\n\nvar brightcovePlayerLoader = function brightcovePlayerLoader(parameters) {\n var params = _extends({}, DEFAULTS, parameters);\n\n var Promise = params.Promise,\n onSuccess = params.onSuccess,\n onFailure = params.onFailure; // When Promise is not available or any success/failure callback is given,\n // do not attempt to use Promises.\n\n if (!isFn(Promise) || isFn(onSuccess) || isFn(onFailure)) {\n return loadPlayer(params, isFn(onSuccess) ? onSuccess : function () {}, isFn(onFailure) ? onFailure : function (err) {\n throw err;\n });\n } // Promises are supported, use 'em.\n\n\n return new Promise(function (resolve, reject) {\n return loadPlayer(params, resolve, reject);\n });\n};\n/**\n * Expose a non-writable, non-configurable property on the\n * `brightcovePlayerLoader` function.\n *\n * @private\n * @param {string} key\n * The property key.\n *\n * @param {string|Function} value\n * The value.\n */\n\n\nvar expose = function expose(key, value) {\n Object.defineProperty(brightcovePlayerLoader, key, {\n configurable: false,\n enumerable: true,\n value: value,\n writable: false\n });\n};\n/**\n * Get the base URL for players. By default, this will be the Brightcove CDN.\n *\n * @return {string}\n * The current base URL.\n */\n\n\nexpose('getBaseUrl', function () {\n return urls.getBaseUrl();\n});\n/**\n * Set the base URL for players. By default, this will be the Brightcove CDN,\n * but can be overridden with this function.\n *\n * @param {string} baseUrl\n * A new base URL (instead of Brightcove CDN).\n */\n\nexpose('setBaseUrl', function (baseUrl) {\n urls.setBaseUrl(baseUrl);\n});\n/**\n * Get the URL for a player.\n */\n\nexpose('getUrl', function (options) {\n return urls.getUrl(options);\n});\n/**\n * Completely resets global state.\n *\n * This will dispose ALL Video.js players on the page and remove ALL `bc` and\n * `videojs` globals it finds.\n */\n\nexpose('reset', function () {\n return env.reset();\n}); // Define some read-only constants on the exported function.\n\n[['EMBED_TAG_NAME_VIDEO', EMBED_TAG_NAME_VIDEO], ['EMBED_TAG_NAME_VIDEOJS', EMBED_TAG_NAME_VIDEOJS], ['EMBED_TYPE_IN_PAGE', EMBED_TYPE_IN_PAGE], ['EMBED_TYPE_IFRAME', EMBED_TYPE_IFRAME], ['REF_NODE_INSERT_APPEND', REF_NODE_INSERT_APPEND], ['REF_NODE_INSERT_PREPEND', REF_NODE_INSERT_PREPEND], ['REF_NODE_INSERT_BEFORE', REF_NODE_INSERT_BEFORE], ['REF_NODE_INSERT_AFTER', REF_NODE_INSERT_AFTER], ['REF_NODE_INSERT_REPLACE', REF_NODE_INSERT_REPLACE], ['VERSION', version]].forEach(function (arr) {\n expose(arr[0], arr[1]);\n});\n\nexport default brightcovePlayerLoader;\n","\"use strict\";\n\nvar ReviewsBdc = require(\"modules/product-reviews/product-reviews-bdc\");\nvar ReviewsBca = require(\"modules/product-reviews/product-reviews-bca\");\nvar ReviewsThd = require(\"modules/product-reviews/product-reviews-thd\");\nvar globals = require(\"globals\");\n\nmodule.exports = function (productId, aliasId) {\n switch (globals.siteId) {\n case 2:\n return new ReviewsBca(productId, aliasId);\n case 11:\n return new ReviewsThd(productId, aliasId);\n default:\n return new ReviewsBdc(productId, aliasId);\n }\n};","define([\r\n \"globals\",\r\n \"knockout\",\r\n \"jquery\",\r\n \"scroll-to-section\"],\r\nfunction (globals, ko, $, ScrollToSection) {\r\n\r\n // Blinds.com Product Reviews module\r\n\r\n \"use strict\";\r\n\r\n var Reviews = function(productId, aliasId) {\r\n\r\n var self = this;\r\n self.productId = productId;\r\n self.aliasId = aliasId;\r\n self.hideReviews = ko.observable(true);\r\n self.$BVCheck;\r\n\r\n self.isMobile = globals.ssm.getState(\"mobile\").active;\r\n self.hideSection = ko.observable(self.isMobile);\r\n self.hasReviews = ko.observable(true);\r\n self.buttonText = ko.observable(\"Show individual reviews\");\r\n\r\n self.ratingWidth = function(ratingValue) {\r\n var percentage = ratingValue ? ((ratingValue / 5) * 100) : 0;\r\n return percentage + \"%\";\r\n };\r\n\r\n self.numReviews = ko.observable(0);\r\n self.scrollToSection = function (hash) {\r\n if ((hash == \"testimonials\" || hash == \"BVRRWidgetID\") && self.hasReviews()) {\r\n self.showContent();\r\n new ScrollToSection(\"#testimonials\");\r\n }\r\n }\r\n\r\n self.processReviewData = function(result, callback) {\r\n\r\n self.numReviews(result.TotalReviewCount);\r\n self.hasReviews(result.TotalReviewCount > 0);\r\n\r\n if (result.TotalReviewCount > 0) {\r\n\r\n // Update reviews on mobile\r\n var ratingValue = $(\"span[itemprop=ratingValue]\").text();\r\n $(\".bdc-product-ratingstars-total\").css(\"width\", self.ratingWidth(ratingValue));\r\n $(\".bdc-product-mobile-ratings-text\").append(\"(\" + result.TotalReviewCount + \" Reviews)\");\r\n\r\n // Redirect from PIP\r\n if (location.search.indexOf(\"tab=reviews\") > -1) {\r\n if (self.isMobile) {\r\n $(\"#testimonials .bdc-product-details-title\").trigger(\"click\");\r\n }\r\n location.hash = \"#testimonials\";\r\n }\r\n\r\n var hash = window.location.hash.slice(1);\r\n self.scrollToSection(hash);\r\n\r\n // Click on show reviews\r\n $(window).on(\"hashchange\", function () {\r\n var internalhash = window.location.hash.slice(1);\r\n if (internalhash == \"BVRRWidgetID\" && self.hasReviews()) {\r\n self.showContent();\r\n self.toggleSection();\r\n }\r\n });\r\n\r\n $(\"dd.bv-rating-ratio-count, .bdc-product-mobile-ratings-text\").on(\"click\", function() {\r\n self.showContent();\r\n if (self.isMobile) {\r\n self.toggleSection();\r\n }\r\n self.scrollToSection(\"testimonials\");\r\n });\r\n\r\n } else {\r\n $(\".bdc-product-mobile-ratings\").hide();\r\n $(\".bdc-product-name-brand-wrapper\").css(\"margin-bottom\", \"1em\");\r\n }\r\n\r\n if (callback) {\r\n callback(result.TotalReviewCount);\r\n }\r\n };\r\n\r\n self.getReviewData = function(callback) {\r\n\r\n self.$BVCheck = window.setInterval(function() {\r\n var result = window.$BVResult;\r\n if (result) {\r\n window.clearInterval(self.$BVCheck);\r\n self.processReviewData(result, callback);\r\n }\r\n }, 1000);\r\n\r\n }\r\n\r\n self.showContent = function () {\r\n self.hideReviews(false);\r\n self.buttonText(\"Hide individual reviews\");\r\n };\r\n\r\n this.toggleSection = function(viewModel, event) {\r\n self.hideSection(!self.hideSection());\r\n location.hash = \"\";\r\n if (history.pushState) {\r\n history.pushState(\"\", document.title, window.location.pathname);\r\n }\r\n if (event && self.hideSection() === false) {\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n this.toggleDetails = function () {\r\n self.hideReviews(!self.hideReviews());\r\n if (self.hideReviews()) {\r\n location.hash = \"\";\r\n self.buttonText(\"Show individual reviews\");\r\n } else {\r\n if (!self.isMobile) {\r\n location.hash = \"\";\r\n location.hash = \"#testimonials\";\r\n }\r\n self.buttonText(\"Hide individual reviews\");\r\n }\r\n };\r\n\r\n }\r\n\r\n return Reviews;\r\n\r\n});\r\n","define([\r\n \"globals\",\r\n \"knockout\",\r\n \"jquery\"],\r\nfunction (globals, ko, $) {\r\n\r\n // Blinds.ca Product Reviews module\r\n\r\n \"use strict\";\r\n\r\n var Reviews = function(productId, aliasId) {\r\n\r\n var self = this;\r\n self.productId = productId;\r\n self.aliasId = aliasId;\r\n self.hideReviews = ko.observable(true);\r\n self.$BVCheck;\r\n\r\n self.isMobile = globals.ssm.getState(\"mobile\").active;\r\n self.hideSection = ko.observable(self.isMobile);\r\n self.hasReviews = ko.observable(true);\r\n self.buttonText = ko.observable(\"Show individual reviews\");\r\n\r\n self.ratingWidth = function(ratingValue) {\r\n var percentage = ratingValue ? ((ratingValue / 5) * 100) : 0;\r\n return percentage + \"%\";\r\n };\r\n\r\n self.numReviews = ko.observable(0);\r\n self.scrollToSection = function(hash) {\r\n if ((hash == \"testimonials\" || hash == \"BVRRWidgetID\") && self.hasReviews()) {\r\n self.showContent();\r\n $(\"html, body\").animate({\r\n scrollTop: $(\"#testimonials\").offset().top\r\n }, 1000);\r\n }\r\n }\r\n\r\n self.processReviewData = function(result, callback) {\r\n\r\n // Hiding reviews summary container if there are no reviews\r\n if (result.TotalReviewCount === 0) {\r\n $(\"#BVRRSummaryContainer\").hide();\r\n }\r\n\r\n self.numReviews(result.TotalReviewCount);\r\n self.hasReviews(result.TotalReviewCount > 0);\r\n\r\n if (result.TotalReviewCount > 0) {\r\n\r\n // Update reviews on mobile\r\n var ratingValue = $(\"span[itemprop=ratingValue]\").text();\r\n $(\".bdc-product-ratingstars-total\").css(\"width\", self.ratingWidth(ratingValue));\r\n $(\".bdc-product-mobile-ratings-text\").append(\"(\" + result.TotalReviewCount + \" Reviews)\");\r\n\r\n // Redirect from PIP\r\n if (location.search.indexOf(\"tab=reviews\") > -1) {\r\n if (self.isMobile) {\r\n $(\"#testimonials .bdc-product-details-title\").trigger(\"click\");\r\n }\r\n location.hash = \"#testimonials\";\r\n }\r\n\r\n var hash = window.location.hash.slice(1);\r\n self.scrollToSection(hash);\r\n\r\n // Click on show reviews\r\n $(window).on(\"hashchange\", function () {\r\n var internalhash = window.location.hash.slice(1);\r\n if (internalhash == \"BVRRWidgetID\" && self.hasReviews()) {\r\n self.showContent();\r\n self.toggleSection();\r\n }\r\n });\r\n\r\n $(\"dd.bv-rating-ratio-count, .bdc-product-mobile-ratings-text\").on(\"click\", function() {\r\n self.showContent();\r\n if (self.isMobile) {\r\n self.toggleSection();\r\n }\r\n self.scrollToSection(\"testimonials\");\r\n });\r\n\r\n } else {\r\n $(\".bdc-product-mobile-ratings\").hide();\r\n $(\".bdc-product-name-brand-wrapper\").css(\"margin-bottom\", \"1em\");\r\n }\r\n\r\n if (callback) {\r\n callback(result.TotalReviewCount);\r\n }\r\n\r\n };\r\n\r\n self.getReviewData = function(callback) {\r\n self.$BVCheck = window.setInterval(function() {\r\n var result = window.$BVResult;\r\n if (result) {\r\n window.clearInterval(self.$BVCheck);\r\n self.processReviewData(result, callback);\r\n }\r\n }, 1000);\r\n }\r\n\r\n self.showContent = function () {\r\n self.hideReviews(false);\r\n self.buttonText(\"Hide individual reviews\");\r\n };\r\n\r\n this.toggleSection = function(viewModel, event) {\r\n self.hideSection(!self.hideSection());\r\n location.hash = \"\";\r\n if (history.pushState) {\r\n history.pushState(\"\", document.title, window.location.pathname);\r\n }\r\n if (event && self.hideSection() === false) {\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n this.toggleDetails = function () {\r\n self.hideReviews(!self.hideReviews());\r\n if (self.hideReviews()) {\r\n location.hash = \"\";\r\n self.buttonText(\"Show individual reviews\");\r\n } else {\r\n if (!self.isMobile) {\r\n location.hash = \"\";\r\n location.hash = \"#testimonials\";\r\n }\r\n self.buttonText(\"Hide individual reviews\");\r\n }\r\n };\r\n\r\n }\r\n\r\n return Reviews;\r\n\r\n});\r\n","define([\r\n \"globals\",\r\n \"knockout\",\r\n \"jquery\"],\r\nfunction (globals, ko, $) {\r\n\r\n // THD Product Reviews module\r\n\r\n \"use strict\";\r\n\r\n var Reviews = function(productId, aliasId) {\r\n\r\n var self = this;\r\n self.productId = productId;\r\n self.aliasId = aliasId;\r\n self.hideReviews = ko.observable(true);\r\n\r\n self.isMobile = globals.ssm.getState(\"mobile\").active;\r\n self.hideSection = ko.observable(self.isMobile);\r\n self.hasReviews = ko.observable(true);\r\n self.buttonText = ko.observable(\"Show individual reviews\");\r\n self.starsWidth = ko.observable('100%');\r\n self.writeReviewLink = ko.observable('#');\r\n self.readReviewsLink = ko.observable('#');\r\n\r\n self.ratingWidth = function(ratingValue) {\r\n var percentage = ratingValue ? ((ratingValue / 5) * 100) : 0;\r\n return percentage + \"%\";\r\n };\r\n\r\n self.numReviews = ko.observable(0);\r\n self.scrollToSection = function(hash) {\r\n if ((hash == \"testimonials\" || hash == \"BVRRWidgetID\") && self.hasReviews()) {\r\n self.showContent();\r\n $(\"html, body\").animate({\r\n scrollTop: $(\"#testimonials\").offset().top\r\n }, 1000);\r\n }\r\n }\r\n\r\n self.getReviewData = function(callback) {\r\n\r\n if ($BV) {\r\n $BV.configure(\"global\", {});\r\n $BV.ui(\"rr\", \"show_reviews\", {\r\n productId: globals.partnerProductId,\r\n onEvent: function (result) {\r\n if (result.attributes.numReviews > 0) {\r\n const writeReviewLink = `https://www.homedepot.com/p/writeAReview?itemId=${result.productId}`;\r\n self.writeReviewLink(writeReviewLink);\r\n self.readReviewsLink(`https://www.homedepot.com/p/reviews/${result.urlPageName.substr(2)}/1?sort=Most-helpful&reviewsRating=0`)\r\n $('body').on('click', '#BVRRRatingSummaryLinkWriteID', function(event) {\r\n if ($('html').is('.mobile')) {\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n window.location.href = writeReviewLink;\r\n }\r\n });\r\n self.numReviews(result.attributes.numReviews);\r\n self.starsWidth(self.ratingWidth(result.attributes.avgRating))\r\n if (result.eType == \"Read\" && result.eventSource == \"Action\" && result.eventTarget == \"Review\") {\r\n $(\"#bazaarVoice\").removeClass(\"bdc-product-reviews-hide\");\r\n }\r\n $(\"#reviews-header\").show();\r\n\r\n if(window.location.hash) {\r\n $(\"html, body\").animate({\r\n scrollTop: $(window.location.hash).offset().top\r\n }, 1000);\r\n }\r\n\r\n } else {\r\n setTimeout(function () {\r\n $(\"#reviews-header\").hide();\r\n $(\"#bazaarVoice\").removeClass(\"bdc-product-reviews-hide\");\r\n $(\".BVRRLinkToContactUs\").attr(\"href\", \"mailto:customblinds@homedepot.com\");\r\n }, 1000);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Click behavior for THD\r\n $(window).on(\"hashchange\", function () {\r\n var internalhash = window.location.hash.slice(1);\r\n if (internalhash == \"BVRRWidgetID\") {\r\n window.location.hash = \"#testimonials\";\r\n self.showContent();\r\n }\r\n });\r\n\r\n }\r\n\r\n self.showContent = function () {\r\n self.hideReviews(false);\r\n self.buttonText(\"Hide individual reviews\");\r\n };\r\n\r\n this.toggleSection = function(viewModel, event) {\r\n self.hideSection(!self.hideSection());\r\n location.hash = \"\";\r\n if (history.pushState) {\r\n history.pushState(\"\", document.title, window.location.pathname);\r\n }\r\n if (event && self.hideSection() === false) {\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n this.toggleDetails = function () {\r\n self.hideReviews(!self.hideReviews());\r\n if (self.hideReviews()) {\r\n location.hash = \"\";\r\n self.buttonText(\"Show individual reviews\");\r\n } else {\r\n if (!self.isMobile) {\r\n location.hash = \"\";\r\n location.hash = \"#testimonials\";\r\n }\r\n self.buttonText(\"Hide individual reviews\");\r\n }\r\n };\r\n\r\n }\r\n\r\n return Reviews;\r\n\r\n});\r\n","define([\r\n \"globals\",\r\n \"base-view-model\",\r\n \"jquery\",\r\n \"knockout\",\r\n \"product-choice-view-model\",\r\n \"unveil\"],\r\nfunction(globals, baseViewModel, $, ko, ProductChoiceViewModel) {\r\n\r\n \"use strict\";\r\n\r\n function ProductGroupViewModel(data, groupChoices, optionId) {\r\n\r\n var self = this;\r\n ko.utils.extend(self, baseViewModel);\r\n\r\n // This field is used for serverTemplate as Id\r\n\r\n this.groupid = data.GroupId;\r\n this.name = data.Name;\r\n this.choices = [];\r\n this.groupVisibleLimit = 20;\r\n this.selectedChoice = ko.observable();\r\n this.allVisible = ko.observable(false);\r\n\r\n var load = function () {\r\n $.each(groupChoices, function (index, value) {\r\n var newChoice = new ProductChoiceViewModel(value, self, optionId);\r\n newChoice.visible(index < self.groupVisibleLimit);\r\n self.choices.push(newChoice);\r\n });\r\n };\r\n\r\n this.unselectAll = function () {\r\n $.each(self.choices, function (index, value) {\r\n value.selected(false);\r\n });\r\n };\r\n\r\n this.makeAllVisible = function() {\r\n for (var i = self.groupVisibleLimit, j = self.choices.length; i < j; i++) {\r\n self.choices[i].visible(true);\r\n }\r\n $(\"img\").unveil();\r\n self.allVisible(true);\r\n };\r\n\r\n load();\r\n }\r\n\r\n return ProductGroupViewModel;\r\n\r\n});\r\n","define([\r\n \"globals\",\r\n \"base-view-model\",\r\n \"jquery\",\r\n \"knockout\",\r\n \"postal\",\r\n \"underscore\",\r\n \"cookies-factory\"\r\n],\r\nfunction (globals, baseViewModel, $, ko, postal, _, cookiesFactory ) {\r\n \"use strict\";\r\n\r\n var ProductChoiceViewModel = function (data, group, optionId) {\r\n var self = this;\r\n const { isSamplingEnabled, isSamplingEnabledCecOnly } = globals;\r\n ko.utils.extend(self, baseViewModel);\r\n\r\n var productPageChannel = postal.channel(\"productpage\");\r\n self.globals = globals;\r\n self.group = group;\r\n self.name = data.ShortLabel;\r\n self.image = data.MediaUrl;\r\n self.selected = ko.observable(false);\r\n self.visible = ko.observable(true);\r\n self.id = data.ChoiceId;\r\n // This field is used for serverTemplate as Id\r\n self.choiceid = data.ChoiceId;\r\n self.optionId = optionId;\r\n self.isAvailable = data.IsAvailable;\r\n self.isSampleable = data.IsSampleable;\r\n self.sampleProductId = data.SampleProductId;\r\n self.variantId = data.SampleVariantId;\r\n self.shouldDisplaySampling = (isSamplingEnabled && !isSamplingEnabledCecOnly) || (cookiesFactory.isInternalUser() && isSamplingEnabledCecOnly);\r\n self.isUnavailableInSize = ko.observable(false);\r\n self.price = ko.observable(data.Price);\r\n\r\n self.priceDollars = ko.computed(function () {\r\n return Math.floor(self.price());\r\n });\r\n\r\n self.priceCents = ko.computed(function () {\r\n return self.price().toFixed(2).toString().split(\".\")[1];\r\n });\r\n\r\n self.sampleAvailable = ko.computed(function () {\r\n return self.isSampleable && self.isAvailable && self.shouldDisplaySampling;\r\n });\r\n\r\n this.sampleAdded = ko.observable(false);\r\n\r\n this.mouseoverPreview = function (color, event) {\r\n if (self.selected()) {\r\n var $target = $(event.currentTarget).parent();\r\n $target.prepend(\"
\");\r\n }\r\n };\r\n\r\n this.mouseoutPreview = function (color, event) {\r\n var $target = $(event.currentTarget).parent();\r\n $target.find(\".bdc-choiceswatch-preview\").remove();\r\n };\r\n\r\n this.addSample = function () {\r\n var sample = {\r\n productId: globals.productId,\r\n productName: globals.productName,\r\n productCategory: globals.productCategory,\r\n productBrand: globals.productBrand,\r\n optionId: self.optionId,\r\n choiceId: self.id,\r\n name: self.name,\r\n sampleProductId: self.sampleProductId,\r\n variantId: self.variantId\r\n };\r\n var message = (self.sampleAdded()) ? \"sample.remove\" : \"sample.add\";\r\n productPageChannel.publish(message, sample);\r\n };\r\n\r\n this.toggleSelected = function () {\r\n productPageChannel.publish(\"selection.changed\", self);\r\n\r\n var selectedSwatch = buildSwatch();\r\n productPageChannel.publish(\"after.selection.change\", selectedSwatch);\r\n\r\n var swatchSelectedEvent = new CustomEvent('swatchSelected', {\r\n detail: selectedSwatch,\r\n });\r\n\r\n document.dispatchEvent(swatchSelectedEvent);\r\n };\r\n\r\n var buildSwatch = function () {\r\n var selectedColor = { productId: globals.productId, optionId: self.selected() ? self.optionId : null, colorId: self.selected() ? self.id : null, optionType: null };\r\n\r\n _.find(globals.models.sampleOptions.Options, function (o) {\r\n if (o.OptionId === self.optionId) {\r\n selectedColor.optionType = o.Type;\r\n }\r\n });\r\n return selectedColor;\r\n };\r\n\r\n productPageChannel.subscribe(\"selection.changed\", function (selectedChoice) {\r\n if (selectedChoice.optionId === self.optionId && selectedChoice.id !== self.id) {\r\n self.selected(false);\r\n } else if (selectedChoice.id === self.id) {\r\n self.selected(!self.selected());\r\n if (self.selected()) {\r\n self.group.selectedChoice = selectedChoice;\r\n } else {\r\n self.group.selectedChoice = null;\r\n }\r\n }\r\n });\r\n\r\n productPageChannel.subscribe(\"sample.added\", function (sample) {\r\n\r\n if (sample === self.id) {\r\n self.sampleAdded(true);\r\n }\r\n });\r\n\r\n productPageChannel.subscribe(\"sample.removed\", function (sample) {\r\n if (sample === self.id) {\r\n self.sampleAdded(false);\r\n }\r\n });\r\n\r\n productPageChannel.subscribe(\"choice.price.updated\", function (choicePrice) {\r\n if (choicePrice.choiceId === self.id) {\r\n self.price(choicePrice.price);\r\n }\r\n });\r\n }\r\n\r\n return ProductChoiceViewModel;\r\n});\r\n","define([\"configurator-zone\",\r\n \"delay-visible\",\r\n \"fade-in-text\",\r\n \"fade-visible\",\r\n \"format-money\",\r\n \"numeric-price\",\r\n \"numeric\",\r\n \"replace-server-template\",\r\n \"stop-binding\",\r\n \"visibility\"\r\n], \r\nfunction(){\r\n\r\n});\r\n\r\n","define([\r\n \"jquery\",\r\n \"knockout\"],\r\nfunction($, ko) {\r\n\r\n \"use strict\";\r\n\r\n ko.bindingHandlers.delayVisible = {\r\n init: function(element, valueAccessor) {\r\n var value = valueAccessor();\r\n $(element).toggle(ko.utils.unwrapObservable(value));\r\n },\r\n update: function(element, valueAccessor) {\r\n var value = valueAccessor();\r\n setTimeout(function() {\r\n if (ko.utils.unwrapObservable(value)) {\r\n $(element).show();\r\n } else {\r\n $(element).hide();\r\n }\r\n }, 300);\r\n }\r\n };\r\n\r\n});\r\n","define([\r\n \"jquery\",\r\n \"knockout\"],\r\nfunction($, ko) {\r\n\r\n \"use strict\";\r\n\r\n ko.bindingHandlers.fadeInText = {\r\n update: function(element, valueAccessor) {\r\n $(element).hide();\r\n ko.bindingHandlers.text.update(element, valueAccessor);\r\n $(element).fadeIn();\r\n }\r\n };\r\n\r\n});\r\n","define([\r\n \"jquery\",\r\n \"knockout\"],\r\nfunction($, ko) {\r\n\r\n \"use strict\";\r\n\r\n ko.bindingHandlers.fadeVisible = {\r\n init: function (element, valueAccessor) {\r\n var value = valueAccessor();\r\n $(element).toggle(ko.utils.unwrapObservable(value));\r\n },\r\n update: function (element, valueAccessor) {\r\n var value = valueAccessor();\r\n if (ko.utils.unwrapObservable(value)) {\r\n $(element).fadeIn();\r\n } else {\r\n $(element).fadeOut();\r\n }\r\n }\r\n };\r\n\r\n});\r\n","define([\r\n \"knockout\"],\r\nfunction(ko) {\r\n\r\n \"use strict\";\r\n\r\n // Usage numericPrice: field\r\n // If there is a decimal portion, show two decimal places. If not, show 0 decimal places.\r\n ko.bindingHandlers.numericPrice = {\r\n update: function(element, valueAccessor) {\r\n var value = ko.utils.unwrapObservable(valueAccessor());\r\n var precision = value % 1 === 0 ? 0 : 2;\r\n var formattedValue = value.toFixed(precision);\r\n ko.bindingHandlers.text.update(element, function() {\r\n return formattedValue;\r\n });\r\n },\r\n defaultPrecision: 1\r\n };\r\n\r\n});\r\n","define([\r\n \"jquery\",\r\n \"knockout\"],\r\nfunction($, ko) {\r\n\r\n \"use strict\";\r\n\r\n // Uses a foreach binding, but clears the existing content first: http://stackoverflow.com/a/13803122\r\n ko.bindingHandlers.replaceServerTemplate = {\r\n init: function(element, valueAccessor) {\r\n $(element).html(\"\");\r\n return ko.bindingHandlers.template.init(element, valueAccessor);\r\n },\r\n update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n return ko.bindingHandlers.template.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\r\n }\r\n };\r\n\r\n});\r\n","define([\r\n \"jquery\"],\r\nfunction ($) {\r\n\r\n \"use strict\";\r\n\r\n // Allows specific offsets by target\r\n var offsets = {\r\n testimonials: 0\r\n };\r\n\r\n /**\r\n * This file provides smooth scrolling for links pointed to same page targets.\r\n */\r\n $(function() {\r\n $(document).on(\"click\", \"a[href^='#']\", function(event) {\r\n var target = $(this).attr(\"href\").substr($(this).attr(\"href\").indexOf(\"#\") + 1);\r\n if (target === \"BVRRWidgetID\") {\r\n target = \"testimonials\";\r\n } else {\r\n event.preventDefault();\r\n }\r\n\r\n var offset = offsets[target] !== undefined ? offsets[target] : 50;\r\n if ($(this).attr(\"data-offset\")) {\r\n offset = $(this).attr(\"data-offset\");\r\n }\r\n if ($(\"#\" + target).attr(\"id\") != \"gcc-product-gallery-detail\") {\r\n if ($(\"#\" + target).length > 0) {\r\n $(\"html, body\").animate({\r\n scrollTop: $(\"#\" + target).offset().top - offset\r\n }, 1000);\r\n }\r\n }\r\n });\r\n });\r\n\r\n});\r\n","define([\r\n \"jquery\",\r\n \"knockout\"],\r\nfunction($, ko) {\r\n\r\n \"use strict\";\r\n\r\n function renderImage(context, img, x, y) {\r\n\r\n context.save();\r\n\r\n // draw the image which will be clipped except in the clipping path\r\n context.drawImage(img, x, y);\r\n }\r\n\r\n function clippingPath(context, pathPoints, img, x, y) {\r\n\r\n context.save();\r\n\r\n // define the path that will be clipped to\r\n context.beginPath();\r\n context.moveTo(pathPoints[0], pathPoints[1]);\r\n context.lineTo(pathPoints[2], pathPoints[3]);\r\n context.lineTo(pathPoints[4], pathPoints[5]);\r\n context.closePath();\r\n\r\n // make the current path a clipping path\r\n context.clip();\r\n\r\n // draw the image which will be clipped except in the clipping path\r\n context.drawImage(img, x, y);\r\n\r\n // restore the unclipped context (==undo the clipping path)\r\n context.restore();\r\n\r\n }\r\n\r\n function loadAllImages(callback, primaryColor, secondaryColor) {\r\n\r\n var imagesOK = 0;\r\n var imgs = [];\r\n var imageURLs = [primaryColor, secondaryColor];\r\n\r\n for (var i = 0; i < imageURLs.length; i++) {\r\n var img = new Image();\r\n imgs.push(img);\r\n img.onload = function() {\r\n imagesOK++;\r\n if (imagesOK >= imageURLs.length) {\r\n callback(imgs);\r\n }\r\n };\r\n img.onerror = function() {\r\n // console.log(\"image load failed\");\r\n }\r\n img.src = imageURLs[i];\r\n }\r\n }\r\n\r\n ko.bindingHandlers.colorSwatchPreview = {\r\n\r\n init: function(element, valueAccessor) {\r\n var options = ko.unwrap(valueAccessor());\r\n $(element).append(\"\");\r\n },\r\n\r\n update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\r\n var options = ko.unwrap(valueAccessor());\r\n var colorSwatches = ko.unwrap(options.colorSwatches) || {};\r\n var primary = colorSwatches.primary || \"\";\r\n var secondary = colorSwatches.secondary || \"\";\r\n var canvas = $(element).find('canvas')[0];\r\n var ctx = canvas.getContext(\"2d\");\r\n if (primary !== \"\" && secondary !== \"\") {\r\n loadAllImages(function (images) {\r\n clippingPath(ctx, [0, 0, 0, 50, 50, 0], images[0], 0, 0);\r\n clippingPath(ctx, [50, 0, 50, 50, 0, 50], images[1], 0, 0);\r\n }, primary, secondary);\r\n $(\"#bdc-product-color-swatch-preview-single\").hide();\r\n $(\"#bdc-product-color-swatch-preview-double\").show();\r\n return;\r\n }\r\n if (primary !== \"\" && secondary === \"\") {\r\n $(\"#bdc-product-color-swatch-preview-double\").hide();\r\n $(\"#bdc-product-color-swatch-preview-single\").attr({src: primary, \"aria-labelledby\": \"swatch-preview-primary\"}).show();\r\n }\r\n if (primary === \"\" && secondary !== \"\") {\r\n $(\"#bdc-product-color-swatch-preview-double\").hide();\r\n $(\"#bdc-product-color-swatch-preview-single\").attr({src: secondary, \"aria-labelledby\": \"swatch-preview-secondary\"}).show();\r\n }\r\n }\r\n };\r\n\r\n});\r\n"],"sourceRoot":""}