﻿(function()
{
    var app = angular.module('app', ['ngRoute', 'Core', 'ngCookies', 'ui.bootstrap', 'LocalStorageModule', 'gRecaptcha.v3']);
    var viewsBase = '/MooreCountySolidWaste/app/views/';

    app.config(function ($routeProvider, $locationProvider) {
        $locationProvider.html5Mode(true);
        $routeProvider
            .when('/',
            {
                templateUrl: viewsBase + 'Home.html',
                controller: 'HomeController as vmHome'
            })
            .when('/AccountDetails',
            {
                templateUrl: viewsBase + 'AccountDetails.html',
                controller: 'AccountsController as vmAccount'
            })
            .when('/Login',
            {
                templateUrl: viewsBase + 'Login.html',
                controller: 'LoginController as vmLogin'
            })
            .when('/StationSetup',
            {
                templateUrl: viewsBase + 'StationSetup.html',
                controller: 'StationSetupController as vmStationSetup'
            })
            .when('/CreditCardPayment/:Type/:Amount/:Reference',
            {
                templateUrl: viewsBase + 'CreditCardPayment.html',
                controller: 'CreditCardPaymentController as vmCreditCardPayment'
            })
            .when('/eCheckPayment/:Type/:Amount/:Reference',
            {
                templateUrl: viewsBase + 'eCheckPayment.html',
                controller: 'eCheckPaymentController as vmeCheckPayment'
            })
            .when('/CreditCardReceipt/:ConfirmationId/:ReceiptType',
            {
                templateUrl: viewsBase + 'CreditCardReceipt.html',
                controller: 'ReceiptController as vmReceiptData'
            })
            .when('/eCheckReceipt/:ConfirmationId/:ReceiptType',
            {
                templateUrl: viewsBase + 'eCheckReceipt.html',
                controller: 'ReceiptController as vmReceiptData'
            })
            .when('/TerminalPayment/:Type/:Amount/:Reference',
            {
                templateUrl: viewsBase + 'TerminalPayment.html',
                controller: 'TerminalPaymentController as vmTerminalPayment'
            })
            .when('/TerminalReceipt/:ConfirmationId/:ReceiptType',
            {
                templateUrl: viewsBase + 'TerminalReceipt.html',
                controller: 'ReceiptController as vmReceiptData'
            });
    });

    app.directive('phoneInput', function ($filter, $browser) {
        return {
            require: 'ngModel',
            link: function ($scope, $element, $attrs, ngModelCtrl) {
                var listener = function () {
                    var value = $element.val().replace(/[^0-9]/g, '');
                    $element.val($filter('tel')(value, false));
                };

                // This runs when we update the text field
                ngModelCtrl.$parsers.push(function (viewValue) {
                    return viewValue.replace(/[^0-9]/g, '').slice(0, 10);
                });

                // This runs when the model gets updated on the scope directly and keeps our view in sync
                ngModelCtrl.$render = function () {
                    $element.val($filter('tel')(ngModelCtrl.$viewValue, false));
                };

                $element.bind('change', listener);
                $element.bind('keydown', function (event) {
                    var key = event.keyCode;
                    // If the keys include the CTRL, SHIFT, ALT, or META keys, or the arrow keys, do nothing.
                    // This lets us support copy and paste too
                    if (key == 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) {
                        return;
                    }
                    $browser.defer(listener); // Have to do this or changes don't get picked up properly
                });

                $element.bind('paste cut', function () {
                    $browser.defer(listener);
                });
            }

        };
    });

    app.filter('tel', function () {
        return function (tel) {
            if (!tel) { return ''; }

            var value = tel.toString().trim().replace(/^\+/, '');

            if (value.match(/[^0-9]/)) {
                return tel;
            }

            var country, city, number;

            switch (value.length) {
                case 1:
                case 2:
                case 3:
                    city = value;
                    break;

                default:
                    city = value.slice(0, 3);
                    number = value.slice(3);
            }

            if (number) {
                if (number.length > 3) {
                    number = number.slice(0, 3) + '-' + number.slice(3, 7);
                }
                else {
                    number = number;
                }
                return ("(" + city + ") " + number).trim();
            }
            else {
                return "(" + city;
            }
        };
    });

    app.directive('currencyInput', function ($filter, $browser) {
        return {
            require: 'ngModel',
            link: function ($scope, $element, $attrs, ngModelCtrl) {
                var listener = function () {
                    var value = $element.val().replace(/[^0-9]/g, '').replace(/^0+/, '') / 100;
                    $element.val($filter('currency')(value));
                };

                // This runs when we update the text field
                ngModelCtrl.$parsers.push(function (viewValue) {
                    return viewValue.replace(/[^0-9]/g, '').replace(/^0+/, '') / 100;
                });

                // This runs when the model gets updated on the scope directly and keeps our view in sync
                ngModelCtrl.$render = function () {
                    $element.val($filter('currency')(ngModelCtrl.$viewValue));
                };

                $element.bind('change', listener);
                $element.bind('keydown', function (event) {
                    var key = event.keyCode;
                    // If the keys include the CTRL, SHIFT, ALT, or META keys, or the arrow keys, do nothing.
                    // This lets us support copy and paste too
                    if (key == 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) {
                        return;
                    }
                    $browser.defer(listener); // Have to do this or changes don't get picked up properly
                });

                $element.bind('paste cut', function () {
                    $browser.defer(listener);
                });
            }
        };
    });

    app.directive('ngFocus', ['$parse', function($parse) {
        return function(scope, element, attr) {
            var fn = $parse(attr['ngFocus']);
            element.on('focus', function(event) {
                scope.$apply(function() {
                    fn(scope, {$event:event});
                });
            });
        };
    }])

    app.directive('ngBlur', ['$parse', function($parse) {
        return function(scope, element, attr) {
            var fn = $parse(attr['ngBlur']);
            element.on('blur', function(event) {
                scope.$apply(function() {
                    fn(scope, {$event:event});
                });
            });
        };
    }]);

    app.directive('autoFocus', function ($timeout) {
        return {
            restrict: 'AC',
            link: function (_scope, _element) {
                $timeout(function () {
                    _element[0].focus();
                }, 0);
            }
        };
    });
}());
