define(['quote/quote'], function (quote) { quote.controller('Car', ['$scope', '$rootScope', '$http', '$window', 'Helpers', 'VehicleHelpers', '$timeout', '$mdDialog', function ($scope, $rootScope, $http, $window, Helpers, VehicleHelpers, $timeout, $mdDialog) { if ($scope.Quote.AmendmentMode != "Edit") { eval(document.getElementById("mvdInit").innerHTML); $scope.mvdActive = _mvdActive; } $scope.SetStepHeader('Car information'); $rootScope.NavigationInProgress = true; var firstLoad = true; $scope.checkFirstLoad = function () { var shouldShow = firstLoad; if (firstLoad) { firstLoad = false; } return shouldShow; }; //Tracking Device Description var trackingDialogTemplate = Helpers.dialog("trackingDialog"); function dialogFunction(template, accept, reject) { return function dialogFunctionFunction(event) { $mdDialog.show({ clickOutsideToClose: true, disableParentScroll: false, scope: $scope, preserveScope: true, targetEvent: event, template: template, controller: ['$scope', '$mdDialog', function ($scope, $mdDialog) { $scope.accept = $mdDialog.hide; $scope.cancel = $mdDialog.cancel; }] }).then(accept, reject); } } $scope.showTrackingDeviceDescription = dialogFunction(trackingDialogTemplate, function () { }); //vehicleobject actions //when the currently selected Vehicle changes $scope.changeIndex = function (vehicle) { var index = VehicleHelpers.getVehicleIndex(vehicle); $scope.index = index; $scope.listIndex = VehicleHelpers.getLastVehicleIndexByType($scope.Vehicles[$scope.index], 'IsCar'); $scope.Vehicles[index].HasSeen = true; console.assert($scope.Vehicles && $scope.Vehicles[$scope.index] && $scope.Vehicles[$scope.index].IsCar); }; //when a Vehicle is removed $scope.removeItem = function (vehicle) { var index = VehicleHelpers.getVehicleIndex(vehicle); VehicleHelpers.removeVehicle($scope, index, 'IsCar'); }; //when a Vehicle is added $scope.addItem = function addItem() { window.scrollTo(0, 0); VehicleHelpers.addVehicle($scope, { IsCar: true, OriginalRegularDriverSeqNo: 0, NumberOfWheels: 4, //On #618 this needed to be added to stop required messages MethodOfParkingDay: null, AreaType: null, AreaAccess: null, MethodOfParkingNight: null, AreaTypeNight: null, AreaAccessNight: null }, 'IsCar'); }; $scope.checkisnew = function (year) { if (!$scope.Vehicles.length) return; $scope.IsVehicleAbsoluteantitheft(); if (year == undefined) $scope.DisableIsNew = false; else if ($scope.Quote.AmendmentMode != "Edit") { if (new Date().getFullYear() != year) { $scope.Vehicles[$scope.index].IsNew = "3"; $scope.DisableIsNew = true; } else { $scope.Vehicles[$scope.index].IsNew = "2"; $scope.DisableIsNew = false; } } } // // functions //for suburb autocomplete. TODO: replace with directive $scope.suburbAutocompleteFormatter = function suburbAutocompleteFormatter(value) { if (value && value.SuburbName) { return "" + value.SuburbName + ' ' + value.PostCode; } else { return undefined; } } $scope.getNonRegularDriverSeqNo = function () { if (!$scope.Vehicles[$scope.index].OriginalRegularDriverSeqNo) { $scope.Vehicles[$scope.index].OriginalRegularDriverSeqNo = 0; } if ($scope.Vehicles[$scope.index].RegularDriverSeqNo && $scope.Vehicles[$scope.index].RegularDriverSeqNo > 1) { $scope.Vehicles[$scope.index].OriginalRegularDriverSeqNo = $scope.Vehicles[$scope.index].RegularDriverSeqNo; } $scope.Vehicles[$scope.index].Driver = null; $scope.Quote.Persons[0].IsDriver = false; return (($scope.Vehicles[$scope.index].OriginalRegularDriverSeqNo == $scope.PolicyHolderPersonNumber) ? 0 : $scope.Vehicles[$scope.index].OriginalRegularDriverSeqNo) } //for car model autocomplete. TODO: replace with directive $scope.carAutocompleteFormatter = function carAutocompleteFormatter(value) { if (value && value.Description) { return value.Description.replace(value.Year + ' ', ''); } else { return value; } } $scope.vehicleAutocomplete = function (index) { if ($scope.Vehicles[index].VehicleYear != null) $scope.Vehicles[index].VehicleDescription = undefined; } $scope.checkIfCarSoundAble = function (isAddressTypeNight) { var vechDescription = ($scope.Vehicles[$scope.index].VehicleDescription != null && $scope.Vehicles[$scope.index].VehicleDescription.Description != null && $scope.Vehicles[$scope.index].VehicleDescription.Description.length > 0) ? $scope.Vehicles[$scope.index].VehicleDescription.Description : "Current Vehicle"; var message = "Due to the information you have provided radio cover for your " + vechDescription + " is uninsurable at this time and has been removed from your quote."; var MessageIndex = -1; for (var x in $scope.Quote.GeneralMessages.Error) { if ($scope.Quote.GeneralMessages.Error[x] == message) MessageIndex = x; } if ($scope.Vehicles[$scope.index].RadioValue != null && ($scope.Vehicles[$scope.index].RadioValue.length > 0 || $scope.Vehicles[$scope.index].RadioValue > 0) && ($scope.Vehicles[$scope.index].AddressTypeNight == 'M' || $scope.Vehicles[$scope.index].MethodOfParkingNight == '1' || $scope.Vehicles[$scope.index].MethodOfParkingNight == '2' || $scope.Vehicles[$scope.index].MethodOfParkingNight == '3' || $scope.Vehicles[$scope.index].MethodOfParkingNight == '7')) { $scope.Vehicles[$scope.index].RadioValue = ""; if (MessageIndex == -1) { $scope.Quote.GeneralMessages.Error[$scope.Quote.GeneralMessages.Error.length] = message; $window.scrollTo(0, 0); } } else if (!($scope.Vehicles[$scope.index].AddressTypeNight == 'M' || $scope.Vehicles[$scope.index].MethodOfParkingNight == '1' || $scope.Vehicles[$scope.index].MethodOfParkingNight == '2' || $scope.Vehicles[$scope.index].MethodOfParkingNight == '3' || $scope.Vehicles[$scope.index].MethodOfParkingNight == '7')) { $scope.Quote.GeneralMessages.Error.splice(MessageIndex, 1); } } $scope.GetTrackingList = function (VehicleSequenceNumber) { $http({ method: 'POST', url: "/quote/car/gettrackinglist", params: { referenceNumber: $scope.Quote.ReferenceNumber } }).success(function (data, status, headers, config) { $scope.TrackingList = data; $scope.TrackingListComplete = true; if ($scope.TrackingListComplete && $scope.RadioMinMaxComplete && $scope.CarUseComplete) $rootScope.NavigationInProgress = false; }).error(function (data, status, headers, config) { $scope.TrackingListComplete = true; if ($scope.TrackingListComplete && $scope.RadioMinMaxComplete && $scope.CarUseComplete) $rootScope.NavigationInProgress = false; }); } $scope.GetRadioMinMax = function (VehicleSequenceNumber) { $http({ method: 'POST', url: "/quote/car/getradiominmax", params: { referenceNumber: $scope.Quote.ReferenceNumber } }).success(function (data, status, headers, config) { $scope.Vehicles[$scope.index].RadioMinMax = {} $scope.Vehicles[$scope.index].RadioMinMax = data; $scope.RadioMinMaxComplete = true; if ($scope.TrackingListComplete && $scope.RadioMinMaxComplete && $scope.CarUseComplete) $rootScope.NavigationInProgress = false; }).error(function (data, status, headers, config) { $scope.RadioMinMaxComplete = true; if ($scope.TrackingListComplete && $scope.RadioMinMaxComplete && $scope.CarUseComplete) $rootScope.NavigationInProgress = false; }); } $scope.GetCarUse = function () { $http({ method: 'POST', url: "/quote/car/GetUse", params: { referenceNumber: $scope.Quote.ReferenceNumber, vehicleSequenceNumber: $scope.Vehicles[$scope.index].VehicleSequenceNumber, regularDriverSequenceNumber: $scope.Vehicles[$scope.index].RegularDriverSeqNo } }).success(function (data, status, headers, config) { $scope.VehicleUses = data; //Clear current use if we can't find it var curUseInList = false; $scope.VehicleUses.forEach(function (use) { if (use.Code == $scope.Vehicles[$scope.index].UseCode) { curUseInList = true; } }); if (!curUseInList) { $scope.Vehicles[$scope.index].UseCode = null; } $scope.CarUseComplete = true; if ($scope.TrackingListComplete && $scope.RadioMinMaxComplete && $scope.CarUseComplete) $rootScope.NavigationInProgress = false; }).error(function (data, status, headers, config) { $scope.CarUseComplete = true; if ($scope.TrackingListComplete && $scope.RadioMinMaxComplete && $scope.CarUseComplete) $rootScope.NavigationInProgress = false; }); } hiddenprop($scope, "numberOfCars", function () { //if (!$scope.Quote.AmendmentType) { var numberOfCars = ($scope.Vehicles.filter(function (vehicle) { return (vehicle.IsCar == true); }).length); return numberOfCars; }); function getNumberOfMotorCycles() { return ($scope.Vehicles.filter(function (vehicle) { return (vehicle.IsMotorcycle == true); }).length); } function TackingDeviceFittedChanged(isTrackingDeviceFitted) { if (isTrackingDeviceFitted == "Y") { $scope.Vehicles[$scope.index].AntitheftInstalledList = "Y"; $scope.Vehicles[$scope.index].AntitheftLevelInstalled = "50"; //$scope.Vehicles[$scope.index].AntitheftOption = "Y"; } else { $scope.Vehicles[$scope.index].AntitheftInstalledList = "001"; $scope.Vehicles[$scope.index].AntitheftLevelInstalled = "00"; //$scope.Vehicles[$scope.index].AntitheftOption = " "; } $scope.IsVehicleAbsoluteantitheft(); } function ClearTracking() { if ($scope.Vehicles[$scope.index].AntitheftOption == 'N' && $scope.Vehicles[$scope.index].VehicleFinanced == 'Y') $scope.Vehicles[$scope.index].AntitheftOption == ''; } function fixAreaAccessDay(areatype) { if (areatype == "H") $scope.Vehicles[$scope.index].AreaAccess = "01"; else $scope.Vehicles[$scope.index].AreaAccess = null; } function fixAreaAccessNight(areatype) { if (areatype == "H") $scope.Vehicles[$scope.index].AreaAccessNight = "01"; else $scope.Vehicles[$scope.index].AreaAccessNight = null; } function validateAddress(nv) { var notSameAsRAddress = $scope.Vehicles[$scope.index].AddressTypeDay != 'R' && $scope.Vehicles[$scope.index].AddressTypeDay != 'M'; var address = !!(nv && nv.SuburbName); if ($scope.carFormParkingDay && $scope.carFormParkingDay.SuburbDay && notSameAsRAddress) { $scope.carFormParkingDay.SuburbDay.$setValidity('required', address); } else if ($scope.carFormParkingDay && $scope.carFormParkingDay.SuburbDay) { $scope.carFormParkingDay.SuburbDay.$setValidity('required', true); } } function validateAddressNight(nv) { var notSameAsRAddress = $scope.Vehicles[$scope.index].AddressTypeNight != 'R' && $scope.Vehicles[$scope.index].AddressTypeNight != 'M'; var address = !!(nv && nv.SuburbName); if ($scope.carFormParkingNight && $scope.carFormParkingNight.SuburbNight && notSameAsRAddress) { $scope.carFormParkingNight.SuburbNight.$setValidity('required', address); } else if ($scope.carFormParkingNight && $scope.carFormParkingNight.SuburbNight) { $scope.carFormParkingNight.SuburbNight.$setValidity('required', true); } } function fixAntitheftOption(option, old) { var vehicle = $scope.Vehicles[$scope.index]; //If we receive D from tape is amounts to None or N as we have hardcoded it (RetroRabbit/Budget#1208). //This is because the client is charged for 'Double Theft', because the they don't want to install a tracking device and have no tracking device if (option == "D") { vehicle.AntitheftOption = "N"; vehicle.TrackerYN = "N"; } //Spoke to Justin. In the case we receive Y it means "Own tracker" has been installed (RetroRabbit/Budget#1208). I.e. Person selected Has tracker and install None if (option == "Y") { vehicle.AntitheftOption = "N"; vehicle.TrackerYN = "Y"; } $scope.IsVehicleAbsoluteantitheft(); } // // watches $scope.$watch("Vehicles[index].VehicleFinanced", ClearTracking); $scope.$watch("Vehicles[index].TrackerYN", TackingDeviceFittedChanged); $scope.$watch('Vehicles[index].AreaType', fixAreaAccessDay); $scope.$watch('Vehicles[index].AreaTypeNight', fixAreaAccessNight); $scope.$watch("Vehicles[index].VehicleDescription.Year", function (year) { $scope.checkisnew(year); $scope.setIsVehicleAbsoluteAntiTheft(); }); $scope.$watch("Vehicles[index].AntitheftOption", fixAntitheftOption); $scope.$watch("Vehicles[index].ParkingSuburbAutocomplete", validateAddress, true); $scope.$watch("Vehicles[index].ParkingSuburbAutocompleteNight", validateAddressNight, true); $scope.$watch("Vehicles[index].VehicleFinanced", function (value) { if (value == "Y") { $scope.Vehicles[$scope.index].Sasria = "Y"; $scope.Vehicles[$scope.index].HailCover = "Y"; } //Reset ParkingSuburbAutocomplete objects if ($scope.Vehicles[$scope.index].ParkingSuburbAutocomplete == undefined) $scope.Vehicles[$scope.index].ParkingSuburbAutocomplete = {}; if ($scope.Vehicles[$scope.index].ParkingSuburbAutocompleteNight == undefined) $scope.Vehicles[$scope.index].ParkingSuburbAutocompleteNight = {}; }); // //controller start code $scope.Vehicles = $scope.Quote.Vehicles; $scope.PolicyHolderPersonNumber = $scope.Quote.PolicyHolder.PersonNumber || 1; var extraAmountNeeded = ($scope.Quote.Selection.Motorcycle == true && getNumberOfMotorCycles() == 0) ? 1 : 0; $scope.maxNumberOfCars = (6 - extraAmountNeeded); //startup fixes: populate OriginalRegularDriverSeqNo //select the last car or add a blank one if ($scope.Quote.AmendmentType) { function getRegularDriverDescription(driver) { if (driver.IsPolicyHolder) { return driver.FirstName + ' ' + driver.Surname + ' (Policy Holder)'; } else { return driver.FirstName + ' ' + driver.Surname; } } $scope.drivers = $scope.Quote.Persons.filter(function (v) { return v.FirstName != null; }).map(function (d) { return { key: d.PersonNumber.toString(), value: getRegularDriverDescription(d) }; }); $scope.drivers.push({ key: 0, value: 'New Household Member' }); $scope.drivers.push({ key: -1, value: 'Non Household Member' }); var addDefaultCar = true; if ($scope.Vehicles != undefined) { for (var i = 0; i < $scope.Vehicles.length; i++) { if ($scope.Vehicles[i].IsCar) { $scope.index = i; addDefaultCar = false; } } } if (addDefaultCar || $scope.Quote.Type === 'Amendment') { VehicleHelpers.setupState($scope, 'IsCar'); } } $scope.setIsVehicleAbsoluteAntiTheft = function () { if (!$scope.Vehicles[$scope.index].VehicleDescription) return; if ($scope.Quote.AmendmentType == "Car" && $scope.Quote.AmendmentMode == "Edit") { $scope.VehicleAbsoluteantitheftAsync('Amendment', $scope.Vehicles[$scope.index]); return; } $scope.VehicleAbsoluteantitheftAsync('Lead', $scope.Vehicles[$scope.index]); } $scope.IsVehicleAbsoluteantitheft = function () { if ($scope.Vehicles[$scope.index].TrackerYN == "N" && $scope.Vehicles[$scope.index].AntitheftOption == "N" && $scope.Vehicles[$scope.index].FlagAbsoluteAntiTheft) { $scope.Vehicles[$scope.index].IsVehicleAbsoluteAntiTheft = true; if ($scope.Vehicles[$scope.index].CoverType == 'A' && $scope.Quote.Vehicles.filter(function (v) { return (!v.IsVehicleAbsoluteAntiTheft); }).length == 0) $scope.carFormAboutCar.AntitheftOption.$setValidity("forced", false); else $scope.carFormAboutCar.AntitheftOption.$setValidity("forced", true); } else { $scope.Vehicles[$scope.index].IsVehicleAbsoluteAntiTheft = false; if ($scope.carFormAboutCar && $scope.carFormAboutCar.AntitheftOption) $scope.carFormAboutCar.AntitheftOption.$setValidity("forced", true); } } $scope.VehicleAbsoluteantitheftAsync = function (Type, vehicle) { if (Type == 'Amendment') { $http({ method: 'POST', url: "/quote/car/IsReferenceVehicleAbsoluteantitheft", params: { referenceNumber: $scope.Quote.ReferenceNumber, sequenceNumber: vehicle.VehicleSequenceNumber } }).success(function (data) { if (data && data.BOOL == "1") vehicle.FlagAbsoluteAntiTheft = true; else vehicle.FlagAbsoluteAntiTheft = false; $scope.IsVehicleAbsoluteantitheft(); }); } else { $http({ method: 'POST', url: "/quote/car/IsVehicleAbsoluteantitheft", params: { vehiclekey: vehicle.VehicleDescription.Id, suburbseq: $scope.Quote.RiskAddress.SuburbSequence } }).success(function (data) { if (data && data.BOOL == "1") vehicle.FlagAbsoluteAntiTheft = true; $scope.IsVehicleAbsoluteantitheft(); }); } } //$timeout(function () { // $scope.IsVehicleAbsoluteantitheft(); //}, 0, false); $scope.GetTrackingList(); $scope.GetRadioMinMax(); $scope.GetCarUse(); if ($scope.Vehicles[$scope.index].VehicleYear == null && $scope.Vehicles[$scope.index] != null && $scope.Vehicles[$scope.index].VehicleDescription != null && $scope.isUpdate) $scope.Vehicles[$scope.index].VehicleYear = $scope.Vehicles[$scope.index].VehicleDescription.Year; }]); });