(function () { "use strict"; angular.module("enrMapModule") .directive("enrCountyModel", [function () { return { templateUrl: "Scripts/EnrAngular/EnrMap/enrCountyModel.html", controller: "enrCountyModelController", scope: {}, restrict: "E" }; }]) .controller("enrCountyModelController", ["$scope","$filter","$timeout", "detailsData", "enrModeManager", "officeJsonRegionFilter","regionsJsonParser","participationCalculator","primaryService","gradientService","sortDataService", function ($scope, $filter,$timeout, detailsData, enrModeManager, officeJsonRegionFilter, regionsJsonParser, participationCalculator, primaryService, gradientService, sortDataService) { var hoverRegionPropertiesData; var hoverRegionIdData; $scope.noResultsForReferendums = "hidden"; $scope.$on("COUNTY_MOUSEOVER", function (event, hoverRegionProperties, hoverRegionId) { hoverRegionPropertiesData = hoverRegionProperties; hoverRegionIdData = hoverRegionId; if (enrModeManager.isOfficeMode()) { refreshDataBindings(); } }); var refreshDataBindingsOfficeMode = function () { $scope.contactTitle = detailsData.getOfficeData().OfficeCategory.OFFICE_CATEGORY_NAME; var regionData = officeJsonRegionFilter.getRegionNodes(detailsData.getOfficeData(), hoverRegionPropertiesData)[0]; if (regionData !== undefined && regionData !== null) { var isCounty = isNaN(regionData.MAP_JURISDICTION_NAME); if (isCounty) $scope.contactRegion = regionData.MAP_JURISDICTION_NAME.toUpperCase() + " COUNTY"; else $scope.contactRegion = "DISTRICT " + regionData.MAP_JURISDICTION_NAME; var addressInfoPresent = regionData.Office_Info !== undefined && regionData.Office_Info !== null; if (addressInfoPresent) { $scope.addressVisibility = ""; var addressJson = regionData.Office_Info; officeDataBinding(addressJson); } else $scope.addressVisibility = "hidden"; } else { $scope.contactRegion = "INDIANA STATE"; $scope.addressVisibility = "hidden"; } var raceList; if (hoverRegionIdData) { var offCatJson = detailsData.getOfficeData(); raceList = getRegionalRaceListFromOffCatJson(offCatJson, hoverRegionPropertiesData); } if (raceList && raceList.length > 0) { $scope.officeVisible = ""; } else { $scope.officeVisible = "hidden"; } $scope.raceList = raceList; } var officeDataBinding = function (addressJson) { $scope.addressOfficeName = addressJson.GENERAL_OFFICE_NAME; $scope.addressLine1 = addressJson.FULL_ADDRESS; $scope.addressLine2 = addressJson.FULL_ADDRESS_LINE2; $scope.addressPhone = addressJson.PHONE; $scope.addressPhoneExtensions = addressJson.PHONE_EXT; if (addressJson.CITY === undefined || addressJson.STATE === undefined || addressJson.ZIP === undefined) $scope.addressCityStateZip = undefined; else $scope.addressCityStateZip = addressJson.CITY + ", " + addressJson.STATE + " " + addressJson.ZIP; } var refreshDataBindingsReferendumsMode = function () { $scope.contactTitle = "Referendums"; if (detailsData.isRefDataPresent()) { $scope.contactRegion = detailsData.getRefData().Region.JURISDICTION_NAME.toUpperCase() + " COUNTY"; $scope.addressVisibility = ""; officeDataBinding(detailsData.getRefData().Region.Office_Info); // Get the flat list of referendums from the Json var flatReferendumData = regionsJsonParser.getReferendumsDetailJsonAsArray(detailsData.getRefData()); // Create a 2D array of the referendums, organized by referendum type. var formattedReferendumData = []; for (var i = 0; i < flatReferendumData.length; i++) { var sortOrder = getOrderNumber(flatReferendumData[i]); // Start a new category if necessary var isNewReferendumCategory = formattedReferendumData.length === 0 || flatReferendumData[i].REFERENDUM_TYPE_NAME !== formattedReferendumData[formattedReferendumData.length - 1].referendumCategoryName; if (isNewReferendumCategory) { formattedReferendumData.push({ referendumCategoryName: flatReferendumData[i].REFERENDUM_TYPE_NAME, referendums: [], order: sortOrder }); } formattedReferendumData[formattedReferendumData.length - 1].referendums.push(flatReferendumData[i]); } // Bind Data $scope.referendumData = sortReferendums(formattedReferendumData); } else { $scope.contactRegion = "Select a County."; $scope.addressVisibility = "hidden"; } } function sortReferendums(data) { return $filter('orderBy')(data, 'order'); } function getOrderNumber(referendum) { var order = 99; if (referendum.REFERENDUM_TYPE_NAME === "Ratification Of State Constitutional Amendment") order = 0; else if (referendum.REFERENDUM_TYPE_NAME === "Local Public Question") order = 1; else if (referendum.REFERENDUM_TYPE_NAME === "Court Of Appeals Judge Retention") order = 2; return order; } var refreshDataBindings = function () { if (enrModeManager.isOfficeMode()) { $scope.officeVisible = ""; $scope.referundumVisible = "hidden"; refreshDataBindingsOfficeMode(); } else if (enrModeManager.isReferendumsMode()) { $scope.referundumVisible = ""; $scope.officeVisible = "hidden"; refreshDataBindingsReferendumsMode(); } $scope.noResultsVisible = determineNoResultsVisibility(); $scope.noResultsForReferendums = determineNoResultsVisibilityForReferendums(); $timeout(function () { $("#divCountyCandidates")[0].scrollTop = 0; $("#divCountyReferendums")[0].scrollTop = 0; }, 100); } $scope.$on(detailsData.dataOffChangedEventName, function () { if (hoverRegionIdData) { refreshDataBindings(); } }); $scope.$on(detailsData.dataRefChangedEventName, function () { if (enrModeManager.isReferendumsMode()) { refreshDataBindings(); } }); // Candidates information $scope.candidateTitleText = function () { var isVisible = $scope.raceList !== undefined && $scope.raceList !== null && $scope.raceList.length <= 1; return isVisible ? "Candidates" : ""; } // Visibility Handling var determineNoResultsVisibility = function () { var isVisible = false; if (enrModeManager.isReferendumsMode()) isVisible = false; else if (enrModeManager.isOfficeMode()) isVisible = !participationCalculator.isOfficesRegionParticipating(detailsData.getOfficeData(), hoverRegionPropertiesData); return isVisible ? "" : "hidden"; }; var determineNoResultsVisibilityForReferendums = function () { var isVisible = false; if (enrModeManager.isReferendumsMode()) isVisible = !participationCalculator.isReferendumsRegionParticipatingFromDetailedJson(detailsData.getRefData()); else if (enrModeManager.isOfficeMode()) isVisible = false; return isVisible ? "" : "hidden"; }; // 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, order: sortDataService.getOrdrerNumber(partyCode) } if (isPrimary && !gradientService.isOfficeExcludedFromGradients($scope.contactTitle)) { // 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); var grdientDetails = candidateInfoWithGradients && $filter("filter")(candidateInfoWithGradients, { NAME_ON_BALLOT: curCandidateJson.NAME_ON_BALLOT })[0]; if (grdientDetails && grdientDetails.GRADIENT_COLOR) curCandidateJson.GRADIENT_COLOR = grdientDetails.GRADIENT_COLOR; else curCandidateJson.GRADIENT_COLOR = ""; } newCandidateListItem.gradientColor = curCandidateJson.GRADIENT_COLOR; } newRaceListItem.candidateList.push(newCandidateListItem); } if (newRaceListItem.candidateList.length > 0) { //newRaceListItem.candidateList = sortCandidatesByVotes(newRaceListItem.candidateList,"votes"); //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 getRegionalRaceListFromOffCatJson = function (offCatJson, regionProperties) { var raceList = []; var isValidRegionsData = regionsJsonParser.validOfficesRegionsJsonExist(offCatJson); if (isValidRegionsData) { var regionsJson = regionsJsonParser.getOfficesRegionsJsonAsArray(offCatJson); var filteredRegionNodes = officeJsonRegionFilter.getRegionNodes(detailsData.getOfficeData(), 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; } }]); }());