(function () {
    if (!window.app) {
        window.app = {};
	}
	window.app.ng = angular.module("app",
		["ngAnimate", "ngCkeditor", "ui.bootstrap", "ui.router", "angularFileUpload",
			"angular-growl", "chart.js", "sticky", "ui.select", "ngCookies", "ngAria", "ngMaterial", "pascalprecht.translate"])
        .run([
            "$rootScope", function ($rootScope) {
                // Register data in the root scope so that it's easily accesible from all views.
				$rootScope.data = app.data;

            }
        ])
        .config([
            "$locationProvider", function ($locationProvider) {
                $locationProvider.html5Mode(false);
            }
        ])
        .config([
            'growlProvider', function (growlProvider) {
                growlProvider.globalTimeToLive(3000);
            }
        ])
        .config([
            '$httpProvider', function ($httpProvider) {
                $httpProvider.interceptors.push(['$q', '$injector', 'growl', '$rootScope', '$timeout', function ($q, $injector, growl, $rootScope, $timeout) {
                    return {
                        request: function (request) {
                            return request;
                        },
                        // This is the responseError interceptor
                        responseError: function (rejection) {
                            if (rejection.status === 500) {
                                 var msg = 'An error has occured. ' + rejection.data.ExceptionMessage;
                                 growl.addErrorMessage(msg);
                                 $rootScope.$broadcast('loaderEnd', {});
                            }
                            if (rejection.status === 401) {
                                var msg = 'An authorization error has occured. Make sure you are logged in.';
                                growl.addErrorMessage(msg);
                                $rootScope.$broadcast('loaderEnd', {});
                                $timeout(function () { window.location.href = '/Account/Login'; }, 2000);

                            }

                            return $q.reject(rejection);
                        }
                    };
                }]);
            }
        ])
        .config([
            "$stateProvider", "$urlRouterProvider", "$urlMatcherFactoryProvider", function ($stateProvider, $urlRouterProvider, $urlMatcherFactory) {

                $urlMatcherFactory.caseInsensitive(true);

                // For any unmatched url, redirect to /404
                //$urlRouterProvider.otherwise("/404");


                $stateProvider
                    .state("Home", {
                        url: "/",
                        templateUrl: app.root + "/Scripts/Templates/Home.html",
                        controller: "App.Controller.Home"
                    })
                    .state("Home2", {
                        url: "",
                        templateUrl: app.root + "/Scripts/Templates/Home.html",
                        controller: "App.Controller.Home"
                    })
                    .state("403", {
                        url: "403",
                        templateUrl: app.root + "/Scripts/Templates/403.html",
                    })
                    .state("Dashboard", {
                        url: "/Dashboard",
                        templateUrl: app.root + "/Scripts/Templates/Dashboard.html",
                        controller: "App.Controller.Dashboard",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Learn", {
                        url: "/Learn",
                        templateUrl: app.root + "/Scripts/Templates/Guidance.html",
                        controller: "App.Controller.Guidance",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                     .state("About", {
                         url: "/About",
                         templateUrl: app.root + "/Scripts/Templates/About.html",
                         controller: "App.Controller.About",
                         resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                     })
                    .state("Support", {
                        url: "/Support",
                        templateUrl: app.root + "/Scripts/Templates/Support.html",
                        controller: "App.Controller.Support",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Analysis", {
                        url: "/Analysis",
                        templateUrl: app.root + "/Scripts/Templates/Analysis.html",
                        controller: "App.Controller.Analysis",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Admin", {
                        url: "/Admin",
                        templateUrl: app.root + "/Scripts/Templates/Admin.html",
                        controller: "App.Controller.Admin",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
					})
					.state("ChangePassword", {
						url: "/ChangePassword",
						templateUrl: app.root + "/Scripts/Templates/ChangePassword.html",
						controller: "App.Controller.ChangePassword",
		                resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
	                })
                    .state("Admin.ManageUsers", {
                        url: "/ManageUsers",
                        templateUrl: app.root + "/Scripts/Templates/Admin/ManageUsers.html",
                        controller: "App.Controller.ManageUsers",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Admin.Stages", {
                        url: "/Stages",
                        templateUrl: app.root + "/Scripts/Templates/Stages.html",
                        controller: "App.Controller.Stages",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Admin.Stage", {
                        url: "/Stage/:stageId",
                        templateUrl: app.root + "/Scripts/Templates/Admin/Stage.html",
                        controller: "App.Controller.Admin.Stage",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Admin.Indicator", {
                        url: "/S/:stageId/Indicator/:indicatorId",
                        templateUrl: app.root + "/Scripts/Templates/Admin/Indicator.html",
                        controller: "App.Controller.Admin.Indicator",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Admin.SubIndicator", {
                        url: "/S/:stageId/Indicator/:parentIndicatorId/Sub/:indicatorId",
                        templateUrl: app.root + "/Scripts/Templates/Admin/Indicator.html",
                        controller: "App.Controller.Admin.Indicator",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Admin.User", {
                        url: "/User/:userId",
                        templateUrl: app.root + "/Scripts/Templates/Admin/User.html",
                        controller: "App.Controller.Admin.User",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Admin.PageLoads", {
                        url: "/PageLoads",
                        templateUrl: app.root + "/Scripts/Templates/Admin/PageLoads.html",
                        controller: "App.Controller.Admin.PageLoads",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    })
                    .state("Assessments", {
                        url: "/Assessments",
                        templateUrl: app.root + "/Scripts/Templates/Assessment/List.html",
                        controller: "App.Controller.List",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { $stateParams.entityName = 'Assessment'; return $stateParams; }] }
                    })
                    .state("Assessment", {
                        url: "/Assessment/:entityId",
                        templateUrl: app.root + "/Scripts/Templates/Assessment/Root.html",
                        controller: "App.Controller.Assessment.Root",
                        abstract: true,
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { $stateParams.entityName = 'Assessment'; return $stateParams; }] }
                    })
                    .state("Assessment.Home", {
                        url: "/Home",
                        templateUrl: app.root + "/Scripts/Templates/Assessment/Home.html",
                        controller: "App.Controller.Assessment.Home",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { $stateParams.entityName = 'Assessment'; return $stateParams; }] }
                    })
                    .state("Assessment.Details", {
                        url: "",
                        templateUrl: app.root + "/Scripts/Templates/Assessment/Details.html",
                        controller: "App.Controller.Assessment.Details",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { $stateParams.entityName = 'Assessment'; return $stateParams; }] }
                    })
                    .state("Assessment.Stages", {
                        url: "/Stages?sectorId",
                        abstract: true,
                        templateUrl: app.root + "/Scripts/Templates/Assessment/Stages.html",
                        controller: "App.Controller.Assessment.Stages",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { $stateParams.entityName = 'Assessment'; return $stateParams; }] }
					})
                    .state("Assessment.Projects", {
                        url: "/Projects",
                        templateUrl: app.root + "/Scripts/Templates/Assessment/Projects.html",
                        controller: "App.Controller.Assessment.Projects",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { $stateParams.entityName = 'Assessment'; return $stateParams; }] }
                    })
                    .state("Assessment.DataMapping", {
                        url: "/DataMapping",
                        templateUrl: app.root + "/Scripts/Templates/Assessment/DataMapping.html",
                        controller: "App.Controller.Assessment.DataMapping",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { $stateParams.entityName = 'Assessment'; return $stateParams; }] }
                    })
                    .state("Assessment.Analysis", {
                        url: "/Analysis",
                        templateUrl: app.root + "/Scripts/Templates/Assessment/Analysis.html",
						controller: "App.Controller.Assessment.Analysis",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
					})
                    .state("Assessment.Stages.Detail", {
                        url: "/Stage/:stageId",
                        templateUrl: app.root + "/Scripts/Templates/Assessment/Stage.html",
                        controller: "App.Controller.Assessment.Stage",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
					})
	                .state("Assessment.Stages.Detail.Home", {
		                url: "/StageHome",
		                templateUrl: app.root + "/Scripts/Templates/Assessment/StageHome.html",
		                controller: "App.Controller.Assessment.StageHome",
		                resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
	                })
                    .state("Assessment.Stages.Detail.Indicator", {
                        url: "/Indicator/:indicatorId",
                        templateUrl: app.root + "/Scripts/Templates/Assessment/Indicator.html",
                        controller: "App.Controller.Assessment.Indicator",
                        resolve: { routeInfo: ["$stateParams", function ($stateParams) { return $stateParams; }] }
                    });
            }
		]);
}());

app.ng.directive("csDateToIso", function () {

    var linkFunction = function (scope, element, attrs, ngModelCtrl) {

        ngModelCtrl.$parsers.push(function (datepickerValue) {
            return moment(datepickerValue).format("YYYY-MM-DD");
        });
    };

    return {
        restrict: "A",
        require: "ngModel",
        link: linkFunction
    };
});
