/* Minification failed. Returning unminified contents.
(764,101-102): run-time error JS1195: Expected expression: >
(764,127-128): run-time error JS1004: Expected ';': )
(771,9-10): run-time error JS1002: Syntax error: }
(773,43-44): run-time error JS1004: Expected ';': {
(840,58-59): run-time error JS1100: Expected ',': =
(898,64-65): run-time error JS1100: Expected ',': =
(1064,79-80): run-time error JS1100: Expected ',': =
(1121,78-79): run-time error JS1195: Expected expression: >
(1121,104-105): run-time error JS1004: Expected ';': )
(1123,9-10): run-time error JS1002: Syntax error: }
(1125,90-91): run-time error JS1004: Expected ';': {
(1318,54-55): run-time error JS1100: Expected ',': =
(1560,94-95): run-time error JS1195: Expected expression: >
(1563,22-23): run-time error JS1195: Expected expression: ,
(1568,13-14): run-time error JS1002: Syntax error: }
(1568,44-45): run-time error JS1004: Expected ';': {
(1582,14-15): run-time error JS1195: Expected expression: )
(1585,72-73): run-time error JS1004: Expected ';': {
(1814,73-74): run-time error JS1100: Expected ',': =
(2041,5-6): run-time error JS1002: Syntax error: }
(2042,41-42): run-time error JS1195: Expected expression: )
(2042,43-44): run-time error JS1004: Expected ';': {
(2047,6-7): run-time error JS1195: Expected expression: )
(2049,13-25): run-time error JS1197: Too many errors. The file might not be a JavaScript file: "TopsoftApp"
(2043,9,2046,10): run-time error JS1018: 'return' statement outside of function: return function (url, find, replace) {
            if (!url || !find || !replace) return url;
            return url.replace(new RegExp(find, 'g'), replace);
        }
(1122,13-39): run-time error JS1018: 'return' statement outside of function: return result.length !== 0
 */
var searchModule = angular
    .module('TopsoftApp', ['scrollto', 'infinite-scroll', 'ngMap']);

searchModule.filter('unicodeDisplay', function ($sce) {
    return function (val) {
        return $sce.trustAsHtml(val);
    };
});

searchModule.config(['$qProvider', function ($qProvider) {
    //for canceling http request disable this option
    $qProvider.errorOnUnhandledRejections(false);
}]);;
angular
    .module('TopsoftApp')
    .factory('SearchClientService', ['$http', '$q', function SearchClientService($http, $q) {
        var findProductsCanceler = $q.defer();
        var findReferencesCanceler = $q.defer();

        function getAreasByCategoryId(id) {
            return  $http({
                method: 'GET',
                url: '/search/GetAreasForCategory?id=' + id
            });
        }

        function findProducts(filterModel) {
            findReferencesCanceler.resolve();

            findProductsCanceler = $q.defer();

            return $http({
                method: 'POST',
                data: filterModel,
                url: '/search/search',
                timeout: findProductsCanceler.promise
            });
        }

        function getGroupsByCategoryId(id) {
            return $http({
                method: 'GET',                
                url: '/search/GetGroupsByCategory?id=' + id
            });
        }

        function getCategories() {
            return $http({
                method: 'GET',
                url: '/search/GetCategories'
            });
        }

        function getBranches() {
            return $http({
                method: 'GET',
                url: '/search/GetBranches'
            });
        }

        function getPopularProducts(filterModel) {
            return $http({
                method: 'POST',
                data: filterModel,
                url: '/search/GetPopularProducts'
            });
        }

        function findReferences(refFilterModel) {
            findProductsCanceler.resolve();

            findReferencesCanceler = $q.defer();

            return $http({
                method: 'POST',
                data: refFilterModel,
                url: '/search/SearchByRef',
                timeout: findReferencesCanceler.promise
            });
        }

        function saveSearchQuery(url) {
            return $http.get("/User-profile/SaveToHistory", { params: { queryString: url } });
        }

        return {
            getAreasByCategoryId: getAreasByCategoryId,
            findProducts: findProducts,
            getCategories: getCategories,
            getBranches: getBranches,
            getPopularProducts: getPopularProducts,
            getGroupsByCategoryId: getGroupsByCategoryId,
            findReferences: findReferences,
            saveSearchQuery: saveSearchQuery
        };
    }]);;
angular
    .module('TopsoftApp')
    .factory('UserProfileClientService', ['$http', '$q', function UserProfileClientService($http, $q) {
        function addProductToWishist(id) {
             return $http({
                method: 'GET',
                url: '/User-profile/AddProductToWishlist?productId=' + id,
            });
        }

        function removeProductFromWishlist(id) {
            return $http({
                method: 'POST',  
                data: {productId: id},
                url: '/User-profile/DeleteProductFromWishlist'
            });
        }        

        return {
            addProductToWishlist: addProductToWishist,
            removeProductFromWishlist: removeProductFromWishlist
        };
    }]);;
angular
    .module('TopsoftApp')

    .controller('SearchFiltersController', ['$scope', '$sce', '$timeout', 'SearchClientService', 'UserProfileClientService', 'characteristicsService', 'NgMap', function ($scope, $sce, $timeout, searchClientService, userProfileClientService, characteristicsService, NgMap) {



        var mapOption = {
            center: { lat: 46.8072547, lng: 8.128938 },
            scrollwheel: true,
            zoom: 8,
            mapTypeId: google.maps.MapTypeId.roadmap,
            mapTypeControl: false,
            fullscreenControl: false,
            zoomControl: true,
            zoomControlOptions: {
                position: google.maps.ControlPosition.RIGHT_BOTTOM
            },
            scaleControl: true,
            streetViewControl: false,
            gestureHandling: 'cooperative'
        };

        $scope.productsForMapWasSetted = false;
        var vendorOutsideList = null;
        var mainMap = {};
        var mMapVendors = {};
        var productsLen = null;

        var defaultMarker = "/img/map-marker.png", hoverMarker = "/img/map-marker-hover.png"
        markerImg = new google.maps.MarkerImage(defaultMarker);

        markerHoverImg = new google.maps.MarkerImage(hoverMarker);

        $scope.planWidth = 0;
        $scope.planHeight = 0;
        $scope.WtoH = 0;
        $scope.headerW = 0;
        $scope.widePlan = false;
        $scope.productsForPlanH = 0;

        $scope.fullPlan = function () {
            $scope.widePlan = !$scope.widePlan;
            $timeout(function () { setHeightPlan(); });
        };

        $scope.initChangeHeight = function (pW, pH) {
            $scope.headerW = 1800 / pH;
            $scope.WtoH = parseInt(pW) / parseInt(pH);
            $timeout(function () { setHeightPlan(); });
            angular.element(window).bind('resize', function () {
                var planWrp = document.getElementById('non-drag-plan');
                if (planWrp && planWrp > 650) {
                    setHeightPlan();
                    $scope.$apply();
                }
            });
        };

        var setHeightPlan = function () {
            var planWrpElem = document.getElementById('non-drag-plan');
            var wrpW = planWrpElem.clientWidth;
            if (wrpW === 0) {
                $timeout(function () { setHeightPlan(); });
                return;
            }
            $scope.productsForPlanH = planWrpElem.clientHeight;
            if (wrpW < 650) {
                wrpW = 650;
            }
            var itemH = wrpW / $scope.WtoH;
            $scope.planWidth = Math.round(wrpW);
            $scope.planHeight = Math.round(itemH);
        };

        $scope.clearUnusedPreviousMarkers = function () {
            for (var vendorKey in mMapVendors) {
                if (mMapVendors.hasOwnProperty(vendorKey)) {
                    if (!(vendorKey in $scope.productsForMap)) {
                        mMapVendors[vendorKey].marker.setMap(null);
                    }
                }
            }
        }

        $scope.reassignExistingMarkers = function (map) {
            for (var vendorKey in mMapVendors) {
                if (mMapVendors.hasOwnProperty(vendorKey)) {
                    mMapVendors[vendorKey].marker.setMap(map);
                }
            }
        }

        $scope.updateMarkers = function (map) {
            if ($scope.productsForMap) {
                $scope.clearUnusedPreviousMarkers();
                var newMapVendors = {};
                $.extend(true, newMapVendors, $scope.productsForMap);
                for (var vendorKey in newMapVendors) {
                    if (newMapVendors.hasOwnProperty(vendorKey)) {
                        var vendor = newMapVendors[vendorKey];
                        vendor.marker = (vendorKey in mMapVendors) ? mMapVendors[vendorKey].marker : $scope.createVendorMarker(vendor, map);
                    }
                }
                mMapVendors = newMapVendors;
                if (vendorOutsideList) {
                    google.maps.event.trigger(mMapVendors[vendorOutsideList.Vendor].marker, 'mouseover');
                    vendorOutsideList = null;
                }
            }
        }

        var mapTooltipMarkup = function (vendor) {
            var vendorLogo = "";
            var response = null;
            if (vendor.VendorLogoUrl) {
                var modifiedVendorLogoUrl = vendor.VendorLogoUrl.replace('mode=boxpad&bgcolor=fff', 'height=40');
                vendorLogo = '<img class="vendor-logo" src="' + modifiedVendorLogoUrl + '" />';
            }
            var vendorBlock =
                '<div class="tooltip-item"><a target="_blank" href="' +
                vendor.Url +
                '">' +
                vendorLogo +
                '<h5 class="product-title product-title-popup vendor-name">' +
                vendor.Vendor +
                '</h5><div class="vendor-address">' +
                vendor.VendorAddress1 +
                '</div> <div class="vendor-address">' +
                vendor.PostCode + ' ' + vendor.Place +
                '</div></a></div >';
            let productBlock = vendorBlock;
            if (vendor.Products && vendor.Products.length) {
                for (let product of vendor.Products) {
                    let logoUrl = "";
                    if (product.LogoUrl) {
                        var modifiedProductLogoUrl = product.LogoUrl.replace('mode=boxpad&bgcolor=fff', 'height=30');
                        logoUrl = '<img class="product-logo" src="' + modifiedProductLogoUrl + '" />';
                        let productMarkUp = '<div class="tooltip-item product-block"><a target="_blank" href="' +
                            product.ProductUrl +
                            '">' +
                            '<h5 class="product-title product-title-popup">' +
                            product.ProductName +
                            '</h5>' +
                            logoUrl +
                            '</a></div>';
                        productBlock += productMarkUp;
                    } else {
                        let productMarkUp = '<div class="tooltip-item product-block no-logo"><a target="_blank" href="' +
                            product.ProductUrl +
                            '">' +
                            '<h5 class="product-title product-title-popup">' +
                            product.ProductName +
                            '</h5></a></div>';
                        productBlock += productMarkUp;
                    }

                }
            }
            var allProducts = "";

            if (vendor.TotalProductsCount)
                allProducts = '<div class="all-products-ref"><a target="_blank" href="' + vendor.Url + '">All ' + vendor.TotalProductsCount + ' Product(s)</a></div>';
            else
                allProducts = '<div class="all-products-ref"><a target="_blank" href="' + vendor.VendorUrl + '#products">All Products</a></div>';

            return productBlock + allProducts;
        }

        $scope.createVendorMarker = function (vendor, map) {
            var pos = new google.maps.LatLng(vendor.Latitude, vendor.Longitude);
            var icon = markerImg;
            var marker = new google.maps.Marker({
                position: pos,
                map: map,
                icon: icon,
                zIndex: 1,
                vendor: vendor
            });

            google.maps.event.addListener(marker,
                'mouseover',
                function () {

                    if ($scope.info) {
                        $scope.info.close();
                        $scope.info = null;
                    }
                    var contnet = mapTooltipMarkup(this.vendor);
                    $scope.info = new SnazzyInfoWindow({
                        marker: marker,
                        content: contnet,
                        placement: 'right',
                        pointer: false,
                        wrapperClass: 'map-tooltip-wrp',
                        padding: 0,
                        shadow: false
                    });

                    this.setOptions({ zIndex: 10 });
                    marker.setIcon(markerHoverImg);

                    $scope.info.open();

                });

            google.maps.event.addListener(marker,
                'mouseout',
                function ($event) {
                    this.setOptions({ zIndex: 1 });
                    marker.setIcon(markerImg);
                });

            return marker;
        }

        $scope.showVendorOnMap = function (vendorName, show) {
            if (!show) {
                if ($scope.info) {
                    $scope.info.close();
                    $scope.info = null;
                }
            }
            if (vendorName in mMapVendors) {
                var vendor = mMapVendors[vendorName];
                google.maps.event.trigger(vendor.marker, show ? 'mouseover' : 'mouseout');
            } else {
                for (let item of $scope.products) {
                    if (item.Vendor === vendorName) {
                        mainMap.setOptions({
                            center: { lat: item.Latitude, lng: item.Longitude },
                            zoom: 16
                        });
                        vendorOutsideList = item;
                        $scope.productsForMap[item["Vendor"]] = item;
                        $scope.updateMarkers(mainMap);
                        $scope.createVendorMarker(item, mainMap);
                        var newV = mMapVendors[vendorName];
                        google.maps.event.trigger(newV.marker, show ? 'mouseover' : 'mouseout');
                        break;
                    }
                }
            }


        };

        $scope.orderTypes = ["by-vendor", "by-product", "exhibs-by-vendor", "exhibs-by-product"];

        $scope.sortItems = [
            {
                value: 0,
                label: 'Nach Relevanz',
                icon: 'sort-icon-relevance'
            },
            {
                value: 1,
                label: 'Alphabetisch',
                icon: 'sort-icon-alphabeth'
            },
            {
                value: 2,
                label: 'Nach Datum',
                icon: 'sort-icon-date'
            }
        ];

        $scope.sortByVendorObj = {
            value: 3,
            label: 'Anbieter alphabetisch',
            icon: 'sort-icon-alphabeth'
        };

        var chunkCounter = 3;
        $scope.searchType = 0;

        $scope.filterShown = true;
        $scope.mapShown = false;
        $scope.wideMap = false;
        $scope.mapIsFull = false;
        $scope.mainMapInitialized = false;
        $scope.fromWideMap = false;
        $scope.isMobile = false;

        $scope.selectedItem = $scope.sortItems[0];

        $scope.loading = true;
        $scope.categoryLoading = true;

        $scope.Count = 0;
        $scope.VendorsCount = 0;
        $scope.ExhibsProdsCount = 0;
        $scope.ExhibsVendorsCount = 0;

        $scope.areas = [];
        $scope.category = "";

        $scope.categories = [];
        $scope.initialCategorioesCount = null;

        $scope.topProducts = [];

        $scope.currentPage = 0;
        $scope.itemsPerPage = 12;
        $scope.itemsOnMap = 50;

        $scope.pagingHeaderLabel = "Produkte";

        $scope.products = [];
        $scope.productsForMap = {};

        $scope.itemsVisible = true;

        $scope.firstLetter = null;

        $scope.cleanCriterias = function () {
            for (var crit of $scope.filterModel.selectedCriterias) {
                if (crit.Сriterion) {
                    crit.Сriterion.boolValue = false;
                    $scope.selectCriteria(crit.Сriterion, { id: crit.GroupId }, true);
                }
            }
            //$scope.filterModel = { selectedCriterias: [], query: "", ActiveCategory: { Id: categoryId, Name: categoryName }, isExhibitioner: false, showPlan: false };
            tabSelector = '#view-tabs a[href=#list-view]';
            $scope.changeOrder(0, true);
            $scope.changeProductPanelTab('list', true);
            $scope.categoriesSearchType = 3;
            $scope.firstLetter = null;
            $scope.filterModel.selectedCriterias = [];
            criteriasInUrl = [];
            delete $scope.filterModel.firstLetter;
            delete $scope.filterModel.query;

            var urlObj = window.location;

            window.history.pushState("object or string", "Title", urlObj.origin + urlObj.pathname);
            
            $scope.findProducts(true);
           
        };

        $scope.firstLetterSearch = function (paramsObj) {
            paramsObj.event.preventDefault();
            if ($scope.firstLetter === paramsObj.firstLetter) {
                $scope.firstLetter = null;
                delete $scope.filterModel.firstLetter;
                delete $scope.refFilterModel.firstLetter;
            } else {
                if (paramsObj.firstLetter === 'Alle') {
                    $scope.firstLetter = null;
                    delete $scope.filterModel.firstLetter;
                    delete $scope.refFilterModel.firstLetter;
                } else {
                    $scope.firstLetter = paramsObj.firstLetter;
                }
            }

            $scope.loading = true;
            $scope.itemsVisible = false;
            $scope.currentPage = 0;

            $scope.doSearch($scope.searchType);
            var modelfil = $scope.filterModel;
            var newQueryString = "";
            if ($scope.searchType !== 1) {
                if ($scope.firstLetter) {
                    newQueryString = "?firstLetters=" + $scope.firstLetter;
                    if ($scope.activeTab !== null && $scope.filterModel.query !== "" && $scope.activeGroup !== null) {
                        newQueryString = "?firstLetters=" + $scope.firstLetter + "&view=" + $scope.activeTab + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup;
                    } else if ($scope.activeTab !== null) {
                        newQueryString = "?firstLetters=" + $scope.firstLetter + "&view=" + $scope.activeTab + "&sortingType=" + $scope.activeGroup;
                    } else if ($scope.filterModel.query !== "") {
                        newQueryString = "?firstLetters=" + $scope.firstLetter + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup;
                    }
                }
                else if ($scope.firstLetter === null && $scope.filterModel.query !== "") {
                    newQueryString = "?view=" + $scope.activeTab + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup;
                } else if ($scope.firstLetter === null) {
                    newQueryString = "?view=" + $scope.activeTab + "&sortingType=" + $scope.activeGroup;
                }

                if ($scope.filterModel.vendor != null) {
                    newQueryString += "&vendor=" + $scope.filterModel.vendor;
                }

                if (newQueryString !== "") {
                    window.history.pushState("object or string", "Title", newQueryString + getCritsOnUrl());
                }
            }
        };

        $scope.chunk = function (arr, size) {
            if (!arr) return arr;

            var newArr = [];
            for (var i = 0; i < size; i++) {
                newArr.push([]);

                for (var j = i; j < arr.length; j += size) {
                    newArr[i].push(arr[j]);
                }
            }
            return newArr;
        }

        $scope.changeSortingByList = function (searchType) {
            switch (searchType) {
                case 0:
                    $scope.sortItems = [{
                        value: 0,
                        label: 'Nach Relevanz',
                        icon: 'sort-icon-relevance',
                    }, {
                        value: 1,
                        label: 'Alphabetisch',
                        icon: 'sort-icon-alphabeth'
                    }, {
                        value: 2,
                        label: 'Nach Datum',
                        icon: 'sort-icon-date'
                    }];
                    break;
                case 1:
                    $scope.sortItems = [{
                        value: 0,
                        label: 'Referezen nach Relevanz',
                        icon: 'sort-icon-relevance'
                    }, {
                        value: 1,
                        label: 'Referezen alphabetisch',
                        icon: 'sort-icon-alphabeth'
                    }, {
                        value: 2,
                        label: 'Referezen nach Datum',
                        icon: 'sort-icon-date'
                    }, {
                        value: 3,
                        label: 'Anbieter alphabetisch',
                        icon: 'sort-icon-alphabeth'
                    }];
                    break;
            }
        };

        $scope.isSortTypeAlphabetical = function () {
            var val = $scope.selectedItem.value;

            return val === $scope.sortItems[1].value;
        };

        var tabSelector = "";
        var criteriasInUrl = [];

        $scope.init = function (activeCategoryId, activeCategoryName, isRefTab, productCount, referenceCount, isMemberAuthenticated, productsWishlist, sortingType) {
            $scope.initFilterModel(activeCategoryId, activeCategoryName);
            $scope.productCount = productCount;
            $scope.referenceCount = referenceCount;
            $scope.isMemberAuthenticated = isMemberAuthenticated;
            $scope.productsWishlist = productsWishlist;
            if (window.orientation !== undefined) {
                $scope.isMobile = true;
            }



            if (sortingType === 3) {
                $scope.pagingHeaderLabel = "Anbieter";
                $scope.selectedItem = $scope.sortItems[3];
                $scope.filterModel.sortType = 3;
            }


            if (isRefTab) {
                var elem = angular.element('[href=#ByReferencesTab]');
                $scope.textQueryLabel = $scope.referenceCount + " Referenzen nach Stichwort durchsuchen";
                $timeout(function () {
                    angular.element(elem).trigger('click');
                    var sumo = angular.element('#reference-categories-select')[0].sumo;
                    sumo.selectItem(activeCategoryId.toString());

                }, 0);
            }
            else {
                var query = characteristicsService.getParamsFromUrl("query");
                if (query) {
                    $scope.filterModel.query = query;
                }

                var vendor = characteristicsService.getParamsFromUrl("vendor");
                if (vendor) {
                    $scope.filterModel.vendor = vendor;
                }

                var letret = characteristicsService.getParamsFromUrl("firstLetters");
                if (letret) {
                    $scope.firstLetter = letret;
                    $scope.filterModel.firstLetter = $scope.firstLetter;
                }

                var critInUrl = characteristicsService.getParamsFromUrl("crit");
                if (critInUrl) {
                    criteriasInUrl = critInUrl.split(",");
                    characteristicsService.critsInUrl = criteriasInUrl;
                    $scope.filterModel.selectedCriterias = criteriasInUrl;
                }

                $scope.textQueryLabel = $scope.productCount + " Produkte nach Stichwort durchsuchen";
                var type = characteristicsService.getParamsFromUrl("sortingType");
                var view = characteristicsService.getParamsFromUrl("view");
                if (view === null || view === "" || view === " ") {
                    if (type === "by-product") {
                        $scope.changeOrder(1);
                        $scope.categoriesSearchType = 1;
                    } else if (type === "by-vendor") {
                        $scope.changeOrder(0);
                        $scope.categoriesSearchType = 3;
                    }
                    else if (type === "exhibs-by-vendor") {
                        $scope.changeOrder(2);
                        $scope.categoriesSearchType = 3;
                    }
                    else if (type === "exhibs-by-product") {
                        $scope.changeOrder(3);
                        $scope.categoriesSearchType = 1;
                    }
                    else {
                        $scope.findProducts();
                    }

                }

                else {
                    tabSelector = '#view-tabs a[href=#' + view + '-view]';
                    $scope.activeTab = view;
                    if (type === "by-product") {
                        $scope.activeGroup = "by-product";
                        $scope.categoriesSearchType = 1;
                    } else {
                        if (type === "by-vendor") {
                            $scope.activeGroup = "by-vendor";
                            $scope.categoriesSearchType = 3;
                        } else if (type === "exhibs-by-vendor") {
                            $scope.activeGroup = "exhibs-by-vendor";
                            $scope.categoriesSearchType = 3;
                            $scope.filterModel.isExhibitioner = true;
                            $scope.filterModel.showPlan = false;

                        } else if (type === "exhibs-by-product") {
                            $scope.activeGroup = "exhibs-by-product";
                            $scope.categoriesSearchType = 1;
                            $scope.filterModel.isExhibitioner = true;
                            $scope.filterModel.showPlan = true;
                        }
                    }
                    $scope.loading = false;
                    $scope.findProducts();
                   // $scope.changeProductPanelTab(view);
                }

            }

        };


        $scope.initControls = function () {
            $('.js-custom-sumo-dropdown').addClass('sumo-dropdown').SumoSelect();
            $('.js-custom-ui-dropdown').addClass('ui dropdown').dropdown({ transition: 'fade' });
            $('[data-toggle="tooltip"]').tooltip({
                placement: function () {
                    var width = 767;
                    var innerWidth = window.innerWidth;
                    if (innerWidth < width) {
                        return 'bottom';
                    }
                    return 'right';
                }
            });
        };

        $scope.initFilterModel = function (categoryId, categoryName) {
            $scope.filterModel = { selectedCriterias: [], query: "", ActiveCategory: { Id: categoryId, Name: categoryName }, isExhibitioner: false, showPlan: false };
            $scope.category = categoryName;
        };

        $scope.addToWishlist = function (productItem) {
            productItem.pending = true;
            //add or remove?
            if ($scope.isProductAddedToWishlist(productItem)) {
                var index = $scope.productsWishlist.indexOf(productItem.ProductId);
                if (index > -1) {
                    $scope.productsWishlist.splice(index, 1);
                }

                userProfileClientService
                    .removeProductFromWishlist(productItem.ProductId)
                    .then(function (result) {
                        if (result.data.Success === true) {
                            //process somehow if needed
                        }
                    })
                    .finally(function () {
                        productItem.pending = false;
                    });
            }
            else {
                $scope.productsWishlist.push(productItem.ProductId);

                userProfileClientService
                    .addProductToWishlist(productItem.ProductId)
                    .then(function (result) {
                        if (result.data.Success === true) {
                            //process somehow if needed
                        }
                    })
                    .finally(function () {
                        productItem.pending = false;
                    });
            }
        };

        $scope.isProductAddedToWishlist = function (productItem) {
            if ($scope.productsWishlist !== null) {
                return $scope.productsWishlist.indexOf(productItem.ProductId) >= 0;
            }
            return false;
        };

        $scope.doSearch = function (searchType) {
            if (searchType === 1)
                $scope.searchReferences($scope.refFilterModel);
            else
                $scope.findProducts();
        };

        $scope.selectedCriteriasCount = function () {
            return $.grep($scope.filterModel.selectedCriterias, function (item) {
                return item.isChecked === true;
            }).length;
        }



        $scope.clickRemoveFilterTag = function (filterItem) {
            filterItem.isChecked = false;
            $scope.filterModel.selectedCriterias = $scope.filterModel.selectedCriterias.filter(obj => obj.ID !== filterItem.ID);
            filterItem.Сriterion.boolValue = false;
            $scope.currentPage = 0;
            $scope.loading = true;
            $scope.itemsVisible = false;
            addRemoveCategoryToUrl(filterItem.Сriterion.id);
            $scope.doSearch($scope.searchType);
        };

        $scope.pageChanged = function (n) {
            $scope.loading = true;
            $scope.currentPage = n;
            $scope.doSearch($scope.searchType);
        };

        $scope.choiceSearch = function (searchType) {
            $scope.searchType = searchType;

            if (searchType === 1) {
                $scope.wideMap = false;
                chunkCounter = 3;
                $scope.mapShown = false;
                $scope.wideMap = false;

                $scope.pagingHeaderLabel = "Referenzen";
                $scope.textQueryLabel = $scope.referenceCount + " Referenzen nach Stichwort durchsuchen";
                window.history.pushState("object or string", "Title", window.location.origin + window.location.pathname);

                $scope.changeSortingByList(1);
                $scope.firstLetter = null;
                var $searchInput = $(".search-box").find('#query').first();
                if ($searchInput !== null) {
                    $searchInput.val("");
                }
                $scope.selectedItem = $scope.sortItems[0];
                $scope.doSearch(searchType);
                
            }
            else {
                $scope.activeGroup = $scope.orderTypes[0];
                $scope.selectedItem.value = 0;
                $scope.changeSortingByList(0);
                $scope.changeProductPanelTab('list', true);
                $('#view-tabs a[href=#list-view]').tab('show');
                $scope.cleanCriterias();
                $scope.changeOrder(0);
            }

            $scope.currentPage = 0;
        };


        $scope.alphabericalRange = function () {
            return ['Alle', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#'];
        };

        $scope.enableExhibsFind = function () {
            $scope.filterModel.isExhibitioner = true;
        };

        $scope.disableExhibsFind = function () {
            $scope.filterModel.isExhibitioner = false;
        };

        $scope.activeGroup = $scope.orderTypes[0];

        var getCritsOnUrl = function () {
            var critsOnUrl = characteristicsService.getParamsFromUrl("crit");
            if (critsOnUrl === null) {
                critsOnUrl = "";
            } else {
                critsOnUrl = "&crit=" + critsOnUrl;
            }
            return critsOnUrl;
        };

        $scope.changeOrder = function (index, skipSearch = false) {
            switch ($scope.orderTypes[index]) {
                case "by-product":
                    productsLen = $scope.Count;
                    $scope.disableExhibsFind();
                    $scope.categoriesSearchType = 1;
                    $scope.order(1, false, skipSearch);
                    if ($scope.activeTab === 'plan') {
                        $scope.changeProductPanelTab('list', true);
                        $('#view-tabs a[href=#list-view]').tab('show');
                    }
                    break;
                case "by-vendor":
                    productsLen = $scope.VendorsCount;
                    $scope.disableExhibsFind();
                    $scope.categoriesSearchType = 3;
                    $scope.order(3, false, skipSearch);
                    if ($scope.activeTab === 'plan') {
                        $scope.changeProductPanelTab('list', true);
                        $('#view-tabs a[href=#list-view]').tab('show');
                    }
                    break;
                case "exhibs-by-product":
                    productsLen = $scope.ExhibsProdsCount;
                    $scope.enableExhibsFind();
                    $scope.categoriesSearchType = 1;
                    $scope.order(1, false, skipSearch);
                    break;
                case "exhibs-by-vendor":
                    productsLen = $scope.ExhibsVendorsCount;
                    $scope.enableExhibsFind();
                    $scope.categoriesSearchType = 3;
                    $scope.order(3, false, skipSearch);
                    break;

            }
            $scope.activeGroup = $scope.orderTypes[index];

            if ($scope.activeGroup) {
                var newQueryString = "?sortingType=" + $scope.activeGroup;
                if ($scope.firstLetter !== null && $scope.filterModel.query !== "" && $scope.activeTab !== null) {
                    newQueryString = "?firstLetters=" + $scope.firstLetter + "&view=" + $scope.activeTab + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup;
                } else if ($scope.firstLetter !== null) {
                    newQueryString = "?firstLetters=" + $scope.firstLetter + "&view=" + $scope.activeTab + "&sortingType=" + $scope.activeGroup;
                } else if ($scope.filterModel.query !== "") {
                    newQueryString = "?view=" + $scope.activeTab + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup;
                } else if ($scope.firstLetter === null && $scope.activeGroup !== null) {
                    newQueryString = "?view=" + $scope.activeTab + "&sortingType=" + $scope.activeGroup;
                }

                if ($scope.filterModel.vendor != null) {
                    newQueryString += "&vendor=" + $scope.filterModel.vendor;
                }

                window.history.pushState("object or string", "Title", newQueryString + getCritsOnUrl());
            }
        };

        $scope.order = function (sortingType, item, skipSearch = false) {

            if (!item) {
                item = $scope.sortByVendorObj;
            }

            if ($scope.info) {
                $scope.info.close();
                $scope.info = null;
            }
            if ($scope.mapShown) {
                $timeout(function () {
                    $scope.fromWideMap = true;
                    $scope.rebindMap();
                });
            }
            if ($scope.searchType === 0) {
                if (item.value === 3) {
                    $scope.pagingHeaderLabel = "Anbieter";
                } else {
                    $scope.pagingHeaderLabel = "Produkte";
                }
            } else {
                $scope.firstLetter = null;
                delete $scope.refFilterModel.firstLetter;
            }
            $scope.products = [];
            $scope.productChunks = [];

            $scope.selectedItem = item;
            $scope.filterModel.sortType = sortingType;
            $scope.refFilterModel.sortType = sortingType;
            $scope.loading = true;
            $scope.itemsVisible = false;

            $scope.currentPage = 0;

            if (!skipSearch) {
                $scope.doSearch($scope.searchType);
            }
        };

        $scope.prevPage = function () {
            if ($scope.currentPage > 0) {
                $scope.currentPage--;
                $scope.pageChanged($scope.currentPage);
            }
        };

        $scope.nextPage = function () {
            var maxPages = Math.ceil(productsLen / $scope.itemsPerPage);
            if ($scope.currentPage < maxPages - 1) {
                $scope.currentPage++;
                $scope.pageChanged($scope.currentPage);
            }
        };

        $scope.setPage = function () {
            $scope.currentPage = this.n;
        };

        $scope.textSearch = function () {
            $scope.loading = true;
            $scope.itemsVisible = false;
            $scope.currentPage = 0;
            $scope.doSearch($scope.searchType);

            if ($scope.filterModel.query) {
                newQueryString = "?query=" + $scope.filterModel.query;
                if ($scope.firstLetter !== null && $scope.activeTab !== null) {
                    newQueryString = "?firstLetters=" + $scope.firstLetter + "&view=" + $scope.activeTab + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup;
                } else if ($scope.firstLetter !== null) {
                    newQueryString = "?firstLetters=" + $scope.firstLetter + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup;
                } else if ($scope.activeTab !== null) {
                    newQueryString = "?view=" + $scope.activeTab + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup;
                } 
            }
            else if ($scope.firstLetter === null) {
                newQueryString = "?view=" + $scope.activeTab + "&sortingType=" + $scope.activeGroup;
            } else if ($scope.filterModel.query === "") {
                newQueryString = "?firstLetters=" + $scope.firstLetter + "&view=" + $scope.activeTab + "&sortingType=" + $scope.activeGroup;
            }

            if ($scope.filterModel.vendor != null) {
                newQueryString += "&vendor=" + $scope.filterModel.vendor;
            }
            window.history.pushState("object or string", "Title", newQueryString + getCritsOnUrl());
        };

        $scope.choiceCategory = function (categoryId, categoryName) {
            if (categoryId === $scope.activeCategoryId) {
                return;
            }

            $scope.categoryLoading = true;
            $scope.loading = true;
            $scope.itemsVisible = false;
            $scope.initFilterModel(categoryId, categoryName);

            $scope.searchProducts();
            $scope.activeCategoryId = categoryId;
        };

        $scope.initCategory = function (categoryId, categoryName, c) {
            if ($scope.categories.indexOf(categoryId) < 0)
                $scope.categories.push(categoryId);
        };

        var addRemoveCategoryToUrl = function (criterionId) {
            var newCritId = criterionId.toString();
            var critsOnUrl = characteristicsService.getParamsFromUrl("crit");
            var currUrl = window.location.href;
            var alreadyContainsParams = false;

            if (currUrl.indexOf("?") > -1) {
                alreadyContainsParams = true;
            }

            if (critsOnUrl === null) {
                critsOnUrl = newCritId;
                if (alreadyContainsParams) {
                    window.history.pushState("object or string", "Title", window.location.href + "&crit=" + critsOnUrl);
                } else {
                    window.history.pushState("object or string", "Title", "?crit=" + critsOnUrl);
                }
            } else {
                var newParams = "";
                if (critsOnUrl.indexOf(newCritId) > -1) {
                    var regex = new RegExp(newCritId, "g");
                    newParams = critsOnUrl.replace(regex, "").replace(/,,/g, ",");
                    if (newParams.charAt(0) === ",") {
                        newParams = newParams.slice(1);
                    }

                } else {
                    newParams = critsOnUrl + "," + newCritId;
                }

                if (newParams.charAt(newParams.length - 1) === ",") {
                    newParams = newParams.slice(0, -1);
                }

                if (newParams === "") {
                    if (window.location.href.indexOf("&crit=") > -1) {
                        window.history.pushState("object or string", "Title", window.location.href.replace("&crit=" + critsOnUrl, newParams));
                    } else {
                        var newUrl = window.location.href.replace("?crit=" + critsOnUrl, "?").replace("?&", "?");
                        if (newUrl.charAt(newUrl.length - 1) === "?") {
                            newUrl = newUrl.slice(0, -1);
                        }
                        window.history.pushState("object or string", "Title", newUrl);
                    }
                    
                } else {
                    window.history.pushState("object or string", "Title", window.location.href.replace(critsOnUrl, newParams));
                }
            }

            critsOnUrl = characteristicsService.getParamsFromUrl("crit");
            if (critsOnUrl === null) {
                criteriasInUrl = [];
            } else {
                criteriasInUrl = critsOnUrl.split(",");
            }
        };

        $scope.selectCriteria = function (criterion, group, skipFind, checked = false) {
            $scope.itemsVisible = false;
            var foundCriterion = null;
            var array = [];

            for (var i = 0; i < $scope.filterModel.selectedCriterias.length; i++) {
                if ($scope.filterModel.selectedCriterias[i].ID === criterion.id) {
                    foundCriterion = $scope.filterModel.selectedCriterias[i];
                }
            }

            if(!skipFind)
                addRemoveCategoryToUrl(criterion.id);

            if (foundCriterion === null) {
                $scope.filterModel.selectedCriterias.push({
                    Сriterion: criterion,
                    GroupId: group.id,
                    ID: criterion.id,
                    Name: criterion.name,
                    isChecked: checked ? true : criterion.boolValue
                });
                for (i = 0; i < $scope.filterModel.selectedCriterias.length; i++) {
                    if ($scope.filterModel.selectedCriterias[i].isChecked !== false) {
                        array.push($scope.filterModel.selectedCriterias[i].ID);
                    }
                }
            } else {
                foundCriterion.isChecked = criterion.boolValue;
                console.log(array);
                for (i = 0; i < $scope.filterModel.selectedCriterias.length; i++) {
                    if ($scope.filterModel.selectedCriterias[i].isChecked !== false) {
                        array.push($scope.filterModel.selectedCriterias[i].ID);
                    }
                }
            }

            if (checked)
                criterion.boolValue = checked;

            $scope.currentPage = 0;

            if (skipFind !== undefined && skipFind === false && requestAllowed) {
                // prevent the second call to the function
                debounceRequests();
                // also, give time for the input to register on the label
                setTimeout(function () {
                    // finally, send an http request
                    $scope.findProducts();
                }, 0);
            }

            $scope.categoryLoading = false;

        };

        $scope.activeMainFilter = function (criterion) {
            const result = $scope.filterModel.selectedCriterias.filter(item => item.ID === criterion.id);
            return result.length !== 0;
        }

        $scope.selectMainFilter = function (criterion, group, skipFind, checked = false) {

            var array = [];
            const myArray = window.location.href.split("?crit");
            window.history.pushState("object or string", "Title", myArray[0] + "?crit=" + criterion.id);
            $scope.filterModel.selectedCriterias = [];
            $scope.itemsVisible = false;
            var foundCriterion = null;
            var array = [];

            for (var i = 0; i < $scope.filterModel.selectedCriterias.length; i++) {
                if ($scope.filterModel.selectedCriterias[i].ID === criterion.id) {
                    foundCriterion = $scope.filterModel.selectedCriterias[i];
                }
            }

           
            if (foundCriterion === null) {
                $scope.filterModel.selectedCriterias.push({
                    Сriterion: criterion,
                    GroupId: group.id,
                    ID: criterion.id,
                    Name: criterion.name,
                    isChecked: true 
                });
                for (i = 0; i < $scope.filterModel.selectedCriterias.length; i++) {
                    if ($scope.filterModel.selectedCriterias[i].isChecked !== false) {
                        array.push($scope.filterModel.selectedCriterias[i].ID);
                    }
                }
            } else {
                foundCriterion.isChecked = criterion.boolValue;
                console.log(array);
                for (i = 0; i < $scope.filterModel.selectedCriterias.length; i++) {
                    if ($scope.filterModel.selectedCriterias[i].isChecked !== false) {
                        array.push($scope.filterModel.selectedCriterias[i].ID);
                    }
                }
            }

            if (checked)
                criterion.boolValue = checked;

            $scope.currentPage = 0;

            if (skipFind !== undefined && skipFind === false && requestAllowed) {
                // prevent the second call to the function
                debounceRequests();
                // also, give time for the input to register on the label
                setTimeout(function () {
                    // finally, send an http request
                    $scope.findProducts();
                }, 0);
            }

            $scope.categoryLoading = false;

        };




        var requestAllowed = true;

        var debounceRequests = function () {
            requestAllowed = false;
            setTimeout(function () {
                requestAllowed = true;
            }, 0);
        };

        $scope.collapsePanel = function ($event) {
            $($event.currentTarget).parent().next().collapse('toggle');
        };

        $scope.productsForPlan = [];
        $scope.planImg = {};

        $scope.planPopover = {};
        var prevPopoverSelector = "";

        getPlacement = function (element) {
            var planWrp = document.getElementById("non-drag-plan-item");

            var planW = planWrp.clientWidth;
            var planH = planWrp.clientHeight;

            var parent = element.parentElement;


            var elemTop = parent.offsetTop;
            var elemLeft = parent.offsetLeft;
            var elemHalfW = element.offsetWidth / 2;
            var elemHalfH = element.offsetHeight / 2;

            var topPos = elemTop + elemHalfH;
            var leftPos = elemLeft + elemHalfW;
            var botPos = planH - topPos;
            var rightPos = planW - elemLeft;

            if (rightPos > 190 && topPos > 100) {
                if (botPos > 140) {
                    return "right";
                } else {
                    return "top";
                }

            } else {
                if (rightPos < 190 && topPos > 100) {
                    if (leftPos < 190) {
                        return "top";
                    } else {
                        return "left";
                    }
                } else {
                    if (rightPos > 190 && topPos < 100 || rightPos < 190 && topPos < 100) {
                        return "bottom";
                    } else {
                        return "top";
                    }
                }
            }
        };

        $scope.replaceStand = function (stand) {
            return stand.replace(/[^\w\s]/gi, '-').split(" ").join("-");
        };

        $scope.showTooltipOnPlan = function (stand, vendorId, vendor) {
            $timeout(function () {
                var standReplaced = stand.replace(/[^\w\s]/gi, '-').split(" ").join("-");
                var currSelector = '.exhib-item[stand=' + standReplaced + '-' + vendorId + ']';
                if (prevPopoverSelector && prevPopoverSelector !== "" && prevPopoverSelector !== currSelector) {
                    $(prevPopoverSelector).popover("hide");
                    prevPopoverSelector = "";
                }
                if (vendor.VendorLogoUrl && vendor.VendorLogoUrl !== "" && vendor.VendorLogoUrl !== " ") {
                    var logo = vendor.VendorLogoUrl.split("?");
                    logo = logo[0] + "?anchor=center&mode=min&height=60";
                    vendorLogo = '<div class="plan-popover-img-wrp"><img class="vendor-logo" src="' + logo + '" /></div>';
                } else {
                    vendorLogo = '<div style="height:10px;"></div>';
                }
                var vendorBlock =
                    '<div class="tooltip-item plan-tooltip-item"><a target="_blank" href="' +
                    vendor.VendorUrl +
                    '">' +
                    vendorLogo +
                    '<h5 class="product-title product-title-popup vendor-name">' +
                    vendor.Vendor +
                    '</h5><div class="vendor-address">' +
                    vendor.VendorAddress1 +
                    '</div> <div class="vendor-address">' +
                    vendor.PostCode + ' ' + vendor.Place +
                    '</div></a></div>' +
                    '<div class="plan-products-ref"><a target="_blank" href="' + vendor.VendorUrl + '#products">' +
                    '<span>Products</span><span class="glyphicon glyphicon-chevron-right"></span></a></div>';

                var popoverTemplate =
                    '<div class="popover plan-popover">' +
                    '<div class="arrow"></div>' +
                    '<div class="popover-content-1">' +
                    '<div class="plan-popover-close-wrp"><span class="glyphicon glyphicon-remove"></span></div>' +
                    vendorBlock +
                    '</div></div>';

                popoverPlacement = getPlacement($('.exhib-item[stand=' + standReplaced + '-' + vendorId + ']')[0]);

                $scope.planPopover = {
                    selector: '[rel=popover]',
                    trigger: 'click',
                    template: popoverTemplate,
                    placement: popoverPlacement,
                    html: true
                };
                $('.exhib-item[stand=' + standReplaced + '-' + vendorId + ']').popover($scope.planPopover);
                $('.exhib-item[stand=' + standReplaced + '-' + vendorId + ']').popover("show");
                prevPopoverSelector = '.exhib-item[stand=' + standReplaced + '-' + vendorId + ']';

                $(".plan-popover-close-wrp > .glyphicon.glyphicon-remove").on('click', function () {
                    $(prevPopoverSelector).popover("hide");
                    prevPopoverSelector = "";
                });
            });
            

        };
        $scope.hideTooltipOnPlan = function (stand, vendorId) {
            var standReplaced = stand.replace(/[^\w\s]/gi, '-').split(" ").join("-");
            $('.exhib-item[stand=' + standReplaced + '-' + vendorId + ']').popover("hide");
            prevPopoverSelector = "";
        };

        $scope.findProducts = function (clearFilters = false) {
            var data = null;
            if (!clearFilters) {
                var searchQuery = getSearchQueryValue();
                $scope.filterModel.query = searchQuery;
                $scope.filterModel.pageNumber = $scope.currentPage;
                $scope.filterModel.pageSize = $scope.itemsPerPage;

                if ($scope.searchType === 1) {
                    $scope.filterModel.sortType = $scope.selectedItem.value;
                }
                else {
                    $scope.filterModel.sortType = $scope.categoriesSearchType;
                }

                if ($scope.firstLetter)
                    $scope.filterModel.firstLetter = $scope.firstLetter;
                data = angular.copy($scope.filterModel);
                data.selectedCriterias = $.grep(data.selectedCriterias, function (item) {
                    return item.isChecked === true;
                });
                data.selectedCriterias = $.map(data.selectedCriterias, function (item) {
                    return item.ID;
                });

                if (criteriasInUrl.length !== 0) {
                    var critsInUrlStr = [];
                    for (var crit of criteriasInUrl) {
                        if(typeof (crit) === "string") {
                            critsInUrlStr.push(crit);
                        }
                    }
                    data.selectedCriterias = data.selectedCriterias.concat(critsInUrlStr);
                }
            } else {
                data = angular.copy($scope.filterModel);
            }
            if (!data.sortType) {
                $scope.categoriesSearchType = 3;
                $scope.order(3, null, true);
                data.sortType = 3;
            }
            searchClientService.findProducts(data).then(function (response) {
                if (response.data.Success) {
                    if (response.data.Object.ExhibsVendorsCount === 0) {
                        if ($scope.activeTab === "plan") {
                            $scope.activeTab = "list";
                            var url = window.location.href;
                            window.history.pushState("object or string", "Title", url.replace("view=plan", "view=list"));
                            $scope.changeOrder(0, true);
                            $scope.changeProductPanelTab('list', true);
                            tabSelector = '#view-tabs a[href=#list-view]';
                            $timeout(function () {
                                $(tabSelector).tab('show');
                                tabSelector = "";
                            });
                            $scope.findProducts();
                            return;
                        } else {
                            if ($scope.activeGroup === 'exhibs-by-vendor' || $scope.activeGroup === 'exhibs-by-product') {
                                $scope.changeOrder(0, true);
                                $scope.changeProductPanelTab('list', true);
                                tabSelector = '#view-tabs a[href=#list-view]';
                                $timeout(function () {
                                    $(tabSelector).tab('show');
                                    tabSelector = "";
                                });
                                $scope.findProducts();
                                return;
                            }
                        }
                        
                    }
                    $scope.showPlanOnWebsite = response.data.Object.ShowPlanOnWebsite;
                    if ($scope.activeTab === "plan" && !$scope.showPlanOnWebsite) {
                        $scope.activeTab = "list";
                    }

                    if ($scope.currentPage > 0)
                        $scope.products = $scope.products.concat(response.data.Object.Results);
                    else {
                        $scope.products = response.data.Object.Results;
                        if ($scope.activeTab === "map" && $scope.mainMapInitialized) {
                            $scope.getMarkersForMap(mainMap);
                        }
                    }

                    if ($scope.filterModel.showPlan && response.data.Object.ResultsForPlan !== null) {
                        $scope.planImg = response.data.Object.PlanImg;
                        $scope.productsForPlan = response.data.Object.ResultsForPlan;
                        $scope.resForPlan = response.data.Object.ProductsForPlan;
                        if ($scope.activeGroup === 'exhibs-by-product') {
                            $scope.productsForPlan = getDistinctProducts(response.data.Object.ProductsForPlan);

                        } else {
                            $scope.productsForPlan = response.data.Object.ProductsForPlan;
                        }
                        if (characteristicsService.getParamsFromUrl("view") || characteristicsService.getParamsFromUrl("view") === "list") {
                            $scope.productChunks = $scope.chunk($scope.resForPlan, 3);
                        } else {
                            $scope.productChunks = $scope.chunk($scope.resForPlan, 1);
                        }
                        
                    } else {
                        $scope.productsForPlan = [];
                        $scope.resForPlan = [];
                        $scope.productChunks = $scope.chunk($scope.products, chunkCounter);
                    }
                    if ($scope.searchType === 0) {
                        if (tabSelector !== null && tabSelector !== "" && tabSelector !== " ") {
                            $timeout(function () {
                                $(tabSelector).tab('show');
                                tabSelector = "";
                            });
                        }
                        $scope.Count = response.data.Object.Count;
                        $scope.VendorsCount = response.data.Object.VendorCount;
                        $scope.ExhibsVendorsCount = response.data.Object.ExhibsVendorsCount;
                        $scope.ExhibsProdsCount = response.data.Object.ExhibsProdsCount;

                        if (productsLen === null || productsLen === 0) {
                            productsLen = $scope.Count;
                        }
                        else {
                            setProductLengthByGroup();
                        }

                    } else {
                        $scope.Count = response.data.Object.Count;
                        productsLen = $scope.Count;
                    }

                    $scope.pageCount = 15;
                    if ($scope.Count < $scope.pageCount)
                        $scope.pageCount = $scope.Count;

                    if (!$scope.productsForMapWasSetted) {
                        $scope.productsForMapWasSetted = true;
                        if (characteristicsService.getParamsFromUrl("view") === "map") {
                            $scope.changeProductPanelTab("map");
                        }
                       
                    }
                    $scope.totalItems = $scope.products.length;
                    showPopularProducts(data);
                    $scope.loading = false;
                }
            }).finally(function (response) {
                $scope.loading = false;
                $scope.itemsVisible = true;
                $scope.categoryLoading = false;

                $(".top-panel-product-search").stick_in_parent({
                    offset_top: 106,
                    parent: '.search-page-content'
                });

                $timeout(function () {
                    //DOM has finished rendering
                    $(document.body).trigger("sticky_kit:recalc");
                });
            });
        };


        var setProductLengthByGroup = function () {
            switch ($scope.activeGroup) {
                case "by-product":
                    productsLen = $scope.Count;
                    break;
                case "by-vendor":
                    productsLen = $scope.VendorsCount;
                    break;
                case "exhibs-by-product": $scope.filterModel.sortType
                    productsLen = $scope.ExhibsProdsCount;
                    break;
                case "exhibs-by-vendor":
                    productsLen = $scope.ExhibsVendorsCount;
                    break;
            }
        };

        var getDistinctProducts = function (productsArr) {
            var tempArr = [];
            for (var pr of productsArr) {
                contains = false;
                for (var tarr of tempArr) {
                    if (pr['VendorId'] === tarr['VendorId']) {
                        contains = true;
                        break;
                    }
                }

                if (!contains) {
                    tempArr.push(pr);
                }
            }

            return tempArr;

        };

        $scope.getDataForMap = function () {
            $scope.findProducts();
        };

        $scope.getMarkersForMap = function (map) {
            $scope.findProductsForMap(map);
        };

        $scope.findProductsForMap = function (map) {
            var mapBounds = map.getBounds();
            var southWest = mapBounds.getSouthWest(), northEast = mapBounds.getNorthEast();
            var searchQuery = getSearchQueryValue();
            var data = angular.copy($scope.filterModel);
            data.pageNumber = 0;
            data.sortType = 3;
            data.pageSize = $scope.itemsOnMap;
            data.ShowMap = true;

            data.selectedCriterias = $.grep(data.selectedCriterias, function (item) {
                return item.isChecked === true;
            });
            data.selectedCriterias = $.map(data.selectedCriterias, function (item) {
                return item.ID;
            });
            data.coordinates = {
                minLatitude: southWest.lat(), minLongitude: southWest.lng(), maxLatitude: northEast.lat(), maxLongitude: northEast.lng()
            };

            if (criteriasInUrl.length !== 0) {
                var critsInUrlStr = [];
                for (var crit of criteriasInUrl) {
                    if (typeof (crit) === "string") {
                        critsInUrlStr.push(crit);
                    }
                }
                data.selectedCriterias = data.selectedCriterias.concat(critsInUrlStr);
            }

            searchClientService.findProducts(data).then(function (response) {
                if (response.data.Success) {
                    $scope.productsForMap = response.data.Object.Results.reduce((obj, item) => {
                        obj[item["Vendor"]] = item;
                        return obj;
                    }, {});

                    $scope.updateMarkers(map);

                }
            }).finally(function (response) {
                $scope.loading = false;
                $scope.itemsVisible = true;
                $scope.categoryLoading = false;

                $(".top-panel-product-search").stick_in_parent({
                    offset_top: 106,
                    parent: '.search-page-content'
                });

                $timeout(function () {
                    //DOM has finished rendering
                    $(document.body).trigger("sticky_kit:recalc");
                });
            });
        };

        function hideZeroProductsCategories(productsInCategoriesCount) {
            if ($scope.initialCategorioesCount === null) {
                $scope.initialCategorioesCount = productsInCategoriesCount;

                $scope.initialCategorioesCount.forEach(function (value, key) {
                    var $categoryCounter = $('#sp_' + value.CategoryId);

                    if (value.Count <= 0) {
                        $categoryCounter
                            .closest(".category-list-item")
                            .hide();
                    }
                });
            }
        }

        var firstLoad = true;// TODO: temp solution

        $scope.infNextPage = function () {
            if ($scope.loading) return;
            if (!firstLoad) {
                $scope.nextPage();
            } else { firstLoad = false; }

            
        };

        var scrollIsInited = false; 
        $scope.infNextPageInit = function () {
            if (!scrollIsInited) {
                scrollIsInited = true;
                return;
            }
            scrollIsInited = true;
            $scope.infNextPage();
        };

        $scope.searchProducts = function () {
            $scope.currentPage = 0;
            $scope.findProducts();
        };


        function getSearchQueryValue() {
            var $searchInput = $(".search-box").find('#query').first();
            if ($searchInput !== null) {
                return $searchInput.val();
            }

            return "";
        }

        //show/hide area/group/criterias
        function showAvailableCriterias(criterias) {
            if (criterias === null || criterias === undefined)
                return;
            var ids = criterias.map(function (c) { return c.CriteriaId; });
            angular.forEach($scope.areas, function (area, key) {
                area.Hide = true;
                angular.forEach(area.Groups, function (group, key) {
                    group.Hide = true;
                    angular.forEach(group.Criterions, function (crit, key) {
                        var res = ids.indexOf(parseInt(crit.ID));
                        if (res >= 0) {
                            area.Hide = false;
                            crit.Hide = false;
                            group.Hide = false;
                        } else {
                            crit.Hide = true;
                        }
                    });
                });
            });
        }

        function updateCategoriesProductsFound(cats) {
            if (cats === null || cats === undefined)
                return;
            $('.items-count').text("");
            cats.forEach(function (value, key) {
                var $categoryCounter = $('#sp_' + value.CategoryId);

                $categoryCounter.text("(" + value.Count + ")");
                if (value.Count <= 0) {
                    $categoryCounter
                        .closest(".category-list-item")
                        .hide();
                }
            });
        }

        function updateAreasProductsFound(areas) {
            if (areas === null || areas === undefined)
                return;
            areas.forEach(function (val, key) {
                var selector = '#area-number-' + val.AreaId;
                $(selector).text("(" + val.Count + ")");
            });
        }

        function updateGroupsProductsFound(groups) {
            if (groups === null || groups === undefined)
                return;
            groups.forEach(function (val, key) {
                var selector = '#group-number-' + val.GroupId;
                $(selector).text("(" + val.Count + ")");
                //updateCriteriasProductsFound(val.ProductsInCriterias);
            });
        }

        function updateCriteriasProductsFound(criterias) {
            if (criterias === null || criterias === undefined)
                return;
            criterias.forEach(function (val, key) {
                var selector = '#crit-number-' + val.CriteriaId;
                $(selector).text("(" + val.Count + ")");

                $('.ui.dropdown').dropdown({ transition: 'fade' });
                $('.sumo-dropdown').SumoSelect();

            });
        }

        function showPopularProducts(data) {
            searchClientService.getPopularProducts(data).then(function (response) {
                if (response.data.Success) {
                    $scope.topProducts = response.data.Object.Results;
                }
            });
        }


        // ------ TAB by references -------
        $scope.references = [];

        $scope.referenceActiveBranch = { Id: -1, Name: "-- Alle Branchen --" };
        $scope.referenceActiveCategory = { Id: -1, Name: "-- Alle Kategorien --" };

        $scope.initReferenceFilterModel = function () {
            $scope.refFilterModel = { Category: $scope.referenceActiveCategory, Branch: $scope.referenceActiveBranch, GroupId: -1 };
        };

        $scope.initReferenceFilterModel();

        $("#reference-categories-select").on("change", function () {
            var categoryId = $('#reference-categories-select').val();
            var categoryName = $('#reference-categories-select :selected').text();

            //gets areas for category
            searchClientService
                .getGroupsByCategoryId(categoryId)
                .then(function (response) {
                    if (response.data.Success) {
                        $scope.referenceActiveCategory.Id = categoryId;
                        $scope.referenceActiveCategory.Name = categoryName;

                        //init reference model for search request       
                        $scope.setCategoryReferenceFilterModel(categoryId, categoryName);

                        $scope.searchReferences($scope.refFilterModel);
                    }
                });
        });

        $("#reference-branches-select").on("change", function () {
            var branchId = $('#reference-branches-select').val();
            var branchName = $('#reference-branches-select :selected').text();

            $scope.referenceActiveBranch.Id = branchId,
                $scope.referenceActiveBranch.Name = branchName;

            //set branch in request model
            $scope.setBranchReferenceFilterModel(branchId, branchName);
            $scope.searchReferences($scope.refFilterModel);
        });

        $("#reference-categories-select").on("change", function () {
            var categoryId = $('#reference-categories-select').val();
            var categoryName = $('#reference-categories-select :selected').text();

            $scope.setCategoryReferenceFilterModel(categoryId, categoryName);
            $scope.searchReferences($scope.refFilterModel);
        });

        $scope.referenceItemTracker = function (item) {
            return item.ReferenceId.toString() + item.ProductId.toString();
        };

        $scope.setCategoryReferenceFilterModel = function (categoryId, categoryName) {
            $scope.refFilterModel.Category.Id = categoryId;
            $scope.refFilterModel.Category.Name = categoryName;
            $scope.currentPage = 0;
        };

        $scope.setBranchReferenceFilterModel = function (branchId, branchName) {
            $scope.refFilterModel.Branch.Id = branchId;
            $scope.refFilterModel.Branch.Name = branchName;
            $scope.currentPage = 0;
        };

        $scope.disableOnlyExhibs = function () {
            $scope.filterModel.isExhibitioner = false;
        };

        $scope.findOnlyExhibitioner = function (sortType) {
            if ($scope.loading) {
                return;
            } else {
                $scope.currentPage = 0;

                $scope.filterModel.isExhibitioner = true;
                if (!$scope.filterModel.isExhibitioner) {
                    $scope.productsForPlan = [];
                }
                if (sortType) {
                    $scope.findProducts(sortType);
                } else {
                    $scope.findProducts();
                }
            }
        };

        $scope.hidePlan = function () {
            $scope.filterModel.showPlan = false;
        };


        $scope.activeTab = "list";

        $scope.changeProductPanelTab = function (currentTab, skipSearch = false) {

            $scope.activeTab = currentTab;
            switch (currentTab) {
                case 'list':
                    $scope.products = [];
                    $scope.hideMap();
                    $scope.hidePlan();
                    $scope.currentPage = 0;
                    if ($scope.activeGroup === $scope.orderTypes[2] || $scope.activeGroup === $scope.orderTypes[3]) {
                        $scope.enableExhibsFind();
                    }
                    if (!skipSearch) {
                        $scope.findProducts();
                    }
                    break;
                case 'map':
                    $scope.hidePlan();
                    $scope.getDataForMap();
                    if ($scope.products && $scope.products.length > 0) {
                        mapOption.center.lat = $scope.products[0].Latitude;
                        mapOption.center.lng = $scope.products[0].Longitude;
                    }
                    $timeout(function () {
                        $scope.wideMap = false;
                        mainMap = new google.maps.Map($('#mainMap')[0], mapOption);
                        $scope.showMap();
                    });
                    break;
                case 'plan':
                    $scope.widePlan = false;
                    if ($scope.activeGroup === $scope.orderTypes[0]) {
                        $scope.activeGroup = $scope.orderTypes[2];
                    } else {
                        if ($scope.activeGroup === $scope.orderTypes[1]) {
                            $scope.activeGroup = $scope.orderTypes[3];
                        }
                    }
                    $scope.hideMap();
                    $scope.dataForPlan();
                    break;

            }
            if ($scope.activeTab) {
                var newQueryString = "?view=" + $scope.activeTab;
                if ($scope.firstLetter !== null && $scope.filterModel.query !== "" && $scope.activeGroup !== null) {
                    newQueryString = "?firstLetters=" + $scope.firstLetter + "&view=" + $scope.activeTab + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup;
                } else if ($scope.firstLetter !== null) {
                    newQueryString = "?firstLetters=" + $scope.firstLetter + "&view=" + $scope.activeTab + "&sortingType=" + $scope.activeGroup;
                } else if ($scope.filterModel.query !== "") {
                    newQueryString = "?view=" + $scope.activeTab + "&query=" + $scope.filterModel.query + "&sortingType=" + $scope.activeGroup + "&firstLetters=" + $scope.firstLetter;
                } else if ($scope.activeGroup !== null && $scope.filterModel.query !== "") {
                    newQueryString = "?view=" + $scope.activeTab + "&sortingType=" + $scope.activeGroup + "&query=" + $scope.filterModel.query;
                } else if ($scope.activeGroup !== null) {
                    newQueryString = "?view=" + $scope.activeTab + "&sortingType=" + $scope.activeGroup;
                }

                if ($scope.filterModel.vendor != null) {
                    newQueryString += "&vendor=" + $scope.filterModel.vendor;
                }

                window.history.pushState("object or string", "Title", newQueryString + getCritsOnUrl());
            }
        };
        $scope.dataForPlan = function () {
            if ($scope.loading) {
                return;
            } else {
                $scope.loading = true;
                $scope.currentPage = 0;
                $scope.filterModel.showPlan = true;
                $scope.filterModel.isExhibitioner = true;
                $scope.findProducts();
            }
        };

        var loadingReferences = false;
        $scope.searchReferences = function (refFilterModel) {
            refFilterModel.pageNumber = $scope.currentPage;
            refFilterModel.pageSize = $scope.itemsPerPage;
            refFilterModel.sortType = $scope.selectedItem.value;

            if ($scope.firstLetter)
                refFilterModel.firstLetter = $scope.firstLetter;

            refFilterModel.query = getSearchQueryValue();
            refFilterModel.sortType = $scope.selectedItem.value;
            if (!loadingReferences) {
                loadingReferences = true;
                searchClientService.findReferences(refFilterModel).then(function (response) {
                    if (response.data.Success) {
                        if ($scope.currentPage > 0)
                            $scope.references = $scope.references.concat(response.data.Object.Results);
                        else
                            $scope.references = response.data.Object.Results;

                        $scope.referenceChunks = $scope.chunk($scope.references, chunkCounter);

                        $scope.Count = response.data.Object.Count;
                        $scope.pageCount = 15;
                        if ($scope.Count < $scope.pageCount)
                            $scope.pageCount = $scope.Count;
                    }
                    $scope.loading = false;
                    $scope.itemsVisible = true;
                    loadingReferences = false;

                });
            }
        };

        $scope.smallMap = function () {
            $scope.wideMap = false;
            $scope.fromWideMap = true;
        };

        $scope.rebindMap = function () {
            if ($scope.mapShown) {
                $timeout(function () {
                    $scope.showMap();
                });
            }
        };

        $scope.showMap = function () {
            if ($scope.info) {
                $scope.info.close();
                $scope.info = null;
            }
            $scope.mapShown = true;
            chunkCounter = 1;
            if ($scope.filterModel.sortType < 3) {
                $scope.scrollColumn = angular.element(document.querySelector('#col-scroll-0-p'));
            } else {
                $scope.scrollColumn = angular.element(document.querySelector('#col-scroll-0-v'));
            }
            $scope.scrollColumn.on('scroll',
                function ($event) {
                    if ($scope.loading)
                        return;
                    
                    let height = $event.currentTarget.clientHeight;
                    let scrollHeight = $event.currentTarget.scrollHeight;
                    let currentScrollPosition = $event.currentTarget.scrollTop;

                    let loadPosition = scrollHeight - height - 50;

                    if (currentScrollPosition > loadPosition) {
                        $scope.infNextPage();
                    }
                });
            $scope.productChunks = $scope.chunk($scope.products, chunkCounter);
            google.maps.event.addListener(mainMap, 'idle', function () {
                $scope.getMarkersForMap(mainMap);
            });
            $scope.mainMapInitialized = true;
        };

        $scope.hideMap = function () {
            $scope.mapShown = false;
            $scope.fromWideMap = false;
            angular.element(document.querySelector('#col-scroll-0')).unbind('scroll');
            chunkCounter = 3;
            $scope.productChunks = $scope.chunk($scope.products, chunkCounter);
        };

        $scope.hideFullMap = function () {
            var zoom = $scope.fullMap.getZoom(), center = $scope.fullMap.getCenter();
            mainMap.setZoom(zoom);
            mainMap.setCenter(center);
            $scope.reassignExistingMarkers(mainMap);
            $scope.hideMap();
        };

        $scope.showFullMap = function () {
            if ($scope.fullMap) {
                var zoom = mainMap.getZoom(), center = mainMap.getCenter();
                $scope.fullMap.setZoom(zoom);
                $scope.fullMap.setCenter(center);
                $scope.reassignExistingMarkers($scope.fullMap);
            }
            $scope.mapIsFull = true;
        };

        $scope.initFullMap = function () {
            var options = angular.copy(mapOption);
            options.zoom = mainMap.getZoom();
            options.center = mainMap.getCenter();
            $scope.fullMap = new google.maps.Map(document.getElementById('full-map-content'), options);
            $scope.reassignExistingMarkers($scope.fullMap);
            google.maps.event.addListener($scope.fullMap, 'idle', function () {
                $scope.getMarkersForMap($scope.fullMap);
            });
        };

        $scope.closeMap = function () {
            var zoom = $scope.fullMap.getZoom(), center = $scope.fullMap.getCenter();
            mainMap.setZoom(zoom);
            mainMap.setCenter(center);
            $scope.reassignExistingMarkers(mainMap);
            $scope.getMarkersForMap(mainMap);
        };


        $scope.savingQuery = false;
        $scope.animationFlag = false;

        $scope.saveSearchQuery = function () {
            if (!$scope.savingQuery) {
                $scope.savingQuery = true;
                $scope.animationFlag = true;
                var url = window.location.href;
                searchClientService.saveSearchQuery(url).then(
                    function (response) {
                        $scope.animationFlag = false;
                        $timeout(function () {
                            $scope.savingQuery = false;
                        }, 1000);
                    },
                    function (err) {
                        $scope.animationFlag = false;
                        $timeout(function () {
                            $scope.savingQuery = false;
                        }, 1000);
                    });
            }
        };
    }])
    .filter('replaceUrlPart', function () {
        return function (url, find, replace) {
            if (!url || !find || !replace) return url;
            return url.replace(new RegExp(find, 'g'), replace);
        };
    });;
angular
    .module("TopsoftApp")
    .factory('characteristicsService', ['$http', function ($http) {
        var characteristics = [];
        var critsInUrl = [];
        function getCategories(crits) {
            if (crits) {
                return $http.get('/umbraco/api/Characteristics/GetCategories?showEmptyCategories=' + true + "&crits=" + crits);
            } else {
                return $http.get('/umbraco/api/Characteristics/GetCategories?showEmptyCategories=' + true);
            }
            
        }

        function getGroups(categoryId) {
            return $http.post('/umbraco/api/Characteristics/GetGroups?categoryId=' + categoryId);
        }

        function getCriteria(groupId) {
            return $http.post('/umbraco/api/Characteristics/GetCriteria?groupId=' + groupId);
        }

        function getCategoriesWithGroups() {
            return $http.post('/umbraco/api/Characteristics/GetCategoriesWithGroups');
        }

        function getGroupsWithCriteria(categoryId) {
            return $http.post('/umbraco/api/Characteristics/GetGroupsWithCriteria?categoryId=' + categoryId);
        }

        function getFullCategoryObj(crits) {
            return $http.post('/umbraco/api/Characteristics/GetFullCategoriesObj?crits=' + crits);
        }

        function getParamsFromUrl(paramName) {
            var url_string = window.location.href;
            if (url_string.indexOf("firstLetters=#") > -1) {
                url_string = url_string.replace("firstLetters=#", "firstLetters=others_symbols");
            }
            var url = new URL(url_string);
            var paramVal = url.searchParams.get(paramName);
            if (paramVal === "others_symbols") {
                return "#";
            }
            return paramVal;
        }

        return {
            getGroupsWithCriteria: getGroupsWithCriteria,
            getCategories: getCategories,
            getGroups: getGroups,
            getCriteria: getCriteria,
            getCategoriesWithGroups: getCategoriesWithGroups,
            characteristics: characteristics,
            critsInUrl: critsInUrl,
            getFullCategoryObj: getFullCategoryObj,
            getParamsFromUrl: getParamsFromUrl
        };
    }]);         ;
angular
    .module("TopsoftApp")
    .controller("CharacteristicsTreeController", ['$scope', '$timeout', '$window', 'characteristicsService', function ($scope, $timeout, $window, characteristicsService) {

        $scope.categoriesModel = [];

        /* when element are not present in DOM we use this function to make collapse animatinons smooth */
        var toggleCollapsible = function ($event, expanded) {
            var cTargetAttr = $($event.currentTarget).find('[data-target]').attr('data-target');
            var $collapsible = $(cTargetAttr);

            $timeout(function () {
                $collapsible.collapse(expanded ? 'show' : 'hide');
            }, 0);
        };


        $scope.categoryExpand = function ($event, category) {
            var that = this;
            if (!this.expanded && !category.groups) {
                $event.stopPropagation();
                characteristicsService.getGroupsWithCriteria(category.id).then(function successCallback(response) {
                    var result = response.data;
                    if (result.success) {
                        category.groups = result.object;
                        for (var group of category.groups) {
                            for (var crt of group.criteria) {
                                if (characteristicsService.critsInUrl.length > 0 && characteristicsService.critsInUrl.indexOf(crt.id.toString()) > -1) {
                                    $scope.selectCriteria(crt, group, true, true);
                                    var idx = $scope.filterModel.selectedCriterias.indexOf(crt.id.toString());
                                    $scope.filterModel.selectedCriterias.splice(idx, 1);
                                }
                            }
                        }
                        toggleCollapsible($event, that.expanded);
                    }
                });
            }

            this.expanded = !this.expanded;
        };

        $scope.mainFilterExpand = function ($event, category) {
            var that = this;
            if (!category.groups) {
                characteristicsService.getGroupsWithCriteria(category.id).then(function successCallback(response) {
                    var result = response.data;
                    if (result.success) {
                        category.groups = result.object;
                        for (var group of category.groups) {
                            for (var crt of group.criteria) {
                                if (characteristicsService.critsInUrl.length > 0 && characteristicsService.critsInUrl.indexOf(crt.id.toString()) > -1) {
                                    $scope.selectCriteria(crt, group, true, true);
                                    var idx = $scope.filterModel.selectedCriterias.indexOf(crt.id.toString());
                                    $scope.filterModel.selectedCriterias.splice(idx, 1);
                                }
                            }
                        }
                    }
                });
            }
        };

        $scope.rerender = function (result) {

                if (result.object) {
                    $scope.categoriesModel = result.object;
                }
                else {
                    $scope.categoriesModel = result;
                }
                characteristicsService.characteristics = $scope.categoriesModel;
        };

        $scope.init = function () {
            var crits = characteristicsService.getParamsFromUrl("crit");
            characteristicsService.getCategories(crits).then(function successCallback(response) {
                $scope.rerender(response.data.object.ctgrInfoViewModels);
                if (crits) {
                    $timeout(function () {
                        for (var item of response.data.object.openedIds) {
                            angular.element('#catrgory-' + item).triggerHandler('click');
                        }
                    });
                }
                $timeout(function () {
                    for (var item of $scope.categoriesModel) {
                        if (item.expanded)
                            angular.element('#catrgory-' + item.id).triggerHandler('click');
                    }
                });
            });
        };
        $scope.init();
    }]);       ;
/*
 Sticky-kit v1.1.2 | WTFPL | Leaf Corcoran 2015 | http://leafo.net
*/
(function(){var b,f;b=this.jQuery||window.jQuery;f=b(window);b.fn.stick_in_parent=function(d){var A,w,J,n,B,K,p,q,k,E,t;null==d&&(d={});t=d.sticky_class;B=d.inner_scrolling;E=d.recalc_every;k=d.parent;q=d.offset_top;p=d.spacer;w=d.bottoming;null==q&&(q=0);null==k&&(k=void 0);null==B&&(B=!0);null==t&&(t="is_stuck");A=b(document);null==w&&(w=!0);J=function(a,d,n,C,F,u,r,G){var v,H,m,D,I,c,g,x,y,z,h,l;if(!a.data("sticky_kit")){a.data("sticky_kit",!0);I=A.height();g=a.parent();null!=k&&(g=g.closest(k));
if(!g.length)throw"failed to find stick parent";v=m=!1;(h=null!=p?p&&a.closest(p):b("<div />"))&&h.css("position",a.css("position"));x=function(){var c,f,e;if(!G&&(I=A.height(),c=parseInt(g.css("border-top-width"),10),f=parseInt(g.css("padding-top"),10),d=parseInt(g.css("padding-bottom"),10),n=g.offset().top+c+f,C=g.height(),m&&(v=m=!1,null==p&&(a.insertAfter(h),h.detach()),a.css({position:"",top:"",width:"",bottom:""}).removeClass(t),e=!0),F=a.offset().top-(parseInt(a.css("margin-top"),10)||0)-q,
u=a.outerHeight(!0),r=a.css("float"),h&&h.css({width:a.outerWidth(!0),height:u,display:a.css("display"),"vertical-align":a.css("vertical-align"),"float":r}),e))return l()};x();if(u!==C)return D=void 0,c=q,z=E,l=function(){var b,l,e,k;if(!G&&(e=!1,null!=z&&(--z,0>=z&&(z=E,x(),e=!0)),e||A.height()===I||x(),e=f.scrollTop(),null!=D&&(l=e-D),D=e,m?(w&&(k=e+u+c>C+n,v&&!k&&(v=!1,a.css({position:"fixed",bottom:"",top:c}).trigger("sticky_kit:unbottom"))),e<F&&(m=!1,c=q,null==p&&("left"!==r&&"right"!==r||a.insertAfter(h),
h.detach()),b={position:"",width:"",top:""},a.css(b).removeClass(t).trigger("sticky_kit:unstick")),B&&(b=f.height(),u+q>b&&!v&&(c-=l,c=Math.max(b-u,c),c=Math.min(q,c),m&&a.css({top:c+"px"})))):e>F&&(m=!0,b={position:"fixed",top:c},b.width="border-box"===a.css("box-sizing")?a.outerWidth()+"px":a.width()+"px",a.css(b).addClass(t),null==p&&(a.after(h),"left"!==r&&"right"!==r||h.append(a)),a.trigger("sticky_kit:stick")),m&&w&&(null==k&&(k=e+u+c>C+n),!v&&k)))return v=!0,"static"===g.css("position")&&g.css({position:"relative"}),
a.css({position:"absolute",bottom:d,top:"auto"}).trigger("sticky_kit:bottom")},y=function(){x();return l()},H=function(){G=!0;f.off("touchmove",l);f.off("scroll",l);f.off("resize",y);b(document.body).off("sticky_kit:recalc",y);a.off("sticky_kit:detach",H);a.removeData("sticky_kit");a.css({position:"",bottom:"",top:"",width:""});g.position("position","");if(m)return null==p&&("left"!==r&&"right"!==r||a.insertAfter(h),h.remove()),a.removeClass(t)},f.on("touchmove",l),f.on("scroll",l),f.on("resize",
y),b(document.body).on("sticky_kit:recalc",y),a.on("sticky_kit:detach",H),setTimeout(l,0)}};n=0;for(K=this.length;n<K;n++)d=this[n],J(b(d));return this}}).call(this);
;
$(function () {

    var $blogsSearchResult = $('#blogsResult');
    $blogsSearchResult.find('a').each(function () {
        makrTaxt($(this));
    });
    var $productsSearchResult = $('#productsResult');
    $productsSearchResult.find('a').each(function () {
        makrTaxt($(this));
    });


    function makrTaxt($wrp) {
        var src_str = $wrp.html();
        var term = pageSetting.query;
        term = term.replace(/(\s+)/, "(<[^>]+>)*$1(<[^>]+>)*");
        var pattern = new RegExp("(" + term + ")", "gi");

        src_str = src_str.replace(pattern, "<mark>$1</mark>");
        src_str = src_str.replace(/(<mark>[^<>]*)((<[^>]+>)+)([^<>]*<\/mark>)/, "$1</mark>$2<mark>$4");

        $wrp.html(src_str);
    }

    var $filtersPanel = $('#FiltersList');

    function bindCustomSelectEvent($wrp, css) {
        $wrp.find('.js-select-wrp').each(function () {
            $(this).addClass(css);
            var $select = $(this).find('select').first();
            var $label = $(this).find('span').first();
            $label.html($select.val());

            $select.on('change', function () {
                $label.html($(this).val());
            });

        });
    }
    //bind multi select
    $filtersPanel.find('.js-topsoft-select-wrp').each(function () {
        $(this).find('select').SumoSelect();
    });
    //bind open/close events for collapse panels by clicking on plus/minus icons
    $filtersPanel.find('.toggle-tab-btn').each(function () {
        $(this).bind('click', function () {
            $(this).parent().next().collapse('toggle');
        });
    });
    //bind check all elements in the panel
    $filtersPanel.find('.area-title > .checkbox-wrp input').each(function () {
        BindMarkChildLevelCheckboxes($(this));
    });
    $filtersPanel.find('.group-title > .checkbox-wrp input').each(function () {
        BindMarkChildLevelCheckboxes($(this));
        BindMarkParentAreaCheckboxes($(this));
    });
    $filtersPanel.find('.criteria-title > .checkbox-wrp input').each(function () {
        BindMarkParentGroupCheckboxes($(this));
    });

    function BindMarkChildLevelCheckboxes($chb, wrp) {
        $chb.on('change', function () {
            if ($(this).is(':checked')) {
                CheckIfLevelChecked(0, 0, $(this));//mark area level as filled

                $(this).parent().parent().next().find('input[type=checkbox]').each(function () {
                    $(this).prop('checked', true);
                    CheckIfLevelChecked(0, 0, $(this));//mark group level as filled
                });

            }
            else {
                $(this).parent().parent().next().find('input[type=checkbox]').each(function () {
                    $(this).prop('checked', false);
                });
            }
        });
    }

    function BindMarkParentAreaCheckboxes($groupCheckbox) {
        $groupCheckbox.on('change', function () {
            if ($(this).is(':checked')) {
                CheckIfLevelChecked(0, 0, $(this));//mark group level as filled
            }
            else {
                CheckIfLevelChecked(-1, 0, $(this));//mark group level as filled
            }

            MarkParentAreaCheckboxes($(this));
        });
    }

    function MarkParentAreaCheckboxes($groupCheckbox) {
        var countOfCheckedGroup = 0;
        var $areaTab = $groupCheckbox.parents('.area-tab');
        //find number of checked groups
        $areaTab.children('.area-content').find('.group-title input[type=checkbox]').each(function () {
            if ($(this).is(':checked')) {
                countOfCheckedGroup++;
            }
        });
        //check/uncheck area chb
        var $areaChb = $areaTab.children('.area-title').find('.checkbox-wrp input[type=checkbox]').first();

        if ($groupCheckbox.is(':checked')) {
            $areaChb.prop('checked', true);
            CheckIfLevelChecked($areaTab.find('.group-title .checkbox-wrp input[type=checkbox]').length, $areaTab.find('.group-title .checkbox-wrp input[type=checkbox].full-level-checked').length, $areaChb);
        }
        else {
            if (countOfCheckedGroup > 0)//check area checkbox
            {
                $areaChb.prop('checked', true);
            }
            else {//uncheck
                $areaChb.prop('checked', false);
            }
            CheckIfLevelChecked($areaTab.find('.group-title .checkbox-wrp input[type=checkbox]').length, countOfCheckedGroup, $areaChb);
        }
    }

    function BindMarkParentGroupCheckboxes($creteriaCheckbox) {
        $creteriaCheckbox.on('change', function () {
            var countOfCheckedCretearias = 0;
            var $groupTab = $(this).parents('.js-group-tab');
            //find number of checked groups
            var $creterias = $groupTab.find('.criteria-title input[type=checkbox]');
            $creterias.each(function () {
                if ($(this).is(':checked')) {
                    countOfCheckedCretearias++;
                }
            });
            //check/uncheck group chb
            var $groupChb = $groupTab.children('.group-title').find('.checkbox-wrp input[type=checkbox]').first();

            if ($(this).is(':checked')) {
                var $groupTab = $(this).parents('.js-group-tab');
                $groupChb.prop('checked', true);
                CheckIfLevelChecked($creterias.length, countOfCheckedCretearias, $groupChb);
                MarkParentAreaCheckboxes($groupChb);


            }
            else {
                if (countOfCheckedCretearias > 0)//check area checkbox
                {
                    $groupChb.prop('checked', true);

                }
                else {//uncheck
                    $groupChb.prop('checked', false);
                }
                CheckIfLevelChecked($creterias.length, countOfCheckedCretearias, $groupChb);
                MarkParentAreaCheckboxes($groupChb);

            }
        });
    }

    function CheckIfLevelChecked(checkedCount, fullCount, $chb) {
        if (checkedCount == fullCount) {
            $chb.addClass('full-level-checked');
        }
        else {
            $chb.removeClass('full-level-checked');
        }
    }
    //by references
    $('#ReferencesList').find('.js-reference-select-wrp').each(function () {
        $(this).find('select').SumoSelect();
    });

    $('body').on('click', '.vendor-address-icon', function (e) {
        e.preventDefault();

        var $modal = $('.vendor-address-modal');
        var $productItem = $(this).closest('.product-item');
        var vendorAddr = $productItem.find('.vendor-address').html();
        var productDescr = $productItem.find('.product-description').html();
        var productTitle = $productItem.find('.product-title').html();
        var productImg = $productItem.find('.img-wrp').html();
        var vendorLogo = $productItem.find('.new-vendor-logo').html();


        $modal.find('.vendor-address').empty().html(vendorAddr);
        $modal.find('.product-description').empty().html(productDescr);
        $modal.find('.product-title').empty().html(productTitle);
        $modal.find('.img-wrp').empty().html(productImg);
        $modal.find('.new-vendor-logo').empty().html(vendorLogo);

        initMap($(vendorAddr).text());

        $modal.modal('show');
    });

    //activate sticky panels on search
    /*$(window).resize(function () {

        window_width = $(window).width();

        if (window_width > 767) {
            make_sticky();
        } else {
            $(".filter-panel").trigger("sticky_kit:detach");
        }

    });

    $(window).load(function () {
        window_width = $(window).width();

        if (window_width > 767) {
            make_sticky();
        } else {
            $(".filter-panel").trigger("sticky_kit:detach");
        }
    }); 

    function make_sticky() {
        $(".filter-panel").stick_in_parent({
            offset_top: 106,
            sticky_class: "filter-panel-stucked",
            recalc_every: 1
        });
    }   */
});

function codeAddress(map, address) {
    var geocoder = new google.maps.Geocoder();

    geocoder.geocode({ 'address': address }, function (results, status) {
        if (status == 'OK') {
            map.setCenter(results[0].geometry.location);
            var marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location
            });
        } else {
            alert('Geocode was not successful for the following reason: ' + status);
        }
    });
}

function initMap(address) {
    if (address) {
        address = address.trim();

        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 15
        });
        var marker = new google.maps.Marker({
            map: map
        });

        codeAddress(map, address);
    }
}
$(window).on('resize', function () { debounceInitPositionTooltip() });

var debounceInitPositionTooltip = debounce(function () {
    destroyTooltip();
    initPositionTooltip();
}, 150);

function destroyTooltip() {
    $('[data-toggle="tooltip"]').tooltip('destroy');
}

function initPositionTooltip() {

    $('[data-toggle="tooltip"]').tooltip({
        placement: tooltipChangePosition()
    });
}

function tooltipChangePosition() {
    var innerWidth = window.innerWidth;
    if (innerWidth < 767) {
        return 'bottom';
    }
    return 'right';
};
