angular.module("headerSearchModule", ["MapService", "UserService", "CartService"]).directive('headerSearch', function ($state, User, Cart, $q, $timeout, Map, Breadcrumb, $mdSidenav) { return { templateUrl: "?component=" + "Directives/HeaderSearch" + "&html", restrict: "E", scope: { isHome: "=", isMenu: "=" }, link: function ($scope) { var init = function () { $scope.user = null; $scope.loaded_user = false; $scope.count = 0; $scope.initSearch(); User.getOb().regAndCall($scope.$id, function () { $scope.loaded_user = false; User.get().then(function (user) { $scope.user = user; $scope.loaded_user = true; }); }); Cart.getOb().regAndCall($scope.$id, function () { Cart.getCart().then(function (response) { $scope.count = response.cart.items.length; }); }); Breadcrumb.getOb().regAndCall($scope.$id, function () { $scope.breadcrumb = Breadcrumb.getBreadcrumb(); }); $scope.$on("$destroy", function () { Breadcrumb.getOb().unreg($scope.$id); Cart.getOb().unreg($scope.$id); User.getOb().unreg($scope.$id); }); }; $scope.initSearch = function () { $scope.real_address = User.getAddress(); $scope.search = { term: $scope.real_address ? $scope.real_address.full : null, address_number: $scope.real_address && $scope.real_address.manual_number ? $scope.real_address.street_number : null, show_address_number: $scope.real_address && $scope.real_address.manual_number, address: null }; }; $scope.loadResults = function () { $scope.search.address = null; $scope.real_address = null; return Map.place($scope.search.term); }; $scope.submitAddress = function () { if ($scope.search.address && $scope.search.address.place_id && !$scope.search.show_address_number) { $scope.generateAddress($scope.search.address); } else if ($scope.search.term && $scope.search.term.trim() !== "" && !$scope.search.show_address_number) { Map.place($scope.search.term).then(function (results) { if (results) { $scope.search.term = results[0].description; $scope.generateAddress(results[0]); } }, function () { }); } else if ($scope.search.term && $scope.search.term.trim() !== "" && $scope.search.show_address_number && $scope.search.address_number && $scope.search.address_number.trim() !== "") { Map.place($scope.search.term).then(function (results) { if (results) { $scope.search.term = results[0].description; $scope.generateAddress(results[0], $scope.search.address_number); } }, function () { }); } else if ($scope.search.term && $scope.search.term.trim() !== "" && $scope.search.show_address_number && (!$scope.search.address_number || $scope.search.address_number.trim() === "")) { angular.element("#header_address_number_input").focus(); } }; $scope.generateAddress = function (result, street_number) { if (result && result.place_id) { Map.geocode(result.place_id).then(function (address) { $scope.real_address = Map.decodeAddress(address, street_number); if ($scope.real_address) { if ($scope.real_address.valid) { $scope.search.show_address_number = $scope.real_address.valid_nonumber || $scope.real_address.manual_number; User.setAddress($scope.real_address); $state.go("Restaurant", null, {reload: true}); } else if ($scope.real_address.valid_nonumber) { $scope.search.show_address_number = true; $scope.search.address_number = null; $timeout(function () { angular.element("#header_address_number_input").focus(); }, 500); } else { $scope.search.show_address_number = false; } } }, function () { }); } }; $scope.toggleMobileMenu = function () { $mdSidenav("mobile-nav").toggle(); }; $scope.go = function (name) { $state.go(name); }; $scope.goBreadcrumb = function (route) { if (route && route.route) { $state.go(route.route, route.params); } }; $scope.logout = function () { User.logout(); $state.go("Home"); }; init(); } }; } );