{"version":3,"sources":["app.min.js"],"names":["app","angular","module","config","$locationProvider","html5Mode","enabled","requireBase","rewriteLinks","localStorageServiceProvider","setPrefix","$httpProvider","defaults","headers","get","constant","zipcodeRegex","filter","$sce","htmlCode","trustAsHtml","baseUrl","authStorageKey","clientName","displaySampleAddedCaller","productsApiUrl","touch","window","DocumentTouch","document","NEXT_FINDER_VIEW","PREV_FINDER_VIEW","resizeMap","productComparisonClearAll","fiber brand","shade","controller","$scope","safeApply","fn","phase","this","$root","$$phase","$apply","$controller","$window","$location","SearchService","selectColorSuccess","result","assignScope","data","path","pdpUrl","replace","initSuccess","assignAllColors","handleError","console","error","isStyleDiscontinued","style","isDeleted","mainColor","hasSamples","selectedColor","specifications","isColorDiscontinued","swatchPath","retailerZip","printUrl","roomSceneImageUrl","hasRoomScene","centerClass","productFamilyDescription","sellSheetPdfUrl","hasSellSheetPdfUrl","ltEleven","allColors","length","lteFive","lteFour","centerCarousel","specSheetPdfUrl","productSpecsPdfUrl","hasSpecSheet","specGroup1","specGroup2","quickShip","quickShipNum","allColorsText","selectColor","styleId","colorId","loadProductDetail","init","undefined","pdpInitData","$timeout","CompareService","APP_EVENTS","FILTER_SORT","localStorageService","$interval","resetResults","styles","totalResults","currentPage","rangeMin","rangeMax","hasMore","stylesFailed","isLoading","errorMessage","Message","toLowerCase","hasError","InitializeDropdowns","stylesUpdated","newStyles","totalPages","Math","floor","defaultPageSize","storedCompareProducts","getLocalStorageKey","initialLoadStoredProducts","productsToCompare","familyCompared","family","_","forEach","checkMatchingStyle","compareChecked","push","search","page","sessionStorage","getItem","waitTime","scrollTo","setItem","toJson","event","HotjarTriggers","triggerDelayed","product","$","dropdown","attr","foundation","loadStyles","firstRequest","size","subFamily","selectedSubFamily","value","selectedFacets","objSorting","sorting","query","forceColorIndex","lastSearched","facetsUpdated","facetGroups","facetHelper","removeSearchValue","facetGroup","reorderFacetValues","values","text","searchVal","searchKey","isFacetKey","checkFacet","selectFacet","subFamilies","find","key","subFamilyKey","loadFacets","compareStylesUpdated","isLoadingCompare","productsToCompareResults","showViewAllButton","some","colors","updatePrintLink","q","showAll","show","currentTab","tab","colorIndex","compareDescription","compareOverflowDescription","compareFamilyUnmatchDescription","comparePageUrl","COMPARISON_MAX_NUM","comparePrintLink","compareActiveDescription","showCompareWarning","productTypeKey","selectedProductTypeName","searchProductTypes","name","tryAddToCompare","isAdded","index","findIndex","e","splice","removeFromLocalStorage","changeCompareDescription","changeCompareDescriptionFamily","overflow","facetKey","facetValues","facet","checked","constructor","Array","indexOf","uncheckFacet","selectedFacet","slice","orderList","sort","x","y","toggleFacetSelection","removeFacetSelection","toggleSearchValue","entry","removeSearchKey","showQuery","isSearch","initSearchMode","subscribeStyles","subscribeFacets","parseInt","$on","searchMode","productType","loadMore","toggleFacets","elementClicked","target","parents","hasClass","removeClass","addClass","toggleFilterController","filterController","filters","changeSorting","styleAbsoluteUrl","styleUrl","host","absUrl","hasSelectedFacets","Object","keys","facetClick","setProductType","clearFilters","setSubFamily","isSamplesFacet","filterTrueValue","arr","i","submit","shouldHaveResults","hasResults","searchFinished","canShowMore","showComparisonPopup","enableCompareButton","clearSelections","set","$broadcast","compareProducts","productIds","location","href","join","capitalizeFirstLetter","string","charAt","toUpperCase","getRatingPartial","rating","array","encodeURIComponent","productClick","pageYOffset","changeQuery","searchInputForm","facetSearch","term","val","stop","cancel","clearQuery","predictiveSearchCollectionFacet","directive","restrict","link","scope","element","attrs","Bloodhound","datumTokenizer","tokenizers","obj","whitespace","queryTokenizer","prefetch","url","cache","cacheKey","sorter","current","next","input_string","trim","currentStyle","styleName","styleNumber","nextStyle","s","currentColor","colorName","colorNumber","nextColor","collections","currentCollection","collection","nextCollection","links","typeahead","highlight","hint","display","source","limit","templates","suggestion","title","notFound","header","label","footer","color","on","dataset","controllerAs","ctrl","$parent","stylePath","div","createElement","span","onclick","parentElement","innerText","appendChild","$compile","transclude","$element","bind","LOCAL_STORAGE_KEY","closest","css","changeState","added","addToLocalStorage","height","$container","$content","scrollHeight","timeout","mouseleave","screenX","screenY","setTimeout","mouseenter","clearTimeout","compareStyleId","$table","colNumber","children","first","hide","history","pushState","urlParams","URLSearchParams","newIds","newQuery","newurl","getAll","protocol","pathname","toggleNav","navIsVisible","toggleClass","preventDefault","mobileSearchBar","focus","mask","initCarouselWidth","parent$","trigger","initExpandable","owlSlider","options","$button","click","owlCarousel","html","initCarousel","defaultOptions","onInitialized","customOptions","$eval","loop","owl","$last","parent","$anchorScroll","updateLocation","tabName","changeActive","$activeContent","$activeTab","$contentToBeActive","$tabToBeActive","yOffset","qsScroll","scroll","hash","$mobileBreak","$this","$tabName","innerWidth","videoid","video","Wistia","api","pause","time","play","factory","$http","handleStylesSuccess","fromJson","updateStyleSubscribers","handleStylesError","subscriber","_stylesSubscribers","callback","post","compareLocalStorageKey","method","Content-Type","then","storedProductsToCompare","$q","googleSearch","start","request","handleSuccess","response","isObject","message","reject","ProductSettings","_totalResults","total","updateStyleSubscribersSuccess","results","updateStyleSubscribersFailure","subscriberSuccess","subscriberFailure","success","failure","item","productFamily","handleFacetsSuccess","handleFacetsError","facets","updateFacetsSubscribers","_facetsSubscribers","pageIndex","pageSize","subFamilyValue","isArray","successProductDetailCallback","failureProductDetailCallback","apply","arguments","$document","onLoad","querySelector","offsetHeight","prev","keypress","keycode","keyCode","which","blur"],"mappings":"CAAA,WACI,YAEA,IAAIA,GAAMC,QAAQC,OAAO,qBAAsB,YAAa,YAAa,sBAEzEF,GAAIG,QAAQ,oBAAqB,SAAUC,GAEvCA,EAAkBC,WACdC,SAAS,EACTC,aAAa,EACbC,cAAc,OAItBR,EAAIG,QAAQ,8BAA+B,SAAUM,GACjDA,EAA4BC,UAAU,wBAG1CV,EAAIG,QAAQ,gBAAiB,SAAUQ,GAC9BA,EAAcC,SAASC,QAAQC,MAChCH,EAAcC,SAASC,QAAQC,QAGnCH,EAAcC,SAASC,QAAQC,IAAI,qBAAuB,gCAC1DH,EAAcC,SAASC,QAAQC,IAAI,iBAAmB,WACtDH,EAAcC,SAASC,QAAQC,IAAY,OAAI,cAGnDd,EAAIe,SAAS,qBACTC,aAAc,8FAIlBhB,EAAIiB,OAAO,SAAU,OAAQ,SAAUC,GACnC,MAAO,UAAUC,GACb,MAAOD,GAAKE,YAAYD,OAIhCnB,EAAIe,SAAS,mBACTM,QAAS,2BACTC,eAAgB,WAChBC,WAAY,4BAGhBvB,EAAIe,SAAS,gBACTM,QAAS,YACTG,yBAA0B,6BAG9BxB,EAAIe,SAAS,mBACTU,eAAiB,kBAGrBzB,EAAIe,SAAS,gBACTW,MAAQ,gBAAkBC,SAAWA,OAAOC,eAAiBC,mBAAoBD,iBAGrF5B,EAAIe,SAAS,cAETe,iBAAoB,mBACpBC,iBAAoB,qBAGxB/B,EAAIe,SAAS,cACTiB,UAAW,YACXC,0BAA2B,8BAG/BjC,EAAIe,SAAS,eACTmB,eAAgB,cAAe,mBAAoB,2BAA4B,QAAS,aAAc,aAAc,eACpHC,OAAU,QAAS,SAAU,aAIrC,WACI,YAEAlC,SAAQC,OAAO,qBAAqBkC,WAAW,kBAAmB,SAAU,SAASC,GAGjFA,EAAOC,UAAY,SAASC,GACxB,GAAIC,GAAQC,KAAKC,MAAMC,OACT,YAAVH,GAAgC,YAAVA,EAClBD,GAAsB,kBAAT,IACbA,IAGJE,KAAKG,OAAOL,UAO5B,WACI,YAEAtC,SAAQC,OAAO,qBAAqBkC,WAAW,iBAAkB,cAAe,SAAW,UAAW,YAAa,gBAAiB,SAAUS,EAAaR,EAAQS,EAASC,EAAWC,GAMnL,QAASC,GAAmBC,GACxBC,EAAYD,EAAOE,MACnBL,EAAUM,KAAKH,EAAOE,KAAKE,QAC3BP,EAAUQ,UAOd,QAASC,GAAYN,GACjBC,EAAYD,GACZO,EAAgBP,GAepB,QAASQ,GAAYN,GACjBO,QAAQC,MAAMR,GAGlB,QAASD,GAAYC,GAEjBf,EAAOwB,oBAAsBT,EAAKU,MAAMC,UACxC1B,EAAOyB,MAAQV,EAAKU,MACpBzB,EAAO2B,UAAYZ,EAAKY,UACxB3B,EAAO4B,WAAwD,QAA3Cb,EAAKU,MAAMI,cAAcC,eAC7C9B,EAAOwB,oBAAsBT,EAAKU,MAAMC,UACxC1B,EAAO+B,oBAAsBhB,EAAKY,UAAUD,UAC5C1B,EAAOiB,OAASF,EAAKE,OACrBjB,EAAOgC,WAAajB,EAAKiB,WACzBhC,EAAOiC,YAAclB,EAAKkB,YAC1BjC,EAAOiC,YAAclB,EAAKkB,YAC1BjC,EAAOkC,SAAWnB,EAAKmB,SACvBlC,EAAOmC,kBAAoBpB,EAAKoB,kBAChCnC,EAAOoC,eAAiBpC,EAAOmC,kBAC/BnC,EAAOqC,YAAcrC,EAAOoC,aAAe,GAAK,SAChDpC,EAAOsC,yBAA2BvB,EAAKuB,yBACvCtC,EAAOuC,gBAAkBxB,EAAKwB,gBAC9BvC,EAAOwC,qBAAuBzB,EAAKwB,gBACnCvC,EAAOyC,SAAW1B,EAAK2B,UAAUC,OAAS,GAAK,WAAa,GAC5D3C,EAAO4C,QAAU7B,EAAK2B,UAAUC,QAAU,EAAI,UAAY,GAC1D3C,EAAO6C,QAAU9B,EAAK2B,UAAUC,QAAU,EAAI,UAAY,GAC1D3C,EAAO8C,eAAiB9C,EAAOyC,SAAW,SAAW,GACrDzC,EAAO+C,gBAAkBhC,EAAKiC,mBAC9BhD,EAAOiD,eAAiBlC,EAAKiC,mBAC7BhD,EAAOkD,WAAanC,EAAKmC,WACzBlD,EAAOmD,WAAapC,EAAKoC,WACzBnD,EAAOoD,UAAYrC,EAAKqC,UACxBpD,EAAOqD,aAAetC,EAAKsC,aAG/B,QAASjC,GAAgBL,GAErBf,EAAO0C,UAAY3B,EAAK2B,UACxB1C,EAAOsD,cAAgBvC,EAAKuC,cArEhC9C,EAAY,kBACRR,OAAQA,IASZA,EAAOuD,YAAc,SAAUC,EAASC,GACpC9C,EAAc+C,kBAAkBF,EAASC,EAAS7C,EAAoBS,IAQ1ErB,EAAO2D,KAAO,SAAUH,EAASC,GACDG,SAAxBnD,EAAQoD,aAAwDD,SAA3BnD,EAAQqB,eAC7CnB,EAAc+C,kBAAkBF,EAASC,EAAStC,EAAaE,IAI/DP,EAAYL,EAAQoD,aACpBzC,EAAgBX,EAAQoD,qBAiDxC,WACI,YAEAjG,SAAQC,OAAO,qBAAqBkC,WAAW,iBAAkB,cAAe,SAAU,YAAa,UAAW,WAAY,gBAAiB,iBAAkB,aAAc,cAAe,sBAAuB,YAAa,SAAUS,EAAaR,EAAQU,EAAWD,EAASqD,EAAUnD,EAAeoD,EAAgBC,EAAYC,EAAaC,EAAqBC,GAsGxW,QAASC,KACLpE,EAAOqE,OAAO1B,OAAS,EACvB3C,EAAOsE,aAAe,GACtBtE,EAAOuE,YAAc,EACrBvE,EAAOwE,SAAW,EAClBxE,EAAOyE,SAAW,EAClBzE,EAAO0E,SAAU,EAIrB,QAASC,GAAa5D,GAClBf,EAAO4E,WAAY,EACnB5E,EAAO6E,aAAgB9D,GAAQA,EAAKA,MAAQA,EAAKA,KAAK+D,SAAY,mBAClE9E,EAAO6E,aAAe7E,EAAO6E,aAAaE,cAC1C/E,EAAOgF,UAAW,EAGlBlB,EAASmB,EAAqB,KAGlC,QAASC,GAAcC,EAAWb,GAC9BtE,EAAO6E,aAAe,KACtB7E,EAAOsE,aAAeA,EACtBtE,EAAOoF,WAAaC,KAAKC,MAAMtF,EAAOsE,aAAetE,EAAOuF,iBAAmB,EAC/EvF,EAAOyE,UAAYU,EAAUxC,OAC7B3C,EAAO0E,QAAU1E,EAAOyE,SAAWH,CACnC,IAAIkB,GAAwBtB,EAAoBzF,IAAIsF,EAAe0B,qBAE/DzF,GAAO0F,2BACHF,GAAyBA,EAAsB7C,OAAS,IACxD3C,EAAO2F,kBAAoBH,EAC3BxF,EAAO4F,eAAiB5F,EAAO2F,kBAAkB,GAAGE,QAI5DC,EAAEC,QAAQZ,EAAW,SAAS1D,GACtBzB,EAAO2F,mBAAqB3F,EAAO2F,kBAAkB/G,OAAOoH,EAAmBvE,IAAQkB,OAAS,IAChGlB,EAAMwE,gBAAiB,GAE3BjG,EAAOqE,OAAO6B,KAAKzE,KAGvBzB,EAAO0F,2BAA4B,CAEnC,IAAInB,GAAc7D,EAAUyF,SAASC,IACrC,IAAI7B,EAAc,GAAuD,GAAlD9D,EAAQ4F,eAAeC,QAAQ,gBAAsB,CACxE,GAAIC,GAAyB,IAAdhC,CACfT,GAAS,WACLrD,EAAQ+F,SAAS,EAAG/F,EAAQ4F,eAAeC,QAAQ,cACnD7F,EAAQ4F,eAAeI,QAAQ,eAAgB7I,QAAQ8I,OAAO,KAC/DH,GAIP,GAAII,GAAQ3G,EAAO6F,OAAS,OAAS7F,EAAO6F,OAAS,WAAa,yBAClEe,gBAAeC,eAAeF,EAAO,KAGrC7C,EAASmB,EAAqB,KAE9BjF,EAAO4E,WAAY,EACnB5E,EAAOgF,UAAW,EAGtB,QAASgB,GAAmBvE,GACxB,MAAO,UAASqF,GACZ,MAAOA,GAAQtD,SAAW/B,EAAM+B,SAIxC,QAASyB,KACLa,EAAEC,QAAQgB,EAAE,kBAAmB,SAAUC,GAChCD,EAAEC,GAAUC,KAAK,kBAClBF,EAAEC,GAAUE,eAKxB,QAASC,KAGL,GAFAnH,EAAO4E,WAAY,GAEdwC,EAAc,CACf,GAAIpH,EAAOuE,aAAevE,EAAOoF,WAE7B,YADApF,EAAO4E,WAAY,EAGvB5E,GAAOuE,cACHvE,EAAOuE,YAAc,GACrB7D,EAAUyF,OAAO,OAAQnG,EAAOuE,aAIxC,GAAI8C,GAAOrH,EAAOuF,gBACda,EAAOpG,EAAOuE,WACd6C,IACAC,EAAOjB,EAAOpG,EAAOuF,gBACrBa,EAAO,EAEHpG,EAAOuE,YAAc,GACrB7D,EAAUyF,OAAO,OAAQnG,EAAOuE,cAGpC6B,GAGJ,IAAIkB,GAAYtH,EAAOuH,kBAAoBvH,EAAOuH,kBAAkBC,MAAQ,IAE5E7G,GAAcwG,WAAWnH,EAAO6F,OAAQO,EAAMiB,EAAMrH,EAAOyH,eAAgBzH,EAAO0H,WAAWC,QAAS3H,EAAO4H,MAAON,EAAWtH,EAAO6H,iBACtI7H,EAAO8H,aAAe9H,EAAO4H,MAC7BR,GAAe,EA4GnB,QAASW,GAAcC,GACnBC,EAAYC,kBAAkB,gCAAiC,SAE/DpC,EAAEC,QAAQiC,EAAa,SAAUG,GAC7BF,EAAYG,mBAAmBD,EAAWE,OAAQpE,EAAYkE,EAAWG,KAAKvD,gBAC9E/E,EAAOgI,YAAY9B,KAAKiC,KAG5BrC,EAAEC,QAAQrF,EAAUyF,SAAU,SAAUoC,EAAWC,GAC/C,GAAIP,EAAYQ,WAAWD,GACvBP,EAAYS,WAAW1I,EAAOgI,YAAaQ,EAAWD,GACtDN,EAAYU,YAAY3I,EAAOyH,eAAgBe,EAAWD,OAEzD,IAAgC,cAA5BC,EAAUzD,cAA+B,CAC9C,GAAI6D,GAAc9C,EAAE+C,KAAKb,EAAa,SAASG,GAAc,MAAOrC,GAAE+C,KAAKV,EAAWE,QAASS,IAAOC,MAClGzB,EAAYxB,EAAE+C,KAAKD,EAAYP,QAASb,MAASe,GACrDvI,GAAOuH,kBAAoBD,KAInCH,IAGJ,QAAS6B,KACLrI,EAAcqI,WAAWhJ,EAAO6F,QAgNpC,QAASoD,GAAqB5E,GAC1BrE,EAAOkJ,kBAAmB,EAC1BlJ,EAAOmJ,yBAA2B9E,EAClCrE,EAAOoJ,kBAAoBpJ,EAAOmJ,yBAAyBE,KAAK,SAAUvC,GACtE,MAAOA,GAAQwC,OAAO3G,OAAS,KAEnC3C,EAAOuJ,kBA3iBX/I,EAAY,kBACRR,OAAQA,IAGZA,EAAO6F,OAAS,GAChB7F,EAAO4H,MAAQlH,EAAUyF,SAASqD,GAAK,GACvCxJ,EAAOyJ,QAAsC,QAA5B/I,EAAUyF,SAASuD,KACpC1J,EAAO8H,aAAe9H,EAAO4H,MAC7B5H,EAAOgI,eACPhI,EAAOyH,kBACPzH,EAAOuF,gBAAkB,GACzBvF,EAAO2J,WAAajJ,EAAUyF,SAASyD,IACvC5J,EAAO4E,WAAY,EACnB5E,EAAOkJ,kBAAmB,EAC1BlJ,EAAO0H,YAAeC,QAAS,IAC/B3H,EAAOgF,UAAW,EAClBhF,EAAO6H,gBAAoD,MAAlCnH,EAAUyF,SAAS0D,WAC5C7J,EAAOwE,SAAW,EAClBxE,EAAOyE,SAAW,CAGlB,IAAIqF,GAAqB,4BACrBC,EAA6B,uDAC7BC,EAAkC,6DAClCC,EAAiB,oBACjBC,EAAqB,EACrB9C,GAAe,CACnBpH,GAAO2F,qBACP3F,EAAOmJ,4BACPnJ,EAAOoJ,mBAAoB,EAC3BpJ,EAAOmK,iBAAmB,GAC1BnK,EAAOoK,yBAA2BN,EAClC9J,EAAOqK,oBAAqB,EAC5BrK,EAAO4F,eAAiB,GACxB5F,EAAO0F,2BAA4B,CAGnC,IAAI4E,GAAiB,cACjBvB,EAAe,WACnB/I,GAAOuK,wBAA0B,KACjCvK,EAAOuH,kBAAoB,KAC3BvH,EAAOwK,qBACCC,KAAM,eACNjD,MAAO,cACPsB,IAAKwB,IAGLG,KAAM,SACNjD,MAAO,SACPsB,IAAKwB,IAGLG,KAAM,eACNjD,MAAO,cACPsB,IAAKwB,IAIbtK,EAAO0K,gBAAkB,SAASjJ,GAC9B,GAAIkJ,IAAU,EACVC,EAAQ9E,EAAE+E,UAAU7K,EAAO2F,kBAAmB,SAAUmF,GAAK,MAAOA,GAAEtH,UAAY/B,EAAM+B,SAsB5F,OApBwC,KAApCxD,EAAO2F,kBAAkBhD,SACzB3C,EAAO4F,eAAiBnE,EAAMoE,QAG9B+E,EAAQ,IACR5K,EAAO2F,kBAAkBoF,OAAOH,EAAO,GACvC7G,EAAeiH,uBAAuBvJ,EAAM+B,SAC5CxD,EAAOiL,0BAAyB,GAChCN,GAAU,GACH3K,EAAO2F,kBAAkBhD,OAASuH,GAAsBlK,EAAO4F,gBAAkBnE,EAAMoE,QAC9F7F,EAAO2F,kBAAkBO,KAAKzE,GAC9BzB,EAAOiL,0BAAyB,IACzBjL,EAAO4F,gBAAkBnE,EAAMoE,QACtC8E,GAAU,EACV3K,EAAOkL,mCAEPP,GAAU,EACV3K,EAAOiL,0BAAyB,IAEpCjL,EAAOC,YACA0K,GAGX3K,EAAOiL,yBAA2B,SAAUE,GACpCA,GACAnL,EAAOoK,yBAA2BL,EAClC/J,EAAOqK,oBAAqB,IAE5BrK,EAAOoK,yBAA2BN,EAClC9J,EAAOqK,oBAAqB,IAIpCrK,EAAOkL,+BAAiC,WACpClL,EAAOoK,yBAA2BJ,EAClChK,EAAOqK,oBAAqB,EAmHhC,IAAIpC,IACAS,WAAY,SAAUV,EAAaoD,EAAUC,GACzCvF,EAAEC,QAAQiC,EAAa,SAAUG,GAC7BrC,EAAEC,QAAQoC,EAAWE,OAAQ,SAAUiD,GAC/BA,EAAMxC,IAAI/D,gBAAkBqG,EAASrG,gBACjB,SAAhBsG,EACAC,EAAMC,SAAU,EAEhBD,EAAMC,QAAWF,EAAYG,cAAgBC,MAASJ,EAAYK,QAAQJ,EAAM9D,OAAS,GAAK8D,EAAM9D,QAAU6D,QAOlIM,aAAc,SAAU3D,EAAaoD,GACjCtF,EAAEC,QAAQiC,EAAa,SAAUG,GAC7BrC,EAAEC,QAAQoC,EAAWE,OAAQ,SAAUiD,GAC/BA,EAAMxC,MAAQsC,IACdE,EAAMC,SAAU,QAMhC5C,YAAa,SAAUlB,EAAgB2D,EAAUC,GAC7C,GAAIO,GAAgBnE,EAAe2D,EAC/BQ,GACAA,EAAc1F,KAAKmF,GACZA,EAAYG,cAAgBC,MACnChE,EAAe2D,GAAYC,EAAYQ,MAAM,GAE7CpE,EAAe2D,IAAaC,IAGpCjD,mBAAoB,SAAUiD,EAAaS,GAClCT,GAAgBS,GAGrBT,EAAYU,KAAK,SAAUC,EAAGC,GAC1B,MAAOH,GAAUJ,QAAQM,EAAExE,MAAMzC,eAAiB+G,EAAUJ,QAAQO,EAAEzE,MAAMzC,eAAiB,GAAK,KAG1GmH,qBAAsB,SAAUzE,EAAgBqB,EAAKtB,GACjD,GAAIoE,GAAgBnE,EAAeqB,EACnC,IAAI8C,EAAe,CACf,GAAIhB,GAAQgB,EAAcF,QAAQlE,EACtB,GAARoD,EACAgB,EAAc1F,KAAKsB,GACZoE,EAAcjJ,OAAS,EAC9BiJ,EAAcb,OAAOH,EAAO,SAGrBnD,GAAeqB,OAG1BrB,GAAeqB,IAAQtB,IAG/B2E,qBAAsB,SAAS1E,EAAgBqB,SACpCrB,GAAeqB,IAE1BsD,kBAAmB,SAAUtD,EAAKtB,GAC9B,GAAI6E,GAAQ3L,EAAUyF,SAAS2C,EAC1BuD,GAEMA,EAAMb,cAAgBC,QAC7BY,GAASA,IAFTA,IAIJ,IAAIzB,GAAQyB,EAAMX,QAAQlE,EACd,GAARoD,EACAyB,EAAMnG,KAAKsB,GACJ6E,EAAM1J,OAAS,EACtB0J,EAAMtB,OAAOH,EAAO,GAEpByB,EAAQ,KAEZ3L,EAAUyF,OAAO2C,EAAKuD,GAAOnL,WAEjCgH,kBAAmB,SAAUY,EAAKtB,GAC9B,GAAI6E,GAAQ3L,EAAUyF,SAAS2C,EAC/B,IAAIuD,EAAO,CACHA,EAAMb,cAAgBC,QACtBY,GAASA,GAEb,IAAIzB,GAAQyB,EAAMX,QAAQlE,EACtBoD,GAAQ,IACRyB,EAAMtB,OAAOH,EAAO,GAExBlK,EAAUyF,OAAO2C,EAAKuD,GAAOnL,YAGrCoL,gBAAiB,SAAUxD,GACvB,GAAIuD,GAAQ3L,EAAUyF,SAAS2C,EAC3BuD,KACAA,EAAQ,KACR3L,EAAUyF,OAAO2C,EAAKuD,GAAOnL,YAGrCuH,WAAY,SAAU2C,GAClB,GAAItC,GAAMsC,EAASrG,aACnB,OAAe,SAAR+D,GAA0B,MAARA,GAAuB,SAARA,GAA0B,gBAARA,GAAiC,cAARA,GAA+B,eAARA,GA+BlH9I,GAAO2D,KAAO,SAAUkC,GACpB7F,EAAOqE,UACPrE,EAAO6F,OAASA,EAChB7F,EAAOuM,YAAcvM,EAAO4H,QAAW5H,EAAO6F,SAAW7F,EAAOyJ,QAChEzJ,EAAOwM,UAAYxM,EAAO6F,OAC1B7F,EAAO0H,WAAWC,QAAU3H,EAAOwM,SAAW,YAAc,MAE5DC,IAEA9L,EAAc+L,gBAAgBxH,EAAeP,GAC7ChE,EAAcgM,gBAAgB5E,GAC9BhE,EAAe2I,gBAAgBzD,EAE/B,IAAI1E,GAAc7D,EAAUyF,SAASC,IACrCpG,GAAOuE,YAAcA,EAAcqI,SAASrI,EAAa,IAAM,EAE3DvE,EAAO6F,OACPmD,IAEA7B,IAGJnH,EAAO6M,IAAI7I,EAAWpE,0BAA2B,WAC7CI,EAAOqE,OAAO0B,QAAQ,SAAUtE,GACxBA,EAAMwE,kBAAmB,IACzBxE,EAAMwE,gBAAiB,OAMvC,IAAIwG,GAAiB,WACjBzM,EAAO8M,YAAc9M,EAAO6F,MAE5B,IAAIkH,GAAcrM,EAAUyF,SAASmE,EACjCyC,KACA/M,EAAO6F,OAASkH,EAChB/M,EAAOuK,wBAA0BzE,EAAE+C,KAAK7I,EAAOwK,oBAAqB,QAASuC,IAActC,MAInGzK,GAAOgN,SAAW7F,EAElBnH,EAAOiN,aAAe,SAAUtG,GAC5B,GAAIuG,GAAiBnG,EAAEJ,EAAMwG,QAAQC,QAAQ,aAEvCF,GAAeG,SAAS,UAG1BH,EAAeI,YAAY,UAF3BJ,EAAeK,SAAS,WAMhCvN,EAAOwN,uBAAyB,SAAU7G,GACtC,GAAI8G,GAAmB1G,EAAEJ,EAAMwG,QAC3BO,EAAUD,EAAiBL,QAAQ,oBAAoBvE,KAAK,WAE3D4E,GAAiBJ,SAAS,WAI3BK,EAAQH,SAAS,SACjBE,EAAiBH,YAAY,YAJ7BG,EAAiBF,SAAS,UAC1BG,EAAQJ,YAAY,WAO5BtN,EAAO2N,cAAgB,WACnBvJ,IACA+C,IACAzG,EAAUyF,OAAO,OAAQnG,EAAO0H,WAAWC,UAG/C3H,EAAO4N,iBAAmB,SAAUC,GAChC,MAAIA,GACOnN,EAAUoN,OAASD,EAEvBnN,EAAUqN,UAGrB/N,EAAOgO,kBAAoB,WAIvB,MAAOC,QAAOC,KAAKlO,EAAOyH,gBAAgB9E,OAAS,GAGvD3C,EAAOmO,WAAa,SAAUrF,EAAKtB,GAC/BS,EAAYiE,qBAAqBlM,EAAOyH,eAAgBqB,EAAKtB,GAC7DS,EAAYmE,kBAAkBtD,EAAKtB,GACnCpD,IACA+C,KAGJnH,EAAOoO,eAAiB,SAAU5G,EAAOiD,GACvB,gBAAVjD,EACIA,IAAUxH,EAAO6F,SACjB7F,EAAO6F,OAAS2B,EAChBxH,EAAOuK,wBAA0BE,EAEjC/J,EAAUyF,OAAOmE,EAAgB9C,GAEjCxH,EAAOgI,eACPhI,EAAOqO,eACPjK,IACA4E,MAGJhJ,EAAO6F,OAAS7F,EAAOuK,wBAA0B,KAEjDtC,EAAYqE,gBAAgBhC,GAE5BtK,EAAOgI,eACPhI,EAAOqO,eACPjK,IACA+C,MAIRnH,EAAOsO,aAAe,SAAShD,GACP,KAAhBA,EAAM9D,OACNxH,EAAOuH,kBAAoB+D,EAE3B5K,EAAUyF,OAAO4C,EAAcuC,EAAM9D,OAErCpD,IACA+C,MAEAc,EAAYqE,gBAAgBvD,GAE5B/I,EAAOuH,kBAAoB,KAE3BnD,IACA+C,MAIRnH,EAAOqO,aAAe,WAElB,GAAKrO,EAAOgO,qBAAoD,OAA7BhO,EAAOuH,kBAA1C,CAIA,GAAIpB,GAASzF,EAAUyF,QACvB,KAAK,GAAIiF,KAAYpL,GAAOyH,eACxBQ,EAAY0D,aAAa3L,EAAOgI,YAAaoD,SACtCjF,GAAOiF,EAElBpL,GAAOyH,kBACP/G,EAAUyF,OAAOA,GAAQjF,UAEzBlB,EAAOsO,aAAa,IAEpBlK,IACA+C,MAGJnH,EAAOuO,eAAiB,SAAUpG,GAC9B,MAA2B,sBAApBA,EAAWG,MAEtBtI,EAAOwO,gBAAkB,SAAUC,GAC/B,MAAOA,GAAMA,EAAI7P,OAAO,SAAU8P,GAC9B,MAAmB,SAAZA,EAAElH,QACRiH,GAGTzO,EAAO2O,OAAS,WACZvK,IACA+C,IAEAzG,EAAUyF,OAAO,IAAKnG,EAAO4H,MAAQ5H,EAAO4H,MAAQ,OAGxD5H,EAAO4O,kBAAoB,WACvB,MAAO5O,GAAO8H,cAAgB9H,EAAO6F,QAAU7F,EAAOyJ,SAE1DzJ,EAAO6O,WAAa,WAChB,MAAO7O,GAAOsE,aAAe,GAEjCtE,EAAO8O,eAAiB,WACpB,MAAO9O,GAAOsE,aAAe,IAEjCtE,EAAO+O,YAAc,WACjB,MAAO/O,GAAOsE,cAAgB,GAAKtE,EAAO0E,WAAY,GAE1D1E,EAAOgP,oBAAsB,WACzB,MAAOhP,GAAO2F,kBAAkBhD,OAAS,GAE7C3C,EAAOiP,oBAAsB,WACzB,MAAOjP,GAAO2F,kBAAkBhD,OAAS,GAE7C3C,EAAOkP,gBAAkB,WACrBlP,EAAO2F,qBACPzB,EAAoBiL,IAAIpL,EAAe0B,yBACvCzF,EAAOoP,WAAWpL,EAAWpE,2BAC7BI,EAAOC,aAGXD,EAAOqP,gBAAkB,WACrB,GAAIC,KACJ1R,SAAQmI,QAAQ/F,EAAO2F,kBAAmB,SAASlE,EAAOmJ,GACtD0E,EAAWpJ,KAAKzE,EAAM+B,WAE1B/C,EAAQ8O,SAASC,KAAOvF,EAAiB,SAAWqF,EAAWG,KAAK,MAYxEzP,EAAO0P,sBAAwB,SAAUC,GACrC,MAAOA,GAAOC,OAAO,GAAGC,cAAgBF,EAAO9D,MAAM,IAGzD7L,EAAO8P,iBAAmB,SAAUC,EAAQnF,GACxC,MAAe,KAAXmF,EAAqB,EACrBA,GAAWnF,EAAQ,EAAW,EACpBA,EAAQ,EAAlBmF,GAAwBA,EAASnF,EAAemF,EAASnF,EAA7D,QAGJ5K,EAAOuJ,gBAAkB,WACrBvJ,EAAOmJ,yBAAyBpD,QAAQ,SAAUtE,EAAOmJ,EAAOoF,GAC5DhQ,EAAOmK,kBAAoB,KAAOS,EAAQ,GAAK,IAC/C5K,EAAOmK,kBAAoB8F,mBAAmBxO,EAAMR,QAChD2J,EAAQoF,EAAMrN,OAAS,IACvB3C,EAAOmK,kBAAoB,QAKvCnK,EAAOkQ,aAAe,WAClBzP,EAAQ4F,eAAeI,QAAQ,YAAa7I,QAAQ8I,OAAOjG,EAAQ0P,cACnE1P,EAAQ4F,eAAeI,QAAQ,eAAgB7I,QAAQ8I,OAAO,KAGlE1G,EAAOmG,OAAS,WACZnG,EAAOoQ,YAAYC,gBAAgB7G,EAAEhC,QAGzCxH,EAAOsQ,YAAc,WACjB,GAAIC,GAAOxJ,EAAE,0BAA0ByJ,KACvCxQ,GAAOoQ,YAAYG,IAGvBvQ,EAAOoQ,YAAc,SAAUxI,GAC3BxD,IACA1D,EAAUyF,OAAO,IAAKyB,EAAQA,EAAQ,MACtC5H,EAAO4H,MAAQlH,EAAUyF,SAASqD,GAAK,EAEvC,IAAIiH,GAAOtM,EAAU,WACgC,IAA9C4C,EAAE,iCAAiCpE,SAClCwE,IACAhD,EAAUuM,OAAOD,KAEtB,MAGPzQ,EAAO2Q,WAAa,WACK,KAAjB3Q,EAAO4H,OACP5H,EAAOoQ,YAAY,OAI3BpQ,EAAO4Q,gCAAkC,SAAUpJ,GAC/C,GAAI8D,GAAQ,yBAEZrD,GAAYqE,gBAAgBhB,GAC5BrD,EAAYkE,qBAAqBb,GAEjCrD,EAAYiE,qBAAqBlM,EAAOyH,eAAgB6D,EAAO9D,GAC/DS,EAAYmE,kBAAkBd,EAAO9D,GAErCpD,IACA+C,WAIZ,WACIvJ,QAAQC,OAAO,qBAAqBgT,UAAU,gBAAiB,WAC3D,OACIC,SAAU,IACVC,KAAM,SAAUC,EAAOC,EAASC,GAE5B,GAAI7M,GAAS,GAAI8M,aACbC,eAAgBD,WAAWE,WAAWC,IAAIC,WAAW,sBAAuB,YAAa,cAAe,cACxGC,eAAgBL,WAAWE,WAAWE,WACtCE,UACIC,IAAK,8BACLC,OAAO,EACPC,SAAU,qBAEdC,OAAQ,SAAUC,EAASC,GACvB,GAAIC,GAAejL,EAAE,aAAayJ,MAAMyB,OAAOlN,cAC3CmN,GAAgBJ,EAAQK,UAAUpN,cAAe+M,EAAQM,YAAYrN,eACrEsN,GAAaN,EAAKI,UAAUpN,cAAegN,EAAKK,YAAYrN,cAEhE,OAA2C,KAAvCmN,EAAaxG,QAAQsG,GACd,GAG6B,KAApCK,EAAU3G,QAAQsG,GACX,EAGPlM,EAAE+C,KAAKqJ,EAAc,SAAUI,GAAK,MAAOA,GAAE5G,QAAQsG,IAAiB,IAC/D,GAGPlM,EAAE+C,KAAKwJ,EAAW,SAAUC,GAAK,MAAOA,GAAE5G,QAAQsG,IAAiB,IAC5D,EAGJ,KAIX1I,EAAS,GAAI6H,aACbC,eAAgBD,WAAWE,WAAWC,IAAIC,WAAW,sBAAuB,YAAa,cAAe,sBAAuB,eAC/HC,eAAgBL,WAAWE,WAAWE,WACtCE,UACIC,IAAK,8BACLC,OAAO,EACPC,SAAU,qBAEdC,OAAQ,SAAUC,EAASC,GACvB,GAAIC,GAAejL,EAAE,aAAayJ,MAAMyB,OAAOlN,cAC3CwN,GAAgBT,EAAQU,UAAUzN,cAAe+M,EAAQW,YAAY1N,eACrE2N,GAAaX,EAAKS,UAAUzN,cAAegN,EAAKU,YAAY1N,cAEhE,OAA2C,KAAvCwN,EAAa7G,QAAQsG,GACd,GAG6B,KAApCU,EAAUhH,QAAQsG,GACX,EAGPlM,EAAE+C,KAAK0J,EAAc,SAAUD,GAAK,MAAOA,GAAE5G,QAAQsG,IAAiB,IAC/D,GAIPlM,EAAE+C,KAAK6J,EAAW,SAAUJ,GAAK,MAAOA,GAAE5G,QAAQsG,IAAiB,IAC5D,EAGJ,KAIXW,EAAc,GAAIxB,aAClBC,eAAgBD,WAAWE,WAAWC,IAAIC,WAAW,uBAAwB,cAC7EC,eAAgBL,WAAWE,WAAWE,WACtCE,UACIC,IAAK,mCACLC,OAAO,EACPC,SAAU,0BAEdC,OAAQ,SAAUC,EAASC,GACvB,GAAIC,GAAejL,EAAE,aAAayJ,MAAMyB,OAAOlN,cAC3C6N,EAAoBd,EAAQe,WAAW9N,cACvC+N,EAAiBf,EAAKc,WAAW9N,aAErC,OAAI6N,KAAsBZ,EACf,GAGPc,IAAmBd,EACZ,EAGqC,KAA5CY,EAAkBlH,QAAQsG,GACnB,GAGkC,KAAzCc,EAAepH,QAAQsG,GAChB,EAGJ,KAIXe,EAAQ,GAAI5B,aACZC,eAAgBD,WAAWE,WAAWC,IAAIC,WAAW,QAAS,QAC9DC,eAAgBL,WAAWE,WAAWE,WACtCE,UACIC,IAAK,6BACLC,OAAO,EACPC,SAAU,qBAIlBX,GAAQ+B,WACJC,WAAW,EACXC,MAAM,IAGNzI,KAAM,QACN0I,QAAS,QACTC,OAAQL,EACRM,MAAO,EACPC,WACIC,WAAY,SAAUxC,GAClB,MAAO,iBAAmBA,EAAKW,IAAM,kCAAoCX,EAAKyC,MAAQ,uBAE1FC,SAAU,MAIdhJ,KAAM,SACN0I,QAAS,QACTC,OAAQ/O,EACRgP,MAAO,EACPC,WACII,OAAQ,kBACRH,WAAY,SAAU9R,GAClB,MAAO,iBAAmBA,EAAMT,KAAO,KAAOS,EAAMkS,MAAQ,cAEhEC,OAAQ,SAAU7S,GACd,MAAO,6CAA+CA,EAAK6G,MAAQ,gCAAkC7G,EAAK6G,MAAQ,cAEtH6L,SAAU,MAIdhJ,KAAM,SACN0I,QAAS,QACTC,OAAQ9J,EACR+J,MAAO,EACPC,WACII,OAAQ,kBACRH,WAAY,SAAUM,GAClB,MAAO,iBAAmBA,EAAM7S,KAAO,KAAO6S,EAAMF,MAAQ,cAEhEC,OAAQ,SAAU7S,GACd,MAAO,6CAA+CA,EAAK6G,MAAQ,6CAA+C7G,EAAK6G,MAAQ,cAEnI6L,SAAU,MAIdhJ,KAAM,cACN0I,QAAS,QACTC,OAAQT,EACRU,MAAO,EACPC,WACII,OAAQ,uBACRH,WAAY,SAAUV,GAClB,MAAO,iBAAmBA,EAAW7R,KAAO,KAAO6R,EAAWc,MAAQ,cAE1EF,SAAU,MAGjBK,GAAG,qBAAsB,SAAUnN,EAAO5F,EAAMgT,GAC7CzU,OAAOiQ,SAASC,KAAOzO,EAAKC,MAAQD,EAAK2Q,cAO7D,WACI9T,QAAQC,OAAO,qBAAqBgT,UAAU,iCAAkC,YAAa,SAAUnQ,GACnG,OACIoQ,SAAU,IACVE,OACInL,OAAQ,KAEZ9F,WAAY,gBACZiU,aAAc,OACdjD,KAAM,SAAUC,EAAOC,EAASC,EAAO+C,GACnC,GAAIpO,GAASqL,EAAMrL,QAAU,EACzByB,EAAgD,OAApC0J,EAAMkD,QAAQ3M,kBAA6ByJ,EAAMkD,QAAQ3M,kBAAkBC,MAAQ,EAE/F+I,EAAO7P,EAAUyF,SAAY,GAAK,EACtC8K,GAAQT,IAAID,EAEZ,IAAIlM,GAAS,GAAI8M,aACbC,eAAgBD,WAAWE,WAAWC,IAAIC,WAAW,sBAAuB,YAAa,cAAe,SACxGC,eAAgBL,WAAWE,WAAWE,WACtCE,UACIC,IAAK,sCAAwC7L,EAAS,cAAgByB,EACtEqK,OAAO,EACPC,SAAU,8BAIde,EAAc,GAAIxB,aAClBC,eAAgBD,WAAWE,WAAWC,IAAIC,WAAW,uBAAwB,cAC7EC,eAAgBL,WAAWE,WAAWE,WACtCE,UACIC,IAAK,2CAA6C7L,EAAS,cAAgByB,EAC3EqK,OAAO,EACPC,SAAU,kCAIlBX,GAAQ+B,WACJC,WAAW,EACXC,MAAM,IAGNzI,KAAM,SACN0I,QAAS,QACTC,OAAQ/O,EACRgP,MAAO,EACPC,WACII,OAAQ,kBACRH,WAAY,SAAU9R,GAClB,GAAI0S,GAAY1S,EAAMT,IACtB,OAAO,sBAAwBS,EAAM0Q,UAAY,WAAagC,EAAY,KAAO1S,EAAMkS,MAAQ,cAEnGF,SAAU,MAIdhJ,KAAM,cACN0I,QAAS,QACTC,OAAQT,EACRU,MAAO,EACPC,WACII,OAAQ,uBACRH,WAAY,SAAUV,GAClB,GAAIuB,GAAM5U,SAAS6U,cAAc,OAC7BC,EAAO9U,SAAS6U,cAAc,OASlC,OARAC,GAAKC,QAAU,SAAUzJ,GACrB,GAAI+H,GAAa9L,EAAE+D,EAAEqC,QAAQE,SAAS,gBAAkBvC,EAAEqC,OAAOqH,cAAcT,QAAQtJ,KAAOK,EAAEqC,OAAO4G,QAAQtJ,IAC/GuG,GAAMkD,QAAQtD,gCAAgCiC,IAGlDyB,EAAKP,QAAQtJ,KAAOoI,EAAWA,WAC/ByB,EAAKG,UAAY5B,EAAWc,MAC5BS,EAAIM,YAAYJ,GACTF,GAEXX,SAAU,cAOlC,WAEI,YAEA7V,SAAQC,OAAO,qBAAqBgT,UAAU,YAAa,WAAY,SAAS8D,GACxE,OACI7D,SAAU,IACV8D,YAAY,EACZ7D,KAAM,SAASC,EAAO6D,EAAU3D,GAC5B2D,EAASC,KAAK,QAAS,WACnBD,EAASvH,YAAY,UACrBvG,EAAE,yBAAyBuG,YAAY,oBAO/D,WAEI,YAEA1P,SAAQC,OAAO,qBAAqBgT,UAAU,gBAAiB,WAAY,sBAAuB,SAAS8D,EAAUzQ,GAC7G,OACI4M,SAAU,IACVC,KAAM,SAASC,EAAO6D,EAAU3D,GAC5B,GAAI6D,GAAoB,uBACpB7Q,GAAoBzF,IAAIsW,IACxBF,EAASG,QAAQ,sBAAsBC,IAAI,UAAW,SAG1DJ,EAASf,GAAG,QAAS,WACjBe,EAASG,QAAQ,sBAAsBC,IAAI,UAAW,UAI1D/Q,EAAoBiL,IAAI4F,GAAmB,WAK/D,WACI,YAEAnX,SAAQC,OAAO,qBACVgT,UAAU,kBAAmB,iBAAkB,SAAU9M,GACtD,OACI+M,SAAU,IACV8D,YAAY,EACZ7D,KAAM,SAAUC,EAAO6D,EAAU5N,GAC7B+J,EAAMkE,YAAc,SAASzT,GACzB,GAAIkE,GAAoBqL,EAAMkD,QAAQvO,kBAAkBhD,MAExD,IAAwB,EAApBgD,GAAyBlE,EAAMwE,kBAAmB,EAAO,CACzD,GAAIkP,IAAQ,CAEZA,GAAQnE,EAAMkD,QAAQxJ,gBAAgBjJ,GAEjC0T,EAGDpR,EAAeqR,kBAAkB3T,GAFjCA,EAAMwE,gBAAiB,MAK3BxE,GAAMwE,gBAAiB,EACvB+K,EAAMkD,QAAQjJ,0BAAyB,EAG3C+F,GAAM/Q,qBAO9B,WACI,YAEArC,SAAQC,OAAO,qBAAqBgT,UAAU,eAAgB,WAC1D,OACIC,SAAU,IACVC,KAAM,SAAUC,EAAO6D,EAAU3D,GAC7B2D,EAASC,KAAK,QAAS,WACnB,GAAID,EAASxH,SAAS,eAClBwH,EAASvH,YAAY,eACrBuH,EAAS9C,KAAK,iBAAiBsD,OAAO,GAAG/H,YAAY,mBAEpD,CACD,GAAIgI,GAAaT,EAASG,QAAQ,kBAElCM,GAAWzM,KAAK,gBAAgByE,YAAY,eAC5CgI,EAAWzM,KAAK,iBAAiBwM,OAAO,GAAG/H,YAAY,eAEvDuH,EAAStH,SAAS,cAClB,IAAIgI,GAAWV,EAAS9C,KAAK,gBAC7BwD,GAASF,OAAOE,EAAS,GAAGC,cAAcjI,SAAS,0BAO3E,WAEI,YAEA3P,SAAQC,OAAO,qBACVgT,UAAU,YAAa,WAAY,SAAU8D,GAC1C,OACI7D,SAAU,IACV8D,YAAY,EACZ7D,KAAM,SAAUC,EAAOC,GACnB,GAAIwE,GAAU,EACVzO,EAAWiK,EAAQpI,KAAK,iBAE5BoI,GAAQyE,WAAW,SAAU5K,GACP,IAAdA,EAAE6K,SAA+B,IAAd7K,EAAE8K,UAKzBH,EAAUI,WAAW,WACjB7O,EAASE,WAAW,UACrB,QAGP+J,EAAQ6E,WAAW,WACfC,aAAaN,aAMrC,WAEI,YAEA7X,SAAQC,OAAO,qBAAqBgT,UAAU,cAAe,UAAW,iBAAkB,SAAUpQ,EAASsD,GACzG,OACIiN,OACIgF,eAAgB,KAEpBjF,KAAM,SAAUC,EAAO6D,EAAU3D,GAC7B,GAAI+E,GAASpB,EAASG,QAAQ,SAC1BkB,EAAYrB,EAASG,QAAQ,MAAMmB,WAAWvL,MAAMiK,EAASG,QAAQ,OAAS,CAElFH,GAASC,KAAK,QAAS,WAEnB,GAAImB,EAAOpN,KAAK,MAAMuN,QAAQvN,KAAK,cAAclG,OAAS,IACtDoE,EAAE,gBAAkBmP,EAAY,IAAKD,GAAQI,OAC7CtP,EAAE,kBAAkBsP,OACpBtS,EAAeiH,uBAAuBgG,EAAMgF,gBAExCM,QAAQC,WAAW,CACnB,GAAIC,GAAY,GAAIC,iBAAgBhW,EAAQ8O,SAASpJ,QACjDuQ,KACAC,EAAW,GACXC,EAAS,EAEbhZ,SAAQmI,QAAQyQ,EAAUK,OAAO,cAAe,SAASrG,EAAK1H,GACtD0H,GAAOQ,EAAMgF,gBACbU,EAAOxQ,KAAK,cAAgBsK,KAIpCmG,GAAY,IAAMD,EAAOjH,KAAK,KAC9BmH,EAASnW,EAAQ8O,SAASuH,SAAW,KAAOrW,EAAQ8O,SAASzB,KAAOrN,EAAQ8O,SAASwH,SAAWJ,EAGhGlW,EAAQ6V,QAAQC,WAAWvV,KAAK4V,GAAQ,GAAGA,cASvE,WACI,YAEAhZ,SAAQC,OAAO,qBAAqBgT,UAAU,cAAe,WACzD,OACIC,SAAU,IACVC,KAAM,SAAUC,EAAO6D,EAAU3D,GAiB7B,QAAS8F,KACL,GAAIC,IAAiBlQ,EAAE,gBAAgBsG,SAAS,qBAChDtG,GAAE,gBAAgBmQ,YAAY,qBAAsBD,GACpDlQ,EAAE,wBAAwBmQ,YAAY,qBAAsBD,GAC5DlQ,EAAE,0BAA0BmQ,YAAY,qBAAsBD,GAC9DlQ,EAAE,QAAQmQ,YAAY,mBAAoBD,GArB9ClQ,EAAE,uBAAwB8N,GAAUf,GAAG,QAAS,SAAUnN,GACtDA,EAAMwQ,gBACN,IAAIC,GAAkBrQ,EAAE,6BACpBqQ,GAAgB/J,SAAS,YACzB+J,EAAgBF,YAAY,UAC5BnQ,EAAE,uBAAuBmQ,YAAY,kBAEzCF,MAIJjQ,EAAE,YAAa8N,GAAUf,GAAG,QAAS,SAAUnN,GAC3CA,EAAMwQ,iBACNH,cAcpB,WACI,YAEApZ,SAAQC,OAAO,qBAAqBgT,UAAU,gBAAiB,WAC3D,OACIC,SAAU,IACVC,KAAM,SAAUC,EAAO6D,EAAU3D,GAC7B2D,EAASC,KAAK,QAAS,WACf/N,EAAE,gBAAgBsG,SAAS,wBAC3BtG,EAAE,gBAAgBmQ,YAAY,sBAC9BnQ,EAAE,wBAAwBmQ,YAAY,sBACtCnQ,EAAE,0BAA0BmQ,YAAY,sBACxCnQ,EAAE,QAAQmQ,YAAY,qBAG1BrC,EAASqC,YAAY,UACrBnQ,EAAE,uBAAuBmQ,YAAY,iBAEjCrC,EAASxH,SAAS,WAElBtG,EAAE,6BAA6BsQ,kBAOvD,WAEI,YAEAzZ,SAAQC,OAAO,qBAAqBgT,UAAU,eAAgB,WAAY,SAAS8D,GAC3E,OACI7D,SAAU,IACV8D,YAAY,EACZ7D,KAAM,SAASC,EAAO6D,EAAU3D,GAC5B,GAAIoG,GAAOvQ,EAAE,YAEb8N,GAASC,KAAK,QAAS,WACfD,EAASxH,SAAS,WAClBwH,EAASvH,YAAY,UACrBgK,EAAKhK,YAAY,YAGjBvG,EAAE,yBAAyBuG,YAAY,UACvCuH,EAAStH,SAAS,UAClB+J,EAAK/J,SAAS,qBAQ1C,WACI,YAmDA,SAASgK,GAAkB5Q,EAAO6Q,GAC9B,GAAIvG,GAAUtK,EAAMwG,OAChB+G,EAAUnN,EAAEkK,GAAS+D,QAAQwC,EAEjCzQ,GAAEJ,EAAMwG,QAAQsK,QAAQ,wBAExB5B,WAAW,WACP3B,EAAQe,IAAI,UAAW,QAAQA,IAAI,aAAc,YAClD,KAGP,QAASyC,GAAezG,EAAS0G,EAAWC,GACxC,GAAIC,GAAU5G,EAAQc,OAAOlJ,KAAK,YAElCgP,GAAQC,MAAM,WACND,EAAQ9W,KAAK,WACbkQ,EAAQ8G,YAAYH,GACpBC,EAAQ9W,KAAK,UAAU,GAAOiX,KAAK,cAEnCL,EAAUF,QAAQ,wBAClBI,EAAQ9W,KAAK,UAAU,GAAMiX,KAAK,YAClC/G,EAAQgE,IAAI,UAAW,YAtEnCrX,QAAQC,OAAO,qBACVgT,UAAU,cAAe,WACtB,OACIC,SAAU,IACV8D,YAAY,EACZ7D,KAAM,SAASC,EAAO6D,EAAU3D,GAC5BF,EAAMiH,aAAe,SAAShH,GAC1B,GAAIuG,GAAUvG,EAAQlQ,KAAK,UACvBmX,GACAC,cAAe,SAASrN,GACpByM,EAAkBzM,EAAG0M,KAGzBY,EAAgBpH,EAAMqH,MAAMpH,EAAQlQ,KAAK,WAE7C,KAAK,GAAI+H,KAAOsP,GACZF,EAAepP,GAAOsP,EAActP,EAGpC+L,GAAShM,KAAK,SAASlG,OAAS,IAChCuV,EAAeI,MAAO,EAG1B,IAAIC,GAAMtH,EAAQ8G,YAAYG,EAE1BjH,GAAQlQ,KAAK,eACb2W,EAAezG,EAASsH,EAAKL,IAIjC,UAAYhH,IACZF,EAAMiH,aAAapD,OAKlChE,UAAU,mBAAoB,WAC3B,OACIC,SAAU,IACV8D,YAAY,EACZ7D,KAAM,SAASC,EAAOC,GAEdD,EAAMwH,OACNxH,EAAMiH,aAAahH,EAAQwH,kBAgCnD,WACI,YAEA7a,SAAQC,OAAO,qBACVgT,UAAU,aAAc,WAAY,SAAS8D,GAC1C,OACI7D,SAAU,IACV8D,YAAY,EACZ7D,KAAM,SAASC,EAAO6D,EAAU5N,GAC7BF,EAAE,QAAQwG,SAAS,qBAMtC,WAEI,YAEA3P,SAAQC,OAAO,qBAAqBgT,UAAU,aAAc,YAAa,UAAW,gBAAiB,SAAUnQ,EAAWD,EAASiY,GAC/H,OACI5H,SAAU,IACV8D,YAAY,EACZ7D,KAAM,SAASC,EAAO6D,GA2ClB,QAAS8D,GAAeC,GAChBlY,EAAUyF,OAAO,MAAOyS,GAAS1X,UACjC8P,EAAMzQ,SAGd,QAASsY,KACLC,EAAexL,YAAY,UAC3ByL,EAAWzL,YAAY,UAEvB0L,EAAmBzL,SAAS,UAC5B0L,EAAe1L,SAAS,UAnD5B,GAGI0L,GAAgBD,EAHhBrP,EAAajJ,EAAUyF,SAASyD,IAChCmP,EAAalE,EAAShM,KAAK,eAC3BiQ,EAAiBjE,EAAShM,KAAK,IAAMkQ,EAAW9R,KAAK,YAIzD,IAFAyR,EAAcQ,QAAU,IAEpBvP,EAAY,CACZqP,EAAqBnE,EAAShM,KAAK,IAAMc,GACzCsP,EAAiBpE,EAAShM,KAAK,aAAec,EAAa,KAC3DkP,GAEA,IAAIM,GAAWzY,EAAUyF,SAASiT,MACjB,UAAbD,GAAoC,MAAbA,IACvBzY,EAAU2Y,KAAK1P,EAAa,QAC5B+O,KAIR7D,EAAShM,KAAK,QAAQiP,MAAM,WACxB,GAAIwB,GAAe,KACfC,EAAQxS,EAAE3G,MACVoZ,EAAWD,EAAMtS,KAAK,WAE1B,IAAKsS,EAAMlM,SAAS,UAQb,CACH,GAAI5M,EAAQgZ,WAAaH,EACrB,MAGJC,GAAMjM,YAAY,UAClBuH,EAAShM,KAAK,IAAM0Q,EAAMtS,KAAK,aAAaqG,YAAY,cAbxDyL,GAAalE,EAAShM,KAAK,eAC3BiQ,EAAiBjE,EAAShM,KAAK,IAAMkQ,EAAW9R,KAAK,aACrDgS,EAAiBpE,EAAShM,KAAK,aAAe2Q,EAAW,KACzDR,EAAqBnE,EAAShM,KAAK,IAAM2Q,GAEzCX,IACAF,EAAea,aA2BvC,WAEI,YAEA5b,SAAQC,OAAO,qBACVgT,UAAU,mBAAoB,WAAY,SAAS8D,GAChD,OACI7D,SAAU,IACV8D,YAAY,EACZ5D,OACI0I,QAAS,KAEb3I,KAAM,SAASC,EAAO6D,GAClBA,EAASiD,MAAM,WACX,GAAI6B,GAAQC,OAAOC,IAAI7I,EAAM0I,QAC7BC,GAAMG,QACNH,EAAMI,KAAK,aAMnC,WAEI,YAEAnc,SAAQC,OAAO,qBACVgT,UAAU,cAAe,WAAY,SAAS8D,GAC3C,OACI7D,SAAU,IACV8D,YAAY,EACZ5D,OACI0I,QAAS,KAEb3I,KAAM,SAASC,EAAO6D,GAClBA,EAASiD,MAAM,WACX,GAAI6B,GAAQC,OAAOC,IAAI7I,EAAM0I,QAC7BC,GAAMK,iBAO9B,WACI,YAEApc,SAAQC,OAAO,qBAAqBoc,QAAQ,kBAAmB,QAAS,sBAAuB,SAASC,EAAOhW,GA8C3G,QAASiW,GAAoBpZ,GACzB,GAAIsD,GAASzG,QAAQwc,SAASrZ,EAAKA,KAEnCsZ,GAAuBhW,GAG3B,QAASiW,GAAkBvZ,IAI3B,QAAS2L,GAAgB6N,GACrBC,EAAmBtU,KAAKqU,GAG5B,QAASF,GAAuBhW,GAC5ByB,EAAEC,QAAQyU,EAAoB,SAASC,GACnCA,EAASpW,KA5DjB6V,EAAM3b,SAASC,QAAQkc,KAAK,gBAAkB,mCAC9C,IAAI1b,GAAU,iBACVwb,KACAG,EAAyB,gBAGzBxT,EAAa,SAAS9C,GAEtB6V,GACIU,OAAQ,OACRlJ,IAAK1S,EAAU,gBACf+B,KAAMsD,EACN7F,SACIqc,eAAgB,sBAErBC,KAAKX,EAAqBG,IAG7B7U,EAAqB,WACrB,MAAOkV,IAGPvF,EAAoB,SAAS3T,GAC7B,GAAIsZ,GAA0B7W,EAAoBzF,IAAIkc,EAClDI,GAC+C,KAA3CA,EAAwBrP,QAAQjK,KAChCsZ,EAAwB7U,KAAKzE,GAC7ByC,EAAoBiL,IAAIwL,EAAwBI,IAGpD7W,EAAoBiL,IAAIwL,GAAyBlZ,KAIrDuJ,EAAyB,SAASvJ,GAClC,GAAIsZ,GAA0B7W,EAAoBzF,IAAIkc,EACtD,IAAII,EAAyB,CACzB,GAAInQ,GAAQmQ,EAAwBrP,QAAQkB,SAASnL,EAAO,IAC5DsZ,GAAwBhQ,OAAOH,EAAO,GACtC1G,EAAoBiL,IAAIwL,EAAwBI,IAyBxD,QACI5T,WAAYA,EACZuF,gBAAiBA,EACjB0I,kBAAmBA,EACnBpK,uBAAwBA,EACxBvF,mBAAoBA,SAIhC,WACI,YAEA7H,SAAQC,OAAO,qBAAqBoc,QAAQ,uBAAwB,QAAS,KAAM,SAASC,EAAOc,GAE/F,QAASC,GAAarT,EAAOsT,GAEzB,GAAIxJ,GAAM,6CACVA,IAAO,8CACPA,GAAO,wCACPA,GAAO,MAAQ9J,EAEXsT,IACAxJ,GAAO,UAAYwJ,EAGvB,IAAIC,GAAUjB,GACVU,OAAQ,MACRlJ,IAAKA,GAGT,OAAOyJ,GAAQL,KAAKM,EAAe/Z,GAGvC,QAAS+Z,GAAcC,GACnB,MAAOA,GAASta,KAGpB,QAASM,GAAYga,GAKjB,MAAKzd,SAAQ0d,SAASD,EAASta,OAAUsa,EAASta,KAAKwa,QAK/CP,EAAGQ,OAAOH,EAASta,KAAKwa,SAJpBP,EAAGQ,OAAO,8BAO1B,OACIP,aAAeA,SAM3B,WACI,YAEArd,SAAQC,OAAO,qBAAqBoc,QAAQ,iBAAmB,QAAS,kBAAmB,SAAUC,EAAOuB,GA4DxG,QAAStB,GAAoBpZ,GACzB,GAAIsD,GAASzG,QAAQwc,SAASrZ,EAAKA,KAEnC2a,GAAgBrX,EAAOsX,MAEvBC,EAA8BvX,EAAOwX,SAGzC,QAASvB,GAAkBvZ,GACvB+a,EAA8B/a,GAGlC,QAAS2L,GAAgBqP,EAAmBC,GACxCxB,EAAmBtU,MACf+V,QAASF,EACTG,QAASF,IAIjB,QAASJ,GAA8BvX,GACnCyB,EAAEC,QAAQyU,EAAoB,SAAU2B,GAChCA,EAAKF,SACLE,EAAKF,QAAQ5X,EAAQqX,KAKjC,QAASI,GAA8B/a,GACnC+E,EAAEC,QAAQyU,EAAoB,SAAU2B,GAChCA,EAAKD,SACLC,EAAKD,QAAQnb,KAKzB,QAASiI,GAAWoT,GAChBlC,EAAMzb,IAAIO,EAAU,UAAYod,GAC3BtB,KAAKuB,EAAqBC,GAGnC,QAASD,GAAoBtb,GACzB,GAAIwb,GAAS3e,QAAQwc,SAASrZ,EAAKA,KACnCyb,GAAwBD,GAG5B,QAASD,GAAkBvb,IAI3B,QAAS4L,GAAgB4N,GACrBkC,EAAmBvW,KAAKqU,GAG5B,QAASiC,GAAwBD,GAC7BzW,EAAEC,QAAQ0W,EAAoB,SAAUhC,GACpCA,EAAS8B,KAjHjBrC,EAAM3b,SAASC,QAAQkc,KAAK,gBAAkB,mCAC9C,IAAI1b,GAAU,iBACV0c,EAAgB,EAChBlB,KACAiC,KAGAtV,EAAa,SAAUiV,EAAeM,EAAWC,EAAUJ,EAAQ5U,EAASC,EAAON,EAAWO,GAC9F,GAAI+U,GAAiB,IAEjBtV,KAEIsV,EADAnR,MAAMoR,QAAQvV,GACGA,GAECA,GAI1B,IAAIvG,IACA8E,OAAQuW,EACRhW,KAAMsW,EACNC,SAAUA,EACVJ,OAAQA,EACR5U,QAASA,EACTC,MAAOA,EACPN,UAAWsV,EACX/U,gBAAiBA,EAGrBqS,IACIU,OAAQ,OACRlJ,IAAK1S,EAAU,SACf+B,KAAMA,EACNvC,SACIqc,eAAgB,sBAErBC,KAAKX,EAAqBG,IAG7B5W,EAAoB,SAAUF,EAASC,EAASqZ,EAA8BC,GAC9E7C,GACIU,OAAQ,MACRlJ,IAAK+J,EAAgBrc,eAAiB,mBAAqBoE,EAAU,YAAcC,EACnFjF,SACIqc,eAAgB,sBAErBC,KAAM,WACDgC,GACAA,EAA6BE,MAAM,KAAMC,YAE9C,WACKF,GACAA,EAA6BC,MAAM,KAAMC,aAiErD,QACI9V,WAAYA,EACZzD,kBAAmBA,EACnBgJ,gBAAiBA,EACjB1D,WAAYA,EACZ2D,gBAAiBA,SAI7B,WAEI,YAEA/O,SAAQC,OAAO,qBAAqBgT,UAAU,iBAAkB,YAAa,WAAY,UAAW,SAASqM,EAAWpZ,EAAUrD,GAC9H,OACIqQ,SAAU,IACVE,OACIpM,UAAW,aACXuY,OAAQ,WAEZpM,KAAM,SAASC,EAAOC,EAASC,GAC3B,GAAIkD,GAAM5U,SAAS4d,cAAc,OAEjCF,GAAUpI,KAAK,SAAU,WACjBrU,EAAQ0P,YAAciE,EAAIiJ,cAAiBjJ,EAAIoB,aAAe,MAASxE,EAAMpM,WAC7EoM,EAAMzQ,OAAOyQ,EAAMmM,kBAO3C,WACI,YAEAvf,SAAQC,OAAO,qBAAqBgT,UAAU,kBAAmB,WAAY,SAAS8D,GAClF,OACI7D,SAAU,IACVC,KAAM,SAASC,EAAO6D,GAClBA,EAASf,GAAG,QAAS,SAAShJ,GAC1BkG,EAAMkD,QAAQvD,aAEdkE,EACKyI,OACAzU,KAAK,SACLmK,UAAU,MAAO,cAO1C,WAEQ,YAEApV,SAAQC,OAAO,qBACVgT,UAAU,aAAc,WAAY,SAAU8D,GAC3C,OACI7D,SAAU,IACVC,KAAM,SAAUC,EAAO6D,GACnBA,EAAS0I,SAAS,SAASzS,GACvB,GAAI0S,GAAW1S,EAAE2S,QAAU3S,EAAE2S,QAAU3S,EAAE4S,KAC1B,OAAXF,IACAxM,EAAMkD,QAAQ9D,YAAYyE,EAASrE,OACnCqE,EAAS8I","file":"app.min.js","sourcesContent":["(function () {\n 'use strict';\n\n var app = angular.module('AladdinCommercial', ['ui.router', 'ngAnimate', 'LocalStorageModule']);\n\n app.config([\"$locationProvider\", function ($locationProvider) {\n // use the HTML5 History API\n $locationProvider.html5Mode({\n enabled: true,\n requireBase: false,\n rewriteLinks: false\n });\n }]);\n\n app.config([\"localStorageServiceProvider\", function (localStorageServiceProvider) {\n localStorageServiceProvider.setPrefix(\"AladdinCommercial\");\n }]);\n\n app.config(['$httpProvider', function ($httpProvider) {\n if (!$httpProvider.defaults.headers.get) {\n $httpProvider.defaults.headers.get = {};\n }\n\n $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';\n $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';\n $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';\n }]);\n\n app.constant('RetailerConstants', {\n zipcodeRegex: /^(\\d{5}-\\d{4})|(\\d{5})|([AaBbCcEeGgHhJjKkLlMmNnPpRrSsTtVvXxYy]\\d[A-Za-z]\\s?\\d[A-Za-z]\\d)$/\n });\n\n // http://stackoverflow.com/a/25513186/1325534\n app.filter('trust', ['$sce', function ($sce) {\n return function (htmlCode) {\n return $sce.trustAsHtml(htmlCode);\n };\n }]);\n\n app.constant('AccountSettings', {\n baseUrl: '/mvc/api/FlooringAccount',\n authStorageKey: 'authData',\n clientName: 'Mohawk Flooring Website'\n });\n\n app.constant('CartSettings', {\n baseUrl: '/api/cart',\n displaySampleAddedCaller: 'displaySampleAddedCaller'\n });\n \n app.constant('ProductSettings', {\n productsApiUrl : '/api/products'\n });\n\n app.constant('SiteFeatures', {\n touch: ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch\n });\n\n app.constant('APP_EVENTS', {\n // product finder events\n 'NEXT_FINDER_VIEW': 'next-finder-view',\n 'PREV_FINDER_VIEW': 'prev-finder-view'\n });\n\n app.constant('APP_EVENTS', {\n resizeMap: 'resizeMap',\n productComparisonClearAll: 'productComparisonClearAll'\n });\n\n app.constant('FILTER_SORT', {\n \"fiber brand\": [\"smartstrand\", \"smartstrand silk\", \"smartstrand silk reserve\", \"air.o\", \"wear-dated\", \"everstrand\", \"permastrand\"],\n \"shade\": [\"light\", \"medium\", \"dark\"]\n });\n})();\n/*global angular */\n(function () {\n 'use strict';\n\n angular.module('AladdinCommercial').controller('BaseController', ['$scope', function($scope) {\n\n // https://coderwall.com/p/ngisma/safe-apply-in-angular-js\n $scope.safeApply = function(fn) {\n var phase = this.$root.$$phase;\n if (phase === '$apply' || phase === '$digest') {\n if (fn && (typeof(fn) === 'function')) {\n fn();\n }\n } else {\n this.$apply(fn);\n }\n };\n\n }]);\n})();\n/*global angular, _, $ */\n(function () {\n 'use strict';\n\n angular.module('AladdinCommercial').controller('PdpController', ['$controller', '$scope', '$window', '$location', 'SearchService', function ($controller, $scope, $window, $location, SearchService) {\n\n $controller('BaseController', {\n $scope: $scope\n });\n\n function selectColorSuccess(result) {\n assignScope(result.data);\n $location.path(result.data.pdpUrl);\n $location.replace();\n }\n\n $scope.selectColor = function (styleId, colorId) {\n SearchService.loadProductDetail(styleId, colorId, selectColorSuccess, handleError);\n };\n \n function initSuccess(result) {\n assignScope(result);\n assignAllColors(result);\n }\n\n $scope.init = function (styleId, colorId) {\n if ($window.pdpInitData === undefined && $window.specifications !== undefined){\n SearchService.loadProductDetail(styleId, colorId, initSuccess, handleError);\n }\n else \n {\n assignScope($window.pdpInitData);\n assignAllColors($window.pdpInitData);\n }\n\n };\n\n function handleError(data) {\n console.error(data);\n }\n\n function assignScope(data)\n {\n $scope.isStyleDiscontinued = data.style.isDeleted;\n $scope.style = data.style;\n $scope.mainColor = data.mainColor;\n $scope.hasSamples = data.style.selectedColor.specifications == \"True\" ;\n $scope.isStyleDiscontinued = data.style.isDeleted;\n $scope.isColorDiscontinued = data.mainColor.isDeleted;\n $scope.pdpUrl = data.pdpUrl;\n $scope.swatchPath = data.swatchPath;\n $scope.retailerZip = data.retailerZip;\n $scope.retailerZip = data.retailerZip;\n $scope.printUrl = data.printUrl;\n $scope.roomSceneImageUrl = data.roomSceneImageUrl;\n $scope.hasRoomScene = !!$scope.roomSceneImageUrl;\n $scope.centerClass = $scope.hasRoomScene ? \"\" : \"center\";\n $scope.productFamilyDescription = data.productFamilyDescription;\n $scope.sellSheetPdfUrl = data.sellSheetPdfUrl;\n $scope.hasSellSheetPdfUrl = !!data.sellSheetPdfUrl;\n $scope.ltEleven = data.allColors.length < 11 ? \"ltEleven\" : \"\";\n $scope.lteFive = data.allColors.length <= 5 ? \"lteFive\" : \"\";\n $scope.lteFour = data.allColors.length <= 4 ? \"lteFour\" : \"\";\n $scope.centerCarousel = $scope.ltEleven ? \"center\" : \"\";\n $scope.specSheetPdfUrl = data.productSpecsPdfUrl;\n $scope.hasSpecSheet = !!data.productSpecsPdfUrl;\n $scope.specGroup1 = data.specGroup1;\n $scope.specGroup2 = data.specGroup2;\n $scope.quickShip = data.quickShip;\n $scope.quickShipNum = data.quickShipNum;\n }\n \n function assignAllColors(data)\n {\n $scope.allColors = data.allColors;\n $scope.allColorsText = data.allColorsText;\n }\n\n }]);\n})();\n/*global angular, _, $ */\n(function () {\n 'use strict';\n\n angular.module('AladdinCommercial').controller('PlpController', ['$controller', '$scope', '$location', '$window', '$timeout', 'SearchService', 'CompareService', 'APP_EVENTS', 'FILTER_SORT', 'localStorageService', '$interval', function ($controller, $scope, $location, $window, $timeout, SearchService, CompareService, APP_EVENTS, FILTER_SORT, localStorageService, $interval) {\n\n $controller('BaseController', {\n $scope: $scope\n });\n\n $scope.family = '';\n $scope.query = $location.search().q || '';\n $scope.showAll = $location.search().show === 'all';\n $scope.lastSearched = $scope.query;\n $scope.facetGroups = [];\n $scope.selectedFacets = {};\n $scope.defaultPageSize = 24;\n $scope.currentTab = $location.search().tab;\n $scope.isLoading = false;\n $scope.isLoadingCompare = false;\n $scope.objSorting = { sorting: '' };\n $scope.hasError = false;\n $scope.forceColorIndex = $location.search().colorIndex === \"1\";\n $scope.rangeMin = 1;\n $scope.rangeMax = 0;\n\n //Product Comparison\n var compareDescription = 'Compare up to 3 products.';\n var compareOverflowDescription = 'A maximum of 3 products can be compared at one time.';\n var compareFamilyUnmatchDescription = 'Products with different product family cannot be compared.';\n var comparePageUrl = '/compare-products';\n var COMPARISON_MAX_NUM = 3;\n var firstRequest = true;\n $scope.productsToCompare = [];\n $scope.productsToCompareResults = [];\n $scope.showViewAllButton = false;\n $scope.comparePrintLink = \"\";\n $scope.compareActiveDescription = compareDescription;\n $scope.showCompareWarning = false;\n $scope.familyCompared = \"\";\n $scope.initialLoadStoredProducts = true;\n\n //Search\n var productTypeKey = 'productType';\n var subFamilyKey = 'subFamily';\n $scope.selectedProductTypeName = null;\n $scope.selectedSubFamily = null;\n $scope.searchProductTypes = [{\n name: 'All Products',\n value: 'allProducts',\n key: productTypeKey\n },\n {\n name: 'Carpet',\n value: 'Carpet',\n key: productTypeKey\n },\n {\n name: 'Hard Surface',\n value: 'HardSurface',\n key: productTypeKey\n }\n ];\n\n $scope.tryAddToCompare = function(style) {\n var isAdded = true;\n var index = _.findIndex($scope.productsToCompare, function (e) { return e.styleId === style.styleId; });\n\n if ($scope.productsToCompare.length === 0) {\n $scope.familyCompared = style.family;\n }\n\n if (index > -1) {\n $scope.productsToCompare.splice(index, 1);\n CompareService.removeFromLocalStorage(style.styleId);\n $scope.changeCompareDescription(false);\n isAdded = false;\n } else if ($scope.productsToCompare.length < COMPARISON_MAX_NUM && $scope.familyCompared == style.family) {\n $scope.productsToCompare.push(style);\n $scope.changeCompareDescription(false);\n } else if ($scope.familyCompared != style.family) {\n isAdded = false;\n $scope.changeCompareDescriptionFamily();\n } else {\n isAdded = false;\n $scope.changeCompareDescription(true);\n }\n $scope.safeApply();\n return isAdded;\n };\n\n $scope.changeCompareDescription = function (overflow) {\n if (overflow) {\n $scope.compareActiveDescription = compareOverflowDescription;\n $scope.showCompareWarning = true;\n } else {\n $scope.compareActiveDescription = compareDescription;\n $scope.showCompareWarning = false;\n }\n };\n\n $scope.changeCompareDescriptionFamily = function() {\n $scope.compareActiveDescription = compareFamilyUnmatchDescription;\n $scope.showCompareWarning = true;\n };\n\n function resetResults() {\n $scope.styles.length = 0;\n $scope.totalResults = -1;\n $scope.currentPage = 0;\n $scope.rangeMin = 1;\n $scope.rangeMax = 0;\n $scope.hasMore = false;\n }\n\n\n function stylesFailed(data) {\n $scope.isLoading = false;\n $scope.errorMessage = (data && data.data && data.data.Message) || \"Unexpected error\";\n $scope.errorMessage = $scope.errorMessage.toLowerCase();\n $scope.hasError = true;\n\n // Regenerate the dropdown panels that are added client side\n $timeout(InitializeDropdowns, 1000);\n }\n\n function stylesUpdated(newStyles, totalResults) {\n $scope.errorMessage = null;\n $scope.totalResults = totalResults;\n $scope.totalPages = Math.floor($scope.totalResults / $scope.defaultPageSize) + 1;\n $scope.rangeMax += newStyles.length;\n $scope.hasMore = $scope.rangeMax < totalResults;\n var storedCompareProducts = localStorageService.get(CompareService.getLocalStorageKey());\n\n if ($scope.initialLoadStoredProducts) {\n if (storedCompareProducts && storedCompareProducts.length > 0) {\n $scope.productsToCompare = storedCompareProducts;\n $scope.familyCompared = $scope.productsToCompare[0].family;\n }\n }\n\n _.forEach(newStyles, function(style) {\n if ($scope.productsToCompare && $scope.productsToCompare.filter(checkMatchingStyle(style)).length > 0) {\n style.compareChecked = true;\n }\n $scope.styles.push(style);\n });\n\n $scope.initialLoadStoredProducts = false;\n\n var currentPage = $location.search().page;\n if (currentPage > 1 && $window.sessionStorage.getItem('shouldScroll') == 1) {\n var waitTime = currentPage * 150;\n $timeout(function () {\n $window.scrollTo(0, $window.sessionStorage.getItem('plpScroll'));\n $window.sessionStorage.setItem('shouldScroll', angular.toJson(0));\n }, waitTime);\n }\n\n // hotjar heatmap trigger\n var event = $scope.family ? 'plp_' + $scope.family + '_heatmap' : 'plp_allproducts_heatmap';\n HotjarTriggers.triggerDelayed(event, 1000);\n\n // Regenerate the dropdown panels that are added client side\n $timeout(InitializeDropdowns, 1000);\n\n $scope.isLoading = false;\n $scope.hasError = false;\n }\n\n function checkMatchingStyle(style) {\n return function(product) {\n return product.styleId == style.styleId;\n };\n }\n\n function InitializeDropdowns() {\n _.forEach($('.dropdown-pane'), function (dropdown) {\n if (!$(dropdown).attr('data-yeti-box')) {\n $(dropdown).foundation();\n }\n });\n }\n\n function loadStyles() {\n $scope.isLoading = true;\n\n if (!firstRequest) {\n if ($scope.currentPage >= $scope.totalPages) {\n $scope.isLoading = false;\n return;\n }\n $scope.currentPage++;\n if ($scope.currentPage > 1) {\n $location.search('page', $scope.currentPage);\n }\n }\n\n var size = $scope.defaultPageSize;\n var page = $scope.currentPage;\n if (firstRequest) {\n size = page * $scope.defaultPageSize;\n page = 0;\n\n if ($scope.currentPage > 1) {\n $location.search('page', $scope.currentPage);\n }\n } else {\n page--;\n }\n\n var subFamily = $scope.selectedSubFamily ? $scope.selectedSubFamily.value : null;\n\n SearchService.loadStyles($scope.family, page, size, $scope.selectedFacets, $scope.objSorting.sorting, $scope.query, subFamily, $scope.forceColorIndex);\n $scope.lastSearched = $scope.query;\n firstRequest = false;\n }\n\n var facetHelper = {\n checkFacet: function (facetGroups, facetKey, facetValues) {\n _.forEach(facetGroups, function (facetGroup) {\n _.forEach(facetGroup.values, function (facet) {\n if (facet.key.toLowerCase() === facetKey.toLowerCase()) {\n if (facetValues === 'True') {\n facet.checked = true;\n } else {\n facet.checked = (facetValues.constructor === Array) ? facetValues.indexOf(facet.value) > -1 : facet.value === facetValues;\n }\n }\n });\n });\n },\n\n uncheckFacet: function (facetGroups, facetKey) {\n _.forEach(facetGroups, function (facetGroup) {\n _.forEach(facetGroup.values, function (facet) {\n if (facet.key === facetKey) {\n facet.checked = false;\n }\n });\n });\n },\n\n selectFacet: function (selectedFacets, facetKey, facetValues) {\n var selectedFacet = selectedFacets[facetKey];\n if (selectedFacet) {\n selectedFacet.push(facetValues);\n } else if (facetValues.constructor === Array) {\n selectedFacets[facetKey] = facetValues.slice(0);\n } else {\n selectedFacets[facetKey] = [facetValues];\n }\n },\n reorderFacetValues: function (facetValues, orderList) {\n if (!facetValues || !orderList) {\n return;\n }\n facetValues.sort(function (x, y) {\n return orderList.indexOf(x.value.toLowerCase()) < orderList.indexOf(y.value.toLowerCase()) ? -1 : 1;\n });\n },\n toggleFacetSelection: function (selectedFacets, key, value) {\n var selectedFacet = selectedFacets[key];\n if (selectedFacet) {\n var index = selectedFacet.indexOf(value);\n if (index < 0) {\n selectedFacet.push(value);\n } else if (selectedFacet.length > 1) {\n selectedFacet.splice(index, 1);\n } else {\n // Last item; delete the entry to avoid an empty array\n delete selectedFacets[key];\n }\n } else {\n selectedFacets[key] = [value];\n }\n },\n removeFacetSelection: function(selectedFacets, key) {\n delete selectedFacets[key];\n },\n toggleSearchValue: function (key, value) {\n var entry = $location.search()[key];\n if (!entry) {\n entry = [];\n } else if (entry.constructor !== Array) {\n entry = [entry];\n }\n var index = entry.indexOf(value);\n if (index < 0) {\n entry.push(value);\n } else if (entry.length > 1) {\n entry.splice(index, 1);\n } else {\n entry = null;\n }\n $location.search(key, entry).replace();\n },\n removeSearchValue: function (key, value) {\n var entry = $location.search()[key];\n if (entry) {\n if (entry.constructor !== Array) {\n entry = [entry];\n }\n var index = entry.indexOf(value);\n if (index > -1) {\n entry.splice(index, 1);\n }\n $location.search(key, entry).replace();\n }\n },\n removeSearchKey: function (key) {\n var entry = $location.search()[key];\n if (entry) {\n entry = null;\n $location.search(key, entry).replace();\n }\n },\n isFacetKey: function (facetKey) {\n var key = facetKey.toLowerCase();\n return key !== 'sort' && key !== 'q' && key !== 'page' && key !== 'producttype' && key !== 'subfamily' && key !== 'colorindex';\n }\n };\n\n function facetsUpdated(facetGroups) {\n facetHelper.removeSearchValue('colors.specifications.Samples', 'false');\n\n _.forEach(facetGroups, function (facetGroup) {\n facetHelper.reorderFacetValues(facetGroup.values, FILTER_SORT[facetGroup.text.toLowerCase()]);\n $scope.facetGroups.push(facetGroup);\n });\n\n _.forEach($location.search(), function (searchVal, searchKey) {\n if (facetHelper.isFacetKey(searchKey)) {\n facetHelper.checkFacet($scope.facetGroups, searchKey, searchVal);\n facetHelper.selectFacet($scope.selectedFacets, searchKey, searchVal);\n }\n else if (searchKey.toLowerCase() === 'subfamily') {\n var subFamilies = _.find(facetGroups, function(facetGroup) { return _.find(facetGroup.values, {'key': subFamilyKey}); });\n var subFamily = _.find(subFamilies.values, {'value': searchVal});\n $scope.selectedSubFamily = subFamily;\n }\n });\n\n loadStyles();\n }\n\n function loadFacets() {\n SearchService.loadFacets($scope.family);\n }\n\n $scope.init = function (family) {\n $scope.styles = [];\n $scope.family = family;\n $scope.showQuery = !!$scope.query || (!$scope.family && !$scope.showAll);\n $scope.isSearch = !$scope.family;\n $scope.objSorting.sorting = $scope.isSearch ? 'relevance' : 'A-Z';\n\n initSearchMode();\n\n SearchService.subscribeStyles(stylesUpdated, stylesFailed);\n SearchService.subscribeFacets(facetsUpdated);\n CompareService.subscribeStyles(compareStylesUpdated);\n\n var currentPage = $location.search().page;\n $scope.currentPage = currentPage ? parseInt(currentPage, 10) : 1;\n\n if ($scope.family) {\n loadFacets();\n } else {\n loadStyles();\n }\n\n $scope.$on(APP_EVENTS.productComparisonClearAll, function () {\n $scope.styles.forEach(function (style) {\n if (style.compareChecked === true) {\n style.compareChecked = false;\n }\n });\n });\n };\n\n var initSearchMode = function () {\n $scope.searchMode = !$scope.family;\n\n var productType = $location.search()[productTypeKey];\n if (productType) {\n $scope.family = productType;\n $scope.selectedProductTypeName = _.find($scope.searchProductTypes, ['value', productType]).name;\n }\n };\n\n $scope.loadMore = loadStyles;\n\n $scope.toggleFacets = function (event) {\n var elementClicked = $(event.target).parents('div.filter');\n\n if (!(elementClicked.hasClass('active'))) {\n elementClicked.addClass('active');\n } else {\n elementClicked.removeClass('active');\n }\n };\n\n $scope.toggleFilterController = function (event) {\n var filterController = $(event.target);\n var filters = filterController.parents('.filters-wrapper').find('.filters');\n\n if (!filterController.hasClass('active')) {\n filterController.addClass('active');\n filters.removeClass('close');\n } else {\n filters.addClass('close');\n filterController.removeClass('active');\n }\n };\n\n $scope.changeSorting = function() {\n resetResults();\n loadStyles();\n $location.search('sort', $scope.objSorting.sorting);\n };\n\n $scope.styleAbsoluteUrl = function (styleUrl) {\n if (styleUrl) {\n return $location.host() + styleUrl;\n }\n return $location.absUrl();\n };\n\n $scope.hasSelectedFacets = function () {\n // If Object.keys() doesn't exist in a browser, we can use the following:\n // for (var facet in $scope.selectedFacets) if ($scope.selectedFacets.hasOwnProperty(facet)) return true;\n // return false;\n return Object.keys($scope.selectedFacets).length > 0;\n };\n\n $scope.facetClick = function (key, value) {\n facetHelper.toggleFacetSelection($scope.selectedFacets, key, value);\n facetHelper.toggleSearchValue(key, value);\n resetResults();\n loadStyles();\n };\n\n $scope.setProductType = function (value, name) {\n if (value !== 'allProducts') {\n if (value !== $scope.family) {\n $scope.family = value;\n $scope.selectedProductTypeName = name;\n\n $location.search(productTypeKey, value);\n\n $scope.facetGroups = [];\n $scope.clearFilters();\n resetResults();\n loadFacets();\n }\n } else {\n $scope.family = $scope.selectedProductTypeName = null;\n\n facetHelper.removeSearchKey(productTypeKey);\n\n $scope.facetGroups = [];\n $scope.clearFilters();\n resetResults();\n loadStyles();\n }\n };\n\n $scope.setSubFamily = function(facet) {\n if (facet.value !== '') {\n $scope.selectedSubFamily = facet;\n\n $location.search(subFamilyKey, facet.value);\n\n resetResults();\n loadStyles();\n } else {\n facetHelper.removeSearchKey(subFamilyKey);\n\n $scope.selectedSubFamily = null;\n\n resetResults();\n loadStyles();\n }\n };\n\n $scope.clearFilters = function () {\n\n if (!$scope.hasSelectedFacets() && $scope.selectedSubFamily === null) {\n return;\n }\n\n var search = $location.search();\n for (var facetKey in $scope.selectedFacets) {\n facetHelper.uncheckFacet($scope.facetGroups, facetKey);\n delete search[facetKey];\n }\n $scope.selectedFacets = {};\n $location.search(search).replace();\n\n $scope.setSubFamily('');\n\n resetResults();\n loadStyles();\n };\n\n $scope.isSamplesFacet = function (facetGroup) {\n return facetGroup.text === 'Samples Available';\n };\n $scope.filterTrueValue = function (arr) {\n return arr ? arr.filter(function (i) {\n return i.value === 'true';\n }) : arr;\n };\n\n $scope.submit = function () {\n resetResults();\n loadStyles();\n\n $location.search('q', $scope.query ? $scope.query : null);\n };\n\n $scope.shouldHaveResults = function () {\n return $scope.lastSearched || $scope.family || $scope.showAll;\n };\n $scope.hasResults = function () {\n return $scope.totalResults > 0;\n };\n $scope.searchFinished = function () {\n return $scope.totalResults > -1;\n };\n $scope.canShowMore = function () {\n return $scope.totalResults >= 0 && $scope.hasMore === true;\n };\n $scope.showComparisonPopup = function () {\n return $scope.productsToCompare.length > 0;\n };\n $scope.enableCompareButton = function () {\n return $scope.productsToCompare.length > 1;\n };\n $scope.clearSelections = function () {\n $scope.productsToCompare = [];\n localStorageService.set(CompareService.getLocalStorageKey(), []);\n $scope.$broadcast(APP_EVENTS.productComparisonClearAll);\n $scope.safeApply();\n };\n\n $scope.compareProducts = function () {\n var productIds = [];\n angular.forEach($scope.productsToCompare, function(style, index) {\n productIds.push(style.styleId);\n });\n $window.location.href = comparePageUrl + '?pids=' + productIds.join(',');\n };\n\n function compareStylesUpdated(styles) {\n $scope.isLoadingCompare = false;\n $scope.productsToCompareResults = styles;\n $scope.showViewAllButton = $scope.productsToCompareResults.some(function (product) {\n return product.colors.length > 12;\n });\n $scope.updatePrintLink();\n }\n\n $scope.capitalizeFirstLetter = function (string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n };\n\n $scope.getRatingPartial = function (rating, index) {\n if (rating === 0) return 0;\n if (rating >= (index + 1)) return 1;\n if (rating < (index + 1) && rating > index) return (rating - index);\n };\n\n $scope.updatePrintLink = function () {\n $scope.productsToCompareResults.forEach(function (style, index, array) {\n $scope.comparePrintLink += \"p\" + (index + 1) + \"=\";\n $scope.comparePrintLink += encodeURIComponent(style.pdpUrl);\n if (index < array.length - 1) {\n $scope.comparePrintLink += \"&\";\n }\n });\n };\n\n $scope.productClick = function () {\n $window.sessionStorage.setItem('plpScroll', angular.toJson($window.pageYOffset));\n $window.sessionStorage.setItem('shouldScroll', angular.toJson(1));\n };\n\n $scope.search = function() {\n $scope.changeQuery(searchInputForm.q.value);\n };\n\n $scope.facetSearch = function () {\n var term = $('#autoCompleteSearchBox').val();\n $scope.changeQuery(term);\n };\n\n $scope.changeQuery = function (query) {\n resetResults();\n $location.search('q', query ? query : null);\n $scope.query = $location.search().q || '';\n\n var stop = $interval(function() {\n if($('.product-wrapper .products li').length === 0){\n loadStyles();\n $interval.cancel(stop);\n }\n }, 100);\n };\n\n $scope.clearQuery = function () {\n if ($scope.query !== '') {\n $scope.changeQuery(null);\n }\n };\n\n $scope.predictiveSearchCollectionFacet = function (value) {\n var facet = 'collection.name.keyword';\n\n facetHelper.removeSearchKey(facet);\n facetHelper.removeFacetSelection(facet);\n\n facetHelper.toggleFacetSelection($scope.selectedFacets, facet, value);\n facetHelper.toggleSearchValue(facet, value);\n\n resetResults();\n loadStyles();\n };\n }]);\n})();\n(function () {\n angular.module('AladdinCommercial').directive('autoComplete', [function () {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n\n var styles = new Bloodhound({\n datumTokenizer: Bloodhound.tokenizers.obj.whitespace('normalizedStyleName', 'styleName', 'styleNumber', 'collection'),\n queryTokenizer: Bloodhound.tokenizers.whitespace,\n prefetch: {\n url: '/api/products/suggestStyles',\n cache: true,\n cacheKey: 'ac-suggest-styles'\n },\n sorter: function (current, next) {\n var input_string = $('.tt-input').val().trim().toLowerCase();\n var currentStyle = [current.styleName.toLowerCase(), current.styleNumber.toLowerCase()];\n var nextStyle = [next.styleName.toLowerCase(), next.styleNumber.toLowerCase()];\n\n if (currentStyle.indexOf(input_string) !== -1) {\n return -1;\n }\n\n if (nextStyle.indexOf(input_string) !== -1) {\n return 1;\n }\n\n if (_.find(currentStyle, function (s) { return s.indexOf(input_string) >= 0})) {\n return -1;\n }\n\n if (_.find(nextStyle, function (s) { return s.indexOf(input_string) >= 0})) {\n return 1;\n }\n\n return 0;\n }\n });\n\n var colors = new Bloodhound({\n datumTokenizer: Bloodhound.tokenizers.obj.whitespace('normalizedColorName', 'colorName', 'colorNumber', 'normalizedStyleName', 'styleNumber'),\n queryTokenizer: Bloodhound.tokenizers.whitespace,\n prefetch: {\n url: '/api/products/suggestcolors',\n cache: true,\n cacheKey: 'ac-suggest-colors'\n },\n sorter: function (current, next) {\n var input_string = $('.tt-input').val().trim().toLowerCase();\n var currentColor = [current.colorName.toLowerCase(), current.colorNumber.toLowerCase()];\n var nextColor = [next.colorName.toLowerCase(), next.colorNumber.toLowerCase()];\n\n if (currentColor.indexOf(input_string) !== -1) {\n return -1;\n }\n\n if (nextColor.indexOf(input_string) !== -1) {\n return 1;\n }\n\n if (_.find(currentColor, function (s) { return s.indexOf(input_string) >= 0})) {\n return -1;\n }\n\n \n if (_.find(nextColor, function (s) { return s.indexOf(input_string) >= 0})) {\n return 1;\n }\n\n return 0;\n }\n });\n\n var collections = new Bloodhound({\n datumTokenizer: Bloodhound.tokenizers.obj.whitespace('normalizedCollection', 'collection'),\n queryTokenizer: Bloodhound.tokenizers.whitespace,\n prefetch: {\n url: '/api/products/suggestcollections',\n cache: true,\n cacheKey: 'ac-suggest-collections'\n },\n sorter: function (current, next) {\n var input_string = $('.tt-input').val().trim().toLowerCase();\n var currentCollection = current.collection.toLowerCase();\n var nextCollection = next.collection.toLowerCase();\n\n if (currentCollection === input_string) {\n return -1;\n }\n\n if (nextCollection === input_string) {\n return 1;\n }\n\n if (currentCollection.indexOf(input_string) !== -1) {\n return -1;\n }\n\n if (nextCollection.indexOf(input_string) !== -1) {\n return 1;\n }\n\n return 0;\n }\n });\n\n var links = new Bloodhound({\n datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title', 'tags'),\n queryTokenizer: Bloodhound.tokenizers.whitespace,\n prefetch: {\n url: '/api/products/suggestlinks',\n cache: true,\n cacheKey: 'ac-suggest-links'\n }\n });\n\n element.typeahead({\n highlight: true,\n hint: false\n },\n {\n name: 'links',\n display: 'title',\n source: links,\n limit: 2,\n templates: {\n suggestion: function (link) {\n return '
View All ' + link.title + ' Products
';\n },\n notFound: ''\n }\n },\n {\n name: 'styles',\n display: 'label',\n source: styles,\n limit: 3,\n templates: {\n header: '
Styles
',\n suggestion: function (style) {\n return '
' + style.label + '
';\n },\n footer: function (data) {\n return '
View All Style Results for ' + data.query + '
';\n },\n notFound: ''\n }\n },\n {\n name: 'colors',\n display: 'label',\n source: colors,\n limit: 3,\n templates: {\n header: '
Colors
',\n suggestion: function (color) {\n return '
' + color.label + '
';\n },\n footer: function (data) {\n return '
View All Color Results for ' + data.query + '
';\n },\n notFound: ''\n }\n },\n {\n name: 'collections',\n display: 'label',\n source: collections,\n limit: 3,\n templates: {\n header: '
Collections
',\n suggestion: function (collection) {\n return '
' + collection.label + '
';\n },\n notFound: ''\n }\n })\n .on(\"typeahead:selected\", function (event, data, dataset) {\n window.location.href = data.path || data.url;\n });\n }\n }\n }]);\n})();\n\n(function () {\n angular.module('AladdinCommercial').directive('autoCompleteSearchStylesFacet', ['$location', function ($location) {\n return {\n restrict: 'A',\n scope: {\n family: '@'\n },\n controller: 'PlpController',\n controllerAs: 'ctrl',\n link: function (scope, element, attrs, ctrl) {\n var family = attrs.family || 0;\n var subFamily = scope.$parent.selectedSubFamily !== null ? scope.$parent.selectedSubFamily.value : 0;\n\n var term = $location.search()['q'] || '';\n element.val(term);\n\n var styles = new Bloodhound({\n datumTokenizer: Bloodhound.tokenizers.obj.whitespace('normalizedStyleName', 'styleName', 'styleNumber', 'label'),\n queryTokenizer: Bloodhound.tokenizers.whitespace,\n prefetch: {\n url: '/api/products/suggestStyles?family=' + family + '&subFamily=' + subFamily,\n cache: true,\n cacheKey: 'ac-suggest-search-styles'\n }\n });\n\n var collections = new Bloodhound({\n datumTokenizer: Bloodhound.tokenizers.obj.whitespace('normalizedCollection', 'collection'),\n queryTokenizer: Bloodhound.tokenizers.whitespace,\n prefetch: {\n url: '/api/products/suggestCollections?family=' + family + '&subFamily=' + subFamily,\n cache: true,\n cacheKey: 'ac-suggest-search-collections'\n }\n });\n\n element.typeahead({\n highlight: true,\n hint: false\n },\n {\n name: 'styles',\n display: 'label',\n source: styles,\n limit: 4,\n templates: {\n header: '
Styles
',\n suggestion: function (style) {\n var stylePath = style.path;\n return '
' + style.label + '
';\n },\n notFound: ''\n }\n },\n {\n name: 'collections',\n display: 'label',\n source: collections,\n limit: 4,\n templates: {\n header: '
Collections
',\n suggestion: function (collection) {\n var div = document.createElement('div');\n var span = document.createElement('span');\n span.onclick = function (e) {\n var collection = $(e.target).hasClass('tt-highlight') ? e.target.parentElement.dataset.name : e.target.dataset.name;\n scope.$parent.predictiveSearchCollectionFacet(collection);\n };\n\n span.dataset.name = collection.collection;\n span.innerText = collection.label;\n div.appendChild(span);\n return div;\n },\n notFound: ''\n }\n });\n }\n }\n }]);\n})();\n(function() {\n\n 'use strict';\n\n angular.module('AladdinCommercial').directive('closeNav', [\"$compile\", function($compile) {\n return {\n restrict: 'A',\n transclude: false,\n link: function(scope, $element, attrs) {\n $element.bind('click', function() {\n $element.removeClass('active');\n $('.nav-first-level-link').removeClass('active');\n });\n\n }\n };\n }]);\n})();\n(function() {\n\n 'use strict';\n\n angular.module('AladdinCommercial').directive('closePrivacy', [\"$compile\", \"localStorageService\", function($compile, localStorageService) {\n return {\n restrict: 'A',\n link: function(scope, $element, attrs) {\n var LOCAL_STORAGE_KEY = \"AcceptedPrivacyPolicy\";\n if(!localStorageService.get(LOCAL_STORAGE_KEY)){\n $element.closest('div.privacy-policy').css('display', 'block'); \n }\n\n $element.on('click', function() {\n $element.closest('div.privacy-policy').css('display', 'none');\n });\n\n // Set the key to true once the message is viewed by the user\n localStorageService.set(LOCAL_STORAGE_KEY, true);\n }\n };\n }]);\n})();\n(function () {\n 'use strict';\n\n angular.module('AladdinCommercial')\n .directive('comparisonItem', ['CompareService', function (CompareService) {\n return {\n restrict: 'A',\n transclude: false,\n link: function (scope, $element, attr) {\n scope.changeState = function(style) {\n var productsToCompare = scope.$parent.productsToCompare.length;\n\n if (productsToCompare < 3 || style.compareChecked === false) {\n var added = false;\n\n added = scope.$parent.tryAddToCompare(style);\n\n if (!added) {\n style.compareChecked = false;\n } else {\n CompareService.addToLocalStorage(style);\n }\n } else {\n style.compareChecked = false;\n scope.$parent.changeCompareDescription(true);\n }\n\n scope.safeApply();\n };\n\n }\n };\n }]);\n})();\n(function () {\n 'use strict';\n\n angular.module(\"AladdinCommercial\").directive(\"dropContent\", [function () {\n return {\n restrict: 'A',\n link: function (scope, $element, attrs) {\n $element.bind('click', function () {\n if ($element.hasClass('drop-active')) {\n $element.removeClass('drop-active');\n $element.next('.drop-content').height(0).removeClass('drop-active');\n }\n else {\n var $container = $element.closest('.drop-container');\n\n $container.find('.drop-button').removeClass('drop-active');\n $container.find('.drop-content').height(0).removeClass('drop-active');\n\n $element.addClass('drop-active');\n var $content = $element.next('.drop-content');\n $content.height($content[0].scrollHeight).addClass('drop-active');\n }\n });\n }\n }\n }])\n})();\n(function () {\n\n 'use strict';\n\n angular.module('AladdinCommercial')\n .directive('hoverFix', [\"$compile\", function ($compile) {\n return {\n restrict: 'A',\n transclude: false,\n link: function (scope, element) {\n var timeout = 0;\n var dropdown = element.find('.dropdown-pane');\n\n element.mouseleave(function (e) {\n if (e.screenX === 0 && e.screenY === 0) {\n // This is a fix for a Chrome bug, which incorrectly fires mouseleave/mouseout\n // events when tapping with a trackpad on this dropdown.\n return;\n }\n timeout = setTimeout(function () {\n dropdown.foundation('close');\n }, 250);\n });\n\n element.mouseenter(function () {\n clearTimeout(timeout);\n });\n }\n };\n }]);\n})();\n(function () {\n\n 'use strict';\n\n angular.module('AladdinCommercial').directive('hideColumn', ['$window', 'CompareService', function ($window, CompareService) {\n return {\n scope: {\n compareStyleId: '@'\n },\n link: function (scope, $element, attrs) {\n var $table = $element.closest('table');\n var colNumber = $element.closest('tr').children().index($element.closest('td')) + 1;\n\n $element.bind('click', function () {\n //// For now the code doesn't allow to remove the last column from the comparison. If needed we can add an else here and do something else.\n if ($table.find('tr').first().find('td:visible').length > 3) {\n $('td:nth-child(' + colNumber + ')', $table).hide();\n $('.remove-column').hide();\n CompareService.removeFromLocalStorage(scope.compareStyleId);\n\n if (history.pushState) {\n var urlParams = new URLSearchParams($window.location.search);\n var newIds = [];\n var newQuery = '';\n var newurl = '';\n\n angular.forEach(urlParams.getAll('productIds'), function(val, key) {\n if (val != scope.compareStyleId) {\n newIds.push('productIds=' + val);\n }\n })\n\n newQuery += '?' + newIds.join('&');\n newurl = $window.location.protocol + \"//\" + $window.location.host + $window.location.pathname + newQuery;\n\n\n $window.history.pushState({path:newurl},'',newurl);\n }\n }\n\n });\n }\n }\n }]);\n})();\n(function () {\n 'use strict';\n\n angular.module(\"AladdinCommercial\").directive(\"mobileMenu\", [function () {\n return {\n restrict: 'A',\n link: function (scope, $element, attrs) {\n $('.cd-dropdown-trigger', $element).on('click', function (event) {\n event.preventDefault();\n var mobileSearchBar = $('.search-bar .mobile-search');\n if (mobileSearchBar.hasClass('active')) {\n mobileSearchBar.toggleClass('active');\n $('.search-bar .search').toggleClass('mobile-active');\n }\n toggleNav();\n });\n\n //close meganavigation\n $('.cd-close', $element).on('click', function (event) {\n event.preventDefault();\n toggleNav();\n });\n\n function toggleNav() {\n var navIsVisible = (!$('.cd-dropdown').hasClass('dropdown-is-active')) ? true : false;\n $('.cd-dropdown').toggleClass('dropdown-is-active', navIsVisible);\n $('.cd-dropdown-trigger').toggleClass('dropdown-is-active', navIsVisible);\n $('#mobile-menu .cd-close').toggleClass('dropdown-is-active', navIsVisible);\n $('body').toggleClass('mobile-nav-shown', navIsVisible);\n }\n }\n }\n }])\n})();\n(function () {\n 'use strict';\n\n angular.module(\"AladdinCommercial\").directive(\"mobileSearch\", [function () {\n return {\n restrict: 'A',\n link: function (scope, $element, attrs) {\n $element.bind('click', function() {\n if ($('.cd-dropdown').hasClass('dropdown-is-active')) {\n $('.cd-dropdown').toggleClass('dropdown-is-active');\n $('.cd-dropdown-trigger').toggleClass('dropdown-is-active');\n $('#mobile-menu .cd-close').toggleClass('dropdown-is-active');\n $('body').toggleClass('mobile-nav-shown');\n }\n\n $element.toggleClass('active');\n $('.search-bar .search').toggleClass('mobile-active');\n\n if ($element.hasClass('active'))\n {\n $('.search-bar .search input').focus();\n }\n });\n }\n }\n }])\n})();\n(function() {\n\n 'use strict';\n\n angular.module('AladdinCommercial').directive('navMenuMask', [\"$compile\", function($compile) {\n return {\n restrict: 'A',\n transclude: false,\n link: function(scope, $element, attrs) {\n var mask = $('#mask-nav');\n\n $element.bind('click', function() {\n if ($element.hasClass('active')) {\n $element.removeClass('active');\n mask.removeClass('active');\n }\n else {\n $('.nav-first-level-link').removeClass('active');\n $element.addClass('active');\n mask.addClass('active');\n }\n });\n\n }\n };\n }]);\n})();\n(function() {\n 'use strict';\n\n angular.module('AladdinCommercial')\n .directive('owlCarousel', function() {\n return {\n restrict: 'E',\n transclude: false,\n link: function(scope, $element, attrs) {\n scope.initCarousel = function(element) {\n var parent$ = element.data('parent');\n var defaultOptions = {\n onInitialized: function(e) {\n initCarouselWidth(e, parent$);\n }\n };\n var customOptions = scope.$eval(element.data('options'));\n\n for (var key in customOptions) {\n defaultOptions[key] = customOptions[key];\n }\n\n if ($element.find('.item').length < 2) {\n defaultOptions.loop = false;\n }\n // init Owl carousel\n var owl = element.owlCarousel(defaultOptions);\n\n if (element.data('expandable')) {\n initExpandable(element, owl, defaultOptions);\n }\n };\n\n if ('static' in attrs) {\n scope.initCarousel($element);\n }\n }\n };\n })\n .directive('owlCarouselItem', [function() {\n return {\n restrict: 'A',\n transclude: false,\n link: function(scope, element) {\n // This waits for the last item on an ng-repeat before calling init for the carousel\n if (scope.$last) {\n scope.initCarousel(element.parent());\n }\n }\n };\n }]);\n\n function initCarouselWidth(event, parent$) {\n var element = event.target;\n var $parent = $(element).closest(parent$);\n\n $(event.target).trigger('refresh.owl.carousel');\n\n setTimeout(function() {\n $parent.css('display', 'none').css('visibility', 'visible');\n }, 100);\n }\n\n function initExpandable(element, owlSlider, options) {\n var $button = element.next().find('.view-all');\n\n $button.click(function() {\n if ($button.data('opened')) {\n element.owlCarousel(options);\n $button.data('opened', false).html('View All');\n } else {\n owlSlider.trigger('destroy.owl.carousel');\n $button.data('opened', true).html('Collapse');\n element.css('display', 'block');\n }\n });\n }\n})();\n(function() {\n 'use strict';\n\n angular.module('AladdinCommercial')\n .directive('printable', [\"$compile\", function($compile) {\n return {\n restrict: 'A',\n transclude: false,\n link: function(scope, $element, attr) {\n $('body').addClass('printable');\n }\n };\n }]);\n})();\n/*global $ */\n(function() {\n\n 'use strict';\n\n angular.module('AladdinCommercial').directive('tabulator', ['$location', '$window', '$anchorScroll', function ($location, $window, $anchorScroll) {\n return {\n restrict: 'A',\n transclude: false,\n link: function(scope, $element) {\n\n var currentTab = $location.search().tab;\n var $activeTab = $element.find('.tab.active');\n var $activeContent = $element.find('#' + $activeTab.attr('data-tab'));\n var $tabToBeActive, $contentToBeActive;\n $anchorScroll.yOffset = 100;\n\n if (currentTab) {\n $contentToBeActive = $element.find('#' + currentTab);\n $tabToBeActive = $element.find('[data-tab=' + currentTab + ']');\n changeActive();\n\n var qsScroll = $location.search().scroll;\n if (qsScroll === 'true' || qsScroll === '1') {\n $location.hash(currentTab + '-tab');\n $anchorScroll();\n }\n }\n\n $element.find('.tab').click(function() {\n var $mobileBreak = 1024;\n var $this = $(this);\n var $tabName = $this.attr('data-tab');\n\n if (!$this.hasClass('active')) {\n $activeTab = $element.find('.tab.active');\n $activeContent = $element.find('#' + $activeTab.attr('data-tab'));\n $tabToBeActive = $element.find('[data-tab=' + $tabName + ']');\n $contentToBeActive = $element.find('#' + $tabName);\n\n changeActive();\n updateLocation($tabName);\n } else {\n if ($window.innerWidth > $mobileBreak) {\n return;\n }\n\n $this.removeClass('active');\n $element.find('#' + $this.attr('data-tab')).removeClass('active');\n }\n });\n\n function updateLocation(tabName) {\n $location.search('tab', tabName).replace();\n scope.$apply();\n }\n\n function changeActive() {\n $activeContent.removeClass('active');\n $activeTab.removeClass('active');\n\n $contentToBeActive.addClass('active');\n $tabToBeActive.addClass('active');\n }\n }\n };\n }]);\n})();\n(function() {\n\n 'use strict';\n\n angular.module('AladdinCommercial')\n .directive('videoModalClose', [\"$compile\", function($compile) {\n return {\n restrict: 'A',\n transclude: false,\n scope: {\n videoid: '@'\n },\n link: function(scope, $element) {\n $element.click(function() {\n var video = Wistia.api(scope.videoid);\n video.pause();\n video.time(0);\n });\n }\n };\n }]);\n})();\n(function() {\n\n 'use strict';\n\n angular.module('AladdinCommercial')\n .directive('videoModal', [\"$compile\", function($compile) {\n return {\n restrict: 'A',\n transclude: false,\n scope: {\n videoid: '@'\n },\n link: function(scope, $element) {\n $element.click(function() {\n var video = Wistia.api(scope.videoid);\n video.play();\n });\n }\n };\n }]);\n})();\n/*global _ */\n(function() {\n 'use strict';\n\n angular.module('AladdinCommercial').factory('CompareService', ['$http', 'localStorageService', function($http, localStorageService) {\n\n $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n var baseUrl = '/api/products/';\n var _stylesSubscribers = [];\n var compareLocalStorageKey = \"compareStyles\";\n\n // Public Functions\n var loadStyles = function(styles) {\n\n $http({\n method: 'POST',\n url: baseUrl + 'compareStyles',\n data: styles,\n headers: {\n 'Content-Type': 'application/json'\n }\n }).then(handleStylesSuccess, handleStylesError);\n };\n\n var getLocalStorageKey = function() {\n return compareLocalStorageKey;\n };\n\n var addToLocalStorage = function(style) {\n var storedProductsToCompare = localStorageService.get(compareLocalStorageKey);\n if (storedProductsToCompare) {\n if (storedProductsToCompare.indexOf(style) === -1) {\n storedProductsToCompare.push(style);\n localStorageService.set(compareLocalStorageKey, storedProductsToCompare);\n }\n } else {\n localStorageService.set(compareLocalStorageKey, [style]);\n }\n };\n\n var removeFromLocalStorage = function(style) {\n var storedProductsToCompare = localStorageService.get(compareLocalStorageKey);\n if (storedProductsToCompare) {\n var index = storedProductsToCompare.indexOf(parseInt(style, 10));\n storedProductsToCompare.splice(index, 1);\n localStorageService.set(compareLocalStorageKey, storedProductsToCompare);\n }\n };\n\n // Private Functions\n function handleStylesSuccess(data) {\n var styles = angular.fromJson(data.data);\n\n updateStyleSubscribers(styles);\n }\n\n function handleStylesError(data) {\n // TODO Don't just console.error(data);\n }\n\n function subscribeStyles(subscriber) {\n _stylesSubscribers.push(subscriber);\n }\n\n function updateStyleSubscribers(styles) {\n _.forEach(_stylesSubscribers, function(callback) {\n callback(styles);\n });\n }\n\n return {\n loadStyles: loadStyles,\n subscribeStyles: subscribeStyles,\n addToLocalStorage: addToLocalStorage,\n removeFromLocalStorage: removeFromLocalStorage,\n getLocalStorageKey: getLocalStorageKey\n };\n }]);\n})();\n(function() {\n 'use strict';\n\n angular.module('AladdinCommercial').factory('GoogleSearchService', ['$http', '$q', function($http, $q) {\n\n function googleSearch(query, start) {\n\n var url = 'https://www.googleapis.com/customsearch/v1?';\n url += 'key=AIzaSyCpvSspDOkr2F3ekbb5yC_w4baAxcLofmQ';\n url += '&cx=000976281450227790847:g1q65afenmk';\n url += '&q=' + query;\n\n if (start) {\n url += '&start=' + start;\n }\n\n var request = $http({\n method: 'GET',\n url: url\n });\n\n return request.then(handleSuccess, handleError);\n }\n\n function handleSuccess(response) {\n return response.data;\n }\n\n function handleError(response) {\n // The API response from the server should be returned in a\n // nomralized format. However, if the request was not handled by the\n // server (or what not handles properly - ex. server error), then we\n // may have to normalize it on our end, as best we can.\n if (!angular.isObject(response.data) || !response.data.message) {\n return ($q.reject(\"An unknown error occurred.\"));\n }\n\n // Otherwise, use expected error message.\n return ($q.reject(response.data.message));\n }\n\n return {\n googleSearch : googleSearch\n };\n\n }]);\n})();\n/*global angular, _ */\n(function () {\n 'use strict';\n\n angular.module('AladdinCommercial').factory('SearchService', ['$http', 'ProductSettings', function ($http, ProductSettings) {\n\n $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n var baseUrl = '/api/products/';\n var _totalResults = 0;\n var _stylesSubscribers = [];\n var _facetsSubscribers = [];\n\n // Public Functions\n var loadStyles = function (productFamily, pageIndex, pageSize, facets, sorting, query, subFamily, forceColorIndex) {\n var subFamilyValue = null;\n\n if (subFamily) {\n if (Array.isArray(subFamily)) {\n subFamilyValue = subFamily;\n } else {\n subFamilyValue = [subFamily];\n }\n }\n\n var data = {\n family: productFamily,\n page: pageIndex,\n pageSize: pageSize,\n facets: facets,\n sorting: sorting,\n query: query,\n subFamily: subFamilyValue,\n forceColorIndex: forceColorIndex\n };\n\n $http({\n method: 'POST',\n url: baseUrl + 'styles',\n data: data,\n headers: {\n 'Content-Type': 'application/json'\n }\n }).then(handleStylesSuccess, handleStylesError);\n };\n\n var loadProductDetail = function (styleId, colorId, successProductDetailCallback, failureProductDetailCallback) {\n $http({\n method: 'GET',\n url: ProductSettings.productsApiUrl + '/Detail?styleId=' + styleId + '&colorId=' + colorId,\n headers: {\n 'Content-Type': 'application/json'\n }\n }).then( function() { \n if (successProductDetailCallback){\n successProductDetailCallback.apply(null, arguments);\n } \n }, function() {\n if (failureProductDetailCallback){\n failureProductDetailCallback.apply(null, arguments);\n }\n });\n }\n\n // Private Functions\n function handleStylesSuccess(data) {\n var styles = angular.fromJson(data.data);\n\n _totalResults = styles.total;\n\n updateStyleSubscribersSuccess(styles.results);\n }\n\n function handleStylesError(data) {\n updateStyleSubscribersFailure(data);\n }\n\n function subscribeStyles(subscriberSuccess, subscriberFailure) {\n _stylesSubscribers.push({\n success: subscriberSuccess,\n failure: subscriberFailure\n });\n }\n\n function updateStyleSubscribersSuccess(styles) {\n _.forEach(_stylesSubscribers, function (item) {\n if (item.success) {\n item.success(styles, _totalResults);\n }\n });\n }\n\n function updateStyleSubscribersFailure(data) {\n _.forEach(_stylesSubscribers, function (item) {\n if (item.failure) {\n item.failure(data);\n }\n });\n }\n\n function loadFacets(productFamily) {\n $http.get(baseUrl + 'facets/' + productFamily)\n .then(handleFacetsSuccess, handleFacetsError);\n }\n\n function handleFacetsSuccess(data) {\n var facets = angular.fromJson(data.data);\n updateFacetsSubscribers(facets);\n }\n\n function handleFacetsError(data) {\n //console.error(data);\n }\n\n function subscribeFacets(subscriber) {\n _facetsSubscribers.push(subscriber);\n }\n\n function updateFacetsSubscribers(facets) {\n _.forEach(_facetsSubscribers, function (callback) {\n callback(facets);\n });\n }\n\n return {\n loadStyles: loadStyles,\n loadProductDetail: loadProductDetail,\n subscribeStyles: subscribeStyles,\n loadFacets: loadFacets,\n subscribeFacets: subscribeFacets\n };\n }]);\n})();\n(function() {\n\n 'use strict';\n\n angular.module('AladdinCommercial').directive('plpScrollLoad', [\"$document\", \"$timeout\", \"$window\", function($document, $timeout, $window) {\n return {\n restrict: 'A',\n scope: {\n isLoading: '=isLoading',\n onLoad: '&onLoad'\n },\n link: function(scope, element, attrs) {\n var div = document.querySelector(\"html\");\n\n $document.bind('scroll', function() {\n if ($window.pageYOffset + div.offsetHeight >= (div.scrollHeight - 150) && !scope.isLoading) {\n scope.$apply(scope.onLoad);\n }\n });\n }\n };\n }]);\n})();\n(function() {\n 'use strict';\n\n angular.module('AladdinCommercial').directive('resetPlpSearch', [\"$compile\", function($compile) {\n return {\n restrict: 'A',\n link: function(scope, $element) {\n $element.on('click', function(e) {\n scope.$parent.clearQuery();\n\n $element\n .prev()\n .find('input')\n .typeahead('val', '');\n });\n }\n };\n }]);\n})();\n\n(function () {\n \n 'use strict';\n \n angular.module('AladdinCommercial')\n .directive('searchPlp', [\"$compile\", function ($compile) {\n return {\n restrict: 'A',\n link: function (scope, $element) {\n $element.keypress(function(e) {\n var keycode = (e.keyCode ? e.keyCode : e.which);\n if (keycode == '13') {\n scope.$parent.changeQuery($element.val());\n $element.blur();\n }\n });\n }\n };\n }]);\n })();"],"sourceRoot":"/source/"}