'use strict';

(function (module) {
    module.service('NotificationService', [
        '$rootScope',
        function ($rootScope) {

            function subscribe(eventname, scope, callback) {
                var handler = $rootScope.$on(eventname, callback);
                scope.$on("$destroy", handler);
            };

            function publish(eventname, data) {
                $rootScope.$emit(eventname, data);
            };

            return {
                publish: publish,
                subscribe: subscribe
            }
        }
    ]);
})(angular.module('AutoSMART.Web.Common'));

'use strict';

(function (module) {
    module.service('ZipCodeService', ['$http', '$q', '$cookies', 'NotificationService', 'Config', function ($http, $q, $cookies, NotificationService, Config) {

        var mainUrl = window.location.protocol + '//' + window.location.host + '/';

        var location = {
            CurrentZipCode: "",
            Latitude: "",
            Longitude: ""
        };
        var cookieName = "user-zip";
        var locationApiUrlRoot = Config.SystemTypesApiUrl;

        var saveZipCode = function (zipCode) {
            location.CurrentZipCode = zipCode;
            $cookies.put(cookieName, zipCode);
            getUserSetLocation(true).then(function() {
                NotificationService.publish("saveZipCode", location);
            });
        };

        function getStates() {
            var deferred = $q.defer();

            var promise = $http({
                method: 'GET',
                url: locationApiUrlRoot + '/Location/GetStates',

                headers: {
                    'Content-Type': 'application/json',
                    'Accept': '*/*',
                    'Accept-Language': 'en-US,en;q=0.8'
                }
            }).then(function (data) {
                if (data.data) {
                    data = data.data;
                }
                deferred.resolve(data);
            }).catch(function (data) {
                deferred.reject(data);
            });
            return deferred.promise;
        };

        function getUserSetLocation(saveToCookie) {
            var deferred = $q.defer();

            var link = mainUrl + 'home/UserLocation/';

            var promise = $http({
                method: 'Post',
                url: link,
                headers: {
                    'Content-Type': 'application/json',
                    'Accept': '*/*',
                    'Accept-Language': 'en-US,en;q=0.8'
                }
            }).then(function (data) {
                if (data.data) {
                    data = data.data;
                }
                if ((location.CurrentZipCode != data.ZipCode) && saveToCookie) {
                    $cookies.put(cookieName, data.ZipCode);
                }
                location.CurrentZipCode = data.ZipCode;
                location.Latitude = data.Latitude;
                location.Longitude = data.Longitude;
                deferred.resolve(data);
            }).catch(function (data) {
                deferred.reject(data);
            });
            return deferred.promise;
        };

        var init = function () {
            return $q.all([
                 getUserSetLocation(false)
            ]);
        };

        return {
            Init: init,
            Location: location,
            SaveZipCode: saveZipCode,
            GetStates: getStates
        }
    }]);

})(angular.module('AutoSMART.Web.Common'));
'use strict';

(function (module) {
    module.service('CalculatorService', ['$http', '$q', function ($http, $q) {
        var cookieName = "PaymentCalculatorSettings";
        var qqSelectedRateTermCookie = 'QQSelections';
        var qqSelectedNewRateTermCookie = 'QQNewRateSelections';    
        
        var mainUrl = window.location.protocol + '//' + window.location.host + '/';
        var calcContent = {
            LoanTerms: [],
            Rate: 0.0,
            RelativeRate: 0.0,
            CreditScore: [],
            CurrentSelectedScore: {},
            LoanDuration: 0,
            RelativeLoanDuration: 0,
            CashRebate: 0,
            TradeInValue: 0,
            AmountOwed: 0,
            DownPayment: 0
        };        

        var defaultOptions = {
            CreditScoreDisplay: ['Poor', 'Average', 'Good', 'Excellent'],
        };

        var init = function () {            
            return $q.all([
                getCalculatorContent()
                .then(function(data) {
                    calcContent.LoanTerms = [];
                    angular.forEach(data.LoanTerms, function(term) {
                        calcContent.LoanTerms.push(term.Months);
                    });

                    calcContent.CreditScore = [];
                    angular.forEach(data.CreditScore, function(score) {
                        var obj = {
                            "Id": score.CreditScoreRateId,
                            "Score": score.CreditScore,
                            "MinRate": score.MinRate,
                            "MaxRate": score.MaxRate
                        };
                        calcContent.CreditScore.push(obj);

                        if (score.CreditScore === "Good") {
                            calcContent.CurrentSelectedScore = obj;
                        }
                    });

                    calcContent.LoanDuration = data.DefaultTerm;
                    calcContent.RelativeLoanDuration = data.DefaultTerm;
                    calcContent.Rate = data.Rate;
                    calcContent.RelativeRate = data.Rate;

                    updateQQSelection(getQQSelection());
                    updateQQSelection(getNewQQSelection());

                    getCookieSetting();
                })
            ]);
        };

        var getQQSelection = function () {
            return JSON.parse($.cookie(qqSelectedRateTermCookie)
                ? $.cookie(qqSelectedRateTermCookie)
                : localStorage.getItem(qqSelectedRateTermCookie));
        };

        var getNewQQSelection = function () {
            return JSON.parse($.cookie(qqSelectedNewRateTermCookie)
                ? $.cookie(qqSelectedNewRateTermCookie)
                : localStorage.getItem(qqSelectedNewRateTermCookie));
        };

        var updateQQSelection = function (qqSelection) {
            if (qqSelection) {
                var obj = {
                    "Id": 99,
                    "Score": "QuickQuote",
                    "MinRate": qqSelection.approvedRate,
                    "MaxRate": qqSelection.approvedRate
                };
                calcContent.CreditScore.push(obj);
                calcContent.CurrentSelectedScore = obj;
                if (qqSelection.loanProduct.toLowerCase() === 'used auto') {
                    localStorage.setItem(qqSelectedRateTermCookie, JSON.stringify(qqSelection));
                    calcContent.RelativeLoanDuration = qqSelection.approvedTerm;
                    calcContent.RelativeRate = qqSelection.approvedRate;
                } else {
                    localStorage.setItem(qqSelectedNewRateTermCookie, JSON.stringify(qqSelection));
                    calcContent.LoanDuration = qqSelection.approvedTerm;
                    calcContent.Rate = qqSelection.approvedRate;
                }
            }
        };

        var updateDownPayment = function (downPayment) {
            if (downPayment) {
               
                calcContent.DownPayment = downPayment;
            }
        };

        function getCalculatorContent() {
            var deferred = $q.defer();

            var promise = $http({
                method: 'GET',
                url: mainUrl + '/Search/GetCalculatorContent',

                headers: {
                    'Content-Type': 'application/json',
                    'Accept': '*/*',
                    'Accept-Language': 'en-US,en;q=0.8'
                }
            }).then(function (data) {
                if (data.data) {
                    data = data.data;
                }
                deferred.resolve(data);
            }).catch(function (data) {
                deferred.reject(data);
            });
            return deferred.promise;
        };

        function saveCookieSetting() {
            var obj = formatCalculatorSettingsForCookie();
            $.cookie(cookieName, JSON.stringify(obj), { path: '/', secure: true });
        };        

        function getCookieSetting() {
            var cookie = $.cookie(cookieName);
            if (typeof cookie != 'undefined') {
                var selectedOptions = JSON.parse(cookie);
                if (selectedOptions !== null || selectedOptions !== undefined) {
                    calcContent.AmountOwed = selectedOptions.AmountOwned;
                    calcContent.CashRebate = selectedOptions.CashRebate;
                    calcContent.DownPayment = selectedOptions.DownPayment;
                    calcContent.LoanDuration = selectedOptions.LoanDuration;
                    calcContent.TradeInValue = selectedOptions.TradeIn;
                    angular.forEach(calcContent.CreditScore, function(score) {
                        if (score.Id == selectedOptions.SelectedCreditScoreId) {
                            calcContent.CurrentSelectedScore = score;
                        }
                    });
                }
            }
        }

        function formatCalculatorSettingsForCookie() {
            return {
                AmountOwned: calcContent.AmountOwed,
                CashRebate: calcContent.CashRebate,
                DownPayment: calcContent.DownPayment,
                LoanDuration: calcContent.LoanDuration,
                SelectedCreditScoreId: calcContent.CurrentSelectedScore.Id,
                TradeIn: calcContent.TradeInValue,
                maxApr: calcContent.CurrentSelectedScore.MaxRate,
                minApr: calcContent.CurrentSelectedScore.MinRate
            };
        }

        var getFraction = function(interest, loanDUration) {
            var a = (1 + interest / 1200);
            var x = Math.pow(a, parseInt(loanDUration));
            x = 1 / x;
            x = 1 - x;
            return x;
        };


        var discountedAmount = function (downPayment, tradeInValue, cashRebate) {
            return downPayment + tradeInValue + cashRebate;
        };
        function calculatePayment(price, interest) {
            var payment = 0;

            if (interest === 0)
                interest = 0.1;

            var cashRebate = isNaN(calcContent.CashRebate) ? 0 : calcContent.CashRebate;
            var downPayment = isNaN(calcContent.DownPayment) ? 0 : calcContent.DownPayment;
            var tradeIn = isNaN(calcContent.TradeInValue) ? 0 : calcContent.TradeInValue;
            var amountOwed = isNaN(calcContent.AmountOwed) ? 0 : calcContent.AmountOwed;

            var totalLoanAmount = price - discountedAmount(downPayment, tradeIn, cashRebate) + parseInt(amountOwed);

            var fraction = getFraction(interest, calcContent.LoanDuration);

            payment = (totalLoanAmount) * (interest / 1200) / fraction;
            return payment;
        }

        var calculateAffordability = function (calculatorValues) {
            var desiredMonthlyPayment =isNaN(calculatorValues.DesiredMonthlyPayment)?0: parseFloat(calculatorValues.DesiredMonthlyPayment);
            var selectedTerm = isNaN(calculatorValues.DesiredMonthlyPayment)?0:parseFloat(calculatorValues.SelectedTerm);
            var interestRate = isNaN(calculatorValues.InterestRate)?0:parseFloat(calculatorValues.InterestRate);
            var downPayment = isNaN(calculatorValues.DownPayment)?0:parseFloat(calculatorValues.DownPayment);
            var tradeInValue = isNaN(calculatorValues.TradeInValue)?0:parseFloat(calculatorValues.TradeInValue);
            var cashRebate = isNaN(calculatorValues.CashRebate) ? 0 : parseFloat(calculatorValues.CashRebate);

            var tmpDownPayment = discountedAmount(downPayment, tradeInValue, cashRebate);
            interestRate = interestRate / 100;
            if (interestRate === 0.0)
                interestRate = 0.001;
            interestRate = interestRate * 100;

            var fraction = getFraction(interestRate, selectedTerm);

            var totalLoanAmount = (parseFloat(desiredMonthlyPayment) * fraction) / (parseFloat(interestRate) / 1200);
            var loanPrice = Math.ceil(totalLoanAmount);
            return Math.ceil(parseInt(loanPrice) + tmpDownPayment);
        };

        var calculateTotalLoanAmount = function (purchasePrice, cashRebate, tradeInValue, amountOwed, downPayment) {
            return purchasePrice - discountedAmount(downPayment, tradeInValue, cashRebate) + amountOwed;
        }

        var calculateMonthly = function (calculatorValues) {
            var purchasePrice = isNaN(calculatorValues.PurchasePrice) ? 0 : parseFloat(calculatorValues.PurchasePrice);
            var selectedTerm = isNaN(calculatorValues.SelectedTerm) ? 0 : parseFloat(calculatorValues.SelectedTerm);
            var interestRate = isNaN(calculatorValues.InterestRate) ? 0 : parseFloat(calculatorValues.InterestRate);
            var downPayment = isNaN(calculatorValues.DownPayment) ? 0 : parseFloat(calculatorValues.DownPayment);
            var tradeInValue = isNaN(calculatorValues.TradeInValue) ? 0 : parseFloat(calculatorValues.TradeInValue);
            var cashRebate = isNaN(calculatorValues.CashRebate) ? 0 : parseFloat(calculatorValues.CashRebate);
            var amountOwed = isNaN(calculatorValues.AmountOwed) ? 0 : parseFloat(calculatorValues.AmountOwed);

            var payment = 0;
            if (interestRate === 0)
                interestRate = 0.1;


            var totalLoanAmount = calculateTotalLoanAmount(purchasePrice, cashRebate, tradeInValue, amountOwed, downPayment);


            var fraction = getFraction(interestRate, selectedTerm);

            payment = (totalLoanAmount) * (interestRate / 1200) / fraction;
            return payment;
          
        };
        var getPriceRangeForSearch = function (price) {
            price = parseInt(price);
            var priceincrement = 1000;
            var lower, upper;
            if (price > 101000) {
                lower = 100000;
                upper = null;
            } else {
                lower = (price - priceincrement) / priceincrement;
                lower = Math.round(lower) * priceincrement;
                upper = (price + priceincrement) / priceincrement;
                upper = Math.round(upper) * priceincrement;
                if (lower < 0) {
                    lower = 0;
                    upper = priceincrement + priceincrement;
                }
                if (upper >= 101000) {
                    upper = null;
                }
            }
            return "/Search/?MinPrice=" + lower + "&MaxPrice=" + upper + "&NewSearch=1";
        };

        return {
            Init: init,
            CalcContent: calcContent,
            SaveCookieSetting: saveCookieSetting,
            CalculatePayment: calculatePayment,
            DefaultOptions: defaultOptions,
            CalculateAffordability: calculateAffordability,
            CalculateMonthly: calculateMonthly,
            GetPriceRangeForSearch: getPriceRangeForSearch,
            UpdateQQSelection: updateQQSelection,
            UpdateDownPayment: updateDownPayment
        };
    }]);

})(angular.module('AutoSMART.Web.Common'));
'use strict';

(function (module) {
    module.service('QuickQuoteService', ['$http', '$q', 'CalculatorService', 'Config',
        function ($http, $q, CalculatorService, Config) {   
        var qqResultCookieName = 'qqresult';
        var qqProcessStatusCookie = 'QQStatus';
        var qqRejectReasonCookie = 'qqRejectReason';
        var qqSelectedRateTermCookie = 'QQSelections';        
        var qqSelectedNewRateTermCookie = 'QQNewRateSelections';        
        var preQualFormDataCookie = 'preQualForm';
        var creditUnionName = Config.ClientName;
        var currentDateTime = new Date();
        currentDateTime = currentDateTime.toISOString();

        var getQQSelection = function () {
            return JSON.parse($.cookie(qqSelectedRateTermCookie)
                ? $.cookie(qqSelectedRateTermCookie)
                : localStorage.getItem(qqSelectedRateTermCookie));
        };

        var getNewQQSelection = function () {
            return JSON.parse($.cookie(qqSelectedNewRateTermCookie)
                ? $.cookie(qqSelectedNewRateTermCookie)
                : localStorage.getItem(qqSelectedNewRateTermCookie));
        };

        var saveQQSelection = function (newSelected, usedSelected) {
            $.cookie(qqSelectedRateTermCookie, JSON.stringify(usedSelected), { path: '/', secure: true });
            $.cookie(qqSelectedNewRateTermCookie, JSON.stringify(newSelected), { path: '/', secure: true });
            if (!$.cookie(qqSelectedRateTermCookie) || !$.cookie(qqSelectedNewRateTermCookie)) {
                localStorage.setItem(qqSelectedNewRateTermCookie, JSON.stringify(newSelected));
                localStorage.setItem(qqSelectedRateTermCookie, JSON.stringify(usedSelected));
            }
            };

        var getQQProcessResultCookie = function () {
            return $.cookie(qqProcessStatusCookie)
                ? $.cookie(qqProcessStatusCookie)
                : localStorage.getItem(qqProcessStatusCookie);
        };

        var getQQResultCookie = function () {
            return JSON.parse($.cookie(qqResultCookieName)
                ? $.cookie(qqResultCookieName)
                : localStorage.getItem(qqResultCookieName));
        };

        var getQQRejectReason = function () {
            return JSON.parse($.cookie(qqRejectReasonCookie)
                ? $.cookie(qqRejectReasonCookie)
                : localStorage.getItem(qqRejectReasonCookie));
        };

        var saveQQProcessResultCookie = function () {
            $.cookie(qqProcessStatusCookie, true, { path: '/', secure: true });
            if (!$.cookie(qqProcessStatusCookie)) {
                localStorage.setItem(qqProcessStatusCookie, true);
            }
        };

        var saveQQResultCookie = function (data) {
          saveDeclineReasonCookie(data);
            if (data && (data.responseCode != 500)) {
                if ((data.lenderResponses[0].decision) && (data.lenderResponses[0].decision != null)) {
                    if (data.lenderResponses[0].decision.toUpperCase().trim() === 'APPROVED' || data.lenderResponses[0].decision.toUpperCase().trim() === 'APPROVE') {
                        var strObj = JSON.stringify(data);
                        $.cookie(qqResultCookieName, strObj, { path: '/', secure: true });
                        if (!$.cookie(qqResultCookieName)) {
                            localStorage.setItem(qqResultCookieName, strObj);
                            removeQQRejectReasonCookie();
                        }
                    }
                    else {
                        removeQQResultCookie();
                    }
                }
                else {
                    removeQQResultCookie();
                }
            }
            else {
                removeQQResultCookie();
            }
        };

            var saveDeclineReasonCookie = function (data) {
                removeQQResultCookie();
            if (data && (data?.responseCode == 500) && (data?.responseMessage)) {
                    var strObj = JSON.stringify(data.responseMessage);
                    $.cookie(qqRejectReasonCookie, strObj, { path: '/', secure: true });
                    if (!$.cookie(qqRejectReasonCookie)) {
                        localStorage.setItem(qqRejectReasonCookie, strObj);
                    }
                }
                else {
                if ((data?.lenderResponses[0]?.decision == null) || (data?.lenderResponses[0]?.decision?.toUpperCase().trim() != 'APPROVED' && data?.lenderResponses[0]?.decision?.toUpperCase().trim() != 'APPROVE')) {


                    if (data.lenderResponses[0].reasons) {
                        var strObj = JSON.stringify(data.lenderResponses[0].reasons);
                        $.cookie(qqRejectReasonCookie, strObj, { path: '/', secure: true });
                        if (!$.cookie(qqRejectReasonCookie)) {
                            localStorage.setItem(qqRejectReasonCookie, strObj);
                        }
                    }
                    else if (data.lenderResponses[0].responseMessage) {
                        var strObj = JSON.stringify(data.lenderResponses[0].responseMessage);
                        $.cookie(qqRejectReasonCookie, strObj, { path: '/', secure: true });
                        if (!$.cookie(qqRejectReasonCookie)) {
                            localStorage.setItem(qqRejectReasonCookie, strObj);
                        }
                    }
                    
                        
                    }
                    
                }
        };

        var removeQQRejectReasonCookie = function () {
           $.removeCookie(qqRejectReasonCookie);
                if (localStorage.getItem(qqRejectReasonCookie)) {
                    localStorage.removeItem(qqRejectReasonCookie);
                    }
        };

        var removeQQResultCookie = function () {
            $.removeCookie(qqResultCookieName);
                if (localStorage.getItem(qqResultCookieName)) {
                    localStorage.removeItem(qqResultCookieName);
                }
        };

        var savePreQualFormData = function (data) {
            sessionStorage.setItem("qqSessionResult", JSON.stringify(data));
            $.cookie(preQualFormDataCookie, JSON.stringify(data), { path: '/', secure: true });
            if (!$.cookie(preQualFormDataCookie)) {
                localStorage.setItem(preQualFormDataCookie, JSON.stringify(data));
            }
        };

            var getPreQualFormData = function () {            
            return JSON.parse($.cookie(preQualFormDataCookie)
                ? $.cookie(preQualFormDataCookie)
                : localStorage.getItem(preQualFormDataCookie));
        };

        var getRates = function (loanAmount) {
            try {
                var data = getQQResultCookie();
                if (data && (data.lenderResponses[0].decision.toUpperCase().trim() === 'APPROVED' || data.lenderResponses[0].decision.toUpperCase().trim() === 'APPROVE')) {
                    if (data && data.lenderResponses[0].results) {
                        var result = data.lenderResponses[0].results;
                        return {
                            'new': result.filter(function (item) { return item.loanProduct === 'New Auto'; }).map(function (item) { return qqResultItemWithMonthlyPayment(item, loanAmount); }),
                            'used': result.filter(function (item) { return item.loanProduct === 'Used Auto'; }).map(function (item) { return qqResultItemWithMonthlyPayment(item, loanAmount); }),
                        };
                    }
                }
                return false;
            }
            catch (ex) {
                return false;
            }
        };

        var qqResultItemWithMonthlyPayment = function (item, loanAmount) {
            return {
                'monthlyPayment': Math.round(CalculatorService.CalculateMonthly({
                    'PurchasePrice': loanAmount ? loanAmount : item.loanAmount,
                    'SelectedTerm': item.approvedTerm,
                    'InterestRate': item.approvedRate
                })),
                //'decision': item.decision,
                'approvedRate': item.approvedRate,
                'approvedTerm': item.approvedTerm,
                'loanAmount': item.loanAmount,
                'loanProduct': item.loanProduct,
                'loanPayment': item.loanPayment
            };
        };

        function newQQForm() {
            return {
                LenderCode: '',
                LenderName: '',
                LoanTypeId: 1,
                Application: {
                    Borrower: {
                        Residence: {
                            StreetAddress: '',
                            City: '',
                            State: '',
                            PostalCode: '',
                            BorrowerResidencyType: 'CURRENT'
                        },
                        Ssn: '',
                        BorrowerID: '',
                        FirstName: '',
                        LastName: '',
                        BirthDate: ''
                    },
                    requestedLoanAmount: 0,
                    ProductType: ''
                },
                ConsumerConsent: {
                    RequestingSystemName: '',
                    TimeOfConsent: '',
                    ConsentVerbiage:''
                }
            };
        }

        var mapQQForm = function (requestBody) {
            var qqObject = newQQForm();
            console.log(Config);
            qqObject.LenderCode = Config.ClientCode;
            qqObject.LenderName = Config.ClientName;
            qqObject.Application.requestedLoanAmount = 0;
            qqObject.Application.Borrower.FirstName = requestBody.FirstName;
            qqObject.Application.Borrower.LastName = requestBody.LastName;
            qqObject.Application.Borrower.GrossAnnualIncome = requestBody.GrossAnnualIncome;

            var month = requestBody.DateOfBirth.substring(0, 2);
            var day = requestBody.DateOfBirth.substring(2, 4);
            var year = requestBody.DateOfBirth.substring(4, 8);

            qqObject.Application.Borrower.BirthDate = year + '-' + month + '-' + day;
            qqObject.Application.Borrower.Residence.StreetAddress = requestBody.HomeAddress;
            qqObject.Application.Borrower.Residence.City = requestBody.City;
            qqObject.Application.Borrower.Residence.State = requestBody.State;
            qqObject.Application.Borrower.Residence.PostalCode = requestBody.ZipCode;
            qqObject.ConsumerConsent.RequestingSystemName = 'AutoSmart 4';
            qqObject.ConsumerConsent.TimeOfConsent = currentDateTime;
            qqObject.ConsumerConsent.ConsentVerbiage = 'By clicking continue, I agree to authorize ' + creditUnionName + ' to obtain my information and personal credit profile from Experian, to use solely for the purpose of pre - qualifying me for auto loan offers. Additionally, I understand this pre - qualification request is a soft credit inquiry, which will be visible only to me and will not affect my credit score.A hard credit inquiry could affect my credit score but will only occur later when I submit a final loan application.';
            return qqObject;
        };        

            var submitQuickQuoteRequest = function () {
                var deferred = $q.defer();
                var useMockQQData = false;
                var requestBody = getPreQualFormData();
                if (useMockQQData) {
                    var data = getMockData();
                    saveQQResultCookie(data);
                    saveQQProcessResultCookie();
                    deferred.resolve(data);
                    return deferred.promise;
                }

                var mappedQQObject = mapQQForm(requestBody);
                deferred = $q.defer();
                var oldResponse;
                $http({
                    method: 'POST',
                    url: Config.BaseDirectory + "/PreQualify/PostQQRequest",
                    data: { data: JSON.stringify(mappedQQObject) },
                    headers: {
                        'Content-Type': 'application/json',
                        'Accept': '*/*',
                        'Accept-Language': 'en-US,en;q=0.8'
                    }
                }).then(function (response) {
                    oldResponse = response.data;
                    saveQQResultCookie(response.data);
                    saveQQProcessResultCookie();
                    sessionStorage.setItem("EmailTrigger", JSON.stringify(response.data));
                    return triggerEmail(response.data, requestBody);
                },
                    function (response) {
                        oldResponse = response.data;
                        saveQQProcessResultCookie();
                        return triggerEmail(response.data, requestBody);
                    }).then(function (response) {
                        deferred.resolve(oldResponse);
                    },
                        function (response) {
                            deferred.reject(oldResponse);
                        });
                return deferred.promise;
            };

            function triggerEmail(response, requestBody) {
                var deferred = $q.defer();
                if (response) {
                    if (typeof response === 'string' && response.startsWith("<!DOCTYPE")) {
                        response = { responseCode: "404" };
                    }
                    if (response.responseCode && (response.responseCode === "500" || response.responseCode === "404")) {
                        response.borrower = {
                            firstName: requestBody.FirstName,
                            lastName: requestBody.LastName,
                            age: 0,
                            birthDate: new Date(requestBody.DateOfBirth.substring(4, 4) + "-" + requestBody.DateOfBirth.substring(0, 2) + "-" + requestBody.DateOfBirth.substring(2, 2)),
                            GrossAnnualIncome: requestBody.GrossAnnualIncome,
                            residence: {
                                streetAddress: requestBody.HomeAddress,
                                city: requestBody.City,
                                state: requestBody.State,
                                postalCode: requestBody.ZipCode,
                                borrowerResidencyType: "CURRENT"
                            }
                        }
                    }
                    var link = Config.AutoBuyingApiUrl + "QQEmail/";
                    response.creditUnionName = creditUnionName;
                    response.clientWebSiteID = Config.ClientWebSiteID;
                    $http({
                        method: 'POST',
                        url: link,
                        data: '\'' + angular.toJson(response) + '\'',
                        headers: {
                            'Content-Type': 'application/json',
                            'Accept': '*/*',
                            'Accept-Language': 'en-US,en;q=0.8'
                        }
                    }).then(function (data) {
                        if (data.data) {
                            data = data.data;
                        }
                        deferred.resolve(data);
                    }).catch(function (data) {
                        deferred.reject(data);
                    });

                }
                return deferred.promise;
            }


        function getMockData() {
            return {
                "applicationId": "671b45e8-0b72-4b99-90eb-215539d1a065",
                "borrower": {
                    "residence": {
                        "streetAddress": "7130 Hendricks St",
                        "city": "Atlanta",
                        "state": "Indiana",
                        "postalCode": "46031",
                        "borrowerResidencyType": "CURRENT"
                    },
                    "ssn": "",
                    "borrowerID": "",
                    "ficoV9Score": 0,
                    "incomeInsightScore": 74,
                    "firstName": "Approve",
                    "lastName": "Me",
                    "bankruptcyPLUSRescaledScore": 844,
                    "ageOfOldestTrade": "653",
                    "satisfactoryTradeCount": "18",
                    "age": 21,
                    "birthDate": "1999-01-01T00:00:00",
                    "ficoV2Score": "832",
                    "totalBalanceNonMedical": null,
                    "highestOriginalUnsecuredAmt": null,
                    "undischargedBankruptcyCount": null,
                    "mosSinceMostRecent30PlusDelq": null,
                    "incomeInsightW2Score": null,
                    "highestOriginalVehicleAmt": 0,
                    "debtToIncomeInsight": 5,
                    "debtToIncomeInsightW2": 11,
                    "fraudVictimAlert": false
                },
                "lenderResponses": [
                    {
                        "responseCode": 1,
                        "responseMessage": "Success",
                        "lenderCode": "082",
                        "lenderName": "Travis Credit Union",
                        "decision": "approve",
                        "results": [
                            {
                                "approvedRate": "4.84",
                                "approvedTerm": 84,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "843.5309917469775",
                                "loanProduct": "New Auto"
                            },
                            {
                                "approvedRate": "4.64",
                                "approvedTerm": 78,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "892.5279113491698",
                                "loanProduct": "New Auto"
                            },
                            {
                                "approvedRate": "4.64",
                                "approvedTerm": 78,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "892.5279113491698",
                                "loanProduct": "New Auto"
                            },
                            {
                                "approvedRate": "4.54",
                                "approvedTerm": 66,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "1029.0192290486557",
                                "loanProduct": "New Auto"
                            },
                            {
                                "approvedRate": "4.34",
                                "approvedTerm": 48,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "1363.8910929119813",
                                "loanProduct": "New Auto"
                            },
                            {
                                "approvedRate": "4.24",
                                "approvedTerm": 36,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "1777.8520169314936",
                                "loanProduct": "New Auto"
                            },
                            {
                                "approvedRate": "5.79",
                                "approvedTerm": 84,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "870.4854210062726",
                                "loanProduct": "Used Auto"
                            },
                            {
                                "approvedRate": "5.59",
                                "approvedTerm": 78,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "919.1959895359662",
                                "loanProduct": "Used Auto"
                            },
                            {
                                "approvedRate": "5.59",
                                "approvedTerm": 78,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "919.1959895359662",
                                "loanProduct": "Used Auto"
                            },
                            {
                                "approvedRate": "5.49",
                                "approvedTerm": 66,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "1055.299825112236",
                                "loanProduct": "Used Auto"
                            },
                            {
                                "approvedRate": "5.29",
                                "approvedTerm": 48,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "1389.6535010540917",
                                "loanProduct": "Used Auto"
                            },
                            {
                                "approvedRate": "5.19",
                                "approvedTerm": 36,
                                "approvedTier": 0,
                                "loanAmount": 60000,
                                "loanPayment": "1803.3766423392683",
                                "loanProduct": "Used Auto"
                            }
                        ],
                        "reasons": [

                        ],
                        "debugInfo": null
                    }
                ],
                "debugInfo": null
            };
        }

           return {           
            GetQQResultCookie: getQQResultCookie,
            GetRates: getRates,
            QQResultItemWithMonthlyPayment: qqResultItemWithMonthlyPayment,
            GetQQSelection: getQQSelection,
            GetNewQQSelection: getNewQQSelection,
            SaveQQSelection: saveQQSelection,
            SubmitQuickQuoteRequest: submitQuickQuoteRequest, 
            SavePreQualFormData: savePreQualFormData,
            GetPreQualFormData: getPreQualFormData,
            SaveQQProcessResultCookie: saveQQProcessResultCookie,
            GetQQProcessResultCookie: getQQProcessResultCookie,
            GetQQRejectReason: getQQRejectReason
        };
    }]);
})(angular.module('AutoSMART.Web.Common'));
'use strict';

(function (module) {
    module.service('GoogleAnalyticsService', ['$http', '$q', function ($http, $q) {

        var exploreFinancingClick = function () {
            ga('send', 'event', 'Home Page', 'Explore Financing Clicked');
        };

        var prequalifyContinueBtn = function () {
            ga('send', 'event', 'Prequalify', 'Prequalify Continue Button Clicked');
        };

        var continueShoppingBtn = function () {
            ga('send', 'event', 'QQ No Results', 'Continue Shopping Clicked');
        };

        var shopforCarsBtn = function () {
            ga('send', 'event', 'QQ Results', 'Shop for Cars Clicked');
        };

        /* Vehicle Details Page */

        var contactDealerVDPBtn = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Contact Dealer Clicked with QQ');
        };

        var contactDealerNoQQVDPBtn = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Contact Dealer Clicked without QQ');
        };

        var appointmentBtn = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Schedule an appointment Clicked');
        };

        var askQuestionBtn = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Ask a question Clicked');
        };

        var saveVehicleClick = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Save Vehicle');
        };

        var removeVehicleClick = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Remove Vehicle');
        };

        var recommendedVehicleClick = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Recommended Vehicle Clicked');
        };

        var carfaxReportClick = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Carfax Report Clicked');
        };

        var editPaymentVDPBtn = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Edit Payment Clicked');
        };

        var editFinancingVDPBtn = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Edit Financing Clicked');
        };

        var continueFinanceVDPBtn = function () {
            ga('send', 'event', 'Vehicle Details Page', 'Continue to Financing Clicked');
        };

        /* SRP */

        var spotlightClick = function(itemId) {
            ga('send', 'event', 'Search Results Listing', 'Spotlight Clicked', itemId);
        };

        var contactDealerBtn = function () {
            ga('send', 'event', 'Search Results Listing', 'Contact Dealer Clicked with QQ');
        };

        var contactDealerNoQQBtn = function () {
            ga('send', 'event', 'Search Results Listing', 'Contact Dealer Clicked without QQ');
        };

        var editPaymentBtn = function () {
            ga('send', 'event', 'Search Results Listing', 'Edit Payment Clicked');
        };

        var editFinancingBtn = function () {
            ga('send', 'event', 'Search Results Listing', 'Edit Financing Clicked');
        };

        var priceComparisonClick = function () {
            ga('send', 'event', 'Search Results Listing', 'Price Comparison Clicked');
        };

        var continueFinanceBtn = function () {
            ga('send', 'event', 'Search Results Listing', 'Continue to Financing Clicked');
        };

        /* Header */

        var saveFavoriteVehicle = function (itemId) {
            ga('send', 'event', 'Search Results Listing', 'Save Vehicle', itemId);
        };

        /* Build Page */

        var buildSearchNearYou = function() {
            ga('send', 'event', 'Build Page', 'Search Inventory');
        };

        /* Finance */

        var financeAffordCalculatorBtn = function() {
            ga('send', 'event', 'Finance Page', 'What Can I Afford Calculator - Button Clicked');
        };

        var financeAffordPaymentVehicleSearchBtn = function () {
            ga('send', 'event', 'Finance Page', 'What Can I Afford Calculator - View Inventory Button Clicked');
        };

        var financeMonthlyPaymentCalculatorBtn = function () {
            ga('send', 'event', 'Finance Page', 'Monthly Payment Calculator - Button Clicked');
        };

        var financeMonthlyPaymentVehicleSearchBtn = function () {
            ga('send', 'event', 'Finance Page', 'Monthly Payment Calculator - View Inventory Button Clicked');
        };

        var financeApplyLoanBtn = function () {
            ga('send', 'event', 'Finance Page', 'Apply for a Loan Clicked');
        };

        var homeApplyLoanBtn = function () {
            ga('send', 'event', 'Home Page', 'Apply for a Loan Clicked');
        };

        var headerApplyLoanBtn = function () {
            ga('send', 'event', 'Header Page', 'Apply for a Loan Clicked');
        };

        var srpPreferredApplyLoanBtn = function () {
            ga('send', 'event', 'SRP Preferred Plus Page', 'Apply for a Loan Clicked');
        };

        var srpApplyLoanBtn = function () {
            ga('send', 'event', 'SRP Page', 'Apply for a Loan Clicked');
        };

        var vdpPreferredApplyLoanBtn = function () {
            ga('send', 'event', 'VDP Preferred Plus Page', 'Apply for a Loan Clicked');
        };

        var vdpApplyLoanBtn = function () {
            ga('send', 'event', 'VDP Page', 'Apply for a Loan Clicked');
        };

        var financeInformationArticleClick = function (text) {
            ga('send', 'event', 'Finance Page', 'Information Articles Clicked', text);
        };

        var financeResearchToolsClick = function (text) {
            ga('send', 'event', 'Finance Page', 'Research Tools Clicked', text);
        };

        var financeVehicleSearchBtn = function (make, model) {
            ga('send', 'event', 'Finance Page', 'Vehicle Inventory Search Clicked', make + ' | ' + model);
        };

        var financeDealerSearchBtn = function (make) {
            ga('send', 'event', 'Finance Page', 'Vehicle Inventory Search Clicked', make);
        };

        return {
            SpotlightClick: spotlightClick,
            SaveFavoriteVehicle: saveFavoriteVehicle,
            BuildSearchNearYou: buildSearchNearYou,
            FinanceAffordCalculatorBtn: financeAffordCalculatorBtn,
            FinanceAffordPaymentVehicleSearchBtn: financeAffordPaymentVehicleSearchBtn,
            FinanceMonthlyPaymentCalculatorBtn: financeMonthlyPaymentCalculatorBtn,
            FinanceMonthlyPaymentVehicleSearchBtn: financeMonthlyPaymentVehicleSearchBtn,
            FinanceApplyLoanBtn: financeApplyLoanBtn,
            FinanceInformationArticleClick: financeInformationArticleClick,
            FinanceResearchToolsClick: financeResearchToolsClick,
            FinanceVehicleSearchBtn: financeVehicleSearchBtn,
            FinanceDealerSearchBtn: financeDealerSearchBtn,
            ContactDealerBtn: contactDealerBtn,
            EditPaymentBtn: editPaymentBtn,
            EditFinancingBtn: editFinancingBtn,
            PriceComparisonClick: priceComparisonClick,
            ContinueFinanceBtn: continueFinanceBtn,
            ContactDealerVDPBtn: contactDealerVDPBtn,
            AppointmentBtn: appointmentBtn,
            AskQuestionBtn: askQuestionBtn,
            SaveVehicleClick: saveVehicleClick,
            RemoveVehicleClick: removeVehicleClick,
            RecommendedVehicleClick: recommendedVehicleClick,
            CarfaxReportClick: carfaxReportClick,
            EditPaymentVDPBtn: editPaymentVDPBtn,
            EditFinancingVDPBtn: editFinancingVDPBtn,
            ContinueFinanceVDPBtn: continueFinanceVDPBtn,
            ExploreFinancingClick: exploreFinancingClick,
            PrequalifyContinueBtn: prequalifyContinueBtn,
            ContinueShoppingBtn: continueShoppingBtn,
            ShopforCarsBtn: shopforCarsBtn,
            ContactDealerNoQQVDPBtn: contactDealerNoQQVDPBtn,
            ContactDealerNoQQBtn: contactDealerNoQQBtn

        }
    }]);

})(angular.module('AutoSMART.Web.Common'));
'use strict';

(function (module) {
    module.service('LoggingService', ['$http', '$q', function ($http, $q) {
        
        var loggingUserAction = function(userActionType, itemId, sourceSectionId) 
        {
            var deferred = $q.defer();


            var link = '/Vehicle/LoggingUserAction';

            var promise = $http({
                method: 'POST',
                url: link,

                headers: {
                    'Content-Type': 'application/json',
                    'Accept': '*/*',
                    //'Accept-Encoding': 'gzip, deflate',
                    'Accept-Language': 'en-US,en;q=0.8'

                },
                data: { userActionType: userActionType, itemId: itemId, sourceSectionId: sourceSectionId  },
            }).then(function (data) {
                if (data.data) {
                    data = data.data;
                }
                deferred.resolve(data);
            }).catch(function (data) {
                deferred.reject(data);
            });
            return deferred.promise;

            //$.ajax({ url: '/Vehicle/LoggingUserAction', cache: false, data: { userActionType: userActionType, itemId: itemId, sourceSectionId: sourceSectionId  } });
        };
        

        return {
            LoggingUserAction:loggingUserAction
        }
    }]);

})(angular.module('AutoSMART.Web.Common'));
'use strict';

(function (module) {
    module.service('DistanceCalculationService', [ function () {
        var  MEAN_RADIUS_MILES = 3969.0;

        var degreesToRadians = function (degrees) {
            return degrees * Math.PI / 180.0;
        }

        var calculateDistance = function(lat1, long1, lat2, long2) {
            var deltaLong = degreesToRadians(long2 - long1);
            var deltaLat = degreesToRadians(lat2 - lat1);
            var lat1Radians = degreesToRadians(lat1);
            var lat2Radians = degreesToRadians(lat2);

            var a = (Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2)) +
            (Math.sin(deltaLong / 2) * Math.sin(deltaLong / 2) *
                Math.cos(lat1Radians) * Math.cos(lat2Radians));
            var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
            return Math.round(Math.abs(c * MEAN_RADIUS_MILES));
        }

        return {
            CalculateDistance: calculateDistance
        }
    }]);

})(angular.module('AutoSMART.Web.Common'));
"use strict";

(function (module) {

    module.filter('monthlypayment', function() {
        return function(price, interest, calcContent) {
            var payment = 0;
            
            if (interest === 0)
                interest = 0.1;

            var cashRebate = isNaN(calcContent.CashRebate) ? 0 : calcContent.CashRebate;
            var downPayment = isNaN(calcContent.DownPayment) ? 0 : calcContent.DownPayment;
            var tradeIn = isNaN(calcContent.TradeInValue) ? 0 : calcContent.TradeInValue;
            var amountOwed = isNaN(calcContent.AmountOwed) ? 0 : calcContent.AmountOwed;

            var totalLoanAmount = price - parseInt(cashRebate) - parseInt(downPayment) - parseInt(tradeIn) + parseInt(amountOwed);
            var a = (1 + interest / 1200);
            var x = Math.pow(a, parseInt(calcContent.LoanDuration));
            x = 1 / x;
            x = 1 - x;
            payment = (totalLoanAmount) * (interest / 1200) / x;
            return payment;
        };
    });
})(angular.module('AutoSMART.Web.Common'));
'use strict';

(function(module) {
    module.filter('dealerraterall', [function() {

    }
]);
})(angular.module('AutoSMART.Web.Common'));

(function (module) {
    module.filter('dealerraterposneg', function () {
        var tmpCollection = [];
        return function(collection, value) {
            for (var i = 0; i < collection.length; i++) {
                if (collection[i].reviewState === value) {
                    tmpCollection.push(collection[i]);
                }
            }
            return tmpCollection;
        }
    }
);
})(angular.module('AutoSMART.Web.Common'));

(function (module) {
    module.filter('dealerraterreason', function () {
        var tmpCollection = [];
        return function(collection, value) {
            var valArr = value.toLowerCase().split('~');
            for (var i = 0; i < collection.length; i++) {
                if (valArr.indexOf(collection[i].reason.toLowerCase()) > -1) {
                    tmpCollection.push(collection[i]);
                }
            }
            return tmpCollection;
        }
    }
);
})(angular.module('AutoSMART.Web.Common'));

(function (module) {
    module.filter('dealerraterservice', [function () {

        }
    ]);
})(angular.module('AutoSMART.Web.Common'));
'use strict';

(function (module) {
    module.filter('htmlstripper', function () {
        return function (string) {
            if (string === undefined) return string;
            var newValue = string.replace(/<\/?[^>]+>/gi, '');
            return newValue;
        }
    }
);
})(angular.module('AutoSMART.Web.Common'));
"use strict";


(function (module) {

    module.component('interstitialmodal', {
        templateUrl: '/app/Common/views/_InterstitialModal.html',
        controller: ["$uibModal", "$cookies", "$scope", "Config",

        function ($uibModal, $cookies, $scope, Config) {
            var $ctrl = this;
            $ctrl.Logo = Config.ClientLogo;
            $ctrl.CreditUnionName = Config.ClientName;
            var hasCookie = $cookies.get("interstitialModalViewed");
            if (!hasCookie) {
                $cookies.put('interstitialModalViewed', true);
            }
            $ctrl.cancel = function () {
                $scope.$parent.$parent.Interstitial.dismiss('cancel');
            };
            $ctrl.PrimaryColor = Config.PrimaryColor;
            $ctrl.SecondaryColor = Config.SecondaryColor.toLowerCase();
            if (!$ctrl.SecondaryColor || $ctrl.SecondaryColor === "#fff" || $ctrl.SecondaryColor === "#ffffff") {
                $ctrl.SecondaryColor = $ctrl.PrimaryColor;
            }
            $ctrl.svgcontent = {
                "TextColor": $ctrl.SecondaryColor,
                "ShieldColor": $ctrl.SecondaryColor
            };
        }]
    });

})(angular.module('AutoSMART.Web.Common'));
"use strict";

(function (module) {

    module.component('nosearchresultcomponent',
        {
            controller: ["$scope", "$window", "$location", "DealerSearchService", "DealerSearchFilterService", 'InventoryFilterService', "Config",
                function ($scope, $window, $location, DealerSearchService, DealerSearchFilterService, InventoryFilterService, Config) {
                    var ctrl = this;

                    $window.onresize = function (event) {
                        ctrl.cardOrientation = 'vertical-card';
                        if ($window.innerWidth >= 1200) {
                            ctrl.cardOrientation = 'horizontal-card';
                        }
                    }

                    ctrl.$onInit = function () {
                        ctrl.selectedFilters = DealerSearchFilterService.selectedFilters;
                        ctrl.filterOptions = DealerSearchFilterService.filterOptions;
                        ctrl.allDealers = DealerSearchService.allDealers;
                        ctrl.searchType = ($location.$$path == "/Dealer") ? false : true;

                        var mediaQuery = window.matchMedia('(max-width: 1024px)');
                        ctrl.cardOrientation = 'horizontal-card';
                        if (mediaQuery.matches) {
                            ctrl.cardOrientation = 'vertical-card';
                        }
                    }
                    $scope.toggleFilterListDisplay = function (obj, $event) {
                        InventoryFilterService.ToggleFilterList(obj, $event);
                    };
                }
            ],
        templateUrl: UrlContent("/App/Common/Views/NoSearchResultComponent.html")
    });
})(angular.module('AutoSMART.Web.Search'));

"use strict";

(function (module) {

    module.component('svgpaymentarrowcomponent', {
        templateUrl: UrlContent("/App/Common/Views/SVGPaymentArrowComponent.html"),
        bindings: {
            data: '='
        }
    });

})(angular.module('AutoSMART.Web.Common'));
"use strict";

(function (module) {

        module.component('locationcomponent',
        {
            controller: ["$scope", "$rootScope", 
                function ($scope, $rootScope) {

                $scope.cancel = function () {
                    $rootScope.modalInstance.close();
                };
                
                var data = ($scope.$parent.$ctrl.data == null) ? $scope.$parent.$ctrl.dedicatedDealerContent : $scope.$parent.$ctrl.data;
                $scope.Latitude = (data.Latitude == null) ? null : data.Latitude.toString();
                $scope.Longitude = (data.Longitude == null) ? null : data.Longitude.toString();
                $scope.DealerAddress = (data.DealerAddress ==null) ? data.Street: data.DealerAddress;
                $scope.DealerName = (data.DealerName==null) ? data.ClientName : data.DealerName;
                $scope.OwnerLocation = (data.OwnerLocation == null) ? (data.City + ', ' + data.State + ' ' + data.Zip) : data.OwnerLocation;
                var geocoder = new google.maps.Geocoder();
                $scope.address = $scope.DealerAddress + " " + $scope.OwnerLocation;
                
               
            }],
            bindings: {
                data: "="
    },
        templateUrl: "/App/Common/Views/LocationComponent.html"
    });
})(angular.module('AutoSMART.Web.Common'));
"use strict";

(function (module) {

    module.component('svgpluscomponent', {
        controller: ["$scope",
            function ($scope) {
                var ctrl = this;

                if (typeof ctrl.data !== 'undefined') {
                    ctrl.TextColor = ctrl.data.TextColor;
                    ctrl.ShieldColor = ctrl.data.ShieldColor;
                } else if (typeof ctrl.color !== 'undefined') {
                    ctrl.TextColor = ctrl.color;
                    ctrl.ShieldColor = ctrl.color;
                } else {
                    ctrl.TextColor = '#000000';
                    ctrl.ShieldColor = '#000000';
                }

            }],
        templateUrl: UrlContent("/App/Common/Views/SVGPlusComponent.html"),
        bindings: {
            data: '=',
            color: '='
        }
    });

})(angular.module('AutoSMART.Web.Common'));
"use strict";

(function (module) {

    module.component('svgpreferredpluscomponent', {
        controller: ["$scope",
            function ($scope) {
                var ctrl = this;

                if (typeof ctrl.data !== 'undefined') {
                    ctrl.TextColor = ctrl.data.TextColor;
                    ctrl.ShieldColor = ctrl.data.ShieldColor;
                } else if (typeof ctrl.color !== 'undefined') {
                    ctrl.TextColor = ctrl.color;
                    ctrl.ShieldColor = ctrl.color;
                } else {
                    ctrl.TextColor = '#000000';
                    ctrl.ShieldColor = '#000000';
                }

            }],
        templateUrl: UrlContent("/App/Common/Views/SVGPreferredPlusComponent.html"),
        bindings: {
            data: '=',
            color: '='
        }
    });

})(angular.module('AutoSMART.Web.Common'));
"use strict";

(function (module) {

    module.component('svgencircleddollarcomponent', {
        controller: ["$scope",
            function ($scope) {
                var ctrl = this;
                
                var getSvgClass = function(cssClass) {
                    switch (cssClass) {
                        case 1:
                            return 'svg-great-price';
                        case 2:
                            return 'svg-fair-price';
                        case 3:
                            return 'svg-overpriced-price';
                    }
                    return '';
                };

                ctrl.SVGColor = getSvgClass(ctrl.data);
            }],
        templateUrl: UrlContent("/App/Common/Views/SVGEncircledDollarComponent.html"),
        bindings: {
            data: '='
        }
    });

})(angular.module('AutoSMART.Web.Common'));

(function (module) {

    module.component('vehicleleadcomponent', {
        templateUrl: "/App/Common/Views/vehicleLead.html",
        controller: ["$scope", "Config", "CalculatorService", "LeadService", '$location', "LoggingService", "GoogleAnalyticsService", "$window", 'VehicleTradeInService', 'VehicleDetailService', 'QuickQuoteService','AmplitudeService',
            function ($scope, Config, CalculatorService, LeadService, $location, LoggingService, GoogleAnalyticsService, $window, VehicleTradeInService, VehicleDetailService, QuickQuoteService, AmplitudeService) {
                var ctrl = this;
                var userActionType = 22; //ApplyForLoan
                var sourceSectionIDSrp = 1; //SRP
                var sourceSectionIDVdp = 7; //VDP                
                var selectedContactlessOptions = [];
                var restrictedCharAttempted = false;
                var leadMessageIsRequired = false;
                var leadMessage = "";

                ctrl.$onInit = function () { 
                    ctrl.itemId = $scope.$parent.$ctrl.itemid;
                    ctrl.vehicle = $scope.$parent.$ctrl.vehicle != null ? $scope.$parent.$ctrl.vehicle : $scope.$parent.$ctrl.VehicleInfo;
                    ctrl.attemptedSubmission = false;
                    ctrl.leadAlreadySubmitted = false;  
                    //srp and vdp shouldn't have this dealer object, data should already be provided from vehicle object                                      
                        if ($scope.$parent.$resolve != undefined) {
                            if ($scope.$parent.$resolve.componentname == 'scheduleappointment') {
                                ctrl.vehicle.selectedOption = "Schedule a Test Drive";
                                $('#lblmessage').hide();
                                $('#txtMessage').hide();
                            }
                            else if ($scope.$parent.$resolve.componentname == 'askquestions') {
                                ctrl.vehicle.selectedOption = "Ask a question";
                                $('#lblmessage').show();
                                $('#txtMessage').show();
                            }
                            else {
                                ctrl.vehicle.selectedOption = "I'm interested in this vehicle";
                                $('#lblmessage').hide();
                                $('#txtMessage').hide();                           
                        }
                    }
                    var dealerInfo = $scope.$parent.$ctrl.dealer;
                    if (dealerInfo) {
                        setUpDealerInfo(dealerInfo);
                    }
                    if (ctrl.vehicle.SellerInfo) {
                        ctrl.hasContactlessService = ctrl.vehicle.SellerInfo.HasHomeDeliverySales || ctrl.vehicle.SellerInfo.HasHomeTestDrives || ctrl.vehicle.SellerInfo.HasNoContactTransactions || ctrl.vehicle.SellerInfo.HasVirtualAppointments;
                    }
                    ctrl.restrictedCharAttempted = false;
                    ctrl.leadMessage = "";
                    ctrl.hasContactlessService = ctrl.hasContactlessService || ctrl.vehicle.HasHomeDeliverySales || ctrl.vehicle.HasHomeTestDrives || ctrl.vehicle.HasNoContactTransactions || ctrl.vehicle.HasVirtualAppointments;
                    ctrl.vehicle.IsFinanced = false;
                    ctrl.vehicle.Term = CalculatorService.CalcContent.LoanDuration;
                    ctrl.vehicle.APR = CalculatorService.CalcContent.CurrentSelectedScore.MinRate;
                    ctrl.vehicle.IsPreferredPlus = ((ctrl.vehicle.SellerInfo) ? ctrl.vehicle.SellerInfo.IsPreferredPlus : (ctrl.vehicle.IsAutoSmartXLive ? ctrl.vehicle.IsAutoSmartXLive : false));
                    ctrl.vehicle.DealerName = (ctrl.vehicle.SellerInfo) ? ctrl.vehicle.SellerInfo.SellerName : ctrl.vehicle.DealerName;
                    ctrl.DisplayPrice = (ctrl.vehicle.ItemID) ? ctrl.vehicle.PriceRetail : ctrl.vehicle.BaseMSRP;
                    ctrl.DisplayPriceTitle = (ctrl.vehicle.ItemID) ? "DEALER PRICE" : "Estimated MSRP";
                    ctrl.PreApprovalLink = function () {
                        if (ctrl.vehicle.pageType === 'SRP') {
                            if (ctrl.vehicle.IsPreferredPlus) {
                                GoogleAnalyticsService.SrpPreferredApplyLoanBtn;
                            } else {
                                GoogleAnalyticsService.SrpApplyLoanBtn;
                            }

                            LoggingService.LoggingUserAction(userActionType, null, sourceSectionIDSrp);
                        } else {
                            if (ctrl.vehicle.IsPreferredPlus) {
                                GoogleAnalyticsService.VdpPreferredApplyLoanBtn;
                            } else {
                                GoogleAnalyticsService.VdpApplyLoanBtn;
                            }

                            LoggingService.LoggingUserAction(userActionType, null, sourceSectionIDVdp);
                        }

                        $window.open(Config.PreApprovalUrl.replace(/&amp;/g, '&'), '_blank');
                    };
                    ctrl.IsLoanApplicationEnabled = Config.IsLoanApplicationEnabled;
                    ctrl.ClientLogo = Config.ClientLogo;
                    ctrl.CreditUnionName = Config.ClientName;
                    ctrl.ShowCloseModal = false;
                    ctrl.vehicle.BuildSelection = $scope.$parent.$ctrl.buildselection;
                    ctrl.IsPreferredPlus = ctrl.vehicle.IsPreferredPlus;

                    ctrl.AdditionalData = getAdditionalData();

                    // Initialize VehicleTradeInService Data
                    VehicleTradeInService.Init()
                        .then(function () {
                            ctrl.VehicleTradeInDetails = VehicleTradeInService.Data.VehicleTradeInDetails;
                        });
                    var qqstatus = Config.IsQuickQuoteEnabled && QuickQuoteService.GetQQProcessResultCookie();
                    ctrl.qqstatus = qqstatus ? 'True' : 'False';
                    var rate = null;
                    var term = null;
                    if (qqstatus) {
                        rate = ctrl.vehicle.APR + '%';
                        term = ctrl.vehicle.Term + ' Months';
                    }
                    var sourcePage = 'Search Result Page';
                    var currentUrl = window.location.href.toLowerCase();
                    if (currentUrl.includes('details')) {
                        sourcePage = 'Vehicle Details Page';
                    }
                    if (currentUrl.includes('details') && $scope.$parent.$ctrl.page == 'sticky') {
                        sourcePage = 'Sticky VDP Button Header';
                    }
                    if (currentUrl.includes('/build')) {
                        sourcePage = 'Build Page';
                    }
                    if (currentUrl.includes('/dealer')) {
                        sourcePage = 'Dealer Search Results Page';
                    }
                    var formattedPrice = '$' + ctrl.DisplayPrice.toString().replace(/(\d)(?=(\d{3})+$)/g, '$1,');
                    
                    AmplitudeService.logEvent('Contact Dealer Modal Loaded',
                        {
                            'Source Page': sourcePage,
                            'Vehicle Type': ctrl.vehicle.PhysicalCondition.toLowerCase(),
                            'Vehicle Year': ctrl.vehicle.ItemYear ? ctrl.vehicle.ItemYear : ctrl.vehicle.ItemName.substr(0, ctrl.vehicle.ItemName.indexOf(' ')),
                            'Make': ctrl.vehicle.MakeModel ? ctrl.vehicle.MakeModel.substr(0, ctrl.vehicle.MakeModel.indexOf(' ')) : (ctrl.vehicle.Make ? ctrl.vehicle.Make : ctrl.vehicle.MakeName),
                            'Model': ctrl.vehicle.MakeModel ? ctrl.vehicle.MakeModel.substr(ctrl.vehicle.MakeModel.indexOf(' ') + 1) : (ctrl.vehicle.Model ? ctrl.vehicle.Model : ctrl.vehicle.ModelName),
                            'Dealership': ctrl.vehicle.DealerName,
                            'Dealer Price': formattedPrice, 
                            'Quick Quote Completed?': ctrl.qqstatus,
                            'Rate': rate ? rate : '--',
                            'Term': term ? term : '--'
                        });

                  $scope.setLeadMessage = function(event) {
                    ctrl.leadMessage = txtMessage.value;
                  }

                    $scope.replaceInputForQuestion = function (event) {
                      var regex = new RegExp("^[\\r\\n?a-zA-Z0-9`~!@#$%^&\*()_\+\=\|;':\",./\? ]+$");
                      var pastedData = event.clipboardData.getData('Text');
                      if (!regex.test(pastedData)) {
                        ctrl.restrictedCharAttempted = true;
                        event.preventDefault();
                        return false;
                      }

                      ctrl.restrictedCharAttempted = false;
                      return true;
                    }

                  $scope.restrictInputForQuestion = function (event) {
                    let allow_char = [13, 32, 96, 126, 33, 64, 35, 36, 37, 94, 38, 42, 40, 41, 95, 43, 61, 124, 59, 39, 58, 34, 44, 46, 47,	63, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 65, 66, 67, 68, 69, 70, 71, 72, 73,	74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 48, 49, 50, 51, 52, 53,	54, 55, 56, 57];
                    if (allow_char.indexOf(event.which) === -1) {
                      event.preventDefault();
                      ctrl.restrictedCharAttempted = true;
                      return false;
                    }
                    ctrl.restrictedCharAttempted = false;
                    return true;
                  }

                  $scope.ddlHowCanWeHelpSelected = function (event) {
                    if (ctrl.vehicle.selectedOption == "Ask a question") {
                      ctrl.leadMessageIsRequired = true;
                    }
                    else {
                      ctrl.leadMessageIsRequired = false;
                    }
                  }

                    $scope.contaclessOptions = [];
                    if ((ctrl.vehicle.SellerInfo && ctrl.vehicle.SellerInfo.HasNoContactTransactions) || ctrl.vehicle.HasNoContactTransactions) {
                        $scope.contaclessOptions.push({ id: "HasNoContactTransactions", name: "Contactless purchase", isChecked: false });
                    }
                    if ((ctrl.vehicle.SellerInfo && ctrl.vehicle.SellerInfo.HasVirtualAppointments) || ctrl.vehicle.HasVirtualAppointments) {
                        $scope.contaclessOptions.push({ id: "HasVirtualAppointments", name: "Virtual appointments", isChecked: false });
                    }
                    if ((ctrl.vehicle.SellerInfo && ctrl.vehicle.SellerInfo.HasHomeTestDrives) || ctrl.vehicle.HasHomeTestDrives) {
                        $scope.contaclessOptions.push({ id: "HasHomeTestDrives", name: "Free test drive at home", isChecked: false });
                    }
                    if ((ctrl.vehicle.SellerInfo && ctrl.vehicle.SellerInfo.HasHomeDeliverySales) || ctrl.vehicle.HasHomeDeliverySales) {
                        $scope.contaclessOptions.push({ id: "HasHomeDeliverySales", name: "Free home delivery", isChecked: false });
                    }
                    selectedContactlessOptions = [];
                };

                function getAdditionalData() {
                    var distance = 0;
                    if ('DistanceToDealer' in ctrl.vehicle) {
                        distance = ctrl.vehicle.DistanceToDealer;
                    }

                    if ('Distance' in ctrl.vehicle && distance === 0) {
                        distance = ctrl.vehicle.Distance;
                    }

                    var data = {
                        DistanceToDealer: distance
                    };

                    if ('PricingData' in ctrl.vehicle) {
                        if (ctrl.vehicle.PricingData.PriceDifference < 0) {
                            data.PricingData = {
                                Text: ctrl.vehicle.PricingData.PriceDifferenceText,
                                Style: ctrl.vehicle.PricingData.PriceStyle
                            }
                        }
                    }

                    if ('SellerInfo' in ctrl.vehicle) {
                        data.DealerInfo = {
                            Name: ctrl.vehicle.SellerInfo.DealerContactName
                        }
                    }

                    return data;
                }

                var setUpDealerInfo = function (dealerInfo) {
                    ctrl.vehicle.SellerInfo = {};
                    ctrl.vehicle.SellerInfo.SellerName = dealerInfo.OwnerName;
                    ctrl.vehicle.SellerInfo.IsPreferredPlus = dealerInfo.IsAutoSmartXLive;
                    ctrl.vehicle.SellerInfo.ClientId = dealerInfo.ClientId;
                }

                ctrl.formatPhoneNumber = function () {
                    if (ctrl.vehicle.UserPhone && ctrl.vehicle.UserPhone.length < 10) {
                        return ctrl.vehicle.UserPhone;
                    } else {
                        var leadNumber = ctrl.vehicle.UserPhone;
                        var areaCode = leadNumber.slice(0, 3);
                        var phoneNumber = leadNumber.slice(3);

                        phoneNumber = phoneNumber.slice(0, 3) + "-" + phoneNumber.slice(3);
                        var formattedNumber = "(" + areaCode + ") " + phoneNumber;
                    }
                    $scope.vehicleLead.leadPhoneNumber.$$lastCommittedViewValue = formattedNumber;

                }

                $scope.cancel = function () {
                    if ($scope.$parent.$parent.modalRebateInstance) {
                        $scope.$parent.$parent.modalRebateInstance.close();
                    }
                    else if ($scope.$parent.$parent.modalCalcInstance) {
                        $scope.$parent.$parent.modalCalcInstance.close();
                    }
                    else if ($scope.$parent.$parent.modalLeadInstance) {
                        $scope.$parent.$parent.modalLeadInstance.close();
                    }
                };

                ctrl.togglecheck = function (option) {                    
                    if (option.isChecked) {
                        selectedContactlessOptions.push(option.name);
                    } else {
                        selectedContactlessOptions.pop(option.name);
                    }
                };

                $scope.SubmitQuote = function () {
                    ctrl.attemptedSubmission = true;

                    if (ctrl.vehicle.selectedOption == "I'm interested in this vehicle") {
                        ctrl.vehicle.ContactReasonId = 1;
                    }
                    else if (ctrl.vehicle.selectedOption == "Schedule a Test Drive"){
                        ctrl.vehicle.ContactReasonId = 2;
                    }
                    else if (ctrl.vehicle.selectedOption == "Ask a question") {
                        ctrl.vehicle.ContactReasonId = 3;

                      if (txtMessage.value) {
                        ctrl.vehicle.QuestionToDealer = txtMessage.value;
                      }
                      else {
                        return;
                      }
                    }
                    else {
                        ctrl.vehicle.QuestionToDealer = null;
                    }
                   
                    ctrl.vehicle.DealerContactlessServices = selectedContactlessOptions;
                    ctrl.vehicle.APRDuration = CalculatorService.CalcContent.LoanDuration;
                    ctrl.vehicle.APRMinimum = CalculatorService.CalcContent.CurrentSelectedScore.MinRate;
                    ctrl.vehicle.APRMaximum = CalculatorService.CalcContent.CurrentSelectedScore.MaxRate;
                    ctrl.vehicle.APRMinimumPrice = CalculatorService.CalculatePayment(ctrl.DisplayPrice, CalculatorService.CalcContent.CurrentSelectedScore.MinRate);
                    ctrl.vehicle.APRMaximumPrice = CalculatorService.CalculatePayment(ctrl.DisplayPrice, CalculatorService.CalcContent.CurrentSelectedScore.MaxRate);
                    ctrl.vehicle.DownPayment = CalculatorService.CalcContent.DownPayment;

                    VehicleDetailService.RetrieveVehicle(ctrl.itemId, true, true).then(function () {

                        var vehicleInfo = VehicleDetailService.VehicleInfo;

                        var qqstatus = Config.IsQuickQuoteEnabled && QuickQuoteService.GetQQProcessResultCookie();
                        ctrl.qqstatus = qqstatus ? 'True' : 'False';
                        
                        var rate = null;
                        var term = null;
                        if (qqstatus) {
                            rate = ctrl.vehicle.APR + '%';
                            term = ctrl.vehicle.APRDuration;
                        }
                        var sourcePage = 'search result page';
                        var currentUrl = window.location.href;
                        if (currentUrl.includes('details')) {
                            sourcePage = 'vehicle details page';
                        }

                        var isPreApproved = "False";
                        if (ctrl.vehicle.IsFinanced == "true") {
                            isPreApproved = "True";
                        }

                        var condition = 'new'
                        if (ctrl.vehicle.PhysicalCondition == 'Used') {
                            condition = 'used'
                        }

                        var formattedPrice = '$' + ctrl.vehicle.PriceRetail.toString().replace(/(\d)(?=(\d{3})+$)/g, '$1,');

                        AmplitudeService.logEvent('Dealer Contacted',
                            {
                                'source page': sourcePage,
                                'CTA source': ctrl.vehicle.selectedOption,
                                'vehicle type': condition,
                                'make': vehicleInfo.Make,
                                'model': vehicleInfo.Model,
                                'dealership': ctrl.vehicle.DealerName,
                                'Quick Quote Completed?': ctrl.qqstatus,
                                'dealer price': formattedPrice,
                                'rate': rate,
                                'term': term,
                                'is pre approved': isPreApproved
                            });
                    });


                    if ($scope.vehicleLead.$invalid || ctrl.leadAlreadySubmitted) {
                        $('.vdplead-modal-content input.has-error').first().focus();
                        return;
                    }

                    ctrl.leadAlreadySubmitted = true;

                    ctrl.vehicle.VehicleTradeInDetails = ctrl.VehicleTradeInDetails;
                    
                    LeadService.MapLeadContents(ctrl.vehicle);
                    LeadService.SaveLead().then(function (guid) {
                        if (ctrl.vehicle.IsPreferredPlus && ctrl.vehicle.ContactReasonId != 3) {
                            if (guid) {
                                var url = $location.protocol() + '://' + location.host + '/Certificate/membercertificate?membercertificateguid=' + guid + '&returnUrl=' + encodeURIComponent(window.location.href);
                                window.location.href = url;
                            }
                        } else {
                            ctrl.ShowCloseModal = true;
                        }
                    });
                };

                ctrl.fillFinance = function (isFinanced) {
                    return (isFinanced === ctrl.vehicle.IsFinanced) ? 'black' : 'white';
                };

                ctrl.setFinance = function (isFinanced) {
                    ctrl.vehicle.IsFinanced = isFinanced;
                };

                $scope.hasRequiredValidValues = function () {
                    return ((ctrl.vehicle.UserName && ctrl.vehicle.UserName.length > 0) && (ctrl.vehicle.UserEmailAddress && ctrl.vehicle.UserEmailAddress.length > 0));
                };
            }]
    });   
})(angular.module('AutoSMART.Web.Common'));

(function (module) {

    module.component('prequalifyvehicleleadcomponent', {
        templateUrl: "/App/Common/Views/prequalifyvehicleLead.html",
        controller: ["$scope", "Config", "CalculatorService", "LeadService", '$location', "LoggingService", "GoogleAnalyticsService", "$window", 'VehicleTradeInService', 'QuickQuoteService', '$cookies', 'AmplitudeService', 'VehicleDetailService', 
            function ($scope, Config, CalculatorService, LeadService, $location, LoggingService, GoogleAnalyticsService, $window, VehicleTradeInService, QuickQuoteService, $cookies, AmplitudeService, VehicleDetailService) {
                var ctrl = this;
                var userActionType = 22; //ApplyForLoan
                var sourceSectionIDSrp = 1; //SRP
                var sourceSectionIDVdp = 7; //VDP
                var contactDealerFieldsCookieName = 'ContactDealerFields';

                ctrl.$onInit = function () {
                    ctrl.itemId = $scope.$parent.$ctrl.itemid;
                    ctrl.vehicle = $scope.$parent.$ctrl.vehicle;                    
                    ctrl.attemptedSubmission = false;
                    ctrl.leadAlreadySubmitted = false;
                    //srp and vdp shouldn't have this dealer object, data should already be provided from vehicle object
                    var dealerInfo = $scope.$parent.$ctrl.dealer;
                    if (dealerInfo) {
                        setUpDealerInfo(dealerInfo);
                    }

                    ctrl.vehicle.IsFinanced = false;
                    ctrl.vehicle.IsPreferredPlus = ((ctrl.vehicle.SellerInfo) ? ctrl.vehicle.SellerInfo.IsPreferredPlus : (ctrl.vehicle.IsAutoSmartXLive ? ctrl.vehicle.IsAutoSmartXLive : false));
                    ctrl.vehicle.DealerName = (ctrl.vehicle.SellerInfo) ? ctrl.vehicle.SellerInfo.SellerName : ctrl.vehicle.DealerName;
                    ctrl.DisplayPrice = (ctrl.vehicle.ItemID) ? ctrl.vehicle.PriceRetail : ctrl.vehicle.BaseMSRP;
                    ctrl.DisplayPriceTitle = (ctrl.vehicle.ItemID) ? "Dealer price" : "Estimated MSRP";
                    ctrl.vehicle.Term = CalculatorService.CalcContent.LoanDuration;
                    ctrl.vehicle.APR = CalculatorService.CalcContent.CurrentSelectedScore.MinRate;
                    ctrl.vehicle.Payment = CalculatorService.CalculatePayment(ctrl.DisplayPrice, CalculatorService.CalcContent.CurrentSelectedScore.MinRate);
                    ctrl.vehicle.Payment = parseInt(ctrl.vehicle.Payment, 10);
                    ctrl.pqFormValues = QuickQuoteService.GetPreQualFormData();
                    if (ctrl.pqFormValues) {
                        ctrl.vehicle.UserName = ctrl.pqFormValues.FirstName + " " + ctrl.pqFormValues.LastName 
                    }
                    var contactDealerCookieData = ctrl.getContactDealerCookie();
                    if (contactDealerCookieData) {
                        ctrl.vehicle.UserName = contactDealerCookieData.name;
                        ctrl.vehicle.UserEmailAddress = contactDealerCookieData.email;
                        ctrl.vehicle.UserPhone = contactDealerCookieData.phone;
                    }
                    ctrl.PreApprovalLink = function () {
                        if (ctrl.vehicle.pageType === 'SRP') {
                            if (ctrl.vehicle.IsPreferredPlus) {
                                GoogleAnalyticsService.SrpPreferredApplyLoanBtn;
                            } else {
                                GoogleAnalyticsService.SrpApplyLoanBtn;
                            }

                            LoggingService.LoggingUserAction(userActionType, null, sourceSectionIDSrp);
                        } else {
                            if (ctrl.vehicle.IsPreferredPlus) {
                                GoogleAnalyticsService.VdpPreferredApplyLoanBtn;
                            } else {
                                GoogleAnalyticsService.VdpApplyLoanBtn;
                            }

                            LoggingService.LoggingUserAction(userActionType, null, sourceSectionIDVdp);
                        }

                        $window.open(Config.PreApprovalUrl.replace(/&amp;/g, '&'), '_blank');
                    };
                    ctrl.IsLoanApplicationEnabled = Config.IsLoanApplicationEnabled;
                    ctrl.ClientLogo = Config.ClientLogo;
                    ctrl.CreditUnionName = Config.ClientName;
                    ctrl.ShowCloseModal = false;
                    ctrl.vehicle.BuildSelection = $scope.$parent.$ctrl.buildselection;
                    ctrl.IsPreferredPlus = ctrl.vehicle.IsPreferredPlus;

                    ctrl.AdditionalData = getAdditionalData();

                    // Initialize VehicleTradeInService Data
                    VehicleTradeInService.Init()
                        .then(function () {
                            ctrl.VehicleTradeInDetails = VehicleTradeInService.Data.VehicleTradeInDetails;
                        });
                   
                    var qqstatus = Config.IsQuickQuoteEnabled && QuickQuoteService.GetQQProcessResultCookie();
                    ctrl.qqstatus = qqstatus ? 'True' : 'False';
                    var rate = null;
                    var term = null;
                    if (qqstatus) {
                        rate = ctrl.vehicle.APR + '%';
                        term = ctrl.vehicle.Term + ' Months';
                    }
                    var sourcePage = 'Search Result Page';
                    var currentUrl = window.location.href.toLowerCase();
                    if (currentUrl.includes('details')) {
                        sourcePage = 'Vehicle Details Page';
                    }
                    if (currentUrl.includes('details') && $scope.$parent.$ctrl.page == 'sticky') {
                        sourcePage = 'Sticky VDP Button Header';
                    }
                    
                    if (currentUrl.includes('/build')) {
                        sourcePage = 'Build Page';
                    }
                    if (currentUrl.includes('/dealer')) {
                        sourcePage = 'Dealer Search Results Page';
                    }

                    var formattedPrice = '$' + ctrl.vehicle.PriceRetail.toString().replace(/(\d)(?=(\d{3})+$)/g, '$1,');
                   
                    AmplitudeService.logEvent('Contact Dealer Modal Loaded',
                        {
                            'Source Page': sourcePage,
                            'Vehicle Type': ctrl.vehicle.PhysicalCondition.toLowerCase(),
                            'Vehicle Year': ctrl.vehicle.ItemYear ? ctrl.vehicle.ItemYear : ctrl.vehicle.ItemName.substr(0, ctrl.vehicle.ItemName.indexOf(' ')),
                            'Make': ctrl.vehicle.MakeModel ? ctrl.vehicle.MakeModel.substr(0, ctrl.vehicle.MakeModel.indexOf(' ')) : (ctrl.vehicle.Make ? ctrl.vehicle.Make : ctrl.vehicle.MakeName),
                            'Model': ctrl.vehicle.MakeModel ? ctrl.vehicle.MakeModel.substr(ctrl.vehicle.MakeModel.indexOf(' ') + 1) : (ctrl.vehicle.Model ? ctrl.vehicle.Model : ctrl.vehicle.ModelName),
                            'Dealership': ctrl.vehicle.DealerName,
                            'Dealer Price': formattedPrice,
                            'Quick Quote Completed?': ctrl.qqstatus,                           
                            'Rate': rate ? rate : '--',
                            'Term': term ? term : '--'
                        });
                };

                angular.element(document).ready(function () {
                    $('#leadUserName').keypress(function (e) {
                        let allow_char = [45, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 32, 39, 8];
                        if (allow_char.indexOf(e.which) === -1) {
                            return false;
                        }
                    });
                });

                angular.element(document).ready(function () {
                    $('#leadPhoneNumber').keypress(function (e) {
                        let allow_char = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 8];
                        if (allow_char.indexOf(e.which) === -1) {
                            return false;
                        }
                    });
                });

                angular.element(document).ready(function () {
                    $('.vdplead-modal-content').on('blur', function () {
                        ctrl.saveContactDealerFields();
                    });
                });


                function getAdditionalData() {
                    var distance = 0;
                    if ('DistanceToDealer' in ctrl.vehicle) {
                        distance = ctrl.vehicle.DistanceToDealer;
                    }

                    if ('Distance' in ctrl.vehicle && distance === 0) {
                        distance = ctrl.vehicle.Distance;
                    }

                    var data = {
                        DistanceToDealer: distance
                    };

                    if ('PricingData' in ctrl.vehicle) {
                        if (ctrl.vehicle.PricingData.PriceDifference < 0) {
                            data.PricingData = {
                                Text: ctrl.vehicle.PricingData.PriceDifferenceText,
                                Style: ctrl.vehicle.PricingData.PriceStyle
                            }
                        }
                    }

                    if ('SellerInfo' in ctrl.vehicle) {
                        data.DealerInfo = {
                            Name: ctrl.vehicle.SellerInfo.DealerContactName
                        }
                    }

                    return data;
                }

                var setUpDealerInfo = function (dealerInfo) {
                    ctrl.vehicle.SellerInfo = {};
                    ctrl.vehicle.SellerInfo.SellerName = dealerInfo.OwnerName;
                    ctrl.vehicle.SellerInfo.IsPreferredPlus = dealerInfo.IsAutoSmartXLive;
                    ctrl.vehicle.SellerInfo.ClientId = dealerInfo.ClientId;
                }

                ctrl.formatPhoneNumber = function () {
                    if (ctrl.vehicle.UserPhone && ctrl.vehicle.UserPhone.length < 10) {
                        return ctrl.vehicle.UserPhone;
                    } else {
                        var leadNumber = ctrl.vehicle.UserPhone;
                        var areaCode = leadNumber.slice(0, 3);
                        var phoneNumber = leadNumber.slice(3);

                        phoneNumber = phoneNumber.slice(0, 3) + "-" + phoneNumber.slice(3);
                        var formattedNumber = "(" + areaCode + ") " + phoneNumber;
                    }
                    $scope.vehicleLead.leadPhoneNumber.$$lastCommittedViewValue = formattedNumber;

                }

                $scope.cancel = function () {
                    ctrl.saveContactDealerFields();
                    if ($scope.$parent.$parent.modalRebateInstance) {
                        $scope.$parent.$parent.modalRebateInstance.close();
                    }
                    else if ($scope.$parent.$parent.modalCalcInstance) {
                        $scope.$parent.$parent.modalCalcInstance.close();
                    }
                    else if ($scope.$parent.$parent.modalLeadInstance) {
                        $scope.$parent.$parent.modalLeadInstance.close();
                    }
                };

                $scope.SubmitQuote = function () {
                    ctrl.saveContactDealerFields();
                    ctrl.vehicle.APRDuration = CalculatorService.CalcContent.LoanDuration;
                    ctrl.vehicle.APRMinimum = CalculatorService.CalcContent.CurrentSelectedScore.MinRate;
                    ctrl.vehicle.APRMaximum = CalculatorService.CalcContent.CurrentSelectedScore.MaxRate;
                    ctrl.vehicle.APRMinimumPrice = CalculatorService.CalculatePayment(ctrl.DisplayPrice, CalculatorService.CalcContent.CurrentSelectedScore.MinRate);
                    ctrl.vehicle.APRMaximumPrice = CalculatorService.CalculatePayment(ctrl.DisplayPrice, CalculatorService.CalcContent.CurrentSelectedScore.MaxRate);
                    ctrl.vehicle.DownPayment = CalculatorService.CalcContent.DownPayment;
                    ctrl.attemptedSubmission = true;

                    if ($scope.vehicleLead.$invalid || ctrl.leadAlreadySubmitted) {
                        $('.vdplead-modal-content input.has-error').first().focus();
                        return;
                    }

                    ctrl.leadAlreadySubmitted = true;

                    ctrl.vehicle.VehicleTradeInDetails = ctrl.VehicleTradeInDetails;

                    VehicleDetailService.RetrieveVehicle(ctrl.itemId, true, true).then(function () {

                        var vehicleInfo = VehicleDetailService.VehicleInfo;

                        var qqstatus = Config.IsQuickQuoteEnabled && QuickQuoteService.GetQQProcessResultCookie();
                        ctrl.qqstatus = qqstatus ? 'True' : 'False';
                        var rate = null;
                        var term = null;
                        if (qqstatus) {
                            rate = ctrl.vehicle.APR + '%';
                            term = ctrl.vehicle.APRDuration;
                        }
                        var sourcePage = 'search result page';
                        var currentUrl = window.location.href.toLowerCase();
                        if (currentUrl.includes('details')) {
                            sourcePage = 'vehicle details page';
                        }
                        if (currentUrl.includes('/build')) {
                            sourcePage = 'BUILD>>>contact a dealer results page';
                        }
                        if (currentUrl.includes('/dealer')) {
                            sourcePage = 'dealer search results page';
                        }

                        var formattedPrice = '$' + ctrl.vehicle.PriceRetail.toString().replace(/(\d)(?=(\d{3})+$)/g, '$1,');

                        AmplitudeService.logEvent('Dealer Contacted',
                            {
                                'source page': sourcePage,
                                'CTA source': 'Contact Dealer',
                                'vehicle type': ctrl.vehicle.PhysicalCondition.toLowerCase(),
                                'make': vehicleInfo.Make,
                                'model': vehicleInfo.Model,
                                'dealership': ctrl.vehicle.DealerName,
                                'Quick Quote Completed?': ctrl.qqstatus,
                                'dealer price': formattedPrice,
                                'rate': rate,
                                'term': term
                            });
                    });

                    LeadService.MapLeadContents(ctrl.vehicle);
                    LeadService.SaveLead().then(function (guid) {
                        if (ctrl.vehicle.IsPreferredPlus) {
                            if (guid) {
                                var url = $location.protocol() + '://' + location.host + '/Certificate/membercertificate?membercertificateguid=' + guid + '&returnUrl=' + encodeURIComponent(window.location.href);
                                window.location.href = url;
                            }
                        } else {
                            ctrl.ShowCloseModal = true;
                        }
                    });
                };

                ctrl.saveContactDealerFields = function () {
                    $cookies.put(contactDealerFieldsCookieName, JSON.stringify(ctrl.getContactDealerFields()));
                    if (!$.cookie(contactDealerFieldsCookieName)) {
                        localStorage.setItem(contactDealerFieldsCookieName, JSON.stringify(ctrl.getContactDealerFields()));
                    }
                }

                ctrl.getContactDealerFields = function () {
                    return { name: ctrl.vehicle.UserName, email: ctrl.vehicle.UserEmailAddress, phone: ctrl.vehicle.UserPhone }
                }

                ctrl.getContactDealerCookie = function () {
                    return JSON.parse($.cookie(contactDealerFieldsCookieName)
                        ? $.cookie(contactDealerFieldsCookieName)
                        : localStorage.getItem(contactDealerFieldsCookieName));
                }

                ctrl.fillFinance = function (isFinanced) {
                    return (isFinanced === ctrl.vehicle.IsFinanced) ? 'black' : 'white';
                };

                ctrl.setFinance = function (isFinanced) {
                    ctrl.vehicle.IsFinanced = isFinanced;
                };

                $scope.hasRequiredValidValues = function () {
                    return ((ctrl.vehicle.UserName && ctrl.vehicle.UserName.length > 0) && (ctrl.vehicle.UserEmailAddress && ctrl.vehicle.UserEmailAddress.length > 0));
                };
            }]
    });
})(angular.module('AutoSMART.Web.Common'));

(function(module) {

    module.component('priceanalysismodalcomponent', {
        templateUrl: '/App/Common/Views/PriceAnalysisModalComponent.html',
        controller: ["$window", "$scope", "Config", "$sce", function($window, $scope, Config, $sce) {
            var ctrl = this;

            ctrl.$onInit = function() {
                ctrl.vehicle = ($scope.$parent.$ctrl.VehicleInfo) ? $scope.$parent.$ctrl.VehicleInfo : $scope.$parent.$ctrl.data;
                ctrl.PhysicalCondition = ctrl.vehicle.PhysicalCondition;
                ctrl.Year = (ctrl.vehicle.Year) ? ctrl.vehicle.Year: ctrl.vehicle.ItemYear;
                ctrl.MakeModel = (ctrl.vehicle.MakeModel) ? ctrl.vehicle.MakeModel : (ctrl.vehicle.Make + " " + ctrl.vehicle.Model);
                ctrl.Trim = ctrl.vehicle.Trim;
                ctrl.LegalDisclaimer = ctrl.HtmlTagConvert(Config.LegalPriceAnalysisModal);
                ctrl.vehicle.ListPrice = (ctrl.vehicle.ListPrice == '0.00') ? 'N/A' : ctrl.vehicle.ListPrice;
            };

            ctrl.VDPLink = function (itemId) {
                // Add a variable hash depending on screen resultion. Alows deeplinking of Price Comparison Tab. Issue #ASIIIDESK-3469
                var hash = ($window.innerWidth < 768) ? '#vdp-price-analysis' : '#price-analysis';
                return '/Vehicle/Details/' + itemId + '?itemViewSource=SRP&PADetails'+hash;
            };

            ctrl.HtmlTagConvert = function (convert) {
                var openTag = "&lt;p&gt;";
                var closeTag = "&lt;/p&gt;";
                var reOpenTag = new RegExp(openTag, 'g');
                var reCloseTag = new RegExp(closeTag, 'g');
                var convertTags = convert.replace(reOpenTag, "<p>").replace(reCloseTag, "</p>");
                return $sce.trustAsHtml(convertTags);
            }

            $scope.cancel = function () {
                if ($scope.$parent.$parent.modalRebateInstance) {
                    $scope.$parent.$parent.modalRebateInstance.close();
                }
                else if ($scope.$parent.$parent.modalCalcInstance) {
                    $scope.$parent.$parent.modalCalcInstance.close();
                }
                else if ($scope.$parent.$parent.modalLeadInstance) {
                    $scope.$parent.$parent.modalLeadInstance.close();
                }
                else if ($scope.$parent.$parent.$root.modalInstance) {
                    $scope.$parent.$parent.$root.modalInstance.close();
                }
            };
        }]
    });

})(angular.module('AutoSMART.Web.Common'));
(function (module) {

    module.component('marketpricingmetercomponent', {
        templateUrl: '/App/Common/Views/MarketPricingMeterComponent.html',
        controller: ["$scope", "$sce", "VehiclePricingService", "HidePriceDifferenceService", function ($scope, $sce, VehiclePricingService, HidePriceDifferenceService) {
            var ctrl = this;

            ctrl.$onInit = function () {
                ctrl.vehicle = ($scope.$parent.$ctrl.VehicleInfo) ? $scope.$parent.$ctrl.VehicleInfo : $scope.$parent.$ctrl.vehicle;
                ctrl.date = new Date();
                ctrl.Price = ctrl.vehicle.PriceRetail;
                ctrl.MarketValue = (ctrl.vehicle.MarketPriceInfo) ? ctrl.vehicle.MarketPriceInfo.MarketValue : ctrl.vehicle.MarketPrice;
                ctrl.DealTypeId = (ctrl.vehicle.MarketPriceInfo) ? ctrl.vehicle.MarketPriceInfo.DealTypeId : ctrl.vehicle.DealTypeId;

                if (ctrl.vehicle.PricingData) {
                    ctrl.priceDifference = ctrl.vehicle.PricingData.PriceDifferenceAbsolute;

                    ctrl.priceDifferencePercentage = Math.abs(ctrl.vehicle.PricingData.PriceDifferencePercentage);
                }
                
                ctrl.SubLabelClass = '';
                switch(ctrl.DealTypeId) {
                    case 1:
                        ctrl.SubLabelClass = 'great-price-sub-label';
                        break;
                    case 2:
                        ctrl.SubLabelClass = 'fair-price-sub-label';
                        break;
                    case 3:
                        ctrl.SubLabelClass = 'overpriced-sub-label';
                        break;
                }

                ctrl.hidePriceDifference = function (location, locationAlt) {
                    var result = HidePriceDifferenceService.IsDealerFromTexas(location, locationAlt);
                    return result;
                }
              
            };
            
        }]
    });

})(angular.module('AutoSMART.Web.Common'));
(function (module) {

    module.component('marketpricingverbiagecomponent', {
        templateUrl: '/App/Common/Views/MarketPricingVerbiageComponent.html',
        controller: ["$scope", "HidePriceDifferenceService", function ($scope, HidePriceDifferenceService) {
            var ctrl = this;

            ctrl.$onInit = function () {
                ctrl.vehicle = ($scope.$parent.$ctrl.VehicleInfo) ? $scope.$parent.$ctrl.VehicleInfo : $scope.$parent.$ctrl.vehicle;
                ctrl.DealerZipCode = (ctrl.vehicle.SellerInfo) ? ctrl.vehicle.SellerInfo.Zipcode : ctrl.vehicle.DealerZip;
                ctrl.VehicleNumber = (ctrl.vehicle.MarketPriceInfo) ? ctrl.vehicle.MarketPriceInfo.CompareCount : ctrl.vehicle.PriceCompareVehicleCount;
                ctrl.Distance = (ctrl.vehicle.MarketPriceInfo) ? ctrl.vehicle.MarketPriceInfo.Miles : ctrl.vehicle.MarketPriceDistance;
            };

            ctrl.hidePriceDifference = function (location, locationAlt) {
                var result = HidePriceDifferenceService.IsDealerFromTexas(location, locationAlt);
                return result;
            }
        }]
    });

})(angular.module('AutoSMART.Web.Common'));
"use strict";

(function (module) {

    module.component('preferredplusbannercomponent',
    {
        controller: ["$scope", "$uibModal","Config",

            function ($scope, $uibModal,Config) {
                var ctrl = this;
                var primaryColor = Config.PrimaryColor.toLowerCase();
                var barColor = Config.SecondaryColor.toLowerCase();
                if (!barColor || barColor === "#fff" || barColor === "#ffffff") {
                    barColor = primaryColor;
                }
                ctrl.barColor = {
                    "background-color": barColor,
                    "color": "white"
                }
                ctrl.svgcontent = {
                    "TextColor": "white",
                    "ShieldColor": "white"
                };
                ctrl.open = function () {
                var interstitial = $uibModal.open({
                    animation: true,
                    ariaDescribedBy: 'interstitial-modal-body',
                    templateUrl: '/app/Common/views/_InterstitialModal.html',
                    component: 'interstitialmodal',
                    scope: $scope,
                    windowClass: 'interstitial-modal-content'
                });
                $scope.Interstitial = interstitial;
            };
        }],

        templateUrl: UrlContent("/App/Common/Views/PreferredPlusBannerComponent.html")
    });
})(angular.module('AutoSMART.Web.Common'));

"use strict";

(function (module) {

    module.component('valuationbuttoncomponent', {

        controller: ["$scope", "Config", "$uibModal", "$rootScope", "$window",
            function ($scope, Config, $uibModal, $rootScope, $window) {
                var ctrl = this;
                ctrl.$onInit = function () {
                    var info = JSON.parse(Config.ValuationInfo.replace(/&quot;/g, '"').replace(/&amp;/g, '&'));
                    ctrl.valuations = info.length > 0 ? info : null;
                    ctrl.HasThirdParty = ctrl.valuations ? true : false;

                };
                ctrl.openModal = function (url, altTag) {
                    $scope.ModalUrl = url;
                    var modalInstance;
                    if (altTag.toLowerCase() === 'black book') {
                        $window.open(url, '_blank');
                    } else if (altTag.toLowerCase() === 'kelley blue book') {
                        //$window.open('/App/Common/Views/KelleyBlueBook.html', '_blank');
                        modalInstance = $uibModal.open({
                            component: 'kelleybluebookcomponent',
                            //windowClass: 'thirdparty-modal-content',
                            scope: $scope
                        });

                        $rootScope.modalInstance = modalInstance;

                        modalInstance.result.then(function (data) {
                            if (data.data) {
                                data = data.data;
                            }
                            console.log(data);
                        });
                    } else {
                        modalInstance = $uibModal.open({
                            component: 'thirdpartymodalcomponent',
                            windowClass: 'thirdparty-modal-content',
                            scope: $scope
                        });

                        $rootScope.modalInstance = modalInstance;

                        modalInstance.result.then(function (data) {
                            if (data.data) {
                                data = data.data;
                            }
                            console.log(data);
                        });
                    }
                };
            }],
        templateUrl: UrlContent('/App/Common/Views/ValuationButton.html')
    });
})(angular.module('AutoSMART.Web.VehicleDetail'));

"use strict";

(function (module) {

    module.component('vdpdealerratercomponent', {
        controller: ['$window', '$filter', 'DealerRaterService', 'VehicleDetailService', 'Config',
            function ($window, $filter, DealerRaterService, VehicleDetailService, Config) {
                var ctrl = this;
                var displaySize = 3;
                ctrl.pageSize = displaySize;
                ctrl.pageLength = 1;
                ctrl.collectionCount = 0;
                ctrl.collectionLimit = undefined;
                ctrl.filterType = 0; //ALL
                ctrl.dealerReviews = null;       
                ctrl.isLoading = true;
                var clientCode = ctrl.data;
                ctrl.displayMoreReviewButton = true;
                var totalFilteredReviewCount = 0;

                var verifyRetrievedAllReview = function () {
                    if (ctrl.pageSize >= totalFilteredReviewCount) {
                        ctrl.displayMoreReviewButton = false;
                        return;
                    }
                    ctrl.displayMoreReviewButton = true;
                }

                var processData = function (reviews) {
                    ctrl.dealerRaterId = reviews.DealerRaterId;
                    ctrl.reviewsLength = (reviews.DealerRatingReviews)? reviews.DealerRatingReviews.length : 0;
                    totalFilteredReviewCount = reviews.TotalFilteredReviews;

                    if (ctrl.dealerReviews === null) {
                        ctrl.dealerReviews = (reviews.DealerRatingReviews) ? reviews.DealerRatingReviews : [];
                    } else {
                        if (reviews.DealerRatingReviews) {
                            angular.forEach(reviews.DealerRatingReviews,
                                function(review) {
                                    ctrl.dealerReviews.push(review);
                                });
                        
                            ctrl.dealerReviews.push(reviews.DealerRatingReviews);
                        }
                        verifyRetrievedAllReview();
                    }

                    ctrl.verifiedReviewsCount = reviews.TotalLifetimeReviews;
                    if (ctrl.collectionLimit === undefined) {
                        ctrl.collectionLimit = reviews.ReviewMaxSize;
                    }
                };

                var getReviews = function () {
                    if (ctrl.pageSize >= ctrl.collectionLimit) {
                        ctrl.collectionCount++;
                    }

                    DealerRaterService.GetRatings(clientCode, ctrl.collectionCount, ctrl.filterType).then(function (reviews) {
                        processData(reviews);
                        ctrl.isLoading = false;
                    });
                };

                ctrl.moreReviews = function (event) {
                    ctrl.pageSize += 3;
                    if (ctrl.pageSize >= ctrl.collectionLimit) {
                        getReviews();
                    }
                    ctrl.focusEl = ctrl.pageSize - 3;

                    //$(event.target).blur();
                    verifyRetrievedAllReview();
                    if (ctrl.displayMoreReviewButton === false) {
                        return;
                    }

                    setTimeout(function () {
                        $('#review-' + ctrl.focusEl).focus();
                    }, 1000)
                 
                }

                var getRaterFilters = function () {
                    var raterFilters = [
                        { 'id': 0, 'text': 'View All' },
                        { 'id': 1, 'text': 'Only Positive' },
                        { 'id': 2, 'text': 'Only Negative' },
                        { 'id': 3, 'text': 'Only Sales' },
                        { 'id': 4, 'text': 'Only Service' }
                    ];
                    return raterFilters;
                };

                var reset = function () {    
                    ctrl.isLoading = true;   
                    ctrl.dealerReviews = null;
                    ctrl.pageSize = displaySize;
                    ctrl.collectionCount = 0;
                    ctrl.displayMoreReviewButton = true;
                }

                ctrl.filterReviews = function (raterFilter) {
                    //resetting the reviews array also reset the pageSize back to 3                                        
                    reset();                    
                    ctrl.filterType = raterFilter.id;
                    getReviews();                    
                    ctrl.selectedFilter = raterFilter.text;                    
                };

                ctrl.writeReview = function (event) {
                    var url = Config.DealerRaterReviewUrl;
                    url += ctrl.dealerRaterId;
                    $window.open(url, '_blank');
                    $(event.currentTarget).blur();
                };


                ctrl.$onInit = function () {                    
                    clientCode = ctrl.data;
                    getReviews();                    
                    ctrl.selectedFilter = 'View All';
                    ctrl.raterFilters = getRaterFilters();
                    ctrl.selectedFilterModel = ctrl.raterFilters[0];
                }
            }],

        templateUrl: UrlContent('/App/Common/Views/vdp-dealerrater.html'),
        bindings: {
            data: '<'
        }
    });
})(angular.module('AutoSMART.Web.Common'));

"use strict";


(function (module) {

    module.component('thirdpartymodalcomponent', {
        templateUrl: '/app/Common/views/ThirdPartyModal.html',
        controller: ["$scope", "$uibModal", "Config", "$sce",

        function ($scope, $uibModal, Config, $sce) {
            var $ctrl = this;
            $ctrl.$onInit = function () {
                $ctrl.ThirdPartyLinkUrl = $sce.trustAsResourceUrl($scope.$parent.ModalUrl);
            };
            $ctrl.cancel = function () {
                $scope.$parent.$uibModalInstance.dismiss('cancel');
            };
        }]
    });

})(angular.module('AutoSMART.Web.Common'));
"use strict";

(function (module) {

    module.component('historybuttoncomponent', {

        controller: ["$scope", "Config", "$uibModal", "$rootScope",
            function ($scope, Config, $uibModal, $rootScope) {
                var ctrl = this;
                ctrl.$onInit = function () {
                    var info = JSON.parse(Config.HistoryInfo.replace(/&quot;/g, '"'));
                    ctrl.history = info.length > 0 ? [info[0]] : null;
                    ctrl.HasThirdParty = ctrl.history ? true : false;
                };
                ctrl.openModal = function (url) {
                    $scope.ModalUrl = url;
                    var modalInstance = $uibModal.open({
                        component: 'thirdpartymodalcomponent',
                        windowClass: 'thirdparty-modal-content',
                        scope: $scope
                    });

                    $rootScope.modalInstance = modalInstance;

                    modalInstance.result.then(function (data) {
                        if (data.data) {
                            data = data.data;
                        }
                        console.log(data);
                    });
                };
            }],
        templateUrl: UrlContent('/App/Common/Views/HistoryButton.html')
    });
})(angular.module('AutoSMART.Web.VehicleDetail'));

"use strict";

(function (module) {

    module.component('carfaxcomponent', {
        bindings: {
            vin: '=',
            page: '@'
        },
        controller: ["Config", "$uibModal", "$rootScope", "$scope", "$window", "VehicleDetailService", "GoogleAnalyticsService",
            function (Config, $uibModal, $rootScope, $scope, $window, VehicleDetailService, GoogleAnalyticsService) {
                var ctrl = this;
                ctrl.$onInit = function () {
                    var info = JSON.parse(Config.HistoryInfo.replace(/&quot;/g, '"'));
                    ctrl.vehicleInfo = VehicleDetailService.VehicleInfo;
                    if (info.length > 0) {
                        if (ctrl.vehicleInfo.VehicleHistorySingleOwner) {
                            ctrl.carfaxInfo = info[1];
                        } else {
                            ctrl.carfaxInfo = info[0];
                        }
                    } else {
                        ctrl.carfaxInfo = null;
                    }
                    ctrl.ThirdPartyImgUrl = (ctrl.carfaxInfo && ctrl.carfaxInfo.ImagePath) ? ctrl.carfaxInfo.ImagePath.replace("~", "") : "";
                    ctrl.ThirdPartyLinkUrl = (ctrl.carfaxInfo && ctrl.carfaxInfo.Url) ? ctrl.carfaxInfo.Url : "";
                    ctrl.HasThirdParty = ctrl.ThirdPartyImgUrl && ctrl.ThirdPartyLinkUrl ? true : false;
                };

                ctrl.openCarFaxModal = function () {
                    if (ctrl.page == 'VDP') {
                        ctrl.CarfaxReportClick = GoogleAnalyticsService.CarfaxReportClick;
                        ctrl.CarfaxReportClick();
                    }
                    var url = Config.CarFaxUrl;
                    url = url.replace("{0}", ctrl.vin).replace(/&amp;/g, "&");
                    $window.open(url, "_blank");
                };
            }],
        templateUrl: UrlContent('/App/Common/Views/Carfax.html')
    });
})(angular.module('AutoSMART.Web.VehicleDetail'));

"use strict";

(function (module) {

    module.component('researchhistorylinkcomponent', {

        controller: ["$scope", "Config", "$uibModal", "$rootScope",
            function ($scope, Config, $uibModal, $rootScope) {
                var ctrl = this;
                ctrl.$onInit = function () {
                    var info = JSON.parse(Config.HistoryInfo.replace(/&quot;/g, '"'));
                    ctrl.history = info.length > 0 ? [info[0]] : null;
                    ctrl.HasThirdParty = ctrl.history ? true : false;
                };
                ctrl.openModal = function (url) {
                    $scope.ModalUrl = url;
                    var modalInstance = $uibModal.open({
                        component: 'thirdpartymodalcomponent',
                        windowClass: 'thirdparty-modal-content',
                        scope: $scope
                    });

                    $rootScope.modalInstance = modalInstance;

                    modalInstance.result.then(function (data) {
                        if (data.data) {
                            data = data.data;
                        }
                        console.log(data);
                    });
                };
            }],
        templateUrl: UrlContent('/App/Common/Views/ResearchHistoryLink.html')
    });
})(angular.module('AutoSMART.Web.VehicleDetail'));


(function (module) {

    module.component('priceanalysisleads', {
        templateUrl: "/App/Common/Views/PriceAnalysisLeadComponent.html",
        controller: ["$scope", "Config", "CalculatorService", "LeadService", '$location',
            function ($scope, Config, CalculatorService, LeadService, $location) {
                var ctrl = this;

                ctrl.$onInit = function () {
                    ctrl.vehicle = $scope.$parent.$ctrl.vehicle;
                    ctrl.attemptedSubmission = false;
                    ctrl.leadAlreadySubmitted = false;
                    //srp and vdp shouldn't have this dealer object, data should already be provided from vehicle object
                    var dealerInfo = $scope.$parent.$ctrl.dealer;
                    if (dealerInfo) {
                        setUpDealerInfo(dealerInfo);
                    }

                    ctrl.vehicle.IsFinanced = false;
                    ctrl.PreApprovalLink = Config.PreApprovalUrl;
                    ctrl.IsLoanApplicationEnabled = Config.IsLoanApplicationEnabled;
                    ctrl.CreditUnionName = Config.ClientName;
                    ctrl.ShowCloseModal = false;
                    ctrl.ShowLeadForm = false;
                };

                var setUpDealerInfo = function (dealerInfo) {
                    ctrl.vehicle.SellerInfo = {};
                    ctrl.vehicle.SellerInfo.SellerName = dealerInfo.OwnerName;
                    ctrl.vehicle.SellerInfo.IsPreferredPlus = dealerInfo.IsAutoSmartXLive;
                    ctrl.vehicle.SellerInfo.ClientId = dealerInfo.ClientId;
                }

                $scope.SubmitQuote = function () {
                    ctrl.vehicle.APRDuration = CalculatorService.CalcContent.LoanDuration;
                    ctrl.vehicle.APRMinimum = CalculatorService.CalcContent.CurrentSelectedScore.MinRate;
                    ctrl.vehicle.APRMaximum = CalculatorService.CalcContent.CurrentSelectedScore.MaxRate;
                    ctrl.vehicle.APRMinimumPrice = CalculatorService.CalculatePayment(ctrl.vehicle.PriceRetail, CalculatorService.CalcContent.CurrentSelectedScore.MinRate);
                    ctrl.vehicle.APRMaximumPrice = CalculatorService.CalculatePayment(ctrl.vehicle.PriceRetail, CalculatorService.CalcContent.CurrentSelectedScore.MaxRate);
                    ctrl.vehicle.DownPayment = CalculatorService.CalcContent.DownPayment;
                    ctrl.attemptedSubmission = true;

                    if ($scope.vehicleLead.$invalid || ctrl.leadAlreadySubmitted) {
                        return;
                    }

                    ctrl.leadAlreadySubmitted = true;
                    LeadService.MapLeadContents(ctrl.vehicle);
                    LeadService.SaveLead().then(function (guid) {
                        if (ctrl.vehicle.IsPreferredPlus) {
                            if (guid) {
                                var url = $location.protocol() + '://' + location.host + '/Certificate/membercertificate?membercertificateguid=' + guid + '&returnUrl=' + encodeURIComponent(window.location.href);
                                window.location.href = url;
                            }
                        } else {
                            ctrl.ShowCloseModal = true;
                        }
                    });
                };

                $scope.cancel = function () {
                    if ($scope.$parent.$parent.modalRebateInstance) {
                        $scope.$parent.$parent.modalRebateInstance.close();
                    }
                    else if ($scope.$parent.$parent.modalCalcInstance) {
                        $scope.$parent.$parent.modalCalcInstance.close();
                    }
                    else if ($scope.$parent.$parent.modalLeadInstance) {
                        $scope.$parent.$parent.modalLeadInstance.close();
                    }
                };

                ctrl.ClientLogo = Config.ClientLogo;

                ctrl.fillFinance = function (isFinanced) {
                    return (isFinanced == ctrl.vehicle.IsFinanced) ? 'black' : 'white';
                };

                ctrl.setFinance = function (isFinanced) {
                    ctrl.vehicle.IsFinanced = isFinanced;
                };
                
                $scope.DisplayLeadForm = function () {
                    if (ctrl.ShowLeadForm == true) {
                        ctrl.ShowLeadForm = false;
                    } else {
                        ctrl.ShowLeadForm = true;
                    }
                    
                };
            }]
    });
})(angular.module('AutoSMART.Web.Common'));

'use strict';

angular.module('AutoSMART.Web.Common')
    .directive('phonenumber', ['$filter', function ($filter) {
        return {
            restrict: 'A',
            require: 'ngModel',
            scope: {
                ngModel: '='
            },
            link: function (scope, elem, attrs, ngModel) {
                var required;

                scope.$watch(function () { return scope.ngModel; }, function (newModel) {
                    var loosePhoneRegex = /^[\(\)\s\d\-]+$/;
                    var phoneRegex = /^\(\d{3}\)\s\d{3}-\d{4}$/;
                    if (!newModel) {
                        if (!required)
                            ngModel.$setValidity(ngModel.$name, true);
                        return;
                    }

                    if (!loosePhoneRegex.test(newModel)) {
                        ngModel.$setValidity(ngModel.$name, false);
                        return;
                    }

                    var digits = newModel.match(/\d/gi);
                    if (digits == null) {
                        ngModel.$setValidity(ngModel.$name, false);
                        return;
                    }

                    var result = '';
                    var plainPhoneNo = "";

                    for (var i = 0; i < Math.min(digits.length, 10) ; i++) {
                        plainPhoneNo += digits[i];
                    }
                    var areaCode = plainPhoneNo.slice(0, 3);
                    var phoneNumber = plainPhoneNo.slice(3);

                    phoneNumber = phoneNumber.slice(0, 3) + "-" + phoneNumber.slice(3);
                    result = "(" + areaCode + ")" + " " + phoneNumber;
                    scope.ngModel = result;
                    ngModel.$modelValue = plainPhoneNo;
                    if (plainPhoneNo === "") {
                        return;
                    }
                    ngModel.$setValidity(ngModel.$name, phoneRegex.test(result));
                });
            }
        };
    }
    ]);


'use strict';

(function(module) {
    module.service('FieldValidationService', [
        '$http', '$q', 'Config', function($http, $q) {


            var isANumber = function(value) {
                return !isNaN(value);
            };

            var isPositive = function(value) {
                return (value > 0);
            };

            var isPositiveOrZero = function(value) {
                return (value >= 0);
            };

            var isValidPercentage = function(value) {
                return value <= 100 && value > 0;
            };

            var checkForValidNumbers = function(value) {
                if (value === "" || value === null) {
                    return true;
                }
                if (!isANumber(value)
                    || !isPositiveOrZero(value)) {
                    return false;
                } else {
                    return true;
                }
            };

            var isValidInterest = function(value) {
                if (!isANumber(value)
                    || !isPositive(value)
                    || !isValidPercentage(value)) {
                    return false;
                } else {
                    return true;
                }
            };

            return {
                IsANumber: isANumber,
                IsPositive: isPositive,
                IsPositiveOrZero: isPositiveOrZero,
                IsValidPercentage: isValidPercentage,
                CheckForValidNumbers: checkForValidNumbers,
                IsValidInterest: isValidInterest
            }
        }
    ]);

})(angular.module('AutoSMART.Web.Common'));
"use strict";

(function (module) {

    module.component('kelleybluebookcomponent', {
        templateUrl: '/app/Common/views/KelleyBlueBook.html',
        controller: ["$scope", "$cookies", "Config", "$sce", "ZipCodeService",
            function ($scope, $cookies, Config, $sce, ZipCodeService) {
                var $ctrl = this;
                var cookieName = "kbbtradeinoutput";
                
                // Config options for KBB Widget. Will be stringified. 
                $ctrl.widgetConfig = {
                    config: {
                        userZipcode: ZipCodeService.Location.CurrentZipCode || Config.ZipCode,
                        kbbApiRoot: Config.SystemTypesApiUrl,
                        primaryColor: Config.PrimaryColor,
                        dictionaryPath: 'Scripts/site/widgets/kbb-tradein/dictionary'
                    }
                };

                $ctrl.$onInit = function () {
                    $ctrl.ThirdPartyLinkUrl = $sce.trustAsResourceUrl($scope.$parent.ModalUrl);
                    $scope.primarycolor = {
                        "background-color": Config.PrimaryColor
                    }
                    $ctrl.injectWidget(); //Don't inject custom element until variables have been initialized
                };

                $ctrl.cancel = function () {
                    $scope.$parent.$uibModalInstance.dismiss('cancel');
                    document.querySelector('cudc-kbb-tradein').removeEventListener('widgetExportDataChange', $ctrl.saveWidgetExportData);
                };


                $ctrl.injectWidget = function () {
                    const widgetContext = JSON.stringify($ctrl.widgetConfig);
                    const widget = document.createElement('cudc-kbb-tradein');
                    widget.setAttribute('widget-context', widgetContext);
                    widget.setAttribute('widget-export-data', '');
                    if (document.getElementById('kbb-widget-container')) {
                        document.getElementById('kbb-widget-container').appendChild(widget);
                        document.querySelector('cudc-kbb-tradein').addEventListener('widgetExportDataChange', $ctrl.saveWidgetExportData)
                    }
                };

                // Since removing an event listener requires a named function, we define the named event listener fn below.
                $ctrl.saveWidgetExportData = function (eventData) {
                    const today = new Date();
                    const tomorrow = new Date(today);
                    tomorrow.setDate(tomorrow.getDate() + 1);
                    $cookies.put(cookieName, eventData.detail, tomorrow);
                    if (!$cookies.get(cookieName)) {
                        localStorage.setItem(cookieName, eventData.detail);
                    }
                };
            }]
    });
})(angular.module('AutoSMART.Web.Common'));

