(function () { "use strict"; angular.module("enrDetailsPaneModule") .directive("detailsCandidateSummary", [function () { return { templateUrl: "Scripts/EnrAngular/EnrDetailsPane/detailsCandidateSummary.html", scope: { }, controller: "detailsCandidateSummaryController", restrict: "E" }; }]) .controller("detailsCandidateSummaryController", ["$scope", "$rootScope", "$filter", "detailsViewModeManager", "enrModeManager", "mapSelectedRegion", "detailsData", "participationCalculator", "regionsJsonParser", "officeJsonRegionFilter", "primaryService", "gradientService", "sortDataService", function ($scope,$rootScope, $filter, detailsViewModeManager, enrModeManager, mapSelectedRegion, detailsData, participationCalculator, regionsJsonParser, officeJsonRegionFilter, primaryService, gradientService, sortDataService) { // Visibility Handling var determineVisibility = function () { var isOfficeMode = enrModeManager.isOfficeMode(); var summaryTabWithNoRegionSelected = !mapSelectedRegion.isAnyRegionSelected() && detailsViewModeManager.isSummaryMode(); var isParticipatingRegionSelected = mapSelectedRegion.isAnyRegionSelected() && participationCalculator.isOfficesRegionParticipating(detailsData.getData(), mapSelectedRegion.getSelectedRegionProperties()); var isVisible = isOfficeMode && (isParticipatingRegionSelected || summaryTabWithNoRegionSelected); return isVisible ? "" : "hidden"; }; $scope.componentVisible = determineVisibility(); $scope.$on(detailsViewModeManager.modeChangeEventName, function () { $scope.componentVisible = determineVisibility(); if ($rootScope.OFFICE_CATEGORY_TYPE == "Local") { $scope.componentVisible = "hidden"; } }); $scope.$on(enrModeManager.modeChangeEventName, function () { $scope.componentVisible = determineVisibility(); }); $scope.$on(mapSelectedRegion.regionChangeEventName, function () { $scope.componentVisible = determineVisibility(); }); $scope.$on(detailsData.dataChangedEventName, function () { $scope.componentVisible = determineVisibility(); if (enrModeManager.isOfficeMode() && detailsData.isDataPresent() && $rootScope.OFFICE_CATEGORY_TYPE != "Local") refreshDataBindings(); }); // Data Population var getBindableRaceListFromRaceJson = function (raceListJson, isFromSummaryNode) { var raceList = []; var isPrimary = primaryService.getIsPrimary(); var selectedPartyCode = primaryService.getSelectedParty(); for (var i = 0; i < raceListJson.length; i++) { var curRaceJson = raceListJson[i]; var newRaceListItem = { raceName: curRaceJson.OFFICE_TITLE, candidateList: [] }; var candidateListJson = curRaceJson.Candidates.Candidate; if (candidateListJson.length === undefined) candidateListJson = [candidateListJson]; for (var j = 0; j < candidateListJson.length; j++) { var curCandidateJson = candidateListJson[j]; var partyCode = isFromSummaryNode ? curCandidateJson.PARTY : curCandidateJson.PARTY_ABBREV; // In primary mode, we only show members of the currently selected party. if (isPrimary && partyCode !== selectedPartyCode) continue; var newCandidateListItem = { name: curCandidateJson.NAME_ON_BALLOT, nameLast: curCandidateJson.CandidateName, partyLetter: partyCode, partyColor: curCandidateJson.DISPLAY_COLOR, votes: isFromSummaryNode ? curCandidateJson.TOTAL : curCandidateJson.TOTAL_VOTES, winner: curCandidateJson.isWinner, order: sortDataService.getOrdrerNumber(partyCode) } if (isPrimary && !gradientService.isCurOfficeExcludedFromGradients()) { // Depending on the source of the JSON, we may have to manually grab gradient color if (!curCandidateJson.GRADIENT_COLOR) { var candidateInfoWithGradients = gradientService.getGradientsByParty(curCandidateJson.DISPLAY_COLOR); try{ curCandidateJson.GRADIENT_COLOR = candidateInfoWithGradients!=undefined? $filter("filter")(candidateInfoWithGradients, { NAME_ON_BALLOT: curCandidateJson.NAME_ON_BALLOT })[0].GRADIENT_COLOR : ''; } catch (e) { curCandidateJson.GRADIENT_COLOR = ''; } } newCandidateListItem.gradientColor = curCandidateJson.GRADIENT_COLOR; } newRaceListItem.candidateList.push(newCandidateListItem); } if (newRaceListItem.candidateList.length > 0) { //newRaceListItem.candidateList = sortDataService.sortCandiatesByParty(newRaceListItem.candidateList, 'order', 'votes', 'nameLast'); raceList.push(newRaceListItem); } } // Percentages for (var i = 0; i < raceList.length; i++) { var curRaceItem = raceList[i]; var totalVotes = 0; for (var k = 0; k < curRaceItem.candidateList.length; k++) totalVotes += curRaceItem.candidateList[k].votes; for (var k = 0; k < curRaceItem.candidateList.length; k++) curRaceItem.candidateList[k].percentage = totalVotes !== 0 ? curRaceItem.candidateList[k].votes / totalVotes : 0; } return raceList; } var getStatewideRaceListFromOffCatJson = function (offCatJson) { var raceList = []; var isValidStatewideRaceData = offCatJson.StatewideSummary !== undefined && offCatJson.StatewideSummary !== null && offCatJson.StatewideSummary.Race !== undefined && offCatJson.StatewideSummary.Race !== null; if (isValidStatewideRaceData) { var raceListJson = offCatJson.StatewideSummary.Race; if (raceListJson.length === undefined) raceListJson = [raceListJson]; raceList = getBindableRaceListFromRaceJson(raceListJson, true); } return raceList; } var getRegionalRaceListFromOffCatJson = function (offCatJson, regionProperties) { var raceList = []; var isValidRegionsData = regionsJsonParser.validOfficesRegionsJsonExist(offCatJson); if (isValidRegionsData) { var regionsJson = regionsJsonParser.getOfficesRegionsJsonAsArray(offCatJson); var filteredRegionNodes = officeJsonRegionFilter.getRegionNodes(detailsData.getData(), regionProperties); if (filteredRegionNodes.length > 0) { var regionNode = filteredRegionNodes[0]; var isLocalityBased = regionNode.MAP_JURISDICTION_TYPE === "Locality"; var raceParentNode = isLocalityBased ? regionNode.Races : regionNode.RegionSummary; var raceListJson = raceParentNode.Race; if (raceListJson.length === undefined) raceListJson = [raceListJson]; raceList = getBindableRaceListFromRaceJson(raceListJson, !isLocalityBased); } } return raceList; } var refreshDataBindings = function () { var raceList; var offCatJson = detailsData.getData(); if (mapSelectedRegion.isAnyRegionSelected()) raceList = getRegionalRaceListFromOffCatJson(offCatJson, mapSelectedRegion.getSelectedRegionProperties()); else raceList = getStatewideRaceListFromOffCatJson(offCatJson); $scope.raceList = raceList; angular.element("#candidateDetailsScroll")[0].scrollTop = 0; } $scope.$on(mapSelectedRegion.regionChangeEventName, function () { if (enrModeManager.isOfficeMode() && detailsData.isDataPresent()) refreshDataBindings(); }); $scope.$on("SELECTED_PARTY_CHANGED", function () { if (enrModeManager.isOfficeMode() && detailsData.isDataPresent()) refreshDataBindings(); }); $scope.candidateTitleText = function () { var isVisible = $scope.raceList !== undefined && $scope.raceList !== null && $scope.raceList.length <= 1; return isVisible ? "Candidates" : ""; } }]); }());