(function () {
    "use strict";
    // Date
    Date.prototype.toMonthNameShort = function () {
        return this.toUTCString().split(' ')[2];
    };

    Date.prototype.toDayNameShort = function () {
        return this.toUTCString().substring(0, 3);
    };

    Date.prototype.toDateTimeString = function () {
        return this.getDate() + " " + this.toMonthNameShort().toLowerCase() + " " + this.getFullYear() + ", " + this.toHoursAndMinutesString();
    };

    Date.prototype.toHoursAndMinutesString = function () {
        return this.toTimeString().substring(0, 5);
    };

    Date.prototype.addDays = function (days) {
        this.setTime(this.getTime() + days * 86400000);
        return this;
    };

    Date.prototype.addHours = function (hours) {
        this.setTime(this.getTime() + hours * 3600000);
        return this;
    };

    // String 
    String.prototype.format = String.prototype.f = function () {
        var s = this,
            i = arguments.length;

        while (i--) {
            s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
        }
        return s;
    };
}());
var app = angular.module("app", ["ui.router", "ui.unique", "ngResource", "ui.bootstrap", "angular-loading-bar"]);
app.config(["$stateProvider", "$urlRouterProvider", "$httpProvider", "cfpLoadingBarProvider", "$locationProvider", function ($stateProvider, $urlRouterProvider, $httpProvider, cfpLoadingBarProvider, $locationProvider) {
    "use strict";
    $locationProvider.hashPrefix("");

    var localStorageAvailable = false;
    try {
        localStorage.setItem("requestLimitDialogShown", false);
        localStorageAvailable = localStorage.getItem("requestLimitDialogShown") !== null;
    } catch (ignore) { }

    if (localStorageAvailable) {
        cfpLoadingBarProvider.includeSpinner = true;

        if (!$httpProvider.defaults.headers.get) {
            $httpProvider.defaults.headers.get = {};
        }

        $httpProvider.defaults.headers.get["If-Modified-Since"] = "0";
        $httpProvider.interceptors.push(["$q", "$injector", function ($q, $injector) {
            return {
                'responseError': function (response) {
                    var localDialogService = $injector.get("dialogService") || { openServerErrorDialogAsPromise: function (message) { console.log(message); } };
                    var errorMessage;
                    switch (response.status) {
                        case 401:
                            errorMessage = response.data ? response.data.Message : response.statusText;
                            localDialogService.openAuthenticationErrorDialogAsPromise(errorMessage);
                            break;
                        case 500:
                            errorMessage = response.data ? response.data.ExceptionMessage : response.statusText;
                            localDialogService.openServerErrorDialogAsPromise(errorMessage);
                            break;
                        case 429:
                            var isOpen = localStorage.getItem("requestLimitDialogShown") === "false" ? false : true;
                            if (!isOpen) {
                                localStorage.setItem("requestLimitDialogShown", true);
                                var retryAfter = response.statusText;
                                localDialogService.openRequestLimitDialogAsPromise(retryAfter);
                            }
                            break;
                    }
                    return $q.reject(response);
                }
            };
        }]);

        // Direct function call, doesn't work to "minification-safe" this call
        $urlRouterProvider.otherwise(function ($injector) {
            var $state = $injector.get("$state");
            $state.go("booking.start");
        });

        $stateProvider
            .state("rebooking", {
                "abstract": true,
                url: "/rebooking",
                template: "<div><div ui-view></div></div>",
                controller: "rebookingCtrl"
            })
            .state("rebooking.start", {
                url: "/start",
                templateUrl: "templates/rebooking/start",
                controller: "rebookingStartCtrl"
            })
            .state("rebooking.confirmation", {
                url: "/confirmation",
                templateUrl: "templates/booking/confirmation",
                controller: "bookingConfirmationCtrl"
            })
            .state("booking", {
                "abstract": true,
                url: "/booking",
                template: "<div><div ui-view></div></div>",
                controller: "bookingCtrl"
            })
            .state("booking.start", {
                url: "/start?ap",
                templateUrl: "start",
                controller: "bookingStartCtrl"
            })
            .state("booking.details", {
				url: "/details/:registrationNo/:make/?mam?my?rebooking",
                templateUrl: "templates/booking/details",
                controller: "bookingDetailsCtrl"
            })
            .state("booking.timeslot", {
				url: "/timeslot/:registrationNo/:make/:resourceContainerId?mam?my?rebooking",
                params: {
                    registrationNo: "",
                    make: "",
                    resourceContainerId: "",
                    choosenWorkshop: ""
                },
                templateUrl: "templates/booking/timeslot",
                controller: "bookingTimeslotCtrl"
            })
            .state("booking.confirmation", {
                url: "/confirmation/:regNo",
                templateUrl: "templates/booking/confirmation",
                controller: "bookingConfirmationCtrl"
            });
    }
}]);

app.run(["$rootScope", "$state", "companyInfoRepo", "companyInfoService", "$window", "dialogService", function ($rootScope, $state, companyInfoRepo, companyInfoService, $window, dialogService) {
    "use strict";
    $rootScope.$state = $state;
    $rootScope.localStorageAvailable = false;    
    try {
        $rootScope.localStorageAvailable = localStorage.getItem("requestLimitDialogShown") !== null;
    } catch (ignore) { }

    if ($rootScope.localStorageAvailable) {
        $rootScope.companyKey = companyInfoService.getCompanyKey();

        $rootScope.$on('initBookingStart', function () {
            companyInfoRepo.getIntegrityPolicySettings($rootScope.companyKey).then(function (settings) {
                $rootScope.showIntegrityPolicyLink = settings.data.ShowIntegrityPolicyLink;
                $rootScope.integrityPolicyLink = settings.data.IntegrityPolicyLink;
            }).catch(function () {
                return;
            });
        });

        companyInfoRepo.getCompanyExists($rootScope.companyKey).then(function (data) {
            $rootScope.companyExists = data.data;

            if ($rootScope.companyExists) {
                $rootScope.$broadcast("initBookingStart");
            }
        }).catch(function () {
            return;
        });

        companyInfoRepo.getLogoByCompanyKey($rootScope.companyKey).then(function (logo) {
            if (logo.data.FileType && logo.data.FileData) {
                $rootScope.logo = "data:" + logo.data.FileType + ";base64," + logo.data.FileData;
                $rootScope.showLogo = true;
            } else {
                $rootScope.showLogo = false;
            }
        }).catch(function () {
            return;
        });

        companyInfoRepo.getBackgroundByCompanyKey($rootScope.companyKey).then(function (background) {
            if (background.data.FileType && background.data.FileData) {
                $rootScope.background = "data:" + background.data.FileType + ";base64," + background.data.FileData;
            }
        }).catch(function () {
            return;
        });

    } else {
        dialogService.openGenericErrorDialogAsPromise(Resources.cookiesDisabled);
    }

    $rootScope.setBookAndRebookButtonState = function () {
        if ($state.params.rebooking === "true" || $state.params.registrationNo || $state.current.name === "booking.confirmation" || $state.current.name === "rebooking.confirmation") {
            $rootScope.showBookAndRebookButton = false;
        }
        else {
            $rootScope.showBookAndRebookButton = true;
        }
    };

    $rootScope.setBookingInfoAlertState = function () {
        if (!$state.params.registrationNo ||
            $state.current.name === "booking.confirmation" ||
            $state.current.name === "rebooking.confirmation") {
            document.getElementById('bookingInfoAlert').style.visibility = "hidden";
        }
    };

    $rootScope.$on('showBookingInfoAlert', function () {
        document.getElementById('bookingInfoAlert').style.visibility = "visible";
       
        setTimeout(function () {
            document.getElementById('bookingInfoAlert').style.visibility = "hidden";
        }, 10000);

    });

    $rootScope.checkState = function (stateString) {
        $rootScope.setBookAndRebookButtonState();
        $rootScope.setBookingInfoAlertState();
        return $rootScope.$state.current.name.indexOf(stateString) === 0;
    };

    $rootScope.goToPrivicyPolicy = function () {
        switch (navigator.language.substring(0, 2)) {
            case "sv":
                $window.open("http://www.cab.se/se/hantering-av-personuppgifter/hantering-av-personuppgifter/integritetspolicy.html", "_blank");
                break;
            case "fi":
                $window.open("http://www.cab.se/fi/suomi/cab-group/henkilotietojen-kasittely/henkilotietojen-kasittely/tietosuojapolitiikka.html", "_blank");
                break;
            case "nn":
            case "nb":
                $window.open("http://www.cab.se/no/cab-group/handtering-av-personopplysninger/handtering-av-personopplysninger/personvernpolicy.html", "_blank");
                break;
            case "da":
                $window.open("http://www.cab.se/dk/cab-group/handtering-af-personlige-oplysninger/handtering-af-personlige-oplysninger/politik-om-beskyttelse-af-personoplysninger.html", "_blank");
                break;
            case "et":
                $window.open("http://www.cab.se/et/cab-group/isikuandmete-kaitlemine/isikuandmete-kaitlemine/isikuandmete-kaitse-pohimotted.html", "_blank");
                break;
            case "is":
                $window.open("http://www.cab.se/is/cab-group/medhondlun-personuupplysinga/medhondlun-personuupplysinga/personuverndarstefna.html", "_blank");
                break;
            default:
                $window.open("http://www.cab.se/int/cab-group/handling-of-personal-data/handling-of-personal-data/integrity-policy.html", "_blank");
        }
    };

    $rootScope.getCookie = function (name) {
        var nameEq = name + "=";
        var ca = document.cookie.split(";");
        var i, c;
        for (i = 0; i < ca.length; i++) {
            c = ca[i];
            while (c.charAt(0) === " ") {
                c = c.substring(1, c.length);
            }

            if (c.indexOf(nameEq) === 0) {
                return c.substring(nameEq.length, c.length);
            }
        }
        return null;
    };

    $rootScope.setCookie = function (name, value) {
        if (!$rootScope.getCookie(name)) {
            document.cookie = name + "=" + (value || "") + "; path=/";
        }
    };
}]);

app.factory("$exceptionHandler", [function () {
    "use strict";
    return function (exception, cause) {
        console.log(exception);
        console.log(cause);
    };
}]);
