{"version":3,"sources":["bundle-scripts-9b4d113ad5.js"],"names":["angular","module","directive","TemplateUriHandler","restrict","controller","templateUrl","scope","data","placeholder","$timeout","$parse","link","element","attrs","model","focusMe","$watch","focus","$scope","EnstoGA","$translate","BrowserDetect","_","ctrl","this","filterBy","setDefaultDisplayText","isEmpty","currentlySelected","undefined","DisplayName","displayText","instant","Value","prepareFilterValues","forEach","Values","value","Key","selected","show","length","filterAsLower","toLowerCase","indexOf","showSelectGlyphicon","name","select","unselect","clearSelections","row","typeaheadText","getDisplayTextclass","isOpen","selectValue","current","$event","stopPropagation","newVal","oldVal","showTypeAhead","getTypeAheadState","ViewportWatcher","priority","isGridFloatBreakpointMax","removeClass","addClass","ServerSettings","require","menuItems","pre","attributes","isMainnavbar","$eval","isNull","getValue","post","homeLink","startPageURL","navigationColor","logoColor","whiteText","blackText","logoFileName","navigationTabs","JSON","parse","selectedTabIndex","findIndex","tab","Selected","replace","menuItemGroups","chunk","menu","children","ElementHelper","$window","BgImageUrlRegex","$log","headerSectionHeight","registerCallback","size","extractBgImgURL","backgroundImageStyle","getComputedStyle","backgroundImage","bacgroundImage","result","exec","debug","getImageOriginalSize","img","Image","src","width","height","calculateMargin","originalImageSize","scrollTop","windowSize","outerWidth","outerHeight","sizeRatio","scaledImageSize","marginTop","setMarginTop","margin","css","ScrollProxy","$rootElement","bgElement","parent","el","hasClass","init","on","enstoSolution","document","getElementsByClassName","breadCrumbs","prepend","type","footerClasses","viewportSize","addressesList","facebookPageURL","socialPages","facebook","instagramPageURL","instagram","twitterPageURL","twitter","linkedinPageURL","linkedin","youtubePageURL","youtube","navbarCollapsed","isOpenSearch","isOpenLanguage","isOpenCart","component","bindings","categories","language","authenticated","currentcategoryid","categoryids","hidePriceCounts","$rootScope","$http","$ctrl","$onInit","isFetchingPrices","CategoryIds","Language","CurrentCategoryId","then","response","categoriesWithPrice","$broadcast","pricesFetchFailed","finally","categoryid","mainlevel","webshopProductsOnly","$on","msg","priceData","map","cat","PricedProductsCount","find","priceRow","CategoryId","ContentID","PricedProducts","pricedItemsCount","category","ContentId","AvailableProducts","config","localStorageServiceProvider","setPrefix","setStorageType","factory","localStorageService","EnstoCookieService","get","cookie","set","options","remove","isSupported","templateuri","date","Date","getUTCFullYear","getUTCMonth","getUTCDay","UserSettings","settings_key","getStorageType","transclude","close","dismiss","ok","$value","item","cancel","isElement","querySelector","viewport","innerContainer","offsetHeight","contactTags","querySelectorAll","biggestHeight","contact","style","loadingText","showFade","$observe","path","search","location","test","href","message","isAlert","isUppercase","textUppercase","$uibPosition","checkAffixingStatus","bounds","top","affixTopOffset","affixClass","enstoAffix","enstoAffixClass","offset","getPlainElement","enstoOffClick","setValue","val","isObject","default_value","compile","fromJson","enstoServerJson","removeAttr","$compile","template","thisImages","thisLinks","linkText","text","empty","append","EnstoGAService","trackPageView","url","isString","isFunction","ga","trackSocialShare","socialService","shareUrl","trackFilterAction","action","trackTabOpening","tabName","source","trackContactOpening","eventAction","eventLabel","trackEvent","eventCategory","ElementHelperService","documentEl","windowHeight","windowWidth","scrollLeft","elem","isArray","isInViewport","lookahead","warn","isNumber","left","right","bottom","callListeners","LISTENERS","cb","ScrollProxyService","EVENTS","throttle","off","push","unregisterCallback","registeredCB","UrlService","toQueryString","obj","parts","keys","key","encodeURIComponent","join","getQueryParams","queryString","params","startsWith","substring","split","part","tmp","decodeURIComponent","getAbsoluteUrl","protocol","host","tem","ua","M","navigator","userAgent","match","version","appName","appVersion","splice","ViewportWatcherService","registry","orientation","viewportChanged","each","startWatching","enquire","register","unmatch","constant","cz","ng","fb","ee","fi","fr","de","hu","in","it","kz","lv","lt","no","pl","ro","ru","es","se","en-gb","en-us","TECHNICAL","DOWNLOAD","BENEFITS","SUPPORT","NEWS","$sceDelegateProvider","allowedDomains","AllowedDomainsForEmbeddedMedia","i","resourceUrlWhitelist","html","enstoCompileHtml","contents","getProductName","overrideName","getIntroText","introtext","introText","getEnumber","enumber","eNumber","getType","producttype","productType","getGTIN","gtin","getPrice","price","$resource","preferredCultureName","verb","contentId","areaIds","getProductNews","method","getProductSalesPersons","code","loading","requestUrl","sections","catch","err","error","window","clientWidth","innerWidth","bind","$apply","EnstoProduct","EnstoTabTypes","removeTab","tabType","tabsData","getTab","isEmptyTechnicalSpecifications","technicalSpecifications","o","groups","loadContactsAndSupport","refreshContacts","$promise","results","content","contacts","failed","noop","support","countries","loadProductNews","activeTab","translationkey","active","downloads","openClick","tabSource","benefits","news","every","richcontent","description","enstoDescription","tplType","productnumber","elemement","eq","attr","pageInEditMode","forceAccordionOpen","tabsJustified","justified","pdfCard","isUndefined","tabIndex","noActiveTabs","noTabActive","defaultTabType","defaultTabOpen","first","benefitTabIndex","hash","$uibModal","allowModalOpen","activeImage","setActiveImage","imageObj","getPrimaryImage","productImages","image","openFullScreen","open","backdropClass","windowClass","resolve","form","pdf","pdfName","productName","pageUrl","setProductName","downloadPdf","is_valid","sending","pick","pdfPopoverOpen","closePopover","downloadDefaultPdf","title","downloadSpecificationPdf","primaryImageIndicative","videoIds","enstoVideoIds","sortBy","caption","productNumber","productDefaultImage","productDataservice","Url","primaryImages","secondaryImages","fetching","getProductImages","responseData","getImages","statusText","EnstoProductWrapper","products","header","showenumber","showmyfavourites","compresslimit","useMinifiedVersion","product","productWrapper","merge","$uibModalInstance","downloadUrl","dl","closeModalClick","saveStoredSidenavState","state","localStorage","setItem","toggleSidenavState","sidenavState","getSidenavState","getItem","documentElement","getStoredSidenavState","$","isRunned","picturefill","elements","slice","call","isFixedSize","presetType","alt","attachErrorHandler","detachErrorHandler","presetsType","RegExp","ImagePresets","pixelDensities","generateUrls","urls","preset","density","_lgPreset","customClass","_mdPreset","_smPreset","_xsPreset","screenLgUrls","screenMdUrls","screenSmUrls","screenXsUrls","lg","md","sm","xs","carousel","carouselForExpandedCard","splitbanner","productThumbnail","productImage","productImageFullscreen","articleCard","articleCardExpanded","articlePageImage","productLandingImage","categoryImage","solutionImage","factImage","teaserProduct","imageTeaser","searchResultThumbnail","contactImage","newsTeaser","newsCardHighlight","newsCardTeaser","mobileMenuThumbnail","industryTeaser","whiteList","YouTubeHelperService","getThumbnailURL","videoId","getVideoEmbedURL","rel","modestbranding","youtubeVideoId","useBackground","thumbnailImageSrc","videoid","Video","video","closePlayer","YouTubeHelper","openPlayerModal","thumbnailSrc","videoSrc","slides","ctrls","convertSlides","carouselPreset","thumbnails","slide","media","imgalt","imgtitle","slideInterval","activeSlide","chunks","k","images","setActive","query","queryParams","defaults","depth","range","unit","enabled","evt","searchPageURL","businessUnit","EnstoSearchService","suggestions","count","itemType","page","pageSize","searchInRange","currentFilter","enableOrEnclosureSearch","enable","mm","inch","showQuery","color","dataForModal","cssColorClass","q","getSuggestions","$viewValue","onTypeaheadSelect","$item","$model","typeaheadWaitMs","typeaheadMinLength","MaxDescriptionLength","hasMore","totalResults","searchDuration","facets","searchResults","maxDescriptionLength","allowTrunc","showENum","showButtonLabel","isEqual","showMore","showOrHideEnclosures","enclosures","Id","Hits","Facets","HasMore","TotalCount","Took","selectFacet","facet","Type","$attr","showenum","translations","productindexobj","nodeindexobj","pageindexobj","typeTitle","parseQueryString","values","chain","filter","keyval","resultObj","$httpParamSerializerJQLike","regex","EnstoCookie","inheritFiltersCookieName","isMobile","transformer","tmpData","EnstoCategoryProductsService","e","concat","transformResponse","getProducts","paramSerializer","sortOrder","filters","mobile","saveFilters","savedFilters","clone","pathname","loadFilters","loadedFilters","isInheritFromTopToBottom","isInheritFromBottomToTop","$filter","enstoFilterValueFilter","isNumeric","$stateful","hidePriceFilter","EnstoCategoryProducts","categoryID","enstoCategoryProductCount","id","getFilterName","displayname","enterValuePlaceholder","pop","EnstoUserSettings","defaultViewMode","viewModes","LIST","enstoCategoryPage","activeFilters","currentSortMode","sortModes","PROCUS","currentViewMode","hasSelectedFilters","$location","scrollPos","preserve","preservePage","THINLIST","ALPHABETICAL","loadingProducts","tableHeaders","totalProducts","displayColumns","getActiveFilters","selectedFilters","selectedValues","selectedValue","setFilterType","newFilters","newFilter","_filter","isnumeric","sortFilterValues","initializeFilterValues","newValue","isHidden","existingFilter","newFilterValue","existingValue","resetProducts","showPricesOnly","pricesOnly","preserveMe","preservePageState","retrievedData","sessionStorage","pageStateParams","removeItem","setPreserveStateValues","pageYOffset","stringify","preventDefault","currentTarget","priceRowsOnly","showPrice","ShowWebshop","columnHeaders","total","hasmore","setTimeout","scrollTo","clearAllFilters","showList","showThinList","sortAlphabetically","sortProcus","getPricedProducts","toString","readMore","isExpanded","getImagePreset","getImageUrl","teaserImage","getImageCaption","getReadmoreLinkText","getCards","card","hideColumnCard","parseInt","collectionId","allowExpand","reloadMasonryLayout","update","imagesLoaded","openCard","triggerHandler","EnstoCardService","cards","masonryOptions","columnWidth","itemSelector","percentPosition","transitionDuration","getUrlParameter","param","sUrlVariables","sParameterName","Cards","EnstoCardWrapper","reloadLayout","cardWrapper","event","$sce","scopeId","$id","cardCollapse","getCardBodyText","trustAsHtml","bodyText","cardExpand","clickCatchEnabled","$parent","bu","id[]","firstPageSize","year","magazine","EnstoCardSearchService","facetCategories","eventCategories","yearFacets","buCategories","selectedCategories","eventTags","selectedYears","selectedBuCategories","magazineFilter","currentId","isRel","isCategoryFilterCollapsed","years","unescape","getCategoriesFromQueryString","getKeyAsArrayOrEmpty","localSelectedBuCategories","customPageSize","Array","ensureArray","categoryName","categoryOption","buCategory","newSearch","filterChanged","isActiveCategory","catSelection","toggleCategory","selectedCategory","filtersWithoutSelection","toggleEventTag","index","toggleYear","toggleBu","resetFilters","publishedlabel","tagslabel","imagePreset","imageurl","categoryname","publishdate","teasertext","readmoretext","emcTitle","isCollapsed","isValidType","TEASER_TYPES","teaser","notInSelection","teaserImgCaption","firstNewsEl","firstNews","enstoFirstNews","EnstoContacusService","sendFrom","postData","makeInquirySubjectGroups","inquirySubjects","Math","round","contactusData","rePositionContactUsContainer","containerElem","initialTopPosition","styles","topPosition","position","isInsideSlider","setProductCategories","setSubjectGroups","isSliderOpened","openContactUs","closeContactUs","EnstoContacus","EnstoEmailRegex","messageMaxLength","enstoEmailRegex","showText","languageid","getActiveCountry","country","sentSuccessfulText","sentFailedText","productCategories","rootproductcategorynames","inquiryGroups","subjectdata","closeSendingOverlay","sendForm","pageLanguage","selectedInquirySubjectId","selectedInquirySubjectTitle","productCategory","getPostData","ContactusForm","$setPristine","EnstoCSRFTokenService","headerName","setCSRFTokenHeader","headers","common","EnstoCSRFToken","elemenet","getContacts","categoryIds","roleIds","countyAreaIds","WhereToBuy","loadingContacts","selectedCountry","initialSearchDone","resetResults","getSelectedRoleId","selectedId","roles","getSelectedAreasIds","rootGeographicalAreas","getSelectedCategoryId","getSelectedCountyId","counties","attachWatchers","showContacts","$watchCollection","showCountySelector","inEditMode","showSubFilters","showRootGeographicalAreaSelector","showProductCategorySelector","Hasmore","Roles","Counties","ProductCategories","setResultCountString","Total","Results","resultCountString","resultCountTemplate","getWebAddress","WebAddress","webaddress","getTitle","Title","getRoles","RoleIds","roleids","getImage","ImageUrl","getJobTitle","JobTitle","jobtitle","IntroText","getCategoryNames","CategoryNames","categorynames","getAddress","Address","address","getZip","Zip","zip","getCity","City","city","getCountry","Country","getEmail","Email","email","getPhone","Phone","phone","getCompany","CompanyName","companyName","translatorFactory","getFriendlyText","roleId","friendlyText","getDefault","roleTranslator","$element","openContact","target","innerHTML","contactPersonName","arr","charAt","toUpperCase","hideContact","$interpolate","EnstoContactWrapper","contactWrapper","showPhoneLink","contactType","mapUrl","a2a_config","callbacks","EnstoShareConfig","EnstoShareService","ready","initializing","cbs","scriptEl","_a2aReady","_a2aShare","service","initialize","share","EnstoShare","shareTitle","services","getShareUrl","getShareTitle","copyCardLink","copyThisLink","hostname","EnstoMyselectionService","save","productCode","interceptor","_productCode","_products","_product","productsLoaded","isInSelection","product_code","some","EnstoMyselection","closeMyselection","isMyselectionOpen","typeString","prodNameString","prodName2String","prodEnumString","GTINString","linkString","export","csv","prods","prod","blob","Blob","msSaveOrOpenBlob","msSaveBlob","downloadContainer","downloadLink","URL","createObjectURL","click","isRemove","btnText","checkIfSelected","unbindReady","listenRemove","unbindRemove","isSelected","mySelectionClick","selectionCount","resetForm","MyselectionForm","showSentMessage","shareMyselection","emailForResponse","$error","sendFailed","$submitted","submit","showNotification","AddItemToCartCtrl","shoppingCartService","enstoConstants","quantity","addItemToCart","updatedQuantity","addProduct","showItemAdded","cartEvents","updatingQuantity","showaddbutton","callback","orderid","hasorders","repurchaseOrder","repurchaseCart","AddedItemsCount","removeItemFromCart","removeProduct","errorMessage","constants","disabled","parseQuantity","updatingCart","cartUpdated","broadcastQuantityUpdate","decreaseQuantity","amount","increaseQuantity","onQuantityChange","onKeydown","keyCode","clearCart","urlParser","loadCart","mode","validationErrors","LocalizedValidationIssues","validationIssues","Category","totalPrice","TotalPrice","orders","Orders","cartLoading","sendingOrder","updatingItemCode","changeProductQuantity","cartUpdating","cartStateIsValid","getPackagePrice","order","Package","Price","Amount","enstoUrlParser","serverSettings","optionalNotes","cartHasItems","mapAddress","line1Address","Line1Address","line2Address","Line2Address","lineAddress","fullAddress","reduce","CountryCode","displayValue","canOrder","formatDeliveryDate","deliveryDate","moment","dateFormat","loadContactDetails","CartHasItems","addressMissing","HasBillingAddress","HasShippingAddress","orderSummaryPageUrl","shippingAddresses","CustomerContactInfo","ShippingAddresses","billingAddresses","BillingAddresses","DeliveryDate","minDate","holidays","HolidayDateTimeTicks","dt","placeholderDate","format","isSelectable","dayOfWeek","day","toDate","isHoliday","holidayDt","toDateString","sendOrder","shippingAddressId","billingAddressId","orderSent","orderData","OrderNumber","orderComplete","earliestDeliveryDate","hasInvalidAddresses","InvalidAddresses","loadPrice","leadtime","availabilityToConfirm","availabilityGreenLimit","availabilityToBeConfirmed","getAvailabilityCircleClassByLeadTime","leadTimeInDays","settings","orderSummaryUrl","loadHistory","items","orderId","formatOrderLink","webshopOnly","productsPageRoot","currentLanguage","onChange","reloadUrl","shoppingCartApi","orderApi","parseResponse","makeQueryString","leftPart","keyValues","queryStr","broadcastUpdatingCart","cartResponse","broadcastCartUpdated","broadcastUpdatingCartItemQuantity","fetchFinnishHolidays","wantedDeliveryDate","Content-Type","OptionalNotes","WantedDeliveryDate","toISOString","ShippingAddressId","BillingAddressId","removingItem","broadcastRemovingItem","Code","loadPurchasedCart","getProductData","masterdataApi","$locationProvider","$logProvider","$translateProvider","tmhDynamicLocaleProvider","ngDashConfigProvider","history","pushState","html5Mode","requireBase","rewriteLinks","isDevMode","debugEnabled","jsDebugEnabled","localeLocationPattern","useSanitizeValueStrategy","directivePriority","preferredLanguage","setFilters","setUtils","input","exception","cause","apply","arguments","jsErrors","run","tmhDynamicLocale","EnstoLanguages","useLocale","$document","FastClick","attach","body","cart","isLoading","addingOrderItemsToCart","Cart","billingAddress","BillingAddress","shippingAddress","ShippingAddress","notes","Notes","Message","$templateCache","put"],"mappings":"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","file":"bundle-scripts-9b4d113ad5.js","sourcesContent":[" // Place for select type of controls (Dropdowns, textfields etc.)\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.selectcontrols', ['ngResource'])\r\n .directive('enstoSingleselectDropdown', function (TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n controller: 'EnstoSingleselectController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-singleselect-dropdown.html'),\r\n scope: {\r\n data: '=',\r\n placeholder: '='\r\n }\r\n };\r\n })\r\n .directive('focusMe', ['$timeout', '$parse', function ($timeout, $parse) {\r\n return {\r\n //scope: true, // optionally create a child scope\r\n link: function (scope, element, attrs) {\r\n var model = $parse(attrs.focusMe);\r\n scope.$watch(model, function () {\r\n $timeout(function () {\r\n element[0].focus();\r\n }); \r\n });\r\n }\r\n };\r\n }])\r\n .controller('EnstoSingleselectController', function ($scope, EnstoGA, $translate, BrowserDetect, _) {\r\n var ctrl = this;\r\n $scope.filterBy = '';\r\n $scope._ = _; \r\n\r\n ctrl.setDefaultDisplayText = function () {\r\n if (!_.isEmpty($scope.data.currentlySelected)) {\r\n $scope.displayText = $scope.data.currentlySelected.Value;\r\n }\r\n else if ($scope.data !== undefined && !_.isEmpty($scope.data.DisplayName)) {\r\n $scope.displayText = $scope.data.DisplayName;\r\n }\r\n else if (!_.isEmpty($scope.placeholder)){\r\n $scope.displayText = $scope.placeholder;\r\n } else {\r\n $scope.displayText = $translate.instant('/comcommon/choosevalue');\r\n }\r\n }; \r\n\r\n ctrl.prepareFilterValues = function () {\r\n _.forEach($scope.data.Values, function (value) {\r\n\r\n if (!_.isEmpty($scope.data.currentlySelected)) {\r\n if ($scope.data.currentlySelected.Key === value.Key) {\r\n value.selected = true;\r\n }\r\n }\r\n\r\n value.show = function () {\r\n if ($scope.filterBy.length > 0) {\r\n var filterAsLower = $scope.filterBy.toLowerCase();\r\n var valueTolower = this.Value.toLowerCase();\r\n return valueTolower.indexOf(filterAsLower) >= 0;\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n value.showSelectGlyphicon = function (){\r\n return this.selected === true && BrowserDetect.name !== 'Firefox'; //In firefox the selected icon appears on next row\r\n };\r\n\r\n value.select = function () {\r\n this.selected = true;\r\n };\r\n\r\n value.unselect = function () {\r\n this.selected = false;\r\n };\r\n });\r\n };\r\n\r\n $scope.clearSelections = function () {\r\n $scope.filterBy = '';\r\n _.forEach($scope.data.Values, function (row) {\r\n row.selected = false;\r\n });\r\n\r\n ctrl.setDefaultDisplayText();\r\n $scope.data.currentlySelected = {};\r\n $scope.typeaheadText = '';\r\n };\r\n\r\n $scope.getDisplayTextclass = function (){\r\n if ($scope.data !== undefined && !_.isEmpty($scope.data.currentlySelected)){\r\n return 'ensto-value-selected ensto-display-text';\r\n }else{\r\n return 'ensto-display-text';\r\n }\r\n };\r\n\r\n $scope.isOpen = false;\r\n ctrl.setDefaultDisplayText();\r\n\r\n $scope.selectValue = function (current, $event) { \r\n\r\n $scope.clearSelections();\r\n $scope.displayText = current.Value;\r\n $scope.data.currentlySelected = current;\r\n\r\n $scope.filterBy = '';\r\n current.select(); \r\n \r\n $scope.isOpen = false; // close dropdown\r\n $scope.typeaheadText = ''; //clear typeahead\r\n \r\n $event.stopPropagation();\r\n };\r\n\r\n $scope.$watch('data.currentlySelected', function (newVal, oldVal) {\r\n if (newVal === oldVal) {\r\n return;\r\n }\r\n\r\n if (_.isEmpty(newVal)){\r\n ctrl.setDefaultDisplayText();\r\n } \r\n });\r\n\r\n $scope.$watch('data.Values', function (newVal, oldVal) {\r\n if (newVal === oldVal) {\r\n return;\r\n }\r\n\r\n ctrl.prepareFilterValues();\r\n $scope.showTypeAhead = $scope.getTypeAheadState();\r\n }); \r\n\r\n if ($scope.data !== undefined) {\r\n ctrl.prepareFilterValues();\r\n }\r\n\r\n $scope.getTypeAheadState = function(){ //Show typeahead only if there are more than 10 items\r\n return $scope.data !== undefined && $scope.data.Values !== undefined && $scope.data.Values.length > 10 && BrowserDetect.name !== 'Safari';\r\n };\r\n\r\n $scope.showTypeAhead = $scope.getTypeAheadState(); \r\n });\r\n })(angular);\n// The `enstocom.navigation` module contains navigation related stuff.\r\n(function (angular) {\r\n 'use strict';\r\n angular.module('enstocom.navigation', ['enstocom.utils', 'ui.bootstrap', 'ropooy-angular-rdash'])\r\n // directive is used to add / remove 'navbar-fixed-top' css class from 'Company' - navbar. In mobile devices this navbar needs to be shown inside 'burger'.\r\n .directive('enstoFixedTop', function (ViewportWatcher) {\r\n return {\r\n restrict: 'A',\r\n priority: 100,\r\n link: function (scope, element) {\r\n scope.$watch(function () {\r\n return ViewportWatcher.isGridFloatBreakpointMax;\r\n }, function (newVal) {\r\n if (newVal) {\r\n element.removeClass('navbar-fixed-top');\r\n }\r\n else {\r\n element.addClass('navbar-fixed-top');\r\n }\r\n });\r\n }\r\n };\r\n })\r\n // directive to render navbar (company / mainnav)\r\n .directive('enstoNavbar', function (ServerSettings, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n require: '?enstoServerJson',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-mainnavbar.html'),\r\n scope: {\r\n menuItems: '=?'\r\n },\r\n link: {\r\n pre: function (scope, element, attributes, ctrl) {\r\n scope.isMainnavbar = scope.$eval(attributes.isMainnavbar);\r\n\r\n if (!_.isNull(ctrl)) {\r\n scope.menuItems = ctrl.getValue([]);\r\n }\r\n },\r\n post: function (scope) {\r\n scope.homeLink = ServerSettings.startPageURL;\r\n }\r\n }\r\n };\r\n })\r\n // directive to render navbar (company / mainnav)\r\n .directive('enstoNavbarFacelift', function (ServerSettings, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n require: '?enstoServerJson',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-mainnavbar-facelift.html'),\r\n scope: {\r\n menuItems: '=?',\r\n navigationColor: '@',\r\n logoColor: '@'\r\n },\r\n link: {\r\n pre: function (scope, element, attributes, ctrl) {\r\n scope.isMainnavbar = scope.$eval(attributes.isMainnavbar);\r\n scope.whiteText = scope.navigationColor === 'white';\r\n scope.blackText = scope.navigationColor === 'black';\r\n scope.logoFileName = scope.logoColor !== ''\r\n ? '/static/img/ensto_logo_' + scope.logoColor + '.png'\r\n : '/static/img/ensto_logo_white.png';\r\n scope.navigationTabs = JSON.parse(attributes.navigationTabs);\r\n scope.selectedTabIndex = scope.navigationTabs.findIndex(function(tab){ return tab.Selected === true; });\r\n\r\n if (!_.isNull(ctrl)) {\r\n scope.menuItems = ctrl.getValue([]);\r\n }\r\n },\r\n post: function (scope) {\r\n scope.homeLink = ServerSettings.startPageURL;\r\n }\r\n }\r\n };\r\n })\r\n // directive for megamenu dropdown\r\n .directive('enstoMegamenu', function (TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-megamenu.html'),\r\n replace: true,\r\n link: function (scope) {\r\n var menuGroups = 4;\r\n\r\n scope.menuItemGroups = _.chunk(scope.menu.children, menuGroups);\r\n }\r\n };\r\n })\r\n // controller for 'enstoDynamicPage' directive. THIS SHOULD HAVE UNIT TESTS BECAUSE THIS CONTAINS CALCULATIONS!!!!\r\n .controller('EnstoDynamicPageController', function (ElementHelper, ViewportWatcher, $window, BgImageUrlRegex, $log) {\r\n var ctrl = this;\r\n var headerSectionHeight = 215; // company menu, header area, main navbar\r\n\r\n ViewportWatcher.registerCallback(function (size) {\r\n if (size === 'mobile') {\r\n headerSectionHeight = 80;\r\n }\r\n else {\r\n headerSectionHeight = 215;\r\n }\r\n });\r\n\r\n ctrl.extractBgImgURL = function (element) {\r\n var backgroundImageStyle = ElementHelper.getComputedStyle(element).backgroundImage;\r\n\r\n ctrl.bacgroundImage = _.result(BgImageUrlRegex.exec(backgroundImageStyle), '[1]', '');\r\n $log.debug('EnstoDynamicPageController::extractBgImgURL(), extracted background image url:', ctrl.bacgroundImage);\r\n };\r\n\r\n ctrl.getImageOriginalSize = function () {\r\n var img = new Image();\r\n img.src = ctrl.bacgroundImage;\r\n\r\n return {\r\n width: img.width,\r\n height: img.height\r\n };\r\n };\r\n\r\n ctrl.calculateMargin = function () {\r\n var originalImageSize = ctrl.getImageOriginalSize();\r\n var scrollTop = ElementHelper.scrollTop();\r\n\r\n var windowSize = {\r\n width: $window.outerWidth,\r\n height: $window.outerHeight\r\n };\r\n\r\n $log.debug('EnstoDynamicPageController::calculateMargin(), sizes', originalImageSize, windowSize);\r\n var sizeRatio = (windowSize.width / originalImageSize.width);\r\n var scaledImageSize = {\r\n width: originalImageSize.width * sizeRatio,\r\n height: originalImageSize.height * sizeRatio\r\n };\r\n\r\n $log.debug('EnstoDynamicPageController::calculateMargin(), size ratio', sizeRatio);\r\n $log.debug('EnstoDynamicPageController::calculateMargin(), image scaled size', scaledImageSize);\r\n\r\n $log.debug('EnstoDynamicPageController::calculateMargin(), screen height : scaled image height', (scaledImageSize.height / windowSize.height));\r\n\r\n var marginTop = scaledImageSize.height;\r\n\r\n if (scrollTop > 50) {\r\n marginTop = 0;\r\n }\r\n else if (marginTop > windowSize.height) {\r\n marginTop = (0.6 * windowSize.height) - headerSectionHeight;\r\n }\r\n else if ((scaledImageSize.height / windowSize.height) > 0.6) {\r\n marginTop = (0.6 * marginTop) - headerSectionHeight;\r\n }\r\n else {\r\n marginTop = marginTop - headerSectionHeight;\r\n }\r\n\r\n return (marginTop >= 0) ? marginTop : 0;\r\n };\r\n\r\n ctrl.setMarginTop = function (element) {\r\n var margin = ctrl.calculateMargin();\r\n\r\n angular.element(element)\r\n .css('margin-top', margin + 'px');\r\n };\r\n })\r\n // directive is used inside 'ConSolutionPage.cshtml', it will handle page content margin and allows image to show up more.\r\n .directive('enstoDynamicPage', function (ScrollProxy, $rootElement, $window, $timeout) {\r\n return {\r\n restrict: 'A',\r\n controller: 'EnstoDynamicPageController',\r\n link: function (scope, element, attributes, ctrl) {\r\n var bgElement = $rootElement;\r\n\r\n // check if background image thingy is using \"oldMode\"\r\n angular.forEach(element.parent().children(), function (el) {\r\n if (angular.element(el).hasClass('ensto-main-bg')) {\r\n bgElement = el;\r\n }\r\n });\r\n\r\n var init = function () {\r\n ctrl.extractBgImgURL(bgElement);\r\n\r\n if (!_.isEmpty(ctrl.bacgroundImage)) {\r\n ctrl.setMarginTop(element);\r\n }\r\n };\r\n\r\n $timeout(function () {\r\n init();\r\n });\r\n\r\n angular.element($window).on('resize', function () {\r\n angular.element(element)\r\n .css('transition', 'all 1s ease-in-out');\r\n\r\n init();\r\n });\r\n\r\n ScrollProxy.registerCallback(function () {\r\n angular.element(element)\r\n .css('transition', 'all 1s ease-in-out');\r\n\r\n init();\r\n });\r\n\r\n // Move breadcrumb above heading in solution page\r\n var enstoSolution = document.getElementsByClassName('ensto-page-solution');\r\n var breadCrumbs = document.getElementsByClassName('breadcrumbs');\r\n if (enstoSolution.length !== 0 && breadCrumbs.length !== 0) {\r\n angular.element(element).prepend(breadCrumbs);\r\n }\r\n }\r\n };\r\n })\r\n // directive is used to handle footer links generation when user has scrolled enough close to it.\r\n .directive('enstoFooter', function (TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n require: '?enstoServerJson',\r\n controller: 'EnstoFooterController',\r\n templateUrl: function (element, attributes) {\r\n if (attributes.type === 'top') {\r\n return TemplateUriHandler('/static/com/js/templates/enstocom-footer-top.html?_=20210122');\r\n }\r\n else {\r\n return TemplateUriHandler('/static/com/js/templates/enstocom-footer-bottom.html');\r\n }\r\n },\r\n scope: {\r\n menuItems: '=?',\r\n type: '@'\r\n },\r\n link: {\r\n pre: function (scope, element, attributes, ctrl) {\r\n if (!_.isNull(ctrl)) {\r\n scope.menuItems = ctrl.getValue([]);\r\n }\r\n }\r\n }\r\n };\r\n })\r\n // directive is used inside megamenu link lists and footer link lists.\r\n .directive('enstoLinklist', function (TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-linklist.html'),\r\n scope: {\r\n menu: '='\r\n }\r\n };\r\n })\r\n // controller for 'enstoFooter' directive\r\n .controller('EnstoFooterController', function ($scope, ViewportWatcher, ServerSettings) {\r\n $scope.footerClasses = ($scope.type === 'top') ? 'ensto-section-white ensto-footer-top' : 'ensto-section-gray ensto-footer-bottom';\r\n $scope.viewportSize = 'desktop';\r\n $scope.addressesList = ServerSettings.addressesList;\r\n\r\n $scope.facebookPageURL = ServerSettings.socialPages.facebook || '';\r\n $scope.instagramPageURL = ServerSettings.socialPages.instagram || '';\r\n $scope.twitterPageURL = ServerSettings.socialPages.twitter || '';\r\n $scope.linkedinPageURL = ServerSettings.socialPages.linkedin || '';\r\n $scope.youtubePageURL = ServerSettings.socialPages.youtube || '';\r\n\r\n ViewportWatcher.registerCallback(function (size) {\r\n $scope.viewportSize = size;\r\n });\r\n })\r\n // controller is used in header section and is \"visible\" for mobile users. This manages burger collapse/expand and other mobile menu dropdowns.\r\n .controller('EnstoNavigationController', function ($scope) {\r\n $scope.navbarCollapsed = true;\r\n\r\n $scope.$watch('isOpenCart', function (newVal) {\r\n if (newVal) {\r\n $scope.isOpenSearch = false;\r\n $scope.isOpenLanguage = false;\r\n $scope.navbarCollapsed = true;\r\n }\r\n });\r\n\r\n $scope.$watch('isOpenSearch', function (newVal) {\r\n if (newVal) {\r\n $scope.isOpenCart = false;\r\n $scope.isOpenLanguage = false;\r\n $scope.navbarCollapsed = true;\r\n }\r\n });\r\n\r\n $scope.$watch('isOpenLanguage', function (newVal) {\r\n if (newVal) {\r\n $scope.isOpenSearch = false;\r\n $scope.isOpenCart = false;\r\n $scope.navbarCollapsed = true;\r\n }\r\n });\r\n\r\n $scope.$watch('navbarCollapsed', function (newVal) {\r\n if (!newVal && ($scope.isOpenCart || $scope.isOpenSearch)) {\r\n $scope.isOpenCart = false;\r\n $scope.isOpenLanguage = false;\r\n $scope.isOpenSearch = false;\r\n }\r\n });\r\n })\r\n .component('productsNavigation', {\r\n templateUrl: '/static/com/js/templates/product-navigation.html?_=2019994',\r\n bindings: {\r\n categories: '<',\r\n language: '<',\r\n authenticated: '<',\r\n currentcategoryid: '<',\r\n categoryids: '<',\r\n hidePriceCounts: '<'\r\n },\r\n controller: ['$rootScope', '$http', '$translate', ProductsNavigation]\r\n })\r\n .component('treeNavigation', {\r\n templateUrl: '/static/com/js/templates/tree-navigation.html?_=2019994',\r\n bindings: {\r\n categories: '<',\r\n authenticated: '<',\r\n categoryid: '<',\r\n mainlevel: '<'\r\n },\r\n controller: ['$rootScope', '$scope', TreeController]\r\n })\r\n .component('pricedProductsCounter', {\r\n templateUrl: '/static/com/js/templates/priced-products-counter.html?_=2019994',\r\n bindings: {\r\n categoryid: '<'\r\n },\r\n controller: ['$scope', '_', PricedProductsCount]\r\n });\r\n\r\n\r\n function PricedProductsCount($scope, _) {\r\n var $ctrl = this;\r\n $scope.$on('fetchedProductCounts', function (msg, priceData) {\r\n $ctrl.pricedItemsCount = (_.find(priceData, function (category) {\r\n return $ctrl.categoryid === category.ContentId;\r\n }) || {}).AvailableProducts;\r\n });\r\n }\r\n\r\n function TreeController($rootScope, $scope) {\r\n var $ctrl = this;\r\n\r\n this.$onInit = function () {\r\n $ctrl.hidePriceCounts = $rootScope.webshopProductsOnly;\r\n console.log('tree-controller hide-price-counts: ' + $ctrl.hidePriceCounts);\r\n },\r\n\r\n $scope.$on('fetchedProductCounts', function (msg, priceData) {\r\n $ctrl.categories = _.map($ctrl.categories, function (cat) {\r\n cat.PricedProductsCount = (_.find(priceData, function (priceRow) {\r\n return priceRow.CategoryId === cat.ContentID;\r\n }) || {}).PricedProducts;\r\n return cat;\r\n });\r\n });\r\n }\r\n\r\n function ProductsNavigation($rootScope, $http) {\r\n var $ctrl = this;\r\n\r\n this.$onInit = function () {\r\n $ctrl = this;\r\n //$rootScope.hidePriceCounts = $ctrl.hidePriceCounts;\r\n var hidePriceCounts = $ctrl.hidePriceCounts.toLowerCase() === 'true';\r\n $ctrl.authenticated = $ctrl.authenticated === 'True';\r\n $ctrl.hidePriceCounts = hidePriceCounts;\r\n if (!hidePriceCounts && $ctrl.authenticated) {\r\n $ctrl.isFetchingPrices = true;\r\n $http.post('/api/webshop/products/anchestor',\r\n {\r\n 'CategoryIds': $ctrl.categoryids,\r\n 'Language': $ctrl.language,\r\n 'CurrentCategoryId': $ctrl.currentcategoryid\r\n })\r\n .then(\r\n function (response) {\r\n var categoriesWithPrice = response.data;\r\n $rootScope.$broadcast('fetchedProductCounts', categoriesWithPrice);\r\n }, function () {\r\n $ctrl.pricesFetchFailed = true;\r\n })\r\n .finally(function () {\r\n $ctrl.isFetchingPrices = false;\r\n });\r\n }\r\n\r\n };\r\n }\r\n})(angular);\r\n\n// The `enstocom.utils` module contains a lot of individual services and directives that are used by other modules.\r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.utils', ['ui.bootstrap', 'pascalprecht.translate', 'LocalStorageModule', 'ropooy-angular-rdash'])\r\n // config for LocalStorageModule\r\n .config(function (localStorageServiceProvider) {\r\n localStorageServiceProvider\r\n .setPrefix('ensto')\r\n .setStorageType('localStorage');\r\n })\r\n .value('MaxDescriptionLength', 200)\r\n // wrapper for cookie control, if cookie implementation is needed to be changed the change should be done here.\r\n .factory('EnstoCookie', function (localStorageService) {\r\n /* a simple wrapper for cookie handling, enables easier cookie solution replacement point. (for js-cookie) */\r\n var EnstoCookieService = {\r\n get: function (name) {\r\n return localStorageService.cookie.get(name);\r\n },\r\n set: function (name, value, options) {\r\n return localStorageService.cookie.set(name, value, options);\r\n },\r\n remove: function (name) {\r\n return localStorageService.cookie.remove(name);\r\n }\r\n };\r\n\r\n EnstoCookieService.isSupported = localStorageService.cookie.isSupported;\r\n\r\n return EnstoCookieService;\r\n })\r\n .factory('TemplateUriHandler', function() {\r\n return function(templateuri) {\r\n var date = new Date();\r\n return templateuri + '?_=' + date.getUTCFullYear() + date.getUTCMonth() + date.getUTCDay();\r\n };\r\n })\r\n // service that is used to store various user settings in to local storage\r\n .factory('EnstoUserSettings', function ($rootScope, localStorageService, $log) {\r\n var UserSettings = {};\r\n var settings_key = 'user-settings';\r\n\r\n UserSettings = localStorageService.get(settings_key) || UserSettings;\r\n\r\n if (localStorageService.isSupported) {\r\n $rootScope.$watch(function () {\r\n return UserSettings;\r\n }, function (newVal, oldVal) {\r\n if (newVal === oldVal) {\r\n $log.debug('Current user settings:', newVal, oldVal);\r\n return;\r\n }\r\n\r\n localStorageService.set(settings_key, UserSettings);\r\n }, true);\r\n } else {\r\n $log.debug('Cannot use \"UserSettings\" because storage type:', localStorageService.getStorageType(), ' is disabled or not supported.');\r\n }\r\n\r\n return UserSettings;\r\n })\r\n .component('enstoModal', {\r\n templateUrl: '/static/com/js/templates/ensto-modal.html?_=2019994',\r\n transclude: true,\r\n bindings: {\r\n close: '&',\r\n dismiss: '&'\r\n },\r\n controller: function () {\r\n var $ctrl = this;\r\n $ctrl.ok = function () {\r\n $ctrl.close({$value: $ctrl.selected.item});\r\n };\r\n $ctrl.cancel = function () {\r\n $ctrl.dismiss({$value: 'cancel'});\r\n };\r\n }\r\n })\r\n // TODO: This should be replaced with some solution. Actually I do not know if this is now even required....\r\n .directive('splitbannerBlock', function () {\r\n return {\r\n restrict: 'C',\r\n link: function (scope, element) {\r\n // TODO: NOTE THIS MAY BE TEMPORARY SOLUTION\r\n if (angular.isElement(element[0].querySelector('.image-block img'))) {\r\n angular.element(element[0].querySelector('.image-block img')).addClass('ensto-img-splitbanner');\r\n }\r\n }\r\n };\r\n })\r\n // directive to add spinner. Nicely controller with ng-hide / ng-if \r\n .directive('enstoSpinner', function (TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-spinner.html')\r\n };\r\n })\r\n // directive to help calculate the main navbar height\r\n .directive('calcHeight', function ($timeout, ViewportWatcher) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n $timeout(function () {\r\n if (ViewportWatcher.viewport !== 'mobile') {\r\n var innerContainer = element[0].querySelector('.calc-height-source');\r\n if (innerContainer) {\r\n element.css('height', innerContainer.offsetHeight + 'px');\r\n }\r\n }\r\n });\r\n }\r\n };\r\n })\r\n //Set contacts to be in equal height. Use this directive in the container\r\n .directive('equalHeightContacts', function ($timeout, _, ViewportWatcher) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n var fixHeights = function () {\r\n if (ViewportWatcher.viewport !== 'mobile') {\r\n var contactTags = element[0].querySelectorAll('.ensto-contactcard-container');\r\n var biggestHeight = 200;\r\n _.forEach(contactTags, function (contact) {\r\n if (contact.offsetHeight > biggestHeight) {\r\n biggestHeight = contact.offsetHeight;\r\n }\r\n });\r\n _.forEach(contactTags, function (contact) {\r\n contact.style.height = biggestHeight + 'px';\r\n });\r\n }\r\n };\r\n $timeout(fixHeights, 1000);\r\n }\r\n };\r\n })\r\n // directive is used to show message for user containing spinner\r\n .directive('enstoLoading', function ($translate, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-loading.html'),\r\n scope: {\r\n loadingText: '@'\r\n },\r\n link: function (scope, element, attributes) {\r\n scope.showFade = scope.$eval(attributes.showFade);\r\n\r\n var loadingText = $translate.instant('/comcommon/loading');\r\n\r\n if (scope.showFade) {\r\n element.addClass('ensto-loading-fade in');\r\n }\r\n\r\n if (_.isEmpty(scope.loadingText)) {\r\n scope.loadingText = loadingText;\r\n }\r\n\r\n attributes.$observe('loadingText', function (value) {\r\n scope.loadingText = value || loadingText;\r\n });\r\n }\r\n };\r\n })\r\n // directive to handle svg icons inside buttons\r\n .directive('enstoButtonIcon', function ($window, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-button-icon.html'),\r\n scope: true,\r\n link: function (scope, element, attributes) {\r\n scope.type = attributes.type;\r\n scope.path = '';\r\n\r\n var search = $window.location.search;\r\n\r\n // This is very important because otherwise svg mask is not applied in all pages\r\n // http://stackoverflow.com/questions/25999037/why-snapsvg-mask-doesnt-work-in-chrome-and-firefox-when-theres-a-base-tag-in\r\n if (!_.isEmpty(search)) {\r\n scope.path = search;\r\n } else if (/\\?$/.test($window.location.href)) {\r\n // This is for Chrome, Firefox, Safari and Opera\r\n // if url is like http://example.com/? and query string is not containing anything else then window.location.search is returning \"\" and not \"?\" what would be required. \r\n scope.path = '?';\r\n }\r\n }\r\n };\r\n })\r\n // directive to add Ensto custom \">\" icon which is thinner than bootstrap's menu icon or chevron\r\n // NOTE: this can be controller with css classes '.up .down .left' which are rotating icon in to another angles.\r\n .directive('enstoMenuIcon', function (TemplateUriHandler) { // 'menu' refers to bootstrap .glyphicon-menu-*\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-menu-icon.html')\r\n };\r\n })\r\n // directive used to show message for the user (no spinner)\r\n .directive('enstoMessage', function (TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-message.html'),\r\n scope: true,\r\n link: function (scope, element, attributes) {\r\n scope.message = attributes.message;\r\n scope.isAlert = attributes.type === 'alert';\r\n scope.isUppercase = scope.$eval(attributes.textUppercase);\r\n }\r\n };\r\n })\r\n // directive that controls affix handling. THIS SHOULD HAVE UNIT TESTS!\r\n .directive('enstoAffix', function (ScrollProxy, ElementHelper, $uibPosition) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element, attributes) {\r\n var affixTopOffset = +attributes.enstoAffix;\r\n var affixClass = attributes.enstoAffixClass || 'ensto-affix';\r\n var bounds = $uibPosition.offset(ElementHelper.getPlainElement(element));\r\n\r\n var checkAffixingStatus = function () {\r\n var scrollTop = ElementHelper.scrollTop();\r\n\r\n if (bounds.top <= scrollTop + affixTopOffset) {\r\n element.addClass(affixClass);\r\n } else {\r\n element.removeClass(affixClass);\r\n }\r\n };\r\n\r\n ScrollProxy.registerCallback(checkAffixingStatus);\r\n\r\n //Do initial check if it happens that user is not scrolling but element should be affixed.\r\n checkAffixingStatus();\r\n }\r\n };\r\n })\r\n // directive which is used in couple of places to provide \"click catch\" / \"outside click\". Transparent element.\r\n .directive('enstoClickCatch', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n enstoOffClick: '&'\r\n },\r\n link: function (scope, element) {\r\n angular.element(element).on('click', function () {\r\n scope.enstoOffClick();\r\n });\r\n }\r\n };\r\n })\r\n // directive used to remove failed image from DOM, used inside PdfProductCard.cshtml only. We do not need placeholder images on that print so if image fails to load we do not want it to show up broken.\r\n .directive('enstoRemoveFailedImage', function () {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n angular.element(element)\r\n .on('error', function () {\r\n element.remove();\r\n });\r\n }\r\n };\r\n })\r\n // controller for 'enstoServerJson' directive\r\n .controller('EnstoServerJsonController', function ($log, _) {\r\n var ctrl = this;\r\n var value = null;\r\n\r\n ctrl.setValue = function (val) {\r\n if (!_.isObject(val)) {\r\n $log.debug('EnstoServerJsonController, given value is not an object', val);\r\n return;\r\n }\r\n\r\n value = val;\r\n };\r\n\r\n ctrl.getValue = function (default_value) {\r\n return value || default_value;\r\n };\r\n })\r\n // directive is used to parse JSON from DOM attribute where it was placed in server-side, now other directives are using this through require: '?enstoServerJson'\r\n .directive('enstoServerJson', function () {\r\n return {\r\n restrict: 'A',\r\n priority: 100,\r\n controller: 'EnstoServerJsonController',\r\n compile: function () {\r\n return {\r\n pre: function (scope, element, attributes, ctrl) {\r\n // https://github.com/angular/angular.js/issues/13351\r\n var val = angular.fromJson(attributes.enstoServerJson);\r\n ctrl.setValue(val);\r\n\r\n // just cleanup DOM to make it more readable\r\n element.removeAttr('ensto-server-json');\r\n }\r\n };\r\n }\r\n };\r\n })\r\n // directive which is used to wrap server side content that has been generated using TinyMCE and may contain stuff that needs to be processed to make it act properly\r\n .directive('enstoWysiwygContent', function ($timeout, $compile, _) {\r\n return {\r\n restrict: 'E',\r\n transclude: true,\r\n template: '',\r\n link: function (scope, element) {\r\n // timeout is used to let ng environment to render binded values\r\n $timeout(function () {\r\n // basic image fixes\r\n var thisImages = angular.element(element).find('img');\r\n\r\n _.forEach(thisImages, function (img) {\r\n angular.element(img).addClass('img-responsive');\r\n });\r\n\r\n // custom looking button fixes\r\n var thisLinks = angular.element(element).find('a');\r\n\r\n _.forEach(thisLinks, function (link) {\r\n if (angular.element(link).hasClass('btn-link-ensto-blue')) {\r\n var linkText = angular.element(link).text();\r\n\r\n angular.element(link)\r\n .empty()\r\n .addClass('btn btn-ensto btn-ensto-blue')\r\n .append('' + linkText + '')\r\n .append('');\r\n\r\n $compile(link)(scope); // runs 'enstoButtonIcon' directive\r\n }\r\n });\r\n });\r\n }\r\n };\r\n })\r\n // service used to track page views when card are expanded, social shares when share window is opened or filter / tabopen events.\r\n .factory('EnstoGA', function ($window, $log, _) {\r\n // https://developers.google.com/analytics/devguides/collection/upgrade/reference/gajs-analyticsjs\r\n var EnstoGAService = {};\r\n\r\n EnstoGAService.trackPageView = function (url) {\r\n if (_.isEmpty(url) || !_.isString(url)) {\r\n $log.debug('EnstoGA::trackPageView, given url is empty or not a string', url);\r\n }\r\n\r\n if (_.isFunction($window.ga)) {\r\n $log.debug('EnstoGA::trackPageView, tracking pageview for url ', url);\r\n $window.ga('send', 'pageview', url);\r\n } else {\r\n $log.debug('EnstoGA::trackPageView, \"ga\" is not defined.', url);\r\n }\r\n };\r\n\r\n EnstoGAService.trackSocialShare = function (socialService, shareUrl) {\r\n if (_.isEmpty(socialService) || _.isEmpty(shareUrl)) {\r\n $log.debug('EnstoGA::trackSocialShare, given social service or share url is empty', socialService, shareUrl);\r\n return;\r\n }\r\n\r\n if (_.isFunction($window.ga)) {\r\n // https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions\r\n $log.debug('EnstoGA::trackSocialShare, tracking share for service - url: ', socialService, shareUrl);\r\n $window.ga('send', 'social', socialService, 'share', shareUrl);\r\n } else {\r\n $log.debug('EnstoGA::trackSocialShare, \"ga\" is not defined.', socialService, shareUrl);\r\n }\r\n };\r\n\r\n EnstoGAService.trackFilterAction = function (action, name, value) {\r\n if (_.isEmpty(action) || _.isEmpty(name) || _.isEmpty(value)) {\r\n $log.debug('EnstoGA::trackFilterAction, given filter action, name or value is empty', action, name, value);\r\n return;\r\n }\r\n\r\n if (_.isFunction($window.ga)) {\r\n // https://developers.google.com/analytics/devguides/collection/analyticsjs/events\r\n $log.debug('EnstoGA::trackFilterAction, tracking filter action: ', action, name, value);\r\n $window.ga('send', 'event', 'category-filter', action, name, value);\r\n } else {\r\n $log.debug('EnstoGA::trackFilterAction, \"ga\" is not defined.', action, name, value);\r\n }\r\n };\r\n\r\n EnstoGAService.trackTabOpening = function (tabName, source) {\r\n /*\r\n NOTE: for now 'template-url' attribute is used to detect different source pages inside 'enstoTabSet' directive.\r\n Tab opening is not tracked for 'technical details', because it is open by default inside product page and doesn't give any extra information.\r\n */\r\n if (_.isEmpty(source) || _.isEmpty(tabName)) {\r\n $log.debug('EnstoGA::trackTabOpening, given tab source or name is empty', source, tabName);\r\n return;\r\n }\r\n\r\n if (_.isFunction($window.ga)) {\r\n $log.debug('EnstoGA::trackTabOpening, tracking tab action: ', tabName, source);\r\n $window.ga('send', 'event', 'tab-open', tabName, source);\r\n } else {\r\n $log.debug('EnstoGA::trackTabOpening, \"ga\" is not defined.', tabName, source);\r\n }\r\n };\r\n\r\n EnstoGAService.trackContactOpening = function (eventAction, eventLabel) {\r\n\r\n if (_.isEmpty(eventLabel) || _.isEmpty(eventAction)) {\r\n $log.debug('EnstoGA::trackTabOpening, given tab source or name is empty', eventLabel, eventAction);\r\n return;\r\n }\r\n\r\n if (_.isFunction($window.ga)) {\r\n $log.debug('EnstoGA::trackContactOpening, tracking contact action: ', eventAction, eventLabel);\r\n $window.ga('send', 'event', 'show-contact-information', eventAction, eventLabel);\r\n } else {\r\n $log.debug('EnstoGA::trackContactOpening, \"ga\" is not defined.', eventAction, eventLabel);\r\n }\r\n };\r\n\r\n EnstoGAService.trackEvent = function (eventCategory, eventAction, eventLabel) {\r\n\r\n if (_.isEmpty(eventLabel) || _.isEmpty(eventAction) || _.isEmpty(eventCategory)) {\r\n $log.debug('EnstoGA::trackTabOpening, given tab source or name is empty', eventCategory, eventLabel, eventAction);\r\n return;\r\n }\r\n\r\n if (_.isFunction($window.ga)) {\r\n $log.debug('EnstoGA::trackContactOpening, tracking contact action: ', eventCategory, eventAction, eventLabel);\r\n $window.ga('send', 'event', eventCategory, eventAction, eventLabel);\r\n } else {\r\n $log.debug('EnstoGA::trackContactOpening, \"ga\" is not defined.', eventCategory, eventAction, eventLabel);\r\n }\r\n };\r\n\r\n return EnstoGAService;\r\n })\r\n // service used to check if element is inside viewport and some other nice functions.\r\n .factory('ElementHelper', function ($uibPosition, $window, $log) {\r\n var ElementHelperService = {};\r\n var documentEl = $window.document;\r\n // yes, these are not affected by window resize. So dont resize! ;D\r\n var windowHeight = $window.outerHeight || _.result(documentEl, 'documentElement.clientHeight') || _.result(documentEl, 'documentElement.innerHeight', 0);\r\n var windowWidth = $window.outerWidth || _.result(documentEl, 'documentElement.clientWidth') || _.result(documentEl, 'documentElement.innerWidth', 0);\r\n\r\n ElementHelperService.scrollTop = function () {\r\n return _.result(documentEl, 'body.scrollTop') || _.result(documentEl, 'documentElement.scrollTop') || 0;\r\n };\r\n\r\n ElementHelperService.scrollLeft = function () {\r\n return _.result(documentEl, 'body.scrollLeft') || _.result(documentEl, 'documentElement.scrollLeft') || 0;\r\n };\r\n\r\n ElementHelperService.getComputedStyle = function (element) {\r\n var elem = element;\r\n\r\n if (angular.isElement(element) && !_.isElement(element)) {\r\n // this is angular.element(element) which looks like array in console\r\n elem = element[0];\r\n }\r\n\r\n return _.isFunction($window.getComputedStyle) ? $window.getComputedStyle(elem) : {};\r\n };\r\n\r\n // TODO: Use $uibPosition.getRawNode() instead!\r\n ElementHelperService.getPlainElement = function (element) {\r\n if (angular.isArray(element) && angular.isElement(element[0])) {\r\n element = element[0];\r\n }\r\n\r\n return element;\r\n };\r\n\r\n /* http://upshots.org/javascript/jquery-test-if-element-is-in-viewport-visible-on-screen */\r\n ElementHelperService.isInViewport = function (el, lookahead) {\r\n var isInViewport = false;\r\n\r\n el = ElementHelperService.getPlainElement(el);\r\n\r\n if (!angular.isElement(el)) {\r\n $log.warn('ElementHelper.isInViewport()', \"'el' is not an element.\");\r\n return isInViewport;\r\n }\r\n\r\n lookahead = angular.isNumber(lookahead) ? lookahead : 0;\r\n\r\n var viewport = {\r\n top: ElementHelperService.scrollTop(),\r\n left: ElementHelperService.scrollLeft()\r\n };\r\n\r\n viewport.right = viewport.left + windowWidth;\r\n viewport.bottom = viewport.top + windowHeight;\r\n\r\n var bounds = $uibPosition.offset(el);\r\n bounds.right = bounds.left + bounds.width;\r\n bounds.bottom = bounds.top + bounds.height;\r\n\r\n if ((viewport.right + lookahead) >= bounds.left &&\r\n (viewport.left - lookahead) <= bounds.right &&\r\n (viewport.bottom + lookahead) >= bounds.top &&\r\n (viewport.top - lookahead) <= bounds.bottom) {\r\n isInViewport = true;\r\n }\r\n\r\n return isInViewport;\r\n };\r\n\r\n return ElementHelperService;\r\n })\r\n // service used to throttle scoll events and calls listeners time to time\r\n .factory('ScrollProxy', function ($window, $rootScope, _) {\r\n var ScrollProxyService = {};\r\n\r\n var LISTENERS = [];\r\n var EVENTS = false;\r\n\r\n var callListeners = function () {\r\n _.forEach(LISTENERS, function (cb) {\r\n if (_.isFunction(cb)) {\r\n cb();\r\n }\r\n });\r\n };\r\n\r\n $rootScope.$watch(function () { return LISTENERS.length; }, function () {\r\n if (_.size(LISTENERS) > 0 && !EVENTS) {\r\n EVENTS = true;\r\n angular.element($window).on('scroll resize', _.throttle(callListeners, 10));\r\n } else if (_.size(LISTENERS) === 0) {\r\n angular.element($window).off('scroll resize', _.throttle);\r\n EVENTS = false;\r\n }\r\n }, true);\r\n\r\n ScrollProxyService.registerCallback = function (cb) {\r\n if (!_.isFunction(cb)) {\r\n return;\r\n }\r\n\r\n LISTENERS.push(cb);\r\n };\r\n\r\n ScrollProxyService.unregisterCallback = function (cb) {\r\n if (!_.isFunction(cb)) {\r\n return;\r\n }\r\n\r\n _.remove(LISTENERS, function (registeredCB) {\r\n return registeredCB === cb;\r\n });\r\n };\r\n\r\n return ScrollProxyService;\r\n })\r\n // service for url handling\r\n .factory('UrlService', function (_, $window) {\r\n var UrlService = {};\r\n // convert js object in to query string, prefixed with '?'\r\n UrlService.toQueryString = function (obj) {\r\n if (!_.isObject(obj)) {\r\n return '';\r\n }\r\n\r\n var parts = [];\r\n\r\n _.forEach(_.keys(obj), function (key) {\r\n parts.push(key + '=' + $window.encodeURIComponent(obj[key]));\r\n });\r\n\r\n return ('?' + parts.join('&'));\r\n };\r\n\r\n // expecting query string to begin with '?'\r\n UrlService.getQueryParams = function (queryString) {\r\n queryString = queryString || $window.location.search;\r\n var params = {};\r\n\r\n if (!_.startsWith(queryString, '?')) {\r\n return params;\r\n }\r\n\r\n var parts = queryString.substring(1).split('&');\r\n\r\n _.forEach(parts, function (part) {\r\n var tmp = part.split('=');\r\n params[$window.decodeURIComponent(tmp[0])] = $window.decodeURIComponent(tmp[1]);\r\n });\r\n\r\n return params;\r\n };\r\n\r\n UrlService.getAbsoluteUrl = function (url) {\r\n if (!/^(http|https)/.test(url)) {\r\n url = $window.location.protocol + '//' + $window.location.host + url;\r\n }\r\n\r\n return url;\r\n };\r\n\r\n return UrlService;\r\n })\r\n // Service used to detect browser and it's version\r\n .factory('BrowserDetect', function () {\r\n var getBrowser = function () {\r\n var ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\r\n if (/trident/i.test(M[1])) {\r\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\r\n return { name: 'IE', version: (tem[1] || '') };\r\n }\r\n if (M[1] === 'Chrome') {\r\n tem = ua.match(/\\bOPR\\/(\\d+)/);\r\n if (tem !== null) {\r\n return { name: 'Opera', version: tem[1] };\r\n }\r\n }\r\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\r\n if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) {\r\n M.splice(1, 1, tem[1]);\r\n }\r\n return {\r\n name: M[0],\r\n version: M[1]\r\n };\r\n };\r\n return getBrowser();\r\n })\r\n\r\n // service used to wrap enquire.js to our needs. Viewport watch is started inside app.js\r\n .factory('ViewportWatcher', function ($window, $log, _) {\r\n var ViewportWatcherService = {\r\n registry: [],\r\n viewport: '',\r\n orientation: 'landscape',\r\n isGridFloatBreakpointMax: false\r\n };\r\n\r\n var handleCallbacks = function () {\r\n _.each(ViewportWatcherService.registry, function (cb) {\r\n cb(ViewportWatcherService.viewport, ViewportWatcherService.orientation);\r\n });\r\n };\r\n\r\n ViewportWatcherService.viewportChanged = function (size, orientation) {\r\n this.viewport = size;\r\n this.orientation = orientation;\r\n\r\n $log.debug('ViewportWatcherService::viewportChanged', size, orientation);\r\n handleCallbacks();\r\n };\r\n\r\n ViewportWatcherService.startWatching = function () {\r\n if (!_.isObject($window.enquire)) {\r\n $log.debug('ViewportWatcher::startWatching, \"enquire\" is not defined');\r\n return;\r\n }\r\n\r\n $window.enquire\r\n .register(\"screen and (max-width: 480px) and (orientation: landscape)\", {\r\n match: function () {\r\n ViewportWatcherService.viewportChanged('mobile', 'landscape');\r\n }\r\n })\r\n .register(\"screen and (max-width: 480px) and (orientation: portrait)\", {\r\n match: function () {\r\n ViewportWatcherService.viewportChanged('mobile', 'portrait');\r\n }\r\n })\r\n .register(\"screen and (max-width: 767px)\", {\r\n match: function () {\r\n ViewportWatcherService.isGridFloatBreakpointMax = true;\r\n },\r\n unmatch: function () {\r\n ViewportWatcherService.isGridFloatBreakpointMax = false;\r\n }\r\n })\r\n .register(\"screen and (min-width: 481px) and (max-width: 1199px)\", {\r\n match: function () {\r\n ViewportWatcherService.viewportChanged('tablet', 'landscape');\r\n }\r\n })\r\n .register(\"screen and (min-width: 1200px)\", {\r\n match: function () {\r\n ViewportWatcherService.viewportChanged('desktop', 'landscape');\r\n }\r\n });\r\n };\r\n\r\n ViewportWatcherService.registerCallback = function (cb) {\r\n if (!_.isFunction(cb)) {\r\n $log.debug('ViewportWatcherService::registerCallback, given callback function is not a function!', cb);\r\n return;\r\n }\r\n\r\n this.registry.push(cb);\r\n\r\n /*Initial call for registered callback*/\r\n cb(this.viewport, this.orientation);\r\n };\r\n\r\n ViewportWatcherService.unregisterCallback = function (cb) {\r\n if (!_.isFunction(cb)) {\r\n $log.warn('ViewportWatcherService::unregisterCallback, given callback function is not a function!', cb);\r\n return;\r\n }\r\n\r\n _.remove(this.registry, function (registeredCB) {\r\n return registeredCB === cb;\r\n });\r\n };\r\n\r\n return ViewportWatcherService;\r\n })\r\n /*\r\n https://www.facebook.com/translations/FacebookLocales.xml\r\n https://github.com/angular/bower-angular-i18n\r\n https://dev.twitter.com/rest/reference/get/help/languages\r\n */\r\n // constant that is used to map EpiCms language code in to AngularJS language code and Facebooks language code these can be used to localize other external services as well.\r\n .constant('EnstoLanguages', {\r\n 'cz': { // Czech Republic and Slovak Republic\r\n ng: 'cs-cz',\r\n fb: 'cs_CZ'\r\n },\r\n 'ee': { // Estonia\r\n ng: 'et-ee',\r\n fb: 'et_EE'\r\n },\r\n 'fi': { // Finland\r\n ng: 'fi-fi',\r\n fb: 'fi_FI'\r\n },\r\n 'fr': { // France\r\n ng: 'fr-fr',\r\n fb: 'fr_FR'\r\n },\r\n 'de': { // Germany\r\n ng: 'de-de',\r\n fb: 'de_DE'\r\n },\r\n 'hu': { // Hungary\r\n ng: 'hu-hu',\r\n fb: 'hu_HU'\r\n },\r\n 'in': { // India\r\n ng: 'en-in',\r\n fb: 'en_IN'\r\n },\r\n 'it': { // Italy\r\n ng: 'it-it',\r\n fb: 'it_IT'\r\n },\r\n 'kz': { // Kazakhstan\r\n ng: 'kk-cyrl-kz',\r\n fb: 'kk_KZ'\r\n },\r\n 'lv': { // Latvia\r\n ng: 'lv-lv',\r\n fb: 'lv_LV'\r\n },\r\n 'lt': { // Lithuania\r\n ng: 'lt-lt',\r\n fb: 'lt-LT'\r\n },\r\n 'no': { // Norway\r\n ng: 'nn-no',\r\n fb: 'nn_NO'\r\n },\r\n 'pl': { // Poland\r\n ng: 'pl-pl',\r\n fb: 'pl_PL'\r\n },\r\n 'ro': { // Romania\r\n ng: 'ro-ro',\r\n fb: 'ro_RO'\r\n },\r\n 'ru': { // Russia\r\n ng: 'ru-ru',\r\n fb: 'ru_RU'\r\n },\r\n 'es': { // Spain\r\n ng: 'es-es',\r\n fb: 'es_ES'\r\n },\r\n 'se': { // Sweden\r\n ng: 'sv-se',\r\n fb: 'sv_SE'\r\n },\r\n 'en-gb': { // United Kingdom (English)\r\n ng: 'en-gb',\r\n fb: 'en_GB'\r\n },\r\n 'ua': { // Ukraine\r\n ng: 'uk-ua',\r\n fb: 'uk_UA'\r\n },\r\n 'en-us': { // USA (English)\r\n ng: 'en-us',\r\n fb: 'en_US'\r\n }\r\n })\r\n // regex from here http://www.w3.org/TR/html5/forms.html#valid-e-mail-address\r\n .constant('EnstoEmailRegex', /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/)\r\n .constant('BgImageUrlRegex', /(?:\\(['|\"]?)(.*?)(?:['|\"]?\\))/);\r\n})(angular);\n// The `enstocom.product` module contains stuff around products. \r\n// TODO: Tabs/accordion stuff should be moved inside its own module\r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.product', ['ngAnimate', 'ngMessages', 'ui.bootstrap', 'pascalprecht.translate', 'enstocom.utils', 'enstocom.carousel', 'enstocom.cards', 'enstocom.myselection', 'enstocom.productServices'])\r\n .constant('EnstoTabTypes', {\r\n TECHNICAL: 1,\r\n DOWNLOAD: 2,\r\n BENEFITS: 3,\r\n SUPPORT: 4,\r\n NEWS: 5\r\n })\r\n .config(function ($sceDelegateProvider, ServerSettings) {\r\n var allowedDomains = ServerSettings.AllowedDomainsForEmbeddedMedia.split(',');\r\n for (var i = 0; i < allowedDomains.length; i++) {\r\n allowedDomains[i] = \"*://\" + allowedDomains[i] + \"/**\";\r\n }\r\n allowedDomains.push('self');\r\n $sceDelegateProvider.resourceUrlWhitelist(allowedDomains);\r\n })\r\n // directive is used to 'bind-html' inside attached element. When server returns JSON which contains custom html that has custom elements\r\n // like it cannot be just 'bind-html' because $sce will remove all non standard / safe elements. In AngularJS 1.5 there \r\n // may already be 'whiteList' for custom elements, but not sure atm.\r\n .directive('enstoCompileHtml', function ($compile) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element, attributes) {\r\n // sad, currently in ng 1.4, ng-bind-html doesn't allow custom html elements (custom directives)\r\n // it seemed like ngSanitize would be more configurable in ng 1.5, but we'll see.\r\n element.html(attributes.enstoCompileHtml);\r\n\r\n $compile(element.contents())(scope);\r\n }\r\n };\r\n })\r\n // simple wrapper for product JSON items to unify functionality\r\n .factory('EnstoProductWrapper', function () {\r\n return function () {\r\n return {\r\n getProductName: function () {\r\n return this.overrideName || this.name;\r\n },\r\n getIntroText: function () {\r\n return this.introtext || this.introText;\r\n },\r\n getEnumber: function () {\r\n return this.enumber || this.eNumber;\r\n },\r\n getType: function () {\r\n return this.producttype || this.productType;\r\n },\r\n getGTIN: function () {\r\n return this.gtin;\r\n },\r\n getPrice: function () {\r\n return this.price;\r\n }\r\n };\r\n };\r\n })\r\n // Service is used to fetch product news and contacts\r\n .factory('EnstoProduct', function ($resource, ServerSettings) {\r\n var EnstoProductService = $resource('/api/product/:verb/:contentId', {\r\n language: ServerSettings.preferredCultureName,\r\n verb: '',\r\n contentId: null,\r\n areaIds: null\r\n }, {\r\n getProductNews: {\r\n method: 'GET',\r\n params: {\r\n verb: 'news'\r\n },\r\n isArray: true\r\n },\r\n getProductSalesPersons: {\r\n method: 'GET',\r\n params: {\r\n verb: 'salescontacts'\r\n },\r\n isArray: true\r\n }\r\n });\r\n\r\n return EnstoProductService;\r\n })\r\n .component('productAttributes', {\r\n bindings: {\r\n code: '@',\r\n language: '@'\r\n },\r\n templateUrl: function() { \r\n var date = new Date();\r\n return '/static/com/js/templates/product-attributes.html'\r\n },\r\n controller: ['$http',\r\n function ($http) {\r\n var $ctrl = this;\r\n $ctrl.loading = true;\r\n\r\n $ctrl.$onInit = function () {\r\n var requestUrl = '/api/catalog/product/attributes/' + $ctrl.code + '/language/' + $ctrl.language || 'en';\r\n $http.get(requestUrl)\r\n .then(function (result) {\r\n $ctrl.sections = result.data;\r\n })\r\n .catch(function (err) {\r\n $ctrl.error = err;\r\n })\r\n .finally(function () {\r\n $ctrl.loading = false;\r\n });\r\n };\r\n }]\r\n })\r\n // defaultnode.cshtml uses this for selecting correct width class based on window width\r\n .directive('enstoCategoryWidth', function () {\r\n return {\r\n restrict: 'A',\r\n link: function (scope) {\r\n scope.windowWidth = window.outerWidth || window.clientWidth || window.innerWidth;\r\n\r\n angular.element(window).bind('resize', function () {\r\n scope.windowWidth = window.outerWidth || window.clientWidth || window.innerWidth;\r\n scope.$apply();\r\n });\r\n }\r\n };\r\n })\r\n // ensto tabs controller, used by 'enstoTabSet' directive\r\n .controller('EnstoTabsController', function ($scope, $http, EnstoProduct, EnstoGA, EnstoTabTypes, ViewportWatcher, _) {\r\n var ctrl = this;\r\n\r\n ctrl.removeTab = function (tabType) {\r\n _.remove($scope.tabsData, function (tab) {\r\n return tab.type === tabType;\r\n });\r\n };\r\n\r\n ctrl.getTab = function (tabType) {\r\n return _.find($scope.tabsData, function (tab) {\r\n return tab.type === tabType;\r\n }) || {};\r\n };\r\n\r\n ctrl.isEmptyTechnicalSpecifications = function () {\r\n var isEmpty = true;\r\n\r\n _.forEach($scope.technicalSpecifications, function (o) {\r\n if (!_.isEmpty(o.groups)) { // if even one group is not empty, then..\r\n isEmpty = false;\r\n }\r\n });\r\n\r\n return isEmpty;\r\n };\r\n\r\n ctrl.loadContactsAndSupport = function () {\r\n var tab = ctrl.getTab(EnstoTabTypes.SUPPORT);\r\n\r\n var refreshContacts = function (areaIds) {\r\n tab.loading = true;\r\n\r\n EnstoProduct.getProductSalesPersons({\r\n contentId: $scope.contentId,\r\n areaIds: areaIds\r\n }).$promise\r\n .then(function (results) {\r\n tab.content.contacts = results;\r\n tab.empty = _.isEmpty(results);\r\n tab.loading = false;\r\n }, function () {\r\n tab.failed = true;\r\n }, angular.noop)\r\n .finally(function () {\r\n tab.loading = false;\r\n });\r\n };\r\n\r\n $scope.$watch('support.countries.currentlySelected', function (newVal, oldVal) {\r\n if (newVal === oldVal || newVal === undefined || newVal === null) {\r\n return;\r\n }\r\n refreshContacts(newVal.Key);\r\n });\r\n\r\n if (_.isNull(tab.content.contacts) && $scope.support.countries.Values != null && $scope.support.countries.Values.length < 2) {\r\n refreshContacts();\r\n }\r\n };\r\n\r\n ctrl.loadProductNews = function () {\r\n var tab = ctrl.getTab(EnstoTabTypes.NEWS);\r\n\r\n if (_.isNull(tab.content)) {\r\n tab.loading = true;\r\n\r\n EnstoProduct.getProductNews({\r\n contentId: $scope.contentId\r\n }).$promise\r\n .then(function (results) {\r\n tab.content = results;\r\n tab.empty = _.isEmpty(results);\r\n }, function () {\r\n tab.failed = true;\r\n }, angular.noop)\r\n .finally(function () {\r\n tab.loading = false;\r\n });\r\n }\r\n };\r\n\r\n $scope.activeTab = -1;\r\n $scope.$on('closeTab', function () {\r\n $scope.activeTab = -1;\r\n });\r\n\r\n $scope.tabsData = [\r\n {\r\n type: EnstoTabTypes.TECHNICAL,\r\n translationkey: '/comproductpage/tab/technicalspecification',\r\n content: $scope.technicalSpecifications,\r\n active: false\r\n },\r\n {\r\n type: EnstoTabTypes.DOWNLOAD,\r\n translationkey: '/comproductpage/tab/downloads',\r\n content: $scope.downloads,\r\n openClick: function () {\r\n EnstoGA.trackTabOpening('download', ctrl.tabSource);\r\n },\r\n active: false\r\n },\r\n {\r\n type: EnstoTabTypes.BENEFITS,\r\n translationkey: '/comproductpage/tab/benefits',\r\n content: $scope.benefits,\r\n openClick: function () {\r\n EnstoGA.trackTabOpening('benefits', ctrl.tabSource);\r\n },\r\n active: false\r\n },\r\n {\r\n type: EnstoTabTypes.NEWS,\r\n translationkey: '/comproductpage/tab/news',\r\n content: $scope.news || null,\r\n openClick: function () {\r\n EnstoGA.trackTabOpening('news', ctrl.tabSource);\r\n\r\n ctrl.loadProductNews();\r\n },\r\n active: false\r\n },\r\n {\r\n type: EnstoTabTypes.SUPPORT,\r\n translationkey: '/comproductpage/tab/support',\r\n content: $scope.support || null,\r\n openClick: function () {\r\n EnstoGA.trackTabOpening('support', ctrl.tabSource);\r\n\r\n ctrl.loadContactsAndSupport();\r\n },\r\n active: false\r\n }\r\n ];\r\n\r\n // remove downloads tab if needed\r\n if (_.size($scope.downloads) <= 0) {\r\n ctrl.removeTab(EnstoTabTypes.DOWNLOAD);\r\n }\r\n\r\n // remove benefits tab if needed\r\n if (_.every($scope.benefits, _.isEmpty) && _.every($scope.richcontent, _.isEmpty)) {\r\n ctrl.removeTab(EnstoTabTypes.BENEFITS);\r\n }\r\n\r\n // check if technical specifications tab is actually empty.\r\n if (ctrl.isEmptyTechnicalSpecifications()) {\r\n ctrl.getTab(EnstoTabTypes.TECHNICAL).empty = true;\r\n }\r\n })\r\n // simple directive to add description in to the scope, \r\n // This should be Description goes herer AND this directive should use ng-transclude + add showmore / hide functionality around given text.\r\n .directive('enstoDescription', function () {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element, attributes) {\r\n scope.description = attributes.enstoDescription;\r\n }\r\n };\r\n })\r\n // directive will add tabs. Used inside DefaultItem.cshtml and DefaultNode.cshtml. Mobile phones will use actually Accordion template not tabs.\r\n // also inside DefaultNode.cshtml page tabs will have a custom tabHandle template\r\n .directive('enstoTabSet', function (ViewportWatcher, EnstoTabTypes, ServerSettings, _) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: function () {\r\n var tplType = 'tabs';\r\n\r\n if (ViewportWatcher.viewport === 'mobile') {\r\n tplType = 'accordion';\r\n }\r\n // Note: for now we do not need any extra template which would have 'ngSwitch' between accordion and tabs\r\n // because accordion is only showed in mobile.\r\n return '/static/com/js/templates/enstocom-product-' + tplType + '.html?_=2019994';\r\n },\r\n controller: 'EnstoTabsController',\r\n scope: {\r\n downloads: '=',\r\n benefits: '=',\r\n richcontent: '=',\r\n news: '=',\r\n support: '=',\r\n contentId: '@',\r\n productnumber: '@',\r\n language: '@'\r\n },\r\n link: function ($scope, elemement, attributes) {\r\n },\r\n compile: function (element, attributes) {\r\n // add override for tab template\r\n if (attributes.templateUrl) {\r\n angular.element(element)\r\n .find('uib-tab')\r\n .eq(0)\r\n .attr('template-url', attributes.templateUrl);\r\n }\r\n\r\n return {\r\n pre: function (scope, element, attributes, ctrl) {\r\n ctrl.tabSource = _.isString(attributes.templateUrl) ? 'category-page' : 'product-page';\r\n\r\n scope.pageInEditMode = ServerSettings.pageInEditMode;\r\n scope.forceAccordionOpen = scope.$eval(attributes.forceAccordionOpen);\r\n scope.tabsJustified = scope.$eval(attributes.justified);\r\n scope.pdfCard = scope.$eval(attributes.pdfCard);\r\n scope.tabSource = ctrl.tabSource;\r\n\r\n // If pdfcard remove news and support tabs\r\n if (scope.pdfCard) {\r\n ctrl.removeTab(EnstoTabTypes.NEWS);\r\n ctrl.removeTab(EnstoTabTypes.SUPPORT);\r\n }\r\n\r\n // news and support attributes are currently used inside DefaultNode.cshtml\r\n if (!_.isUndefined(attributes.news) && _.isEmpty(scope.news)) {\r\n ctrl.removeTab(EnstoTabTypes.NEWS);\r\n }\r\n\r\n if (!_.isUndefined(attributes.support) && _.isEmpty(scope.support)) {\r\n ctrl.removeTab(EnstoTabTypes.SUPPORT);\r\n }\r\n\r\n if (_.isUndefined(scope.productnumber)) {\r\n ctrl.removeTab(EnstoTabTypes.TECHNICAL);\r\n }\r\n\r\n var noActiveTabs = scope.$eval(attributes.noTabActive);\r\n var defaultTabType = scope.$eval(attributes.defaultTabOpen);\r\n var tabIndex;\r\n if (!noActiveTabs) {\r\n var set = false;\r\n\r\n if (defaultTabType !== null && typeof (defaultTabType) === \"number\") {\r\n if (defaultTabType !== 0 && defaultTabType !== -1) {\r\n // If it's numbered tab handle it the same way for both items and categories\r\n tabIndex = _.findIndex(scope.tabsData, { 'type': defaultTabType });\r\n // Open tab if index found\r\n if (tabIndex !== -1 && !_.isUndefined(tabIndex)) {\r\n scope.tabsData[tabIndex].active = true;\r\n scope.activeTab = tabIndex;\r\n set = true;\r\n } else {\r\n console.info(\"Default tab not found, opening first tab.\");\r\n }\r\n }\r\n else {\r\n // by default (if defaultTab === 0) category pages open no tabs and item pages open first tab (technical information)\r\n if (ctrl.tabSource === 'category-page') {\r\n // 0 means to not open anything, -1 to open first (default handler takes care)\r\n if (defaultTabType === 0) {\r\n set = true;\r\n }\r\n }\r\n else if (ctrl.tabSource === 'product-page') {\r\n // -1 means to not open anything, 0 to open first (default handler takes care)\r\n if (defaultTabType === -1) {\r\n set = true;\r\n }\r\n }\r\n }\r\n }\r\n // default handler \r\n if (!set && !_.isUndefined(scope.tabsData) && scope.tabsData.length > 0) {\r\n // Normally technical spec is first\r\n _.first(scope.tabsData).active = true;\r\n scope.activeTab = 0;\r\n }\r\n }\r\n\r\n // Set benefits tab open in editMode (Bug: EN-822 Catalog edit mode: scrolling errors with rich benefit area)\r\n // Find benefits object index from current tabsData, if found and oage in editmode, set it to active and open it\r\n var benefitTabIndex = _.findIndex(scope.tabsData, { 'type': 3 });\r\n if (benefitTabIndex !== -1 && scope.pageInEditMode === \"True\") {\r\n scope.tabsData[benefitTabIndex].active = true;\r\n scope.activeTab = benefitTabIndex;\r\n }\r\n\r\n // Open the wanted tab by default according to hash\r\n var hash = window.location.hash;\r\n if (hash !== '') {\r\n // Clean up hash\r\n hash = hash.replace('#', '');\r\n hash = hash.replace('/', '');\r\n var tabType;\r\n // Set tabType number according to hash name\r\n switch (hash) {\r\n case 'technical':\r\n tabType = 1;\r\n break;\r\n case 'downloads':\r\n tabType = 2;\r\n break;\r\n case 'overview':\r\n tabType = 3;\r\n break;\r\n case 'support':\r\n tabType = 4;\r\n break;\r\n case 'news':\r\n tabType = 5;\r\n break;\r\n }\r\n // Find the right index number according to the current tabdata on the page\r\n tabIndex = _.findIndex(scope.tabsData, { 'type': tabType });\r\n // Open tab if index found\r\n if (tabIndex !== -1 && !_.isUndefined(tabIndex)) {\r\n scope.tabsData[tabIndex].active = true;\r\n scope.activeTab = tabIndex;\r\n }\r\n\r\n }\r\n }\r\n };\r\n }\r\n };\r\n })\r\n // controller for 'enstoLightbox' directive\r\n .controller('EnstoLightboxController', function ($scope, $uibModal, ViewportWatcher, _) {\r\n var ctrl = this;\r\n ctrl.allowModalOpen = true;\r\n\r\n $scope.activeImage = {};\r\n\r\n if (ViewportWatcher.viewport === 'mobile') {\r\n ctrl.allowModalOpen = false;\r\n }\r\n\r\n $scope.setActiveImage = function (imageObj) {\r\n $scope.activeImage = imageObj;\r\n };\r\n\r\n $scope.getPrimaryImage = function () {\r\n return _.find($scope.productImages, function (image) {\r\n return image.type === 1; // 1 -> Primary image\r\n });\r\n };\r\n\r\n $scope.openFullScreen = function (TemplateUriHandler) {\r\n if (!ctrl.allowModalOpen) {\r\n return;\r\n }\r\n\r\n $uibModal.open({\r\n templateUrl: '/static/com/js/templates/enstocom-modal-product-image.html',\r\n backdropClass: 'ensto-product-backdrop',\r\n size: 'fullscreen', // custom size, see _enstocom-modal.scss\r\n windowClass: 'ensto-product-modal',\r\n controller: 'EnstoProductImageModalController',\r\n resolve: {\r\n Image: function () {\r\n return $scope.activeImage;\r\n }\r\n }\r\n });\r\n };\r\n })\r\n // controller is used to wrap content inside DefaultItem.cshtml inside it self.\r\n .controller('EnstoProductPageController', function ($scope, $translate, $window, UrlService, $log, _, EnstoGA) {\r\n var ctrl = this;\r\n\r\n $scope.form = {\r\n pdf: 1,\r\n pdfName: 1\r\n };\r\n\r\n $scope.init = function (productName, pageUrl) {\r\n $scope.setProductName(productName);\r\n $scope.pageUrl = pageUrl;\r\n };\r\n\r\n $scope.setProductName = function (productName) {\r\n $scope.productName = productName;\r\n EnstoGA.trackEvent(\"product-page\", \"landed-page\", $scope.productName);\r\n };\r\n\r\n $scope.downloadPdf = function (is_valid) {\r\n if (!is_valid || $scope.form.sending) {\r\n return;\r\n }\r\n var url = $scope.pageUrl + UrlService.toQueryString(_.pick($scope.form, 'projectName', 'positionNumber', 'pdf', 'pdfName', 'additionalText'));\r\n $log.debug('EnstoProductPageController::downloadPdf()', url);\r\n\r\n $window.open(url, '_blank');\r\n $scope.pdfPopoverOpen = false;\r\n\r\n $scope.form = {\r\n pdf: 1,\r\n pdfName: 1\r\n };\r\n\r\n EnstoGA.trackEvent(\"product-page\", \"pdfcard-with-addinfo-download\", \"default label\");\r\n\r\n };\r\n\r\n $scope.closePopover = function () {\r\n $scope.pdfPopoverOpen = false;\r\n };\r\n\r\n $scope.downloadDefaultPdf = function () {\r\n EnstoGA.trackEvent(\"product-page\", \"pdfcard-download\", $window.document.title);\r\n };\r\n\r\n $scope.downloadSpecificationPdf = function () {\r\n EnstoGA.trackEvent(\"product-page\", \"pdfcard-specification-download\", \"default label\");\r\n };\r\n })\r\n // directive is used to add 'lightbox' functionality inside somewhere. Currently only inside DefaultItem.cshtml.\r\n .directive('enstoLightbox', function ($translate, TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-product-lightbox.html'),\r\n require: '?enstoServerJson',\r\n controller: 'EnstoLightboxController',\r\n scope: {\r\n productImages: '=?'\r\n },\r\n link: {\r\n pre: function (scope, element, attributes, ctrl) {\r\n scope.primaryImageIndicative = scope.$eval(attributes.primaryImageIndicative);\r\n scope.videoIds = scope.$eval(attributes.enstoVideoIds);\r\n if (!_.isNull(ctrl)) {\r\n scope.productImages = ctrl.getValue([]);\r\n }\r\n },\r\n post: function (scope) {\r\n scope.productImages = _.sortBy(scope.productImages, 'type');\r\n scope.setActiveImage(_.first(scope.productImages));\r\n\r\n if (scope.primaryImageIndicative) {\r\n $translate('/comproductpage/lightbox/indicativeimage').then(function (text) {\r\n var primaryImage = scope.getPrimaryImage() || {};\r\n\r\n primaryImage.caption = text;\r\n }, angular.noop);\r\n }\r\n }\r\n }\r\n };\r\n })\r\n .component('enstoProductLightbox',\r\n {\r\n bindings: {\r\n productNumber: '@',\r\n productDefaultImage: '@'\r\n },\r\n controller: ['_', 'ServerSettings', 'productDataService', 'ViewportWatcher', '$uibModal',\r\n function (_, ServerSettings, productDataservice, ViewportWatcher, $uibModal) {\r\n var $ctrl = this;\r\n $ctrl.activeImage = { Url: \"/globalassets/common-blocks-and-media/episerver/ensto-placeholder-logo.jpg\" };\r\n $ctrl.primaryImages = [];\r\n $ctrl.secondaryImages = [];\r\n $ctrl.fetching = true;\r\n $ctrl.allowModalOpen = false;\r\n\r\n if (ViewportWatcher.viewport === 'mobile') {\r\n $ctrl.allowModalOpen = false;\r\n }\r\n\r\n $ctrl.setActiveImage = function (imageObj) {\r\n $ctrl.activeImage = imageObj;\r\n };\r\n\r\n $ctrl.getPrimaryImage = function () {\r\n return _.first($ctrl.primaryImages);\r\n };\r\n\r\n var getImages = function (responseData) {\r\n console.log(responseData);\r\n $ctrl.primaryImages = responseData.primaryImages;\r\n $ctrl.secondaryImages = responseData.secondaryImages;\r\n };\r\n\r\n $ctrl.openFullScreen = function () {\r\n if (!$ctrl.allowModalOpen) {\r\n return;\r\n }\r\n\r\n $uibModal.open({\r\n templateUrl: '/static/com/js/templates/enstocom-modal-product-image.html?_=2019994',\r\n backdropClass: 'ensto-product-backdrop',\r\n size: 'fullscreen', // custom size, see _enstocom-modal.scss\r\n windowClass: 'ensto-product-modal',\r\n controller: 'EnstoProductImageModalController',\r\n resolve: {\r\n Image: function () {\r\n return $ctrl.activeImage;\r\n }\r\n }\r\n });\r\n };\r\n\r\n $ctrl.$onInit = function () {\r\n productDataservice.getProductImages($ctrl.productNumber)\r\n .then(function (response) {\r\n $ctrl.productImages = response.data;\r\n getImages(response.data);\r\n $ctrl.setActiveImage($ctrl.getPrimaryImage());\r\n $ctrl.fetching = false;\r\n })\r\n .catch(function (err) {\r\n $ctrl.error = err.statusText;\r\n $ctrl.fetching = false;\r\n })\r\n .finally(function () {\r\n $ctrl.fetching = false;\r\n })\r\n };\r\n }],\r\n templateUrl: '/static/com/js/templates/product-image-lightbox.html?_=2019994'\r\n })\r\n // directive is used inside DefaultNode.cshtml to provide product table list inside DefaultItem.cshmtl, used for Related products, Replacing Products and Product Accessories\r\n .directive('enstoProductList', function (EnstoProductWrapper, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-product-view-list.html'),\r\n require: '?enstoServerJson',\r\n scope: {\r\n products: '=?',\r\n header: '@',\r\n showenumber: '<',\r\n showmyfavourites: '<',\r\n compresslimit: '='\r\n },\r\n link: {\r\n pre: function (scope, element, attributes, ctrl) {\r\n if (!_.isNull(ctrl)) {\r\n scope.products = ctrl.getValue([]);\r\n if (scope.compresslimit && scope.products.length > scope.compresslimit) {\r\n scope.useMinifiedVersion = true;\r\n }\r\n }\r\n },\r\n post: function (scope) {\r\n _.forEach(scope.products, function (product) {\r\n var productWrapper = new EnstoProductWrapper();\r\n _.merge(product, productWrapper);\r\n });\r\n }\r\n }\r\n };\r\n })\r\n // controller for modal opened from 'EnstoLightboxController' \r\n .controller('EnstoProductImageModalController', function ($scope, $uibModalInstance, UrlService, Image) {\r\n $scope.image = Image;\r\n\r\n $scope.image.downloadUrl = Image.url + UrlService.toQueryString({\r\n dl: 1\r\n });\r\n\r\n $scope.closeModalClick = function () {\r\n $uibModalInstance.dismiss();\r\n };\r\n })\r\n .controller('EnstoProductCategoryListController', function ($scope) {\r\n var getStoredSidenavState = function () {\r\n var state = localStorage.getItem('sidenavState') === \"true\"; // Otherwise can return string \"false\" which is interpreted as true by uib-collapse.. :x\r\n if (state === null || typeof (state) === \"undefined\") {\r\n state = document.documentElement.clientWidth > 767;\r\n console.info('state was not found, defaulted to ' + state);\r\n saveStoredSidenavState(state);\r\n }\r\n return document.documentElement.clientWidth > 767 || state;\r\n };\r\n\r\n var saveStoredSidenavState = function (state) {\r\n localStorage.setItem('sidenavState', state);\r\n return state;\r\n };\r\n\r\n $scope.toggleSidenavState = function () {\r\n $scope.sidenavState = { open: !$scope.sidenavState.open };\r\n saveStoredSidenavState($scope.sidenavState.open);\r\n };\r\n $scope.getSidenavState = function () {\r\n return getStoredSidenavState();\r\n };\r\n $scope.init = function () {\r\n $scope.sidenavState = { open: $scope.getSidenavState() };\r\n };\r\n $(window).on(\"resize.trackWidth\", _.throttle(function () {\r\n $scope.$apply(function () {\r\n if (document.documentElement.clientWidth > 767) {\r\n $scope.sidenavState = { open: true }; // however.. do not save it so that it can be restored.\r\n }\r\n else {\r\n $scope.sidenavState = { open: $scope.getSidenavState() }; // restore saved state\r\n }\r\n });\r\n }));\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n $(window).off(\"resize.trackWidth\"); //remove the handler in case the controller gets recreated\r\n });\r\n });\r\n})(angular);\n// The `enstocom.responsiveImage` module contains stuff around images.\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.responsiveImage', ['ropooy-angular-rdash'])\r\n // directive which will match ImageBlock css class and run picturefill for that\r\n .directive('imageBlock', function($window) {\r\n var isRunned = false;\r\n // if page contains even a one image block, run picturefill so that it will place \r\n // correct source in to element inside block. Previously image block did\r\n // contain also src element, but it is now removed, because Safari will then download\r\n // 1x and 2x images.\r\n // It is just fine to run this only once.\r\n return {\r\n restrict: 'C',\r\n link: function() {\r\n if(!isRunned && $window.picturefill) {\r\n $window.picturefill({\r\n elements: [].slice.call($window.document.getElementsByClassName('image-block'))\r\n });\r\n\r\n isRunned = true;\r\n }\r\n }\r\n };\r\n })\r\n // directive is used to add responsive image for someplace \r\n // NOTE: templates could be done in 'lighter' way using 'srcset' + 'sizes' read more http://scottjehl.github.io/picturefill/ that would reduce DOM size.\r\n // element will be part of HTML 5.1 spec as well as 'srcset'\r\n .directive('enstoImage', function(ServerSettings, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: function(element, attributes) {\r\n if(attributes.isFixedSize && attributes.isFixedSize == 'true') {\r\n return TemplateUriHandler('/static/com/js/templates/enstocom-responsive-image-base.html');\r\n }\r\n else {\r\n return TemplateUriHandler('/static/com/js/templates/enstocom-responsive-image.html');\r\n }\r\n },\r\n controller: 'EnstoResponsiveImageController',\r\n scope: {\r\n presetType: '@',\r\n src: '@',\r\n caption: '@',\r\n title: '@',\r\n alt: '@'\r\n },\r\n link: function(scope, element, attributes, ctrl) {\r\n scope.src = scope.src !== '' ? scope.src : ServerSettings.placeholder.product;\r\n ctrl.attachErrorHandler = function() {\r\n angular.element(element)\r\n .find('img')\r\n .eq(0)\r\n .on('error', function() {\r\n ctrl.detachErrorHandler();\r\n\r\n // set placeholder image\r\n scope.$apply(function() {\r\n scope.src = ServerSettings.placeholder.product;\r\n scope.init();\r\n });\r\n });\r\n };\r\n\r\n ctrl.detachErrorHandler = function() {\r\n // detach error handler\r\n angular.element(element)\r\n .find('img')\r\n .eq(0)\r\n .off('error');\r\n };\r\n\r\n attributes.$observe('presetType', function(value) {\r\n if(_.isEmpty(value) || !_.isString(value)) {\r\n scope.presetsType = null;\r\n }\r\n else {\r\n scope.presetType = value;\r\n }\r\n\r\n scope.init();\r\n });\r\n\r\n attributes.$observe('title', function(value) {\r\n scope.title = value;\r\n });\r\n\r\n attributes.$observe('caption', function(value) {\r\n scope.caption = value;\r\n });\r\n\r\n //_.forEach(['lgPreset', 'mdPreset', 'smPreset', 'xsPreset'], function(preset) {\r\n // if(_.isEmpty(scope[preset])) {\r\n // scope[preset] = null;\r\n // }\r\n //});\r\n\r\n attributes.$observe('src', function(value) {\r\n //Change url to use image processor RemoteImageService\r\n //domain must match whitelist domains in imageprocessor.security.config\r\n var regEx = new RegExp(':\\/\\/static.ensto.com\\/');\r\n if (regEx.test(value))\r\n {\r\n value = value.replace(\"https://\", \"/imageService/\");\r\n }\r\n scope.src = value;\r\n scope.init();\r\n\r\n ctrl.attachErrorHandler();\r\n });\r\n\r\n // attach error handler\r\n ctrl.attachErrorHandler();\r\n }\r\n };\r\n })\r\n // controller for 'enstoImage' directive\r\n .controller('EnstoResponsiveImageController', function($scope, ImagePresets, _, $log) {\r\n $scope.pixelDensities = ['at1', 'at2'];\r\n $scope.customClass = null;\r\n\r\n var _lgPreset = null;\r\n var _mdPreset = null;\r\n var _smPreset = null;\r\n var _xsPreset = null;\r\n\r\n var generateUrls = function(urls, preset) {\r\n _.forEach($scope.pixelDensities, function(density) {\r\n urls.push($scope.src + (_.isEmpty(preset) ? '' : ('?preset=' + preset + density)));\r\n });\r\n };\r\n\r\n var resetGenerated = function() {\r\n $scope.screenLgUrls = [];\r\n $scope.screenMdUrls = [];\r\n $scope.screenSmUrls = [];\r\n $scope.screenXsUrls = [];\r\n\r\n _lgPreset = null;\r\n _mdPreset = null;\r\n _smPreset = null;\r\n _xsPreset = null;\r\n };\r\n\r\n /*Resolve what presets actually should be used*/\r\n var resolvePresets = function() {\r\n if(!_.isEmpty(ImagePresets[$scope.presetType])) {\r\n _lgPreset = ImagePresets[$scope.presetType].lg; //example: 345x384\r\n _mdPreset = ImagePresets[$scope.presetType].md;\r\n _smPreset = ImagePresets[$scope.presetType].sm;\r\n _xsPreset = ImagePresets[$scope.presetType].xs;\r\n }\r\n };\r\n\r\n $scope.init = function() {\r\n if(_.isEmpty($scope.src)) {\r\n $log.warn('Unable to initialize \"EnstoResponsiveImageController\", because \"src\" is missing');\r\n return false;\r\n }\r\n\r\n resetGenerated();\r\n\r\n if(!_.isEmpty($scope.presetType)) {\r\n $scope.customClass = ImagePresets[$scope.presetType].customClass || null;\r\n }\r\n\r\n resolvePresets();\r\n\r\n generateUrls($scope.screenLgUrls, _lgPreset);\r\n generateUrls($scope.screenMdUrls, _mdPreset);\r\n generateUrls($scope.screenSmUrls, _smPreset);\r\n generateUrls($scope.screenXsUrls, _xsPreset);\r\n };\r\n })\r\n // Preset definitons, see more from 'Web.Config' -> search 'preset'\r\n .constant('ImagePresets', {\r\n carousel: {\r\n customClass: 'center-block ensto-img-fullwidth',\r\n lg: '1180x664',\r\n md: '940x530',\r\n sm: '720x405',\r\n xs: '460x260'\r\n },\r\n carouselForExpandedCard: {\r\n customClass: 'center-block ensto-img-card-carousel',\r\n lg: '778x438',\r\n md: '616x346',\r\n sm: '720x405',\r\n xs: '460x260'\r\n },\r\n splitbanner: {\r\n customClass: 'center-block ensto-img-splitbanner',\r\n lg: '578x326',\r\n md: '458x258',\r\n sm: '348x196',\r\n xs: '460x259'\r\n },\r\n productThumbnail: {\r\n customClass: 'center-block ensto-img-product-thumbnail',\r\n lg: '120x120',\r\n md: '120x120',\r\n sm: '120x120',\r\n xs: '120x120'\r\n },\r\n productImage: {\r\n customClass: 'center-block ensto-img-product',\r\n lg: '450x450',\r\n md: '450x450',\r\n sm: '450x450',\r\n xs: '450x450'\r\n },\r\n productImageFullscreen: {\r\n lg: 'fullSizeProduct',\r\n md: 'fullSizeProduct',\r\n sm: 'fullSizeProduct',\r\n xs: 'fullSizeProduct'\r\n },\r\n articleCard: {\r\n customClass: 'center-block ensto-img-article-card',\r\n lg: '378x348',\r\n md: '298x270',\r\n sm: '378x348',\r\n xs: '378x348'\r\n },\r\n articleCardExpanded: {\r\n customClass: 'center-block ensto-img-article-expanded',\r\n lg: 'defaultLG',\r\n md: 'defaultMD',\r\n sm: 'defaultSM',\r\n xs: 'defaultXS'\r\n },\r\n articlePageImage: {\r\n customClass: 'ensto-img-article',\r\n lg: 'defaultLG',\r\n md: 'defaultMD',\r\n sm: 'defaultSM',\r\n xs: 'defaultXS'\r\n },\r\n productLandingImage: {\r\n customClass: 'center-block ensto-img-category',\r\n lg: '267x267',\r\n md: '267x267',\r\n sm: '267x267',\r\n xs: '267x267'\r\n },\r\n categoryImage: {\r\n customClass: 'center-block ensto-img-category',\r\n lg: '267xauto',\r\n md: '267xauto',\r\n sm: '267xauto',\r\n xs: '267xauto'\r\n },\r\n solutionImage: {\r\n customClass: 'center-block ensto-img-article-card',\r\n lg: '378x348',\r\n md: '298x270',\r\n sm: '378x348',\r\n xs: '378x348'\r\n },\r\n factImage: {\r\n customClass: 'center-block ensto-img-fact',\r\n lg: '378xauto',\r\n md: '293xauto',\r\n sm: '220xauto',\r\n xs: '378xauto'\r\n },\r\n teaserProduct: {\r\n lg: '378x348',\r\n md: '298x270',\r\n sm: '378x348',\r\n xs: '378x348'\r\n },\r\n imageTeaser: {\r\n lg: '378x348',\r\n md: '298x270',\r\n sm: '378x348',\r\n xs: '378x348'\r\n },\r\n searchResultThumbnail: {\r\n customClass: 'center-block ensto-img-search-thumbnail media-object',\r\n lg: '240x240',\r\n md: '240x240',\r\n sm: '240x240',\r\n xs: '240x240'\r\n },\r\n contactImage: {\r\n customClass: 'ensto-img-contact media-object',\r\n lg: '200xauto',\r\n md: '200xauto',\r\n sm: '200xauto',\r\n xs: '200xauto'\r\n },\r\n newsTeaser: {\r\n customClass: 'center-block ensto-img-newsteaser',\r\n lg: '390x220',\r\n md: '390x220',\r\n sm: '390x220',\r\n xs: '390x220'\r\n },\r\n newsCardHighlight: {\r\n lg: '940x530',\r\n md: '940x530',\r\n sm: '720x405',\r\n xs: '720x405'\r\n },\r\n newsCardTeaser: {\r\n customClass: 'center-block ensto-img-newscardteaser',\r\n lg: '460x260',\r\n md: '460x260',\r\n sm: '720x405',\r\n xs: '720x405'\r\n },\r\n mobileMenuThumbnail: {\r\n customClass: 'center-block ensto-img-mobilemenu-thumbnail',\r\n lg: '76x76',\r\n md: '76x76',\r\n sm: '76x76',\r\n xs: '76x76'\r\n },\r\n industryTeaser: {\r\n customClass: 'center-block',\r\n lg: '590x325',\r\n md: '590x325',\r\n sm: '414x320',\r\n xs: '414x320'\r\n }\r\n });\r\n})(angular);\n// The `enstocom.videoembed` module is used to embed videos from different sources, currently only from YouTube. Video will have only thumbnail rendered\r\n// and after user clicks play, the actual video player is initialized.\r\n//https://developers.google.com/youtube/player_parameters?hl=en#rel\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.videoembed', ['enstocom.utils'])\r\n // Add YouTube url in to whitelist and DO NOT alter already added urls (if there is any), meaning that do not replace the whole list by just youtube.com\r\n .config(function($sceDelegateProvider) {\r\n // add YouTube video urls to the whitelist\r\n // this is the best way to do this =) as long as app.js .config section does not override the whole list.\r\n var whiteList = $sceDelegateProvider.resourceUrlWhitelist();\r\n whiteList.push('*://www.youtube.com/embed/**');\r\n\r\n $sceDelegateProvider.resourceUrlWhitelist(whiteList);\r\n })\r\n // service is used to generate thumbnail and embed urls.\r\n .factory('YouTubeHelper', function(UrlService) {\r\n var YouTubeHelperService = {};\r\n\r\n // http://stackoverflow.com/questions/2068344/how-do-i-get-a-youtube-video-thumbnail-from-the-youtube-api\r\n YouTubeHelperService.getThumbnailURL = function(videoId) {\r\n return '//img.youtube.com/vi/' + videoId + '/hqdefault.jpg';\r\n };\r\n\r\n YouTubeHelperService.getVideoEmbedURL = function(videoId) {\r\n return '//www.youtube.com/embed/' + videoId + UrlService.toQueryString({rel: 0, modestbranding: 1});\r\n };\r\n\r\n return YouTubeHelperService;\r\n })\r\n // directive is showing video thumbnail where it is initialized\r\n .directive('enstoVideoThumbnail', function(TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n controller: 'EnstoVideoEmbedController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-video-thumbnail.html'),\r\n scope: {\r\n youtubeVideoId: '@',\r\n useBackground: '@',\r\n thumbnailImageSrc: '@'\r\n }\r\n };\r\n })\r\n .directive('enstoVideoTeaserCard', function(TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n controller: 'EnstoVideoEmbedController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-video-teaser-card.html'),\r\n scope: {\r\n videoid: '@',\r\n useBackground: '@',\r\n title: '@',\r\n }\r\n };\r\n })\r\n // directive is used to embed actual video\r\n .directive('enstoVideoEmbed', function(TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n controller: 'EnstoVideoEmbedController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-video-embed.html'),\r\n scope: {\r\n youtubeVideoId: '@'\r\n }\r\n };\r\n })\r\n // controller for video modal\r\n .controller('EnstoVideoModalController', function($scope, $uibModalInstance, Video) {\r\n $scope.video = Video;\r\n\r\n $scope.closePlayer = function() {\r\n $uibModalInstance.dismiss();\r\n };\r\n })\r\n // controller for 'enstoVideoThumbnail' and 'enstoVideoEmbed' directives.\r\n .controller('EnstoVideoEmbedController', function($scope, $uibModal, YouTubeHelper, _) {\r\n var initYouTube = function() {\r\n $scope.thumbnailSrc = $scope.thumbnailImageSrc || YouTubeHelper.getThumbnailURL($scope.youtubeVideoId)\r\n $scope.videoSrc = YouTubeHelper.getVideoEmbedURL($scope.youtubeVideoId);\r\n };\r\n\r\n $scope.openPlayerModal = function() {\r\n $uibModal.open({\r\n templateUrl: '/static/com/js/templates/enstocom-modal-videoplayer.html?_=2019994',\r\n controller: 'EnstoVideoModalController',\r\n size: 'lg',\r\n resolve: {\r\n Video: function() {\r\n return {youtubeVideoId: $scope.youtubeVideoId || $scope.videoid};\r\n }\r\n }\r\n });\r\n };\r\n\r\n if(!_.isEmpty($scope.youtubeVideoId)) {\r\n initYouTube();\r\n }\r\n });\r\n})(angular);\n// The `enstocom.carousel` module provies all carousels inside the Ensto page.\r\n(function(angular) {\r\n\t'use strict';\r\n\r\n\tangular.module('enstocom.carousel', ['ui.bootstrap', 'ropooy-angular-rdash', 'enstocom.responsiveImage'])\r\n\t// directive for simple image carousel\r\n\t.directive('enstoCarousel', function(TemplateUriHandler,_) {\r\n\t\treturn {\r\n\t\t\trestrict: 'E',\r\n\t\t\trequire: ['enstoCarousel', '?enstoServerJson'],\r\n\t\t\tcontroller: 'EnstoCarouselController',\r\n\t\t\ttemplateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-carousel.html'),\r\n\t\t\tscope: {\r\n\t\t\t\tslides: '=?'\r\n\t\t\t},\r\n\t\t\tlink: {\r\n\t\t\t\tpre: function(scope, element, attributes, ctrls) {\r\n\t\t\t\t\tscope.convertSlides = scope.$eval(attributes.convertSlides);\r\n\r\n\t\t\t\t\tscope.carouselPreset = _.isString(attributes.carouselPreset) ? attributes.carouselPreset : scope.carouselPreset;\r\n\r\n\t\t\t\t\tif(!_.isNull(ctrls[1])) {\r\n\t\t\t\t\t\tscope.slides = ctrls[1].getValue([]);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tpost: function(scope, element, attributes, ctrls) {\r\n\t\t\t\t\tctrls[0].init();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t})\r\n\t// directive for reference carousel. Usually used in frontpage\r\n\t.directive('enstoReferenceCarousel', function(TemplateUriHandler, _) {\r\n\t\treturn {\r\n\t\t\trestrict: 'E',\r\n\t\t\trequire: '?enstoServerJson',\r\n\t\t\tcontroller: 'EnstoCarouselController',\r\n\t\t\ttemplateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-carousel-reference.html'),\r\n\t\t\tscope: {\r\n\t\t\t\tslides: '=?'\r\n\t\t\t},\r\n\t\t\tlink: {\r\n\t\t\t\tpre: function(scope, element, attributes, ctrl) {\r\n\t\t\t\t\tif(!_.isNull(ctrl)) {\r\n\t\t\t\t\t\tscope.slides = ctrl.getValue([]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t})\r\n\t// directive for thumbnail carousel used inside DefaultItem.cshtml for product images.\r\n\t.directive('enstoThumbnailCarousel', function(TemplateUriHandler) {\r\n\t\treturn {\r\n\t\t\trestrict: 'E',\r\n\t\t\tcontroller: 'EnstoThumbnailCarouselController',\r\n\t\t\ttemplateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-carousel-thumbnail.html'),\r\n\t\t\tscope: {\r\n thumbnails: '=',\r\n videoIds: '=',\r\n\t\t\t\tsetActiveImage: '&?'\r\n\t\t\t},\r\n\t\t\tlink: function(scope, element, attributes, ctrl) {\r\n\t\t\t\tctrl.init();\r\n\t\t\t}\r\n\t\t};\r\n\t})\r\n\t// controller for carousels\r\n\t.controller('EnstoCarouselController', function($scope, _) {\r\n\t\tvar ctrl = this;\r\n\r\n\t\tctrl.init = function() {\r\n\t\t\tif($scope.convertSlides) {\r\n\t\t\t\t_.forEach($scope.slides, function(slide) {\r\n\t\t\t\t\tslide.media = {\r\n\t\t\t\t\t\turl: slide.url,\r\n\t\t\t\t\t\theader: slide.title,\r\n\t\t\t\t\t\talt: slide.imgalt,\r\n\t\t\t\t\t\ttitle: slide.imgtitle\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t$scope.slideInterval = 10000;\r\n\t\t$scope.activeSlide = 0;\r\n\t\t$scope.carouselPreset = 'carousel';\r\n\t})\r\n\t// controller for thumbnail carousel, 3 thumbnails are shown in one slide.\r\n\t.controller('EnstoThumbnailCarouselController', function($scope, _) {\r\n\t\tvar ctrl = this;\r\n $scope.slideInterval = 0; // no slide change\r\n $scope.activeSlide = 0;\r\n $scope.slides = [];\r\n $scope.videoIds = $scope.videoIds || [];\r\n _.forEach($scope.videoIds, function (videoId) {\r\n $scope.thumbnails.push({\r\n videoId: videoId\r\n });\r\n });\r\n ctrl.init = function() {\r\n var chunks = _.chunk($scope.thumbnails, 3);\r\n\t _.forEach(chunks, function(chunk, k) {\r\n\t $scope.slides.push({\r\n\t images: chunk,\r\n\t active: k === 0\r\n\t });\r\n\t });\r\n };\r\n\r\n $scope.setActive = function(src) {\r\n if(_.isFunction($scope.setActiveImage)) {\r\n $scope.setActiveImage()(src);\r\n }\r\n };\r\n });\r\n})(angular);\n// The `enstocom.search` module contains stuff around search.\r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.search', ['ngResource', 'ngAnimate', 'ui.bootstrap', 'enstocom.utils', 'ropooy-angular-rdash'])\r\n .component('searchEnclosures', {\r\n controller: ['$rootScope', 'UrlService', 'ServerSettings', '$window', '_', EnclosureSearchCtrl],\r\n templateUrl: '/static/com/js/templates/search-enclosures.html?_=2019994'\r\n })\r\n // service used to communicate with WebAPI\r\n .factory('EnstoSearchService', function ($resource, $rootScope, ServerSettings, UrlService) {\r\n\r\n \r\n var businessUnit = null;\r\n if (ServerSettings.businessUnit) {\r\n businessUnit = ServerSettings.businessUnit;\r\n } else {\r\n var queryParams = UrlService.getQueryParams();\r\n if (queryParams.businessUnit) {\r\n businessUnit = queryParams.businessUnit;\r\n }\r\n }\r\n \r\n\r\n var EnstoSearchService = $resource('/api/search/:verb', {\r\n verb: '',\r\n language: ServerSettings.preferredCultureName\r\n }, {\r\n suggestions: {\r\n method: 'GET',\r\n params: {\r\n verb: 'suggestions',\r\n count: 20,\r\n query: null,\r\n businessUnit: businessUnit\r\n },\r\n isArray: true\r\n },\r\n search: {\r\n method: 'GET',\r\n params: {\r\n verb: 'results',\r\n query: null,\r\n businessUnit: businessUnit,\r\n itemType: null,\r\n page: 1,\r\n pageSize: 10\r\n }\r\n },\r\n searchInRange: {\r\n method: 'GET',\r\n params: {\r\n verb: 'contentinrange',\r\n query: null,\r\n itemType: null,\r\n page: 1,\r\n pageSize: 10\r\n }\r\n }\r\n });\r\n\r\n EnstoSearchService.currentFilter = null;\r\n EnstoSearchService.enableOrEnclosureSearch = function (enable) {\r\n $rootScope.$broadcast('showEnclosures', { enabled: enable });\r\n };\r\n\r\n return EnstoSearchService;\r\n })\r\n\r\n .controller('EnstoSearchBlockController', function ($scope, EnstoSearchService, UrlService, ServerSettings, $window) {\r\n var ctrl = this;\r\n\r\n var defaults = {\r\n width: undefined,\r\n height: undefined,\r\n depth: undefined,\r\n mm: true,\r\n inch: false\r\n };\r\n\r\n $scope.query = ctrl.showQuery ? UrlService.getQueryParams().query : defaults;\r\n\r\n $scope.search = function (query) {\r\n $window.location.href = ServerSettings.searchPageURL + UrlService.toQueryString(\r\n {\r\n query:\r\n \"width=\" + query.width +\r\n \"&height=\" + query.height +\r\n \"&depth=\" + query.depth +\r\n \"&unit=\" + query.unit\r\n // \"&mm=\" + query.mm +\r\n // \"&inch=\" + query.inch\r\n });\r\n };\r\n })\r\n\r\n // directive used to add search field with typeahead support\r\n .directive('enstoSearchForm', function () {\r\n return {\r\n restrict: 'E',\r\n controller: 'EnstoSearchFormController',\r\n templateUrl: '/static/com/js/templates/enstocom-search-form.html?_=2019994',\r\n scope: true,\r\n link: function (scope, element, attributes, ctrl) {\r\n ctrl.showQuery = scope.$eval(attributes.showQuery);\r\n\r\n ctrl.init();\r\n }\r\n };\r\n })\r\n .component('enstoSearchModal', {\r\n templateUrl: '/static/com/js/templates/search-button.html',\r\n bindings: {\r\n color: '@',\r\n text: '@'\r\n },\r\n controller: function ($uibModal) {\r\n var $ctrl = this;\r\n $ctrl.dataForModal = {\r\n name: 'NameToEdit',\r\n value: 'ValueToEdit'\r\n }\r\n $ctrl.$onInit = function(){\r\n $ctrl.cssColorClass = $ctrl.color ? 'text-' + $ctrl.color : 'text-white';\r\n }\r\n $ctrl.open = function () {\r\n $uibModal.open({\r\n component: \"enstoSearchWide\",\r\n size: 'fullscreen' // custom size, see _enstocom-modal.scss\r\n });\r\n };\r\n }\r\n })\r\n .component('enstoSearchWide', {\r\n templateUrl: '/static/com/js/templates/search-input-large.html?_=2019994',\r\n bindings: {\r\n resolve: '<',\r\n close: '&',\r\n dismiss: '&'\r\n },\r\n controller: function ($window, UrlService, EnstoSearchService, ServerSettings) {\r\n var $ctrl = this;\r\n\r\n var businessUnit = null;\r\n if (ServerSettings.businessUnit) {\r\n businessUnit = ServerSettings.businessUnit;\r\n } else {\r\n var queryParams = UrlService.getQueryParams();\r\n if (queryParams.businessUnit) {\r\n businessUnit = queryParams.businessUnit;\r\n }\r\n }\r\n \r\n $ctrl.ok = function () {\r\n $ctrl.close();\r\n };\r\n $ctrl.cancel = function () {\r\n $ctrl.dismiss();\r\n };\r\n $ctrl.search = function (q, $event) {\r\n if(q !== undefined) {\r\n $window.location.href = ServerSettings.searchPageURL + UrlService.toQueryString({ query: q, businessUnit: businessUnit });\r\n }\r\n };\r\n $ctrl.getSuggestions = function ($viewValue) {\r\n if ($viewValue.indexOf(' ') === -1) {\r\n return EnstoSearchService.suggestions({\r\n query: $viewValue,\r\n businessUnit: businessUnit\r\n }).$promise.then(function (results) {\r\n return results;\r\n }, angular.noop);\r\n }\r\n };\r\n /*jshint unused: false*/\r\n $ctrl.onTypeaheadSelect = function ($item, $model) {\r\n $ctrl.search($item);\r\n };\r\n }\r\n })\r\n // controller for 'enstoSearchForm' directive\r\n .controller('EnstoSearchFormController', function ($scope, EnstoSearchService, UrlService, ServerSettings, $window) {\r\n var ctrl = this;\r\n ctrl.showQuery = false;\r\n $scope.typeaheadWaitMs = 50;\r\n $scope.typeaheadMinLength = 2;\r\n $scope.q = '';\r\n\r\n\r\n var businessUnit = null;\r\n if (ServerSettings.businessUnit) {\r\n businessUnit = ServerSettings.businessUnit;\r\n } else {\r\n var queryParams = UrlService.getQueryParams();\r\n if (queryParams.businessUnit) {\r\n businessUnit = queryParams.businessUnit;\r\n }\r\n }\r\n\r\n ctrl.init = function () {\r\n $scope.q = ctrl.showQuery ? UrlService.getQueryParams().query : '';\r\n };\r\n /*jshint unused: false*/\r\n $scope.search = function (q, $event) {\r\n $window.location.href = ServerSettings.searchPageURL + UrlService.toQueryString({ query: q, businessUnit: businessUnit });\r\n };\r\n $scope.getSuggestions = function ($viewValue) {\r\n if ($viewValue.indexOf(' ') === -1) {\r\n return EnstoSearchService.suggestions({\r\n query: $viewValue,\r\n businessUnit: businessUnit\r\n }).$promise.then(function (results) {\r\n return results;\r\n }, angular.noop);\r\n }\r\n };\r\n /*jshint unused: false*/\r\n $scope.onTypeaheadSelect = function ($item, $model) {\r\n $scope.search($item);\r\n };\r\n })\r\n // controller used inside ComSearchPage.cshtml to wrap whole page inside it.\r\n .controller('EnstoSearchPageController', function ($window, $rootScope, $scope, $translate, EnstoSearchService, UrlService, ViewportWatcher, MaxDescriptionLength, _) {\r\n $scope.page = 1;\r\n\r\n $scope.hasMore = true;\r\n $scope.totalResults = 0;\r\n $scope.searchDuration = '';\r\n $scope.q = UrlService.getQueryParams().query;\r\n $scope.facets = [];\r\n $scope.searchResults = [];\r\n $scope.maxDescriptionLength = MaxDescriptionLength;\r\n $scope.allowTrunc = false;\r\n $scope.showENum = false;\r\n\r\n var resetSearch = function () {\r\n $scope.page = 1;\r\n $scope.searchResults = [];\r\n };\r\n\r\n if (ViewportWatcher.viewport === 'mobile') {\r\n $scope.allowTrunc = true;\r\n }\r\n\r\n $translate('/comproductpage/button/fulldescription').then(function (text) {\r\n $scope.showButtonLabel = text;\r\n }, angular.noop);\r\n\r\n $scope.$watch(function () { return EnstoSearchService.currentFilter; }, function (newVal, oldVal) {\r\n if (_.isEqual(newVal, oldVal)) {\r\n return;\r\n }\r\n\r\n resetSearch();\r\n $scope.showMore();\r\n }, true);\r\n\r\n $scope.showOrHideEnclosures = function () {\r\n EnstoSearchService.enableOrEnclosureSearch($scope.enclosures);\r\n };\r\n $scope.showMore = function () {\r\n if ($scope.loading) {\r\n return;\r\n }\r\n // If no query, set showMore and loading to false\r\n if (_.isUndefined($scope.q)) {\r\n $scope.enclosures = false;\r\n $scope.loading = false;\r\n $scope.hasMore = false;\r\n return;\r\n }\r\n $scope.loading = true;\r\n\r\n if ($scope.q.substring(0, 5) === \"width\") {\r\n EnstoSearchService.searchInRange({\r\n query: $scope.q,\r\n itemType: (_.isNull(EnstoSearchService.currentFilter) ? null : EnstoSearchService.currentFilter.Id),\r\n page: $scope.page\r\n }, function (results) {\r\n $scope.loading = false;\r\n $scope.enclosures = true;\r\n\r\n _.forEach(results.Hits, function (result) {\r\n $scope.searchResults.push(result);\r\n });\r\n\r\n $scope.facets = results.Facets;\r\n\r\n $scope.hasMore = results.HasMore;\r\n $scope.totalResults = results.TotalCount || 0;\r\n $scope.searchDuration = results.Took || '';\r\n $scope.page++;\r\n });\r\n\r\n }\r\n else {\r\n EnstoSearchService.search({\r\n query: $scope.q,\r\n itemType: (_.isNull(EnstoSearchService.currentFilter) ? null : EnstoSearchService.currentFilter.Id),\r\n page: $scope.page\r\n }, function (results) {\r\n $scope.loading = false;\r\n\r\n _.forEach(results.Hits, function (result) {\r\n $scope.searchResults.push(result);\r\n });\r\n\r\n $scope.facets = results.Facets;\r\n\r\n $scope.hasMore = results.HasMore;\r\n $scope.totalResults = results.TotalCount || 0;\r\n $scope.searchDuration = results.Took || '';\r\n $scope.page++;\r\n });\r\n }\r\n\r\n };\r\n })\r\n // controller for 'enstoSearchFacetGroup' directive\r\n .controller('EnstoFacetGroupController', function ($scope, EnstoSearchService) {\r\n var unselectAll = function () {\r\n _.forEach($scope.facets, function (facet) {\r\n facet.Selected = false;\r\n });\r\n };\r\n\r\n $scope.selectFacet = function (facet) {\r\n if (facet.Selected) {\r\n return; // already selected\r\n }\r\n\r\n unselectAll();\r\n facet.Selected = true;\r\n\r\n EnstoSearchService.currentFilter = facet;\r\n };\r\n })\r\n // directive is used to render search facets\r\n .directive('enstoSearchFacetGroup', function () {\r\n return {\r\n restrict: 'E',\r\n transclude: true,\r\n controller: 'EnstoFacetGroupController',\r\n template: '
'\r\n };\r\n })\r\n // directive is used to render single search result\r\n .directive('enstoSearchResult', function (TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-search-result.html'),\r\n link: function (scope, elem, attrs) {\r\n if (scope.result.Type === 'reseller' || scope.result.Type === 'salesperson') {\r\n scope.contact = scope.result; // for the enstocom-contact.html template\r\n }\r\n if (attrs.$attr.showenum) {\r\n scope.showENum = true;\r\n }\r\n }\r\n };\r\n })\r\n // directive for default search results view (all other types except contact)\r\n .directive('enstoSearchResultDefault', function ($translate, TemplateUriHandler) {\r\n\r\n var translations = {\r\n productindexobj: $translate.instant('/comsearch/resulttype/product'),\r\n nodeindexobj: $translate.instant('/comsearch/resulttype/category'),\r\n pageindexobj: $translate.instant('/comsearch/resulttype/content')\r\n };\r\n\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-search-result-default.html'),\r\n transclude: true,\r\n link: function (scope) {\r\n scope.result.typeTitle = translations[scope.result.Type] || '';\r\n }\r\n };\r\n })\r\n // directive used to render single search facet\r\n .directive('enstoSearchFacet', function (TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-search-facet.html')\r\n };\r\n })\r\n .factory('enstoUrlParser', function () {\r\n return {\r\n parseQueryString: function (query) {\r\n var values = query.split(/[&||?]/);\r\n var queryParams = _.chain(values)\r\n .filter(function (val) { return val !== ''; })\r\n .map(function (keyval) {\r\n return keyval.split('=');\r\n })\r\n .map(function (keyval) {\r\n return {\r\n key: keyval[0],\r\n value: keyval.length === 2 ? keyval[1] : null\r\n };\r\n })\r\n .filter(function (resultObj) {\r\n return resultObj !== undefined;\r\n })\r\n .value();\r\n var result = {};\r\n queryParams.forEach(function (element) {\r\n result[element.key] = element.value;\r\n });\r\n return result;\r\n }\r\n };\r\n });\r\n\r\n function EnclosureSearchCtrl($rootScope, UrlService, ServerSettings, $window, _) {\r\n var $ctrl = this;\r\n\r\n $ctrl.$onInit = function () {\r\n var query = UrlService.getQueryParams().query || {};\r\n var queryParams = UrlService.getQueryParams('?' + query) || {};\r\n var defaults = {\r\n width: undefined,\r\n height: undefined,\r\n depth: undefined,\r\n range: undefined\r\n };\r\n $ctrl.query = {};\r\n $ctrl.query.width = queryParams.width || defaults.width;\r\n $ctrl.query.height = queryParams.height || defaults.height;\r\n $ctrl.query.depth = queryParams.depth || defaults.depth;\r\n $ctrl.query.range = queryParams.range || defaults.range;\r\n $ctrl.query.unit = queryParams.unit || 'mm';\r\n $ctrl.enabled = _.find([$ctrl.query.width, $ctrl.query.width, $ctrl.query.width, $ctrl.query.width], function (value) {\r\n return value !== undefined;\r\n }) !== undefined;\r\n };\r\n $rootScope.$on('showEnclosures', function (evt, val) {\r\n $ctrl.enabled = val.enabled;\r\n });\r\n $ctrl.search = function () {\r\n $window.location.href = ServerSettings.searchPageURL + UrlService.toQueryString(\r\n {\r\n query:\r\n \"width=\" + $ctrl.query.width +\r\n \"&height=\" + $ctrl.query.height +\r\n \"&depth=\" + $ctrl.query.depth +\r\n \"&range=\" + $ctrl.query.range +\r\n \"&unit=\" + $ctrl.query.unit\r\n });\r\n };\r\n }\r\n\r\n})(angular); \n// The `enstocom.categoryFilter` module is used inside DefaultNode.cshtml for category and product filtering.\r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.categoryFilter', ['ngResource', 'ropooy-angular-rdash', 'enstocom.product', 'enstocom.teasers', 'enstocom.utils'])\r\n // custom param serializer, simply strip off stuff from jqLike param serializer\r\n .factory('EnstoHttpParamSerializer', function ($httpParamSerializerJQLike) {\r\n var regex = /%5B%5D/g; // encodeURIComponent('[]')\r\n\r\n return function (params) {\r\n var tmp = $httpParamSerializerJQLike(params);\r\n return tmp.replace(regex, '');\r\n };\r\n })\r\n // service to fetch products and filters from WebAPi for specific category.\r\n .factory('EnstoCategoryProducts',\r\n function ($resource, $http, $window, $rootScope, ServerSettings, EnstoCookie, EnstoProductWrapper, ViewportWatcher, $log, _) {\r\n var productWrapper = new EnstoProductWrapper();\r\n var inheritFiltersCookieName = 'inherited-filters';\r\n // If mobile, param value of mobile => 1\r\n var isMobile = ViewportWatcher.viewport === 'mobile';\r\n var transformer = [\r\n function (data) {\r\n try {\r\n var tmpData = angular.fromJson(data);\r\n\r\n _.forEach(tmpData.products, function (product) {\r\n _.merge(product, productWrapper);\r\n });\r\n EnstoCategoryProductsService.categories = tmpData.categories;\r\n\r\n return tmpData;\r\n } catch (e) {\r\n $log.error('EnstoCategoryProducts:: failed to transform response');\r\n }\r\n }\r\n ].concat($http.defaults.transformResponse);\r\n\r\n var EnstoCategoryProductsService = $resource('/api/node/products/:contentId', {\r\n language: ServerSettings.preferredCultureName,\r\n page: 0,\r\n pageSize: 27 // can be divided by 3\r\n }, {\r\n getProducts: {\r\n method: 'GET',\r\n paramSerializer: 'EnstoHttpParamSerializer',\r\n params: {\r\n contentId: null,\r\n sortOrder: null,\r\n filters: null,\r\n mobile: isMobile\r\n },\r\n transformResponse: transformer\r\n }\r\n });\r\n\r\n EnstoCategoryProductsService.categories = [];\r\n\r\n\r\n // save and load filters for inheritance\r\n EnstoCategoryProductsService.saveFilters = function (filter) {\r\n var savedFilters = {};\r\n savedFilters.filters = _.clone(filter);\r\n savedFilters.url = $window.location.pathname; // path is used to check if we are under right place.\r\n\r\n EnstoCookie.set(inheritFiltersCookieName, savedFilters);\r\n };\r\n\r\n EnstoCategoryProductsService.loadFilters = function () {\r\n var loadedFilters = EnstoCookie.get(inheritFiltersCookieName);\r\n\r\n // now check that are these filters 'inherited'\r\n\r\n // \"top level\": \"/fi/tuotteet/valaistus/\"\r\n // \"middle level\": \"/fi/tuotteet/valaistus/asuntovalaisimet/\"\r\n // \"bottom level\": \"/fi/tuotteet/valaistus/asuntovalaisimet/ami/\"\r\n\r\n if (loadedFilters) {\r\n var isInheritFromTopToBottom = new RegExp('^' + loadedFilters.url.replace(/\\//g, '\\\\/'));\r\n var isInheritFromBottomToTop = new RegExp('^' + $window.location.pathname.replace(/\\//g, '\\\\/'));\r\n\r\n if (isInheritFromTopToBottom.test($window.location.pathname) || isInheritFromBottomToTop.test(loadedFilters.url)) {\r\n return loadedFilters.filters;\r\n }\r\n else {\r\n // Clear saved filter because it is not needed anymore, user has started to navigate some other page.\r\n EnstoCookie.remove(inheritFiltersCookieName);\r\n return {};\r\n }\r\n }\r\n else {\r\n return {};\r\n }\r\n };\r\n\r\n return EnstoCategoryProductsService;\r\n })\r\n // custom filter to format numeric values inside dropdowns. These formatings are done locale specific using Angular-locale. \r\n .filter('enstoFilterValue', function ($filter) {\r\n function enstoFilterValueFilter(value, isNumeric) {\r\n if (isNumeric) {\r\n return $filter('number')(value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n enstoFilterValueFilter.$stateful = true; // stateful due the dynamically loaded $locale\r\n\r\n return enstoFilterValueFilter;\r\n })\r\n // directive to provide toolbar containing sorting and view options\r\n .directive('enstoCategoryPageToolbar', function ($rootScope, TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-category-page-toolbar.html'),\r\n link: function (scope, element, attributes) {\r\n scope.hidePriceFilter = $rootScope.webshopProductsOnly;\r\n }\r\n };\r\n })\r\n // directive to add filters for some place inside category page\r\n .directive('enstoCategoryFilters', function (TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-category-filters.html')\r\n };\r\n })\r\n // directive to display category product count\r\n .directive('enstoCategoryProductCount', function (EnstoCategoryProducts, _) {\r\n return {\r\n restrict: 'A',\r\n scope: true,\r\n link: function (scope, element, attributes) {\r\n var categoryID = scope.$eval(attributes.enstoCategoryProductCount);\r\n\r\n scope.$on('Category::updateCount', function () {\r\n scope.count = _.result(_.find(EnstoCategoryProducts.categories, { id: categoryID }), 'count', 0);\r\n });\r\n }\r\n };\r\n })\r\n // directive for filter dropdowns, dropdown DOM is rendered when it is opened\r\n .directive('enstoFilterDropdown', function (TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n controller: 'EnstoFilterController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-category-filter-dropdown.html'),\r\n scope: {\r\n filter: '='\r\n }\r\n };\r\n })\r\n .directive('productListingTable', function (TemplateUriHandler) {\r\n return {\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/product-listing-table.html'),\r\n controller: 'EnstoCategoryPageController'\r\n };\r\n })\r\n // controller for 'enstoFilterDropdown' directive\r\n .controller('EnstoFilterController', function ($scope, EnstoGA, BrowserDetect, _) {\r\n var ctrl = this;\r\n\r\n ctrl.prepareFilterValues = function () {\r\n _.forEach($scope.filter.values, function (value) {\r\n value.getFilterName = function () {\r\n return $scope.filter.displayname;\r\n };\r\n\r\n value.select = function () {\r\n EnstoGA.trackFilterAction('select-filter', this.getFilterName(), this.value);\r\n this.selected = true;\r\n };\r\n\r\n value.showSelectGlyphicon = function () {\r\n return this.selected === true && BrowserDetect.name !== 'Firefox'; //In firefox the selected icon appears on next row. Not what we want\r\n };\r\n\r\n value.unselect = function () {\r\n EnstoGA.trackFilterAction('remove-filter', this.getFilterName(), this.value);\r\n this.selected = false;\r\n };\r\n });\r\n };\r\n\r\n $scope.isOpen = false;\r\n\r\n $scope.selectValue = function (value) {\r\n\r\n if (value.select === undefined) { //Make sure that the functions are bound\r\n ctrl.prepareFilterValues();\r\n }\r\n value.select();\r\n\r\n // close dropdown\r\n $scope.isOpen = false;\r\n };\r\n\r\n // because of the inheritance possibility we need to wrap values now\r\n ctrl.prepareFilterValues();\r\n })\r\n\r\n // directive for filter inputs, dropdown DOM is rendered when it is opened\r\n .directive('enstoFilterInput', function (TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n controller: 'EnstoInputFilterController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-category-filter-input.html'),\r\n scope: {\r\n filter: '='\r\n }\r\n };\r\n })\r\n // controller for 'enstoFilterInput' directive\r\n .controller('EnstoInputFilterController', function ($translate, $scope, EnstoGA, BrowserDetect, _) {\r\n var ctrl = this;\r\n //enterValuePlaceholder = getTranslatedValue;\r\n $translate('/comcommon/enterValue').then(function (text) { $scope.enterValuePlaceholder = text; }, angular.noop);\r\n ctrl.prepareFilterValues = function () {\r\n\r\n _.forEach($scope.filter.values, function (value) {\r\n value.getFilterName = function () {\r\n return $scope.filter.displayname;\r\n };\r\n\r\n value.select = function () {\r\n this.selected = true;\r\n };\r\n\r\n value.showSelectGlyphicon = function () {\r\n return this.selected === true && BrowserDetect.name !== 'Firefox'; //In firefox the selected icon appears on next row. Not what we want\r\n };\r\n\r\n value.unselect = function () {\r\n this.selected = false;\r\n EnstoGA.trackEvent(\"category-filter\", \"remove-range-filter\", this.getFilterName());\r\n };\r\n });\r\n };\r\n\r\n $scope.isOpen = false;\r\n\r\n $scope.selectValue = function (value) {\r\n var val = value;\r\n\r\n EnstoGA.trackEvent(\"category-filter\", \"select-range-filter\", $scope.filter.displayname);\r\n //TODO improve this solution\r\n value = $scope.filter.values.pop();\r\n\r\n if (value.select === undefined) { //Make sure that the functions are bound\r\n ctrl.prepareFilterValues();\r\n }\r\n\r\n // close dropdown add values\r\n $scope.isOpen = false;\r\n $scope.filter.values[0].selected = true;\r\n $scope.filter.values[0].value = val;\r\n };\r\n\r\n // because of the inheritance possibility we need to wrap values now\r\n ctrl.prepareFilterValues();\r\n })\r\n\r\n // directive for category page, wraps most of the category page stuff inside it\r\n .directive('enstoCategoryPage', function ($rootScope, ViewportWatcher, EnstoUserSettings) {\r\n return {\r\n restrict: 'A',\r\n controller: 'EnstoCategoryPageController',\r\n link: {\r\n pre: function (scope, element, attributes, ctrl) {\r\n // Set default viewmode to be list\r\n scope.defaultViewMode = scope.viewModes.LIST;\r\n ctrl.contentId = scope.$eval(attributes.enstoCategoryPage);\r\n var webshopProductsOnly = attributes.webshopProductsOnly.toLowerCase() === 'true';\r\n ctrl.webshopProductsOnly = webshopProductsOnly;\r\n $rootScope.webshopProductsOnly = webshopProductsOnly;\r\n ctrl.activeFilters = null;\r\n scope.currentSortMode = _.result(EnstoUserSettings, 'product.sortMode', scope.sortModes.PROCUS);\r\n scope.currentViewMode = _.result(EnstoUserSettings, 'product.viewMode', scope.defaultViewMode);\r\n\r\n scope.hasSelectedFilters = _.isNull(ctrl.activeFilters) ? false : true;\r\n\r\n ctrl.init();\r\n }\r\n }\r\n };\r\n })\r\n // controller for 'enstoCategoryPage' directive\r\n // TODO: this requires some re-factoring, too much logic inside this + different kinds of logics\r\n .controller('EnstoCategoryPageController', [\r\n '$scope', '$rootScope', '$location', 'EnstoCategoryProducts', 'ViewportWatcher', 'EnstoUserSettings', '_',\r\n function ($scope, $rootScope, $location, EnstoCategoryProducts, ViewportWatcher, EnstoUserSettings, _) {\r\n var ctrl = this;\r\n\r\n ctrl.page = 1; // in this WebAPI interface page 1 is actually first page, not page 0\r\n ctrl.contentId = null;\r\n ctrl.activeFilters = null;\r\n ctrl.scrollPos = null;\r\n ctrl.pageSize = 27;\r\n ctrl.preserve = false;\r\n ctrl.preservePage = null;\r\n\r\n $scope.viewModes = {\r\n LIST: 1,\r\n THINLIST: 2,\r\n };\r\n\r\n $scope.sortModes = {\r\n PROCUS: 0,\r\n ALPHABETICAL: 1\r\n };\r\n\r\n $scope.loadingProducts = false;\r\n $scope.hasMore = true;\r\n\r\n $scope.filters = [];\r\n $scope.products = [];\r\n $scope.tableHeaders = [];\r\n $scope.totalProducts = null;\r\n $scope.displayColumns = {};\r\n $scope.isMobile = ViewportWatcher.viewport === 'mobile' ? 1 : 0;\r\n\r\n ctrl.getActiveFilters = function () {\r\n var selectedFilters = {};\r\n\r\n _.forEach($scope.filters, function (filter) {\r\n var selectedValues = _.filter(filter.values, { selected: true });\r\n\r\n _.forEach(selectedValues, function (selectedValue, key) {\r\n if (key === 0 && !_.isArray(selectedFilters[filter.id])) {\r\n selectedFilters[filter.id] = [];\r\n }\r\n\r\n selectedFilters[filter.id].push(selectedValue.value);\r\n });\r\n });\r\n\r\n return selectedFilters;\r\n };\r\n\r\n ///Recheck whether this filter is numeric or not\r\n ctrl.setFilterType = function (newFilters) {\r\n _.forEach(newFilters, function (newFilter) {\r\n var existingFilter = _.find($scope.filters, function (_filter) {\r\n return _filter.id === newFilter.id;\r\n });\r\n existingFilter.isnumeric = newFilter.isnumeric;\r\n });\r\n };\r\n\r\n ctrl.sortFilterValues = function (filter) {\r\n if (filter.isnumeric) {\r\n filter.values = _.sortBy(filter.values, function (o) {\r\n return +o.value;\r\n });\r\n }\r\n else {\r\n filter.values = _.sortBy(filter.values, 'value');\r\n }\r\n };\r\n\r\n ctrl.initializeFilterValues = function (newFilters) {\r\n _.forEach($scope.filters, function (filter) { //Go through the existing filters on the client and set visibilities\r\n var newFilter = _.find(newFilters, function (_filter) {\r\n return _filter.id === filter.id;\r\n });\r\n\r\n _.forEach(filter.values, function (value) {\r\n var newValue = _.find(newFilter.values, function (newVal) {\r\n return newVal.value === value.value;\r\n });\r\n\r\n value.isHidden = newValue ? false : true;\r\n });\r\n });\r\n\r\n _.forEach(newFilters, function (newFilter) { //Go through the filters from the server and see if we need add something\r\n var existingFilter = _.find($scope.filters, function (_filter) {\r\n return _filter.id === newFilter.id;\r\n });\r\n\r\n _.forEach(newFilter.values,\r\n function (newFilterValue) {\r\n var existingValue = _.find(existingFilter.values,\r\n function (existingValue) {\r\n return existingValue.value === newFilterValue.value;\r\n });\r\n\r\n if (!existingValue) {\r\n existingFilter.values.push(newFilterValue);\r\n }\r\n });\r\n });\r\n\r\n _.forEach($scope.filters, function (filter) {\r\n ctrl.sortFilterValues(filter);\r\n });\r\n };\r\n\r\n ctrl.resetProducts = function () {\r\n ctrl.page = 1;\r\n $scope.products = [];\r\n $scope.displayColumns = {};\r\n };\r\n\r\n ctrl.init = function () {\r\n var query = $location.search();\r\n $scope.showPricesOnly = query.pricesOnly === 'true' || false;\r\n ctrl.activeFilters = EnstoCategoryProducts.loadFilters();\r\n $scope.$watch(function () {\r\n return ctrl.getActiveFilters();\r\n }, function (newVal, oldVal) {\r\n if (newVal === oldVal) {\r\n return;\r\n }\r\n\r\n ctrl.activeFilters = newVal;\r\n EnstoCategoryProducts.saveFilters(newVal);\r\n $scope.hasSelectedFilters = !_.isEmpty(newVal);\r\n\r\n // Don't run showmore again on first load when scroll position is preserved, release clause after if statement by setting it to false\r\n if (!$scope.preserveMe) {\r\n ctrl.resetProducts();\r\n $scope.showMore();\r\n }\r\n $scope.preserveMe = false;\r\n }, true);\r\n\r\n $scope.$watch('currentSortMode', function (newVal, oldVal) {\r\n if (newVal === oldVal) {\r\n return;\r\n }\r\n _.set(EnstoUserSettings, 'product.sortMode', newVal);\r\n\r\n ctrl.resetProducts();\r\n $scope.showMore();\r\n });\r\n\r\n\r\n $scope.$watch('currentViewMode', function (newVal, oldVal) {\r\n if (newVal === oldVal) {\r\n return;\r\n }\r\n\r\n _.set(EnstoUserSettings, 'product.viewMode', newVal);\r\n });\r\n // Preserve page and scroll position if possible and no filters\r\n $scope.preservePageState();\r\n $scope.showMore();\r\n };\r\n\r\n\r\n $scope.preservePageState = function () {\r\n // Get session storage item that has preserved state parameters\r\n var retrievedData = sessionStorage.getItem(\"pageStateParams\");\r\n // If not found, do not continue\r\n if (retrievedData === null) {\r\n return false;\r\n }\r\n ctrl.preserve = true;\r\n $scope.preserveMe = true;\r\n // Turn params into variables\r\n var pageStateParams = JSON.parse(retrievedData);\r\n ctrl.preservePage = pageStateParams[0];\r\n ctrl.scrollPos = pageStateParams[1];\r\n var contentId = pageStateParams[2];\r\n // if state page is larger than default page number (1) and content id is the same (we are on the right page), set new value to ctrl.page variable which is used in the ajax call\r\n if (ctrl.preservePage > ctrl.page && ctrl.contentId === contentId) {\r\n ctrl.pageSize = (ctrl.preservePage - 1) * ctrl.pageSize;\r\n } else {\r\n // user has not come back from product page or the page number is the same, delete the sessionsstorage value \r\n sessionStorage.removeItem(\"pageStateParams\");\r\n }\r\n };\r\n\r\n $scope.setPreserveStateValues = function ($event) {\r\n // Get scrolling position\r\n var scrollPos = window.pageYOffset;\r\n // Set items to sessionstorage \r\n var pageStateParams = [ctrl.page, scrollPos, ctrl.contentId];\r\n sessionStorage.setItem(\"pageStateParams\", JSON.stringify(pageStateParams));\r\n if ($event !== undefined) {\r\n if ($event.type === \"touchend\") {\r\n $event.preventDefault();\r\n window.location.href = $event.currentTarget.href;\r\n }\r\n }\r\n };\r\n\r\n\r\n $scope.showMore = function () {\r\n $scope.loadingProducts = true;\r\n var getPriceFilterMode = function () {\r\n if (ctrl.webshopProductsOnly) { return true; }\r\n\r\n return $scope.showPricesOnly;\r\n };\r\n EnstoCategoryProducts.getProducts({\r\n contentId: ctrl.contentId,\r\n sortOrder: $scope.currentSortMode,\r\n filters: ctrl.activeFilters,\r\n page: ctrl.page,\r\n pageSize: ctrl.pageSize,\r\n priceRowsOnly: getPriceFilterMode() //$scope.showPricesOnly\r\n }).$promise\r\n .then(function (results) {\r\n if (_.isEmpty($scope.filters)) {\r\n // in this state we have all possible filter values available.\r\n $scope.filters = results.filters;\r\n }\r\n else {\r\n ctrl.initializeFilterValues(results.filters);\r\n ctrl.setFilterType(results.filters);\r\n }\r\n $scope.showPrice = results.showPrice;\r\n $scope.ShowWebshop = results.ShowWebshop;\r\n $scope.tableHeaders = results.columnHeaders;\r\n $scope.displayColumns = results.displayColumns;\r\n\r\n _.forEach(results.products, function (product) {\r\n $scope.products.push(product);\r\n });\r\n\r\n $scope.totalProducts = results.total;\r\n $scope.hasMore = results.hasmore;\r\n ctrl.page++;\r\n\r\n $rootScope.$broadcast('Category::updateCount');\r\n }, function () {\r\n $scope.totalProducts = 0;\r\n }, angular.noop)\r\n .finally(function () {\r\n $scope.loadingProducts = false;\r\n // After preserved first load, restore the default pagesize and change the page number and scroll to position\r\n // Set preserve to false and remove sessionstorage value so all of this stuff is not run again\r\n if (ctrl.preserve) {\r\n if (ctrl.scrollPos !== null) {\r\n setTimeout(function () {\r\n window.scrollTo(0, ctrl.scrollPos);\r\n }, 200);\r\n }\r\n ctrl.pageSize = 27;\r\n ctrl.page = ctrl.preservePage;\r\n sessionStorage.removeItem(\"pageStateParams\");\r\n ctrl.preserve = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.clearAllFilters = function () {\r\n _.forEach($scope.filters, function (filter) {\r\n _.forEach(filter.values, function (value) {\r\n if (value.selected) {\r\n value.unselect();\r\n }\r\n });\r\n });\r\n };\r\n\r\n $scope.showList = function () {\r\n $scope.currentViewMode = $scope.viewModes.LIST;\r\n };\r\n\r\n $scope.showThinList = function () {\r\n $scope.currentViewMode = $scope.viewModes.THINLIST;\r\n };\r\n\r\n $scope.sortAlphabetically = function () {\r\n $scope.currentSortMode = $scope.sortModes.ALPHABETICAL;\r\n };\r\n\r\n $scope.sortProcus = function () {\r\n $scope.currentSortMode = $scope.sortModes.PROCUS;\r\n };\r\n\r\n $scope.getPricedProducts = function () {\r\n $scope.showPricesOnly = !$scope.showPricesOnly;\r\n $location.search('pricesOnly', $scope.showPricesOnly.toString());\r\n ctrl.resetProducts();\r\n $scope.showMore();\r\n };\r\n }\r\n ]\r\n );\r\n})(angular);\n// The `enstocom.cards` module provides functionality used inside `ComCardBasePage.cshtml` using Masonry library.\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.cards', ['ngResource', 'ui.bootstrap', 'masonry', 'enstocom.utils', 'enstocom.responsiveImage', 'enstocom.social', 'ropooy-angular-rdash'])\r\n // wrapper service to hide differencies between News, Article, etc. pages.\r\n .factory('EnstoCardWrapper', function($translate, _){\r\n var readMore;\r\n $translate('/comcommon/readmore').then(function(text) {\r\n readMore = text;\r\n }, angular.noop);\r\n\r\n return function() {\r\n return {\r\n isExpanded: false,\r\n getImagePreset: function() {\r\n return this.isExpanded ? 'articleCardExpanded' : 'articleCard';\r\n },\r\n getImageUrl: function() {\r\n if(this.isExpanded) {\r\n return _.result(_.first(this.images), 'url', null);\r\n }\r\n else {\r\n return this.teaserImage || _.result(_.first(this.images), 'url', null);\r\n }\r\n },\r\n getImageCaption: function() {\r\n return this.isExpanded ? _.result(_.first(this.images), 'title', '') : '';\r\n },\r\n getReadmoreLinkText: function() {\r\n return this.link.text || readMore;\r\n }\r\n };\r\n };\r\n })\r\n // Services is used to fetch cards for specific card collection page through WebAPI\r\n .factory('EnstoCardService', function($resource, ServerSettings) {\r\n var EnstoCardService = $resource('/api/collection/:verb', {\r\n verb: '',\r\n language: ServerSettings.preferredCultureName\r\n }, {\r\n getCards: {\r\n method: 'GET',\r\n params: {\r\n verb: 'cards',\r\n id: null,\r\n page: 0,\r\n pageSize: 25,\r\n card: null\r\n }\r\n }\r\n });\r\n\r\n return EnstoCardService;\r\n })\r\n // directive is used to insert card collection to some page. (Currently only for CardCollectionPage). Masonry is not initialized in mobile phones, because it does not give anything extra.\r\n .directive('enstoCardCollection', function(BrowserDetect, ViewportWatcher, $compile, $timeout, $log, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n controller: 'EnstoCardCollectionController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-card-collection.html'),\r\n scope: true,\r\n link: {\r\n pre: function (scope, element) {\r\n scope.hideColumnCard = false;\r\n // ok, lets go with this. Asuming mobile viewport is not growing.\r\n // TODO: This should be done in compile phase to ensure that everything goes well. Then we do not need to call $compile which makes this even safer.\r\n if(ViewportWatcher.viewport !== 'mobile') {\r\n // If safari lt 9, don't run Masonry at this point (quick bandage)\r\n if (BrowserDetect.name === 'Safari' && parseInt(BrowserDetect.version) < 9) {\r\n scope.hideColumnCard = true;\r\n return;\r\n }\r\n angular.element(element).find('div').eq(0).attr('masonry', '{{::masonryOptions}}');\r\n $compile(element.contents())(scope);\r\n }\r\n\r\n },\r\n post: function(scope, element, attributes, ctrl) {\r\n ctrl.collectionId = scope.$eval(attributes.collectionId);\r\n\r\n if(!_.isNumber(ctrl.collectionId) || scope.collectionId === 0) {\r\n $log.warn('Unable to initialize \"CardCollectionController\", because \"collectionId\" is invalid!', ctrl.collectionId);\r\n return;\r\n }\r\n\r\n if(ViewportWatcher.viewport === 'mobile') {\r\n scope.allowExpand = false;\r\n }\r\n\r\n // reload masonry layout\r\n scope.reloadMasonryLayout = function() {\r\n if(_.isFunction(scope.update)) {\r\n /*\r\n Note: This is kind a hax which should be handled correctly inside angular-masonry-directive.\r\n\r\n This solution still has potential timing issue, current 50ms timeout is for the ng-repeat so that it has\r\n time to render all cards in to DOM, so when we use imagesLoaded(), all elements are added (at least should have).\r\n\r\n If we use imagesLoaded directly and $timeout inside imagesLoaded callback, some of the image elements may have\r\n been added to DOM after imagesLoaded has added event listeners and issue is not resolved.\r\n */\r\n $timeout(function() {\r\n imagesLoaded(angular.element(element).find('div').eq(0), function() {\r\n scope.update();\r\n });\r\n }, 50);\r\n /******/\r\n }\r\n };\r\n // Open card if card parameter is found in the controller, this is a little bit of a hack ;)\r\n if (!_.isUndefined(ctrl.openCard)) {\r\n imagesLoaded(angular.element(element).find('div').eq(0), function () {\r\n $timeout(function () {\r\n angular.element(element).find('ensto-card').eq(0).find('div').eq(0).triggerHandler('click');\r\n }, 500);\r\n });\r\n }\r\n scope.showMore();\r\n }\r\n }\r\n };\r\n })\r\n // Controller for 'enstoCardCollection' directive\r\n .controller('EnstoCardCollectionController', function($scope, EnstoCardService) {\r\n var ctrl = this;\r\n ctrl.page = 0; // yes, paging starts from zero :)\r\n\r\n $scope.hasMore = true;\r\n $scope.allowExpand = true;\r\n $scope.cards = [];\r\n $scope.masonryOptions = {\r\n columnWidth: '.ensto-masonry-column',\r\n itemSelector: '.ensto-masonry-item',\r\n percentPosition: true,\r\n transitionDuration: '0.8s'\r\n };\r\n\r\n // Get url parameter\r\n $scope.getUrlParameter = function (param) {\r\n var sPageUrl = window.location.search.substring(1),\r\n sUrlVariables = sPageUrl.split(/[&||?]/),\r\n val;\r\n\r\n for (var i = 0; i < sUrlVariables.length; i += 1) {\r\n var paramName = sUrlVariables[i],\r\n sParameterName = (paramName || '').split('=');\r\n\r\n if (sParameterName[0] === param) {\r\n val = sParameterName[1];\r\n }\r\n }\r\n return val;\r\n };\r\n\r\n // if card parameter is found from querystring, assign it to openCard variable and pass it to getCards method later on\r\n ctrl.openCard = $scope.getUrlParameter('card');\r\n\r\n\r\n $scope.showMore = function() {\r\n if(ctrl.loading) {\r\n return;\r\n }\r\n\r\n ctrl.loading = true;\r\n\r\n EnstoCardService.getCards({\r\n id: ctrl.collectionId,\r\n page: ctrl.page,\r\n card: ctrl.openCard\r\n\r\n }, function(results) {\r\n ctrl.loading = false;\r\n _.forEach(results.Cards, function(card) {\r\n $scope.cards.push(card);\r\n });\r\n\r\n $scope.hasMore = results.HasMore;\r\n ctrl.page++;\r\n \r\n $scope.reloadMasonryLayout();\r\n });\r\n };\r\n\r\n // Open the the correct card if card querystring parameter exists\r\n\r\n\r\n })\r\n // directive for single card\r\n .directive('enstoCard', function(EnstoCardWrapper, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n require: ['^?enstoCardCollection', 'enstoCard'],\r\n controller: 'EnstoCardController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-card-article.html'),\r\n scope: {\r\n card: '=',\r\n reloadLayout: '&?'\r\n },\r\n link: function(scope, element, attributes, ctrls) {\r\n var ctrl = ctrls[1];\r\n\r\n scope.allowExpand = scope.$eval(attributes.allowExpand);\r\n\r\n var cardWrapper = new EnstoCardWrapper();\r\n _.merge(scope.card, cardWrapper);\r\n\r\n scope.reloadLayout = scope.reloadLayout || angular.noop;\r\n\r\n\r\n\r\n scope.$watch('card.isExpanded', function(newVal, oldVal) {\r\n if(newVal === oldVal) {\r\n return;\r\n }\r\n\r\n /*\r\n Why not to use 'ngClass' directive?\r\n Grid is outside of this card directive and I didn't want to\r\n add grid / container related dependencies in to this card component (template).\r\n */\r\n if(newVal) {\r\n element.addClass('ensto-card-expanded');\r\n element.parent().removeClass('col-md-4 col-sm-6').addClass('col-md-8 ensto-dont-catch-click');\r\n\r\n angular.element(element).on('click', function(event) {\r\n // prevent click events from propagating to enstoClickCatch directive.\r\n event.stopPropagation();\r\n });\r\n }\r\n else {\r\n element.parent().removeClass('col-md-8 ensto-dont-catch-click').addClass('col-sm-6 col-md-4');\r\n element.removeClass('ensto-card-expanded');\r\n angular.element(element).off('click');\r\n }\r\n\r\n scope.reloadLayout();\r\n });\r\n\r\n ctrl.init();\r\n }\r\n };\r\n })\r\n // Controller for single card\r\n .controller('EnstoCardController', function($scope, $rootScope, EnstoGA, $sce) {\r\n var ctrl = this;\r\n\r\n ctrl.init = function() {\r\n $scope.$on('EnstoEvent::card-expand', function(event, scopeId) {\r\n if(!_.isEqual($scope.$id, scopeId)) {\r\n $scope.cardCollapse();\r\n }\r\n });\r\n };\r\n\r\n $scope.getCardBodyText = function() {\r\n return $sce.trustAsHtml($scope.card.bodyText);\r\n };\r\n \r\n $scope.cardExpand = function() {\r\n // If card is clicked in mobile, goto link rather than expanding\r\n if(!$scope.allowExpand) {\r\n window.location = $scope.card.link.url;\r\n return;\r\n }\r\n // If card is open, return\r\n if($scope.card.isExpanded ) {\r\n return;\r\n }\r\n\r\n EnstoGA.trackPageView($scope.card.link.url);\r\n\r\n $scope.card.isExpanded = true;\r\n\r\n $rootScope.$broadcast('EnstoEvent::card-expand', $scope.$id);\r\n\r\n $scope.reloadLayout();\r\n };\r\n\r\n $scope.cardCollapse = function() {\r\n $scope.card.isExpanded = false;\r\n\r\n $scope.reloadLayout();\r\n };\r\n\r\n $scope.clickCatchEnabled = function() {\r\n return $scope.card.isExpanded && _.isFunction($scope.$parent.update);\r\n };\r\n });\r\n})(angular);\n// Newsroom cardsearch\r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.cardsearch', ['ngResource', 'ui.bootstrap', 'enstocom.utils', 'enstocom.responsiveImage', 'enstocom.social', 'ropooy-angular-rdash'])\r\n // Services is used to fetch cards for specific card collection page through WebAPI\r\n .factory('EnstoCardSearchService', function ($resource, ServerSettings) {\r\n var EnstoCardService = $resource('/api/collection/:verb', {\r\n verb: '',\r\n language: ServerSettings.preferredCultureName,\r\n bu: ServerSettings.businessUnit\r\n }, {\r\n getCards: {\r\n method: 'GET',\r\n params: {\r\n verb: 'search',\r\n 'id[]': null,\r\n page: 0,\r\n pageSize: 6,\r\n firstPageSize: 7,\r\n year: null,\r\n magazine: null\r\n }\r\n }\r\n });\r\n\r\n return EnstoCardService;\r\n })\r\n // Controller for 'enstoCardCollection' directive\r\n .controller('EnstoCardSearchController', function ($scope, $location, _, EnstoCardSearchService, ServerSettings, UrlService) {\r\n var ctrl = this;\r\n ctrl.page = 0;\r\n\r\n $scope.hasMore = true;\r\n $scope.allowExpand = true;\r\n $scope.facetCategories = [];\r\n $scope.eventCategories = [];\r\n $scope.yearFacets = [];\r\n $scope.buCategories = [];\r\n $scope.selectedCategories = [];\r\n $scope.eventTags = [];\r\n $scope.selectedYears = [];\r\n $scope.selectedBuCategories = [];\r\n $scope.filters = {};\r\n $scope.filters.magazineFilter = null;\r\n $scope.currentId = null;\r\n $scope.cards = [];\r\n $scope.isRel = false;\r\n \r\n $scope.isCategoryFilterCollapsed = false;\r\n\r\n\r\n $scope.init = function (facetCategories, eventCategories, years, buCategories, pageSize, currentId, isRel) {\r\n $scope.facetCategories = facetCategories;\r\n $scope.facetCategories = _.map(facetCategories, function (cat) {\r\n cat.name = unescape(cat.name);\r\n return cat;\r\n });\r\n $scope.eventCategories = eventCategories;\r\n $scope.yearFacets = years;\r\n $scope.buCategories = buCategories;\r\n $scope.selectedCategories = getCategoriesFromQueryString();\r\n var queryParams = $location.search();\r\n\r\n $scope.eventTags = getKeyAsArrayOrEmpty(queryParams['event']); //$location.eventTags || [];\r\n $scope.selectedYears = getKeyAsArrayOrEmpty(queryParams['year']); //$location.selectedYears || [];\r\n var localSelectedBuCategories = getKeyAsArrayOrEmpty(queryParams['buCategory']);\r\n if (localSelectedBuCategories.length == 0 && ServerSettings.businessUnit != '') {\r\n localSelectedBuCategories.push(ServerSettings.businessUnit);\r\n }\r\n\r\n $scope.selectedBuCategories = localSelectedBuCategories;\r\n $scope.customPageSize = pageSize;\r\n $scope.currentId = currentId;\r\n $scope.isRel = isRel;\r\n\r\n $scope.showMore();\r\n\r\n // Collapse filters in mobile layout.\r\n // todo: There should be a single truth about the breakpoint somewhere in code.\r\n var xs_breakpoint = 767;\r\n\r\n if(window.innerWidth < xs_breakpoint) {\r\n $scope.isCategoryFilterCollapsed = true;\r\n }\r\n };\r\n\r\n var ensureArray = function (value) {\r\n return Array.isArray(value) ? value : [value];\r\n };\r\n var getKeyAsArrayOrEmpty = function (value) {\r\n return value !== undefined ? ensureArray(value) : [];\r\n };\r\n\r\n var getCategoriesFromQueryString = function () {\r\n var values = getKeyAsArrayOrEmpty($location.search()['category']);\r\n return _(values)\r\n .map(function (categoryName) {\r\n return _.find($scope.facetCategories, function (categoryOption) {\r\n return categoryOption.name === unescape(categoryName);\r\n });\r\n })\r\n .filter(function (value) { return value !== undefined; })\r\n .value();\r\n };\r\n // load more\r\n $scope.showMore = function () {\r\n if ($scope.loading) {\r\n return;\r\n }\r\n $scope.loading = true;\r\n var queryParams = $location.search();\r\n $scope.filters.magazineFilter = queryParams['magazine'] !== undefined ? queryParams['magazine'] : null;\r\n // If any category is selected, fetch only them, otherwise fetch all\r\n var ids =\r\n $scope.selectedCategories.length > 0 || $scope.eventTags.length > 0\r\n ? _.map($scope.selectedCategories, 'id').concat($scope.eventTags)\r\n : _.map($scope.facetCategories, 'id').concat(_.map($scope.eventCategories, 'id'));\r\n\r\n var params = {\r\n 'id[]': ids,\r\n page: ctrl.page,\r\n year: $scope.selectedYears, \r\n magazine: $scope.filters.magazineFilter,\r\n isRel: $scope.isRel,\r\n buCategory: $scope.selectedBuCategories\r\n };\r\n\r\n if ($scope.customPageSize) {\r\n params.pageSize = $scope.customPageSize;\r\n params.firstPageSize = $scope.customPageSize;\r\n }\r\n if ($scope.currentId) {\r\n params.current = $scope.currentId;\r\n }\r\n\r\n EnstoCardSearchService.getCards(params, function (results) {\r\n $scope.loading = false;\r\n if (ctrl.page === 0) {\r\n $scope.cards = results.Cards.slice();\r\n } else {\r\n $scope.cards = $scope.cards.concat(results.Cards);\r\n }\r\n\r\n $scope.hasMore = results.HasMore;\r\n ctrl.page++;\r\n });\r\n };\r\n\r\n // Get url parameter\r\n $scope.getUrlParameter = function (param) {\r\n var sPageUrl = window.location.search.substring(1),\r\n sUrlVariables = sPageUrl.split(/[&||?]/),\r\n val;\r\n\r\n for (var i = 0; i < sUrlVariables.length; i += 1) {\r\n var paramName = sUrlVariables[i],\r\n sParameterName = (paramName || '').split('=');\r\n\r\n if (sParameterName[0] === param) {\r\n val = sParameterName[1];\r\n }\r\n }\r\n return val;\r\n };\r\n\r\n $scope.newSearch = function() {\r\n ctrl.page = 0;\r\n $scope.cards = [];\r\n $scope.showMore();\r\n };\r\n\r\n $scope.filterChanged = function() {\r\n ctrl.page = 0;\r\n $scope.cards = [];\r\n $location.search('magazine', $scope.filters.magazineFilter);\r\n $scope.showMore();\r\n };\r\n\r\n $scope.isActiveCategory = function (cat) {\r\n return _.find($scope.selectedCategories, function (catSelection) {\r\n return catSelection.id === cat.id;\r\n });\r\n };\r\n\r\n $scope.toggleCategory = function (selectedCategory) {\r\n var existingFilter = _.find($scope.selectedCategories, { 'id': selectedCategory.id });\r\n console.log('selected categories:');\r\n console.log($scope.selectedCategories);\r\n if (existingFilter !== undefined) {\r\n var filtersWithoutSelection = _.filter($scope.selectedCategories, function (cat) {\r\n return cat.id !== selectedCategory.id;\r\n });\r\n console.log('filters without ' + selectedCategory.name);\r\n console.log(filtersWithoutSelection);\r\n $scope.selectedCategories = filtersWithoutSelection;\r\n }\r\n else {\r\n $scope.selectedCategories.push(selectedCategory);\r\n }\r\n $location.search('category', _.map($scope.selectedCategories, 'name'));\r\n\r\n $scope.newSearch();\r\n };\r\n\r\n $scope.toggleEventTag = function(id) {\r\n var index = $scope.eventTags.indexOf(id);\r\n if (index > -1) {\r\n $scope.eventTags.splice(index, 1);\r\n } else {\r\n $scope.eventTags.push(id);\r\n }\r\n $location.search('event', $scope.eventTags);\r\n\r\n $scope.newSearch();\r\n };\r\n\r\n $scope.toggleYear = function (id) {\r\n var index = $scope.selectedYears.indexOf(id);\r\n if (index > -1) {\r\n $scope.selectedYears.splice(index, 1);\r\n } else {\r\n $scope.selectedYears.push(id);\r\n }\r\n $location.search('year', $scope.selectedYears);\r\n\r\n $scope.newSearch();\r\n };\r\n\r\n $scope.toggleBu = function(id) {\r\n var index = $scope.selectedBuCategories.indexOf(id);\r\n if (index > -1) {\r\n $scope.selectedBuCategories.splice(index, 1);\r\n } else {\r\n $scope.selectedBuCategories.push(id);\r\n }\r\n $location.search('buCategory', $scope.selectedBuCategories);\r\n\r\n $scope.newSearch();\r\n }\r\n\r\n $scope.resetFilters = function() {\r\n $scope.selectedCategories = [];\r\n $scope.eventTags = [];\r\n $scope.selectedYears = [];\r\n $scope.filters.magazineFilter = \"-1\";\r\n\r\n $scope.selectedBuCategories = ServerSettings.businessUnit != '' ? [ServerSettings.businessUnit] : [];\r\n ctrl.page = 0;\r\n\r\n var queryParams = UrlService.getQueryParams();\r\n delete queryParams['category'];\r\n delete queryParams['buCategory'];\r\n delete queryParams['event'];\r\n delete queryParams['year'];\r\n delete queryParams['magazine'];\r\n\r\n $location.url($location.path() + UrlService.toQueryString(queryParams));\r\n $scope.showMore();\r\n };\r\n\r\n;\r\n\r\n })\r\n .directive('enstoCardStatic', function (EnstoCardWrapper, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-card-static.html?_=20210122'),\r\n scope: {\r\n card: '=',\r\n first: '=',\r\n publishedlabel: '@',\r\n tagslabel: '@',\r\n imagePreset: '@'\r\n },\r\n link: function(scope) {\r\n var cardWrapper = new EnstoCardWrapper();\r\n _.merge(scope.card, cardWrapper);\r\n }\r\n };\r\n })\r\n .component('enstoCardTeaser', {\r\n transclude: true,\r\n bindings: {\r\n link: '=',\r\n imageurl: '=',\r\n categoryname: '=',\r\n header: '=',\r\n publishdate: '=',\r\n teasertext: '=',\r\n readmoretext: '='\r\n },\r\n templateUrl: '/static/com/js/templates/enstocom-card-teaser.html?_=20210122',\r\n controller: function(){\r\n var $ctrl = this;\r\n }\r\n })\r\n //\r\n // A collapsible menu category component.\r\n //\r\n // usage:\r\n //\r\n // \r\n // ...any content that you want to\r\n // add inside the component.\r\n // \r\n .component('enstoMenuCategory', {\r\n transclude: true,\r\n bindings: {\r\n emcTitle: '@'\r\n },\r\n controller: function() {\r\n // todo: There should be a single truth\r\n // about the breakpoint somewhere in code.\r\n var xs_breakpoint = 767;\r\n \r\n // Collapse by default in mobile layout.\r\n if(window.innerWidth < xs_breakpoint) {\r\n this.isCollapsed = true;\r\n } else {\r\n this.isCollapsed = false;\r\n }\r\n },\r\n templateUrl: '/static/com/js/templates/enstocom-menu-category.html?_=2019994'\r\n\r\n });\r\n})(angular);\n// The `enstocom.teasers` module has directives for couple of teasers\r\n// TODO: Consider moving these directives inside product module or some other place... this would require some re-factoring.\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.teasers', ['pascalprecht.translate', 'enstocom.responsiveImage'])\r\n // directive is used to create product teasers inside DefaultNode.cshtml and inside frontpage \r\n .directive('enstoTeaser', function($translate, $log, _) {\r\n var TEASER_TYPES = /^(product|product2)$/;\r\n\r\n var isValidType = function(type) {\r\n return TEASER_TYPES.test(type);\r\n };\r\n\r\n return {\r\n restrict: 'E',\r\n require: '?enstoServerJson',\r\n templateUrl: function(element, attributes) {\r\n if(isValidType(attributes.type)) {\r\n return '/static/com/js/templates/enstocom-teaser-' + attributes.type + '.html';\r\n }\r\n },\r\n scope: {\r\n teaser: '=?',\r\n type: '@'\r\n },\r\n link: {\r\n pre: function(scope, element, attributes, ctrl) {\r\n if(!_.isNull(ctrl)) {\r\n scope.teaser = ctrl.getValue({});\r\n }\r\n },\r\n post: function(scope, element) {\r\n if(!isValidType(scope.type)) {\r\n $log.debug('enstoTeaser, given teaser type is not valid', scope.type);\r\n return;\r\n }\r\n\r\n if(scope.teaser.notInSelection) {\r\n $translate('/comproductpage/message/notinselection').then(function(text) {\r\n scope.teaserImgCaption = text;\r\n }, angular.noop);\r\n }\r\n\r\n element.addClass('ensto-teaser-' + scope.type);\r\n }\r\n }\r\n };\r\n })\r\n // directive is attached in to frontpage's news teaser area and it will only add attribute which will match into 'enstoFirstNews' directive\r\n .directive('enstoNewsTeaserArea', function() {\r\n return {\r\n restrict: 'C',\r\n compile: function(element) {\r\n var firstNewsEl = angular.element(element)\r\n .find('ensto-teaser-news')\r\n .eq(0);\r\n\r\n angular.element(firstNewsEl).attr('ensto-first-news', true)\r\n .parent()\r\n .removeClass('col-sm-6');\r\n }\r\n };\r\n })\r\n // directive sets simple 'firstNews' variable in to scope and it is used inside _Teaser.cshtml, inside frontpage news teasers area's first teaser will also show up image and take full width.\r\n .directive('enstoFirstNews', function() {\r\n return {\r\n restrict: 'A',\r\n scope: true,\r\n link: function(scope, element, attributes) {\r\n scope.firstNews = scope.$eval(attributes.enstoFirstNews);\r\n }\r\n };\r\n });\r\n})(angular);\n// The `enstocom.contactus` module is used inside \"Contact us\" slider (left) and ComContactFormPage.cshtml\r\n// This was removed 2021/11\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.contactus', ['ngMessages', 'ui.bootstrap', 'pascalprecht.translate', 'enstocom.utils', 'ropooy-angular-rdash'])\r\n // service to POST form data in to WebAPI + some logic that fits here\r\n .factory('EnstoContacus', function($http, $window, _) {\r\n var EnstoContacusService = {};\r\n\r\n EnstoContacusService.sendFrom = function(postData) {\r\n return $http.post('/api/contactform/post', postData/*, configObj*/);\r\n };\r\n\r\n EnstoContacusService.makeInquirySubjectGroups = function(inquirySubjects) {\r\n return _.chunk(inquirySubjects, $window.Math.round(_.size(inquirySubjects) / 2));\r\n };\r\n\r\n return EnstoContacusService;\r\n })\r\n // directive to add \"Contact us\" slider in to the page\r\n .directive('enstoContactusSlider', function(ElementHelper, TemplateUriHandler, _) {\r\n return {\r\n restrict: 'E',\r\n require: '?enstoServerJson',\r\n controller: 'EnstoContactusSliderController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-contactus-slider.html'),\r\n scope: {\r\n contactusData: '=?'\r\n },\r\n link: {\r\n pre: function(scope, element, attributes, ctrl) {\r\n if(!_.isNull(ctrl)) {\r\n scope.contactusData = ctrl.getValue({});\r\n }\r\n },\r\n post: function(scope, element) {\r\n scope.rePositionContactUsContainer = function() {\r\n var containerElem = angular.element(element).find('div').eq(0);\r\n\r\n if(containerElem.hasClass('ensto-contactus-container')) {\r\n // get top position from css\r\n if(_.isNull(scope.initialTopPosition)) {\r\n var styles = ElementHelper.getComputedStyle(containerElem);\r\n // asuming always positive \"top\" value\r\n scope.initialTopPosition = +styles.top.replace(/[^-\\d\\.]/g, '');\r\n }\r\n\r\n // get current scrollTop position\r\n var scrollTop = ElementHelper.scrollTop();\r\n\r\n // setting container element top position to correct one\r\n scope.topPosition.top = scope.initialTopPosition + scrollTop + 'px';\r\n scope.topPosition.position = 'absolute'; // check _enstocom-block-contactus.scss for more rules\r\n }\r\n };\r\n }\r\n }\r\n };\r\n })\r\n // directive to add contact us form in someplace\r\n .directive('enstoContactusForm', function(_,TemplateUriHandler) {\r\n return {\r\n restrict: 'E',\r\n require: '?enstoServerJson',\r\n controller: 'EnstoContactusFormController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-contactus-form.html'),\r\n scope: {\r\n contactusData: '=?'\r\n },\r\n link: {\r\n pre: function(scope, element, attributes, ctrl) {\r\n if(!_.isNull(ctrl)) {\r\n scope.contactusData = ctrl.getValue({});\r\n }\r\n\r\n scope.isInsideSlider = scope.$eval(attributes.isInsideSlider);\r\n },\r\n post: function(scope) {\r\n scope.setProductCategories();\r\n scope.setSubjectGroups();\r\n }\r\n }\r\n };\r\n })\r\n // controller for 'enstoContactusSlider' directive\r\n .controller('EnstoContactusSliderController', function ($window, $scope, $timeout, EnstoGA) {\r\n\r\n $scope.isCollapsed = true;\r\n $scope.isSliderOpened = false;\r\n $scope.initialTopPosition = null;\r\n $scope.topPosition = {};\r\n\r\n $scope.openContactUs = function() {\r\n $scope.isSliderOpened = true;\r\n $scope.rePositionContactUsContainer();\r\n\r\n $scope.isCollapsed = false;\r\n EnstoGA.trackEvent(\"contact-form\", \"contact-form-opened\", $window.document.title);\r\n };\r\n\r\n $scope.closeContactUs = function() {\r\n $scope.isCollapsed = true;\r\n\r\n $timeout(function() {\r\n $scope.topPosition.position = '';\r\n }, 1000);\r\n };\r\n })\r\n // controller for 'enstoContactusForm' directive\r\n .controller('EnstoContactusFormController', function($window, $scope, EnstoContacus, EnstoGA, ServerSettings, EnstoEmailRegex, $timeout, $translate, $log, _) {\r\n $scope.messageMaxLength = 600;\r\n $scope.enstoEmailRegex = EnstoEmailRegex;\r\n $scope.form = {};\r\n $scope.showText = '';\r\n\r\n $scope.countries = [\r\n {\r\n \"languageid\": \"en\",\r\n \"displayname\": \"Global market\"\r\n },\r\n {\r\n \"languageid\": \"fi\",\r\n \"displayname\": \"Finland\"\r\n },\r\n {\r\n \"languageid\": \"cs\",\r\n \"displayname\": \"Czech Republic and Slovak Republic\"\r\n },\r\n {\r\n \"languageid\": \"et\",\r\n \"displayname\": \"Estonia\"\r\n },\r\n {\r\n \"languageid\": \"fr\",\r\n \"displayname\": \"France\"\r\n },\r\n {\r\n \"languageid\": \"de\",\r\n \"displayname\": \"Germany\"\r\n },\r\n {\r\n \"languageid\": \"hu\",\r\n \"displayname\": \"Hungary\"\r\n },\r\n {\r\n \"languageid\": \"in\",\r\n \"displayname\": \"India\"\r\n },\r\n {\r\n \"languageid\": \"it\",\r\n \"displayname\": \"Italy\"\r\n },\r\n {\r\n \"languageid\": \"kk\",\r\n \"displayname\": \"Kazakhstan\"\r\n },\r\n {\r\n \"languageid\": \"lv\",\r\n \"displayname\": \"Latvia\"\r\n },\r\n {\r\n \"languageid\": \"lt\",\r\n \"displayname\": \"Lithuania\"\r\n },\r\n {\r\n \"languageid\": \"no\",\r\n \"displayname\": \"Norway\"\r\n },\r\n {\r\n \"languageid\": \"pl\",\r\n \"displayname\": \"Poland\"\r\n },\r\n {\r\n \"languageid\": \"ro\",\r\n \"displayname\": \"Romania\"\r\n },\r\n {\r\n \"languageid\": \"ru\",\r\n \"displayname\": \"Russia\"\r\n },\r\n {\r\n \"languageid\": \"es\",\r\n \"displayname\": \"Spain\"\r\n },\r\n {\r\n \"languageid\": \"sv\",\r\n \"displayname\": \"Sweden\"\r\n },\r\n {\r\n \"languageid\": \"en-gb\",\r\n \"displayname\": \"United Kingdom\"\r\n },\r\n {\r\n \"languageid\": \"uk\",\r\n \"displayname\": \"Ukraine\"\r\n },\r\n {\r\n \"languageid\": \"en-us\",\r\n \"displayname\": \"United states\"\r\n }\r\n ];\r\n\r\n $scope.getActiveCountry = function() {\r\n for (var i = 0; i < $scope.countries.length; ++i) {\r\n if ($scope.countries[i].languageid.toLowerCase() === ServerSettings.preferredCultureName.toLowerCase()) {\r\n return $scope.countries[i];\r\n } \r\n }\r\n };\r\n\r\n $scope.form.country = $scope.getActiveCountry();\r\n\r\n $translate('/contactus/sending/sending').then(function(text) {\r\n $scope.loadingText = text;\r\n }, angular.noop);\r\n\r\n $translate('/contactus/sending/successful').then(function(text) {\r\n $scope.sentSuccessfulText = text;\r\n }, angular.noop);\r\n\r\n $translate('/contactus/sending/failed').then(function(text) {\r\n $scope.sentFailedText = text;\r\n }, angular.noop);\r\n\r\n $scope.setProductCategories = function() {\r\n $scope.productCategories = _.map($scope.contactusData.rootproductcategorynames, function(categoryName, k) {\r\n return {name: categoryName, id: k};\r\n });\r\n };\r\n\r\n $scope.setSubjectGroups = function() {\r\n $scope.inquiryGroups = EnstoContacus.makeInquirySubjectGroups($scope.contactusData.subjectdata);\r\n };\r\n\r\n var getPostData = function() {\r\n var tmp = _.pick($scope.form, 'name', 'email', 'company', 'city', 'message');\r\n\r\n tmp.country = _.result($scope.form, 'country.displayname');\r\n\r\n // Add language parameter\r\n tmp.language = ServerSettings.pageLanguage;\r\n\r\n tmp.selectedInquirySubjectId = _.result($scope.form, 'inquiryType.pagereferenceid', '');\r\n tmp.selectedInquirySubjectTitle = _.result($scope.form, 'inquiryType.name', '');\r\n tmp.productCategory = _.result($scope.form, 'productCategory.name');\r\n\r\n return tmp;\r\n };\r\n\r\n var closeSendingOverlay = function(cb) {\r\n // delay close of overlay so that user can see success / fail message\r\n $timeout(function() {\r\n $scope.form.sending = false;\r\n\r\n if(_.isFunction(cb)) {\r\n cb();\r\n }\r\n }, 2000);\r\n };\r\n\r\n $scope.sendForm = function(is_valid) {\r\n if(!is_valid || $scope.form.sending) {\r\n return;\r\n }\r\n\r\n $scope.form.sending = true;\r\n $scope.showText = $scope.loadingText;\r\n\r\n EnstoContacus.sendFrom(getPostData())\r\n .then(function () {\r\n //EnstoGA.trackSocialShare('Ensto Contact Us', '/contactus/v.1/');\r\n EnstoGA.trackEvent(\"contact-form \", \"contact-form-submitted\", $window.document.title);\r\n $scope.showText = $scope.sentSuccessfulText;\r\n\r\n closeSendingOverlay(function() {\r\n $scope.form = {};\r\n $scope.ContactusForm.$setPristine();\r\n });\r\n }, function(error) {\r\n $log.debug('EnstoContactusFormController:: failed to send inquiry data', $scope.form, error);\r\n $scope.showText = $scope.sentFailedText;\r\n\r\n closeSendingOverlay();\r\n })\r\n .finally(function() {\r\n });\r\n };\r\n });\r\n})(angular);\n// The `enstocom.csrf` module is used to extract .NET csrf token from DOM and it then can be used in all request.\r\n// TODO: investigate this more deeply https://docs.angularjs.org/api/ng/provider/$httpProvider\r\n// in my quick test I was unable to get this work. I did add $httpProvider in to app config and set the cookie name + header name but it was not adding token to every xhr request.\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.csrf', [])\r\n // service contains default values and adds csrf token in to headers\r\n .factory('EnstoCSRFToken', function($http) {\r\n var EnstoCSRFTokenService = {\r\n name: '__RequestVerificationToken',\r\n headerName: 'X-CSRF-Token',\r\n value: null\r\n };\r\n\r\n EnstoCSRFTokenService.setCSRFTokenHeader = function() {\r\n $http.defaults.headers.common[this.headerName] = this.value;\r\n };\r\n\r\n return EnstoCSRFTokenService;\r\n })\r\n // directive to parse csrf token from DOM\r\n .directive('enstoCsrfTokenParser', function(EnstoCSRFToken, $log) {\r\n return {\r\n restrict: 'E',\r\n link: function(scope, elemenet) {\r\n if(elemenet.find('input').eq(0).attr('name') !== EnstoCSRFToken.name) {\r\n $log.warn('enstoCsrfTokenParser: Unable to find input with \"name\"', EnstoCSRFToken.name);\r\n return;\r\n }\r\n\r\n EnstoCSRFToken.value = elemenet.find('input').eq(0).val();\r\n\r\n // set token header\r\n EnstoCSRFToken.setCSRFTokenHeader();\r\n\r\n // finally remove token from DOM\r\n elemenet.remove();\r\n }\r\n };\r\n });\r\n})(angular);\n// The `enstocom.wheretobuy` module provides contacts handling \r\n(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.wheretobuy', ['ngResource'])\r\n // service used to communicate with WebAPI\r\n .factory('WhereToBuy', function ($resource, ServerSettings) {\r\n var WhereToBuyService = $resource('/api/contacts', {\r\n language: ServerSettings.preferredCultureName,\r\n page: 1,\r\n pageSize: 24,\r\n bu: ServerSettings.businessUnit\r\n }, {\r\n getContacts: {\r\n method: 'GET',\r\n params: {\r\n areaIds: null,\r\n categoryIds: null,\r\n roleIds: null,\r\n countyAreaIds: null\r\n }\r\n }\r\n });\r\n\r\n return WhereToBuyService;\r\n })\r\n // controller used inside ComContactsLandingPage.cshtml to wrap page content around it\r\n .controller('EnstoWhereToBuyPageController', function ($scope, WhereToBuy, ServerSettings, _) {\r\n var ctrl = this;\r\n $scope._ = _;\r\n $scope.contacts = [];\r\n $scope.loadingContacts = false;\r\n $scope.selectedCountry = {};\r\n $scope.selectedCategories = {};\r\n $scope.hasMore = true;\r\n $scope.page = 1;\r\n $scope.initialSearchDone = false;\r\n\r\n ctrl.resetResults = function () {\r\n $scope.hasMore = true;\r\n $scope.page = 1;\r\n $scope.contacts = [];\r\n };\r\n\r\n ctrl.getSelectedRoleId = function () {\r\n var selectedId = {};\r\n if ($scope.roles.currentlySelected !== undefined) {\r\n selectedId = $scope.roles.currentlySelected.Key;\r\n }\r\n return selectedId;\r\n };\r\n\r\n ctrl.getSelectedAreasIds = function () {\r\n var selectedId = {};\r\n if ($scope.rootGeographicalAreas.currentlySelected !== undefined) {\r\n selectedId = $scope.rootGeographicalAreas.currentlySelected.Key;\r\n }\r\n return selectedId;\r\n };\r\n\r\n ctrl.getSelectedCategoryId = function () {\r\n var selectedId = {};\r\n if ($scope.productCategories.currentlySelected !== undefined) {\r\n selectedId = $scope.productCategories.currentlySelected.Key;\r\n }\r\n return selectedId;\r\n };\r\n\r\n ctrl.getSelectedCountyId = function () {\r\n var selectedId = {};\r\n if ($scope.counties.currentlySelected !== undefined) {\r\n selectedId = $scope.counties.currentlySelected.Key;\r\n }\r\n return selectedId;\r\n };\r\n\r\n ctrl.attachWatchers = function () {\r\n\r\n $scope.$watch('roles.currentlySelected', function (newVal, oldVal) {\r\n if (newVal === oldVal || newVal === undefined) {\r\n return;\r\n }\r\n\r\n ctrl.resetResults();\r\n $scope.showContacts();\r\n });\r\n\r\n $scope.$watch('counties.currentlySelected', function (newVal, oldVal) {\r\n if (newVal === oldVal || newVal === undefined) {\r\n return;\r\n }\r\n\r\n ctrl.resetResults();\r\n $scope.showContacts();\r\n });\r\n\r\n $scope.$watch('rootGeographicalAreas.currentlySelected', function (newVal, oldVal) {\r\n if (newVal === oldVal || newVal === undefined) {\r\n return;\r\n }\r\n\r\n $scope.counties.currentlySelected = undefined;\r\n $scope.roles.currentlySelected = undefined;\r\n $scope.productCategories.currentlySelected = undefined;\r\n\r\n ctrl.resetResults();\r\n $scope.showContacts();\r\n });\r\n\r\n $scope.$watchCollection('productCategories.currentlySelected', function (newVal, oldVal) {\r\n if (newVal === oldVal || newVal === undefined) {\r\n return;\r\n }\r\n ctrl.resetResults();\r\n $scope.showContacts();\r\n });\r\n };\r\n\r\n $scope.showCountySelector = function () {\r\n return $scope.inEditMode || ($scope.showSubFilters() && $scope.counties.Values.length > 0 && (!_.isEmpty($scope.rootGeographicalAreas.currentlySelected) || $scope.rootGeographicalAreas.Values.length === 1));\r\n };\r\n\r\n $scope.showRootGeographicalAreaSelector = function () {\r\n return $scope.inEditMode || $scope.rootGeographicalAreas.Values.length > 1;\r\n };\r\n\r\n $scope.showSubFilters = function () {\r\n return $scope.inEditMode || $scope.initialSearchDone;\r\n };\r\n\r\n $scope.showProductCategorySelector = function () {\r\n return ServerSettings.businessUnit != \"DSO\" && ($scope.inEditMode || $scope.initialSearchDone);\r\n }\r\n\r\n $scope.showContacts = function () {\r\n\r\n $scope.loadingContacts = true;\r\n\r\n WhereToBuy.getContacts({\r\n areaIds: ctrl.getSelectedAreasIds(),\r\n roleIds: ctrl.getSelectedRoleId(),\r\n countyAreaIds: ctrl.getSelectedCountyId(),\r\n categoryIds: ctrl.getSelectedCategoryId(),\r\n page: $scope.page\r\n }).$promise\r\n .then(function (results) {\r\n $scope.hasMore = results.Hasmore;\r\n $scope.page++;\r\n $scope.roles.Values = results.Roles.Values;\r\n $scope.counties.Values = results.Counties.Values;\r\n $scope.productCategories.Values = results.ProductCategories.Values;\r\n $scope.initialSearchDone = true;\r\n\r\n $scope.setResultCountString(results.Total);\r\n\r\n _.forEach(results.Results, function (contact) {\r\n $scope.contacts.push(contact);\r\n });\r\n }, angular.noop)\r\n .finally(function () {\r\n $scope.loadingContacts = false;\r\n });\r\n };\r\n\r\n $scope.setResultCountString = function (count) {\r\n $scope.resultCountString = $scope.resultCountTemplate.replace('{0}', count);\r\n };\r\n\r\n $scope.init = function (rootGeographicalAreas, inEditMode, resultCountTemplate) {\r\n $scope.rootGeographicalAreas = rootGeographicalAreas;\r\n $scope.roles = {};\r\n $scope.productCategories = {};\r\n $scope.counties = {};\r\n $scope.resultCountTemplate = resultCountTemplate;\r\n $scope.inEditMode = inEditMode;\r\n\r\n ctrl.attachWatchers();\r\n\r\n if (_.isEmpty(rootGeographicalAreas.Values)) {\r\n $scope.showContacts();\r\n }\r\n\r\n if ($scope.rootGeographicalAreas.Values.length === 1) {\r\n $scope.rootGeographicalAreas.currentlySelected = $scope.rootGeographicalAreas.Values[0];\r\n $scope.showContacts();\r\n }\r\n };\r\n })\r\n // wrapper for single contact JSON object. simplifies views.\r\n .factory('EnstoContactWrapper', function () {\r\n return function () {\r\n return {\r\n getWebAddress: function () {\r\n return this.WebAddress || this.webaddress;\r\n },\r\n getTitle: function () {\r\n return this.Title || this.title;\r\n },\r\n getRoles: function () {\r\n return this.RoleIds || this.roleids;\r\n },\r\n getImage: function () {\r\n return this.ImageUrl || this.imageurl;\r\n },\r\n getJobTitle: function () {\r\n return this.JobTitle || this.jobtitle;\r\n },\r\n getIntroText: function () {\r\n return this.IntroText || this.introtext;\r\n },\r\n getCategoryNames: function () {\r\n return this.CategoryNames || this.categorynames;\r\n },\r\n getAddress: function () {\r\n return this.Address || this.address;\r\n },\r\n getZip: function () {\r\n return this.Zip || this.zip;\r\n },\r\n getCity: function () {\r\n return this.City || this.city;\r\n },\r\n getCountry: function () {\r\n return this.Country || this.country;\r\n },\r\n getEmail: function () {\r\n return this.Email || this.email;\r\n },\r\n getPhone: function () {\r\n return this.Phone || this.phone;\r\n },\r\n getType: function () {\r\n return this.Type || this.type;\r\n },\r\n getCompany: function () {\r\n return this.CompanyName || this.companyName;\r\n }\r\n };\r\n };\r\n })\r\n .factory('roleTranslator', function ($translate) {\r\n var translatorFactory = {};\r\n\r\n translatorFactory.getFriendlyText = function (roleId) {\r\n var friendlyText = '';\r\n switch (roleId) {\r\n case 1:\r\n friendlyText = $translate.instant('/contactroles/sales');\r\n break;\r\n case 2:\r\n friendlyText = $translate.instant('/contactroles/techsupport');\r\n break;\r\n case 3:\r\n friendlyText = $translate.instant('/contactroles/customerservice');\r\n break;\r\n case 4:\r\n friendlyText = $translate.instant('/contactroles/training');\r\n break;\r\n case 5:\r\n friendlyText = $translate.instant('/contactroles/reseller');\r\n break;\r\n case 6:\r\n friendlyText = $translate.instant('/contactroles/exclusivepartner');\r\n break;\r\n default:\r\n friendlyText = '';\r\n }\r\n return friendlyText;\r\n };\r\n\r\n translatorFactory.getDefault = function () {\r\n return $translate.instant('/contactroles/default');\r\n };\r\n return translatorFactory;\r\n })\r\n .filter('friendlyTextForRole', function (roleTranslator, _) {\r\n function enstoFilterValueFilter(roleIds) {\r\n if (roleIds) {\r\n var friendlyText = '';\r\n var i = 0;\r\n _.forEach(roleIds, function (roleId) {\r\n friendlyText += roleTranslator.getFriendlyText(roleId);\r\n i++;\r\n var isLast = (i === roleIds.length);\r\n if (!isLast) {\r\n friendlyText += '\\xa0\\xa0\\xa0|\\xa0\\xa0\\xa0';\r\n }\r\n });\r\n return friendlyText;\r\n } else {\r\n return roleTranslator.getDefault();\r\n }\r\n }\r\n return enstoFilterValueFilter;\r\n })\r\n\r\n\r\n // controller for 'enstoSearchFacetGroup' directive\r\n .controller('EnstoContactController', function ($window, $element, $scope, EnstoGA) {\r\n\r\n $scope.openContact = function ($event) {\r\n //remove link\r\n $event.target.innerHTML = \"\";\r\n var contactPersonName = $scope.contact.Title;\r\n\r\n //workaround for product's contacts\r\n if (typeof contactPersonName === 'undefined') {\r\n var arr = $scope.contact.email.split(\"@\")[0].split(\".\");\r\n contactPersonName = arr[0].charAt(0).toUpperCase() + arr[0].slice(1) + \" \" + arr[1].charAt(0).toUpperCase() + arr[1].slice(1);\r\n }\r\n\r\n $scope.hideContact = true;\r\n\r\n //$window.ga('send', 'event', 'show-contact-information', 'ContactPerson', contactPersonName);\r\n EnstoGA.trackContactOpening('openContact', contactPersonName);\r\n\r\n };\r\n })\r\n\r\n // directive to render single contact\r\n .directive('enstoContact', function (ViewportWatcher, $interpolate, EnstoContactWrapper,TemplateUriHandler, _) {\r\n var contactWrapper = new EnstoContactWrapper();\r\n\r\n return {\r\n restrict: 'E',\r\n controller: 'EnstoContactController',\r\n templateUrl: TemplateUriHandler('/static/com/js/templates/enstocom-contact.html'),\r\n scope: {\r\n contact: '='\r\n },\r\n link: function (scope) {\r\n\r\n if (scope.contact !== undefined) {\r\n\r\n _.merge(scope.contact, contactWrapper);\r\n\r\n scope.showPhoneLink = false;\r\n\r\n // Set Contact Type\r\n scope.contactType = scope.contact.Type;\r\n // If address is not empty, generate a google maps link\r\n\r\n if (!_.isEmpty(scope.contact.getAddress())) {\r\n scope.mapUrl = $interpolate('http://maps.google.fi/?q={{::contact.getAddress()}}, {{::contact.getZip()}} {{::contact.getCity()}}, {{::contact.getCountry()}}')(scope);\r\n }\r\n // Use link in mobile\r\n if (ViewportWatcher.viewport === 'mobile') {\r\n scope.showPhoneLink = true;\r\n }\r\n }\r\n }\r\n };\r\n });\r\n})(angular);\n// The `enstocom.social` module provides social service integrations.\r\n// currently we are using https://www.addtoany.com/\r\n(function(angular) {\r\n 'use strict';\r\n\r\n angular.module('enstocom.social', ['enstocom.utils', 'ui.bootstrap', 'ropooy-angular-rdash'])\r\n // Add to Any configuration\r\n .factory('EnstoShareConfig', function($window) {\r\n $window.a2a_config = $window.a2a_config || {};\r\n $window.a2a_config.callbacks = $window.a2a_config.callbacks || [];\r\n\r\n return $window.a2a_config;\r\n })\r\n // Service which handles Add to Any initialization and GA trackings from shares.\r\n // NOTE: 'Share' is tracked when someone opens up share window I did not make so accurate\r\n // system where you need to actually share the link, because I do not belive that many people are even opening those share windows.\r\n // so it is very very likely that someone who opens that share window, he/she will also make the actual share.\r\n\r\n //TODO: Move Add to any script initialization inside 'enstoShareButtons' directive\r\n .factory('EnstoShare', function($rootElement, EnstoShareConfig, EnstoGA, _) {\r\n var EnstoShareService = {};\r\n var ready = false;\r\n var initializing = false;\r\n var cbs = [];\r\n\r\n var scriptEl = angular.element('');\n$templateCache.put('./com/js/templates/enstocom-address.html','
{{::address.name}}
{{::address.streetaddress}}
{{::address.zip}} {{::address.city}}
{{::address.country}}

');\n$templateCache.put('./com/js/templates/enstocom-button-icon.html',' ');\n$templateCache.put('./com/js/templates/enstocom-card-article.html','

');\n$templateCache.put('./com/js/templates/enstocom-card-collection.html','
');\n$templateCache.put('./com/js/templates/enstocom-card-static.html','');\n$templateCache.put('./com/js/templates/enstocom-card-teaser.html','

');\n$templateCache.put('./com/js/templates/enstocom-carousel-reference.html','
');\n$templateCache.put('./com/js/templates/enstocom-carousel-thumbnail.html','
');\n$templateCache.put('./com/js/templates/enstocom-carousel.html','

');\n$templateCache.put('./com/js/templates/enstocom-category-filter-dropdown.html','');\n$templateCache.put('./com/js/templates/enstocom-category-filter-input.html','
');\n$templateCache.put('./com/js/templates/enstocom-category-filters.html','
{{\\'/comproductpage/message/selectedfilters\\' |translate}}:
{{value.value}} {{value.unit}}
');\n$templateCache.put('./com/js/templates/enstocom-category-page-toolbar.html','');\n$templateCache.put('./com/js/templates/enstocom-company-address.html','

id:{{$ctrl.Id}} {{$ctrl.address.Line1Address}} {{$ctrl.address.Line2Address}} {{$ctrl.address.PostalNumber}} {{$ctrl.address.City}} {{$ctrl.address.CountryCode}}

');\n$templateCache.put('./com/js/templates/enstocom-contact.html','

{{::contact.getPhone()}}

{{::contact.getAddress()}} , {{::contact.getZip()}} {{::contact.getCity()}} , {{::contact.getCountry()}}
{{\\'/comcommon/viewonmap\\' |translate}}
');\n$templateCache.put('./com/js/templates/enstocom-contactus-form-errors.html','
{{\\'/contactus/validation/required\\' |translate}}
{{\\'/contactus/validation/email\\' |translate}}
{{\\'/contactus/validation/message\\' |translate}}
');\n$templateCache.put('./com/js/templates/enstocom-contactus-form.html','



{{\\'/comcommon/charactersleft\\' |translate}} {{messageMaxLength - form.message.length}}
{{\\'/contactus/validation/tos\\' |translate}}
');\n$templateCache.put('./com/js/templates/enstocom-contactus-slider.html','
');\n$templateCache.put('./com/js/templates/enstocom-footer-bottom.html','
');\n$templateCache.put('./com/js/templates/enstocom-footer-top.html','
\"Ensto
');\n$templateCache.put('./com/js/templates/enstocom-linklist.html','
');\n$templateCache.put('./com/js/templates/enstocom-loading.html','

');\n$templateCache.put('./com/js/templates/enstocom-mainnavbar-facelift.html','');\n$templateCache.put('./com/js/templates/enstocom-mainnavbar.html','');\n$templateCache.put('./com/js/templates/enstocom-megamenu.html','
');\n$templateCache.put('./com/js/templates/enstocom-menu-category.html','

{{$ctrl.emcTitle}}

');\n$templateCache.put('./com/js/templates/enstocom-menu-icon.html','');\n$templateCache.put('./com/js/templates/enstocom-message.html','

');\n$templateCache.put('./com/js/templates/enstocom-modal-copy-link.html','

{{::\\'/comarticlepage/cardcopyheader\\' |translate}}

');\n$templateCache.put('./com/js/templates/enstocom-modal-product-image.html','

');\n$templateCache.put('./com/js/templates/enstocom-modal-videoplayer.html','
');\n$templateCache.put('./com/js/templates/enstocom-myselection-button.html','');\n$templateCache.put('./com/js/templates/enstocom-myselection-form.html','
{{::\\'/myselection/validation/required\\' |translate}}
{{::\\'/myselection/validation/email\\' |translate}}
{{::\\'/myselection/validation/required\\' |translate}}
{{::\\'/myselection/validation/email\\' |translate}}
{{::\\'/myselection/validation/message\\' |translate}}
{{::\\'/comcommon/charactersleft\\' |translate}} {{messageMaxLength - form.message.length}}
{{::\\'/myselection/message/send\\' |translate}}
{{::\\'/myselection/message/sendfailed\\' |translate}}
');\n$templateCache.put('./com/js/templates/enstocom-myselection.html','
');\n$templateCache.put('./com/js/templates/enstocom-product-accordion.html','
{{::tab.translationkey |translate}}
');\n$templateCache.put('./com/js/templates/enstocom-product-leadtime.html','
= $ctrl.availabilityToBeConfirmed\" translate=\"/comproductpage/toBeConfirmed\">
');\n$templateCache.put('./com/js/templates/enstocom-product-lightbox.html','
');\n$templateCache.put('./com/js/templates/enstocom-product-pdf-popover.html','
');\n$templateCache.put('./com/js/templates/enstocom-product-tab-benefits.html','
');\n$templateCache.put('./com/js/templates/enstocom-product-tab-contacts.html','
1)\">
1)\">
($index+1)))\">
');\n$templateCache.put('./com/js/templates/enstocom-product-tab-download.html','
{{::file.displaytitle}}{{::file.extension}}
');\n$templateCache.put('./com/js/templates/enstocom-product-tab-news.html','
');\n$templateCache.put('./com/js/templates/enstocom-product-tabs.html','
  {{::tab.translationkey |translate}}
');\n$templateCache.put('./com/js/templates/enstocom-product-view-grid.html','

');\n$templateCache.put('./com/js/templates/enstocom-product-view-list.html','

');\n$templateCache.put('./com/js/templates/enstocom-purchase-history.html','
{{row.OrderNumber}}{{row.PurchaseDate | date:\\'yyyy-MM-dd\\'}}{{row.Total.Amount}} {{row.Total.Currency}}
');\n$templateCache.put('./com/js/templates/enstocom-responsive-image-base.html',' \"{{::alt}}\"
');\n$templateCache.put('./com/js/templates/enstocom-responsive-image.html',' \"{{::alt}}\"
');\n$templateCache.put('./com/js/templates/enstocom-search-facet.html','
  • {{::facet.Name}}
  • ');\n$templateCache.put('./com/js/templates/enstocom-search-form.html','
    ');\n$templateCache.put('./com/js/templates/enstocom-search-result-default.html','

    {{::result.LabelText}}

    {{::result.LabelText}}

    {{::result.typeTitle}}

    {{::result.Title}}

    ');\n$templateCache.put('./com/js/templates/enstocom-search-result.html','

    {{::\\'/comproductpage/message/notinselection\\' |translate}}
    {{::\\'/comproductpage/message/replacingproduct\\' |translate}}: {{::result.ReplacementProduct.ProductType}}

    ');\n$templateCache.put('./com/js/templates/enstocom-share-buttons.html','');\n$templateCache.put('./com/js/templates/enstocom-singleselect-dropdown.html','
    ');\n$templateCache.put('./com/js/templates/enstocom-spinner.html','
    ');\n$templateCache.put('./com/js/templates/enstocom-tab-handle.html','
  • ');\n$templateCache.put('./com/js/templates/enstocom-teaser-product.html','

    {{::teaser.name}}

    ');\n$templateCache.put('./com/js/templates/enstocom-teaser-product2.html','

    ');\n$templateCache.put('./com/js/templates/enstocom-video-embed.html','
    ');\n$templateCache.put('./com/js/templates/enstocom-video-teaser-card.html','
    Video

    {{title}}

    ');\n$templateCache.put('./com/js/templates/enstocom-video-thumbnail.html','
    ');\n$templateCache.put('./com/js/templates/priced-products-counter.html','{{$ctrl.pricedItemsCount}}');\n$templateCache.put('./com/js/templates/product-attributes.html','
    {{::section.Name}}

    {{::attribute.Name}}:{{::attribute.Value}} {{::attribute.Unit}}

    ');\n$templateCache.put('./com/js/templates/product-download.html','
    {{::file.documenttypename}}{{::file.displaytitle}}{{::file.extension}}
    ');\n$templateCache.put('./com/js/templates/product-image-lightbox.html','
    ');\n$templateCache.put('./com/js/templates/product-listing-table.html','
    {{::\\'/comproductpage/basedata/type\\' |translate}}{{::\\'/comproductpage/basedata/name\\' |translate}}
    {{::\\'/comproductpage/basedata/type\\' |translate}}{{::\\'/comproductpage/basedata/name\\' |translate}}{{::\\'/comproductpage/basedata/gtin\\' |translate}}{{::\\'/comproductpage/basedata/enumber\\' |translate}}{{::\\'/comproductpage/basedata/downloadfile\\' |translate}}{{header}}Price

    {{group.DisplayName}}

    {{product.productType}}
    {{product.name}}
    {{product.productName}}

    {{group.DisplayName}}

    {{product.productType}}
    {{product.name}}
    {{product.productName}}
    {{product.productName}}
    {{product.gtin}}{{product.enumber}}{{::\\'/combuttons/download \\' |translate}}{{column}}{{product.unitPrice.Amount}} {{product.unitPrice.Currency}}/{{product.package.PackageUnit.Value}} {{:: \\'/cart/priceNotAvailable\\' |translate}}
    ');\n$templateCache.put('./com/js/templates/product-navigation.html','
    • # =

      Prices fetch failed

    ');\n$templateCache.put('./com/js/templates/product-technical-details.html','
    {{::section.name}}

    0\">

    0\">
    {{::attribute.name}}:{{::attribute.value}} {{::attribute.unit}}

    ');\n$templateCache.put('./com/js/templates/search-button.html','');\n$templateCache.put('./com/js/templates/search-enclosures.html','

    ');\n$templateCache.put('./com/js/templates/search-input-large.html','

    ');\n$templateCache.put('./com/js/templates/shoppingcart-link.html','{{$ctrl.text}} {{$ctrl.price.Amount.toLocaleString($ctrl.language)}} {{$ctrl.price.Currency}} {{$ctrl.text}}');\n$templateCache.put('./com/js/templates/toggle-webshop-products.html','
    ');\n$templateCache.put('./com/js/templates/tree-navigation.html','
  • {{category.Name}}{{category.PricedProductsCount}}
      0\" class=\"sub-nav list-group ensto-sidenav-sub-level\">
  • ');}]);"]}