(function () { "use strict"; angular.module("enrOfficeSelectionModule", []) .directive("enrOfficeSelection", [function () { // Default selection to first item in list. function link(scope) { var deregisterWatch = scope.$watch("listData", function (newElectionOfficesList) { if (newElectionOfficesList) { for (var i = 0; i < newElectionOfficesList.List.length; i++) { var curOfficeHeading = newElectionOfficesList.List[i]; if (curOfficeHeading.Items && curOfficeHeading.Items.Item && curOfficeHeading.Items.Item.length && curOfficeHeading.Items.Item.length > 0) { // scope.handleOfficeClicked(curOfficeHeading.Items.Item[0]); if (((localStorage.getItem("OfficeCode") != "null" && localStorage.getItem("OfficeCode") != "undefined" && localStorage.getItem("OfficeCode") != null))) { if (((localStorage.getItem("OfficeCode").length > 0))) { scope.handleOfficeClicked(false, JSON.parse(localStorage.getItem("OfficeCode")), '1', false); } else { scope.handleOfficeClicked(false, curOfficeHeading.Items.Item[0], '0', true); } } else { scope.handleOfficeClicked(false, curOfficeHeading.Items.Item[0], '0', true); } break; } } deregisterWatch(); } }); } return { link: link, templateUrl: "Scripts/EnrAngular/Directives/enrOfficeSelection.html", scope: { listData: "=", defaultMap: "=", specialElectionColor: "=" }, restrict: "E", controller: "enrOfficeSelectionController" }; }]) .controller("enrOfficeSelectionController", ["$scope", "$rootScope", "$timeout", "$filter", "jsonDataFetcher", "enrModeManager", "detailsData", "primaryService", "gradientService", "selectedOfficeService", "$q", function ($scope, $rootScope, $timeout, $filter, jsonDataFetcher, enrModeManager, detailsData, primaryService, gradientService, selectedOfficeService, $q) { var mapJsonFileName; var officeSummaryJsonFileName; $scope.$on("SLICK_OFFICE_SELECTION", handleSlickOfficeSelection); var fetchMapData = function () { jsonDataFetcher.fetchMultipleJson([mapJsonFileName, officeSummaryJsonFileName], [false, true], [true, false], function (jsonResults) { var mapJson = jsonResults[0]; var officeSummaryJson = jsonResults[1]; // Update map to match selection $scope.$parent.MapGeoData = mapJson; $scope.$parent.MapElectionData = officeSummaryJson; // Generate a flat candidate list for this office category var raceList = officeSummaryJson.StatewideSummary.Race; if (!angular.isArray(raceList)) raceList = [raceList]; var candidateList = []; raceList.forEach(function (race) { var raceCandidates = race.Candidates.Candidate; if (!angular.isArray(raceCandidates)) raceCandidates = [raceCandidates]; raceCandidates.forEach(function (candidate) { candidateList.push(candidate); }); }); if (primaryService.getIsPrimary() && !gradientService.isCurOfficeExcludedFromGradients()) gradientService.generateOfficeCandidateGradients(candidateList); detailsData.setData(officeSummaryJson); detailsData.setOfficeData(officeSummaryJson); if ($rootScope.defaultOfficeSelection == true) { $rootScope.$broadcast("DEFAULT_OFFICE_CHANGE"); } }); }; $scope.$on("DEFAULT_OFFICE_CHANGE", handleDefaultOfficeSelection); function handleDefaultOfficeSelection() { if ($rootScope.defaultOfficeSelection == true) { $rootScope.CountyCount = 0; var MaxOfficeList; var allCountyData = primaryService.getOfficesList(); allCountyData.forEach(function (officecounty) { var val = officecounty.OfficeCategory; if (typeof (val) != "undefined" && typeof (val.Regions.Region.length) != "undefined") { //check how many county contain valid Races var RaceRegionCount = 0; for (var i = 0; i < val.Regions.Region.length; i++) { var RaceRegion = val.Regions.Region[i]; if (typeof (RaceRegion) != "undefined" && typeof (RaceRegion.Races) != "undefined") { RaceRegionCount += 1; } } //if (val.Regions.Region.length > $rootScope.CountyCount) { if (RaceRegionCount > $rootScope.CountyCount) { //$rootScope.CountyCount = val.Regions.Region.length; $rootScope.CountyCount = RaceRegionCount; MaxOfficeList = officecounty; } } }); if (typeof (MaxOfficeList) != "undefined") detailsData.setData(MaxOfficeList); } } //Handle when office is selected from slick. function handleSlickOfficeSelection(event, officeItem) { var inputOffice = angular.copy(officeItem); var officersListData = primaryService.getOfficesList(); var officeJsonFiles = primaryService.getOfficersJsonData(); $rootScope.defaultOfficeSelection = false; var officeIndex = null; var officeCategoryID = null; //Getting office categoryID. for (var i = 0; i < officersListData.length; i++) { var stateSummaryRacesJson = officersListData[i].StatewideSummary.Race; if (stateSummaryRacesJson.length == undefined) { stateSummaryRacesJson = [officersListData[i].StatewideSummary.Race]; } for (var j = 0; j < stateSummaryRacesJson.length; j++) { if (stateSummaryRacesJson[j].OFFICEID == officeItem.OFFICEID) { officeIndex = i; } } } if (officeIndex != null) { officeCategoryID = officeJsonFiles[officeIndex].split('_')[1]; } officeItem.OFFICECATEGORYID = officeCategoryID; var officeCategoryList = $scope.listData.List; for (var i = 0; i < officeCategoryList.length; i++) { if (officeCategoryList[i].Items != undefined) { var officeCategoryItems = officeCategoryList[i].Items.Item; if (officeCategoryItems.length == undefined) { officeCategoryItems = [officeCategoryList[i].Items.Item]; } for (var j = 0; j < officeCategoryItems.length; j++) { officeCategoryItems[j].IsSelected = false; if (officeCategoryItems[j].OFFICECATEGORYID == officeCategoryID) { officeItem = officeCategoryItems[j]; officeCategoryItems[j].IsSelected = true; } } } } var mapJsonFileName = officeItem.MAPCODE; if (mapJsonFileName === undefined) mapJsonFileName = $scope.defaultMap; var officeSummaryJsonFileName = "OffCatC_" + officeItem.OFFICECATEGORYID; // This could take some time. Show busy working. $rootScope.$broadcast("PUSH_BUSY_WORKING"); // Fetching and Updating office summary. jsonDataFetcher.fetchSingleJson(officeSummaryJsonFileName, true, false, function (jsonResults) { // var mapJson = jsonResults[0]; var officeSummaryJson = jsonResults; // Generate a flat candidate list for this office category var raceList = officeSummaryJson.StatewideSummary.Race; if (!angular.isArray(raceList)) raceList = [raceList]; var candidateList = []; var newRace = {}; raceList.forEach(function (race) { if (race.OFFICEID == inputOffice.OFFICEID) { newRace = race; var raceCandidates = race.Candidates.Candidate; if (!angular.isArray(raceCandidates)) raceCandidates = [raceCandidates]; raceCandidates.forEach(function (candidate) { candidateList.push(candidate); }); } }); officeSummaryJson.StatewideSummary.Race = newRace; officeSummaryJson.OfficeCategory.OFFICE_CATEGORY_NAME = newRace.OFFICE_TITLE; if (primaryService.getIsPrimary() && !gradientService.isCurOfficeExcludedFromGradients()) gradientService.generateOfficeCandidateGradients(candidateList); detailsData.setData(officeSummaryJson); // $scope.handleOfficeClicked(officeItem, '0'); }); // To update map jsonDataFetcher.fetchMultipleJson([mapJsonFileName, officeSummaryJsonFileName], [false, true], [true, false], function (jsonResults) { var mapJson = jsonResults[0]; var officeSummaryJson = jsonResults[1]; // Update map to match selection $scope.$parent.MapGeoData = mapJson; $scope.$parent.MapElectionData = officeSummaryJson; }); } //$scope.DefultSelection = false; $scope.handleOfficeClicked = function (DefaultSelection, clickedListItem, isRefresh, isSplash) { if (!clickedListItem.IsSelected && DefaultSelection) { // This could take some time. Show busy working. $rootScope.$broadcast("PUSH_BUSY_WORKING"); } if (isRefresh == "0") { primaryService.resetselectedNavtab(); localStorage.removeItem("SelectedNavtab"); } selectedOfficeService.setSelectedOffice(clickedListItem); primaryService.setSelectedOffice((clickedListItem)); if (DefaultSelection) { localStorage.setItem("isFirstLogin", false); } if (localStorage.length == 0) { $rootScope.defaultOfficeSelection = true; } else if (localStorage.getItem("isFirstLogin") == "undefined") { $rootScope.defaultOfficeSelection = true; } else if (localStorage.getItem("isFirstLogin") == "null") { $rootScope.defaultOfficeSelection = true; } else if (localStorage.getItem("isFirstLogin") == 'true') { $rootScope.defaultOfficeSelection = true; } else { $rootScope.defaultOfficeSelection = false; } // Deselect any selected items angular.forEach($scope.listData.List, function (listItem) { if (listItem.Items && listItem.Items.Item) { var heading = listItem.Heading; angular.forEach(listItem.Items.Item, function (subItem) { subItem.IsSelected = false; if (clickedListItem.OFFICE_CATEGORY_NAME == subItem.OFFICE_CATEGORY_NAME) { $rootScope.OFFICE_CATEGORY_TYPE = heading; if (localStorage.length == 0) { subItem.IsSelected = false; } else if (localStorage.getItem("isFirstLogin") == "undefined") { subItem.IsSelected = false; } else if (localStorage.getItem("isFirstLogin") == "null") { subItem.IsSelected = false; } else if (localStorage.getItem("isFirstLogin") == 'true') { subItem.IsSelected = false; } else { subItem.IsSelected = true; } } }); } }); //clickedListItem.IsSelected = true; // Fetch Map and Office Summary Data mapJsonFileName = clickedListItem.MAPCODE; if (mapJsonFileName === undefined) mapJsonFileName = $scope.defaultMap; officeSummaryJsonFileName = "OffCatC_" + clickedListItem.OFFICECATEGORYID; if (enrModeManager.getCurMode() != 2) {//Don't set office map data when referendum is active. // This could take some time. Show busy working. //$rootScope.$broadcast("PUSH_BUSY_WORKING"); // Delay execution of syncronous logic to give the busy working effect time to appear before causing ui-locking. $timeout(fetchMapData, 500); } $rootScope.$broadcast("OFFICE_CHANGED"); }; $scope.$on(enrModeManager.modeChangeEventName, function (event, newMode) { if (newMode === enrModeManager.modeEnum.offices) fetchMapData(); }); }]); }());