(function(){
    'use strict';

    angular.module('ammico', [ 'ngRoute','ammicoHome', 'ammicoMyvisit', 'ammicoBooks', 'ammicoVisites', 'ammicoSlides', 'ammicoSlideshow', 'ammicoSearch', 'ammicoAuth', 'ammicoCommon', 'templates' ])
    .config(function($routeProvider, $httpProvider) {
        $httpProvider.interceptors.push(function($q) {
            return {
                responseError: function(rejection) {
                    if (rejection.status === 401) {
                        localStorage.removeItem('token');
                    }
                    return $q.reject(rejection);
                }
            };
        });
        
        $routeProvider.
        when('/my_visit', {
            controller: 'my_visitCtrl',
            templateUrl: 'my_visit/my_visit.html',
            authRequired: true
        }).
        when('/books', {
            controller: 'booksCtrl',
            templateUrl: 'books/books.html',
            authRequired: true
        }).
        when('/books/:idBook', {
            controller: 'bookCtrl',
            templateUrl: 'books/book.html',
            authRequired: true
        }).
        when('/visites', {
            controller: 'visitesCtrl',
            templateUrl: 'visites/visites.html',
            authRequired: true
        }).
        when('/visites/:idVisit', {
            controller: 'visiteCtrl',
            templateUrl: 'visites/visite.html',
            authRequired: true
        }).
        when('/slide/:idSlide', {
            controller: 'slidesCtrl',
            templateUrl: 'slides/slides.html',
            authRequired: true
        }).
        when('/slideshow/', {
            controller: 'slideshowCtrl',
            templateUrl: 'slideshow/slideshow.html',
            authRequired: true
        }).
        when('/slideshow/:iSlide', {
            controller: 'slideshowCtrl',
            templateUrl: 'slideshow/slideshow.html',
            authRequired: true
        }).
        when('/search/:q', {
            controller: 'searchCtrl',
            templateUrl: 'search/search.html',
            authRequired: true
        }).
        when('/auth/:action', {
            controller: 'authCtrl',
            templateUrl: 'home/home.html',
            authRequired: false
        }).
        otherwise({
            redirectTo: '/my_visit'
        });
    })
    .run( function($rootScope, $location, $window, $http, authApi, context) {
        $rootScope.globals = {};
        if (context.token || localStorage.getItem('token')) {
            $rootScope.globals.userLogged = true;
            localStorage.setItem('token', (context.token || localStorage.getItem('token') ));
            $http.defaults.headers.common.Authorization = 'Token ' + (context.token || localStorage.getItem('token'));
        }
        $rootScope.$on( '$routeChangeStart', function(event, next) {
            if (next.authRequired && !$rootScope.globals.userLogged) {
                $location.path( '/auth/login' );
            }
        });
    });
})();

(function(){
  'use strict';

  angular.module('ammico')
  .controller('routeClassCtrl', function($scope, $location) {
    $scope.isActive = function(route) {
        return route === $location.path();
    };
  });

})();

(function(){
    'use strict';

    angular.module('ammicoAuth',['ngRoute', 'ngMessages'])
    .controller('authCtrl', function($location, $rootScope, $routeParams, $modal){
        $modal.open({
            templateUrl: 'auth/' + $routeParams.action + '_modal.html',
            controller: 'auth' + $routeParams.action + 'Ctrl'
        }).result.then(function (result) {
            $location.path(result);
        }, function () {
            $location.path('/');
        });
    })
    .controller('authloginCtrl', function($modalInstance, $scope, authApi, $window, $http, $rootScope){
        $scope.login = function(){
            authApi.login.save({email:$scope.email, password:$scope.password}, function(data){
                $rootScope.globals.userLogged = true;
                localStorage.setItem('token', data.token);
                $http.defaults.headers.common.Authorization = 'Token ' + localStorage.getItem('token');
                $modalInstance.close('/');
            });
        };
        $scope.register = function () {
            $modalInstance.close('/auth/register');
        };
        $scope.cancel = function () {
            $modalInstance.close('/');
        };
    })
    .controller('authlogoutCtrl', function($modalInstance, $scope, $window, $http, $rootScope){
        localStorage.removeItem('token');
        $rootScope.globals.userLogged = false;
        delete $http.defaults.headers.common.Authorization;
        $scope.cancel = function () {
            $modalInstance.close('/');
        };
    })
    .controller('authregisterCtrl', function($scope, $modalInstance, authApi){
        $scope.message = '';

        $scope.user = {
            email: '',
            password: '',
            confirmPassword: ''
        };

        $scope.submit = function(isValid) {
            console.log(isValid);
            console.log($scope);
            console.log($scope.email);
            if (isValid) {
                authApi.user.save({
                    email: $scope.user.email,
                    password: $scope.user.password,
                }, function(){
                    $modalInstance.close('/auth/login');
                });
            } else {
                $scope.message = 'Il reste toujours des champs invalides';
            }
        };
        $scope.back = function () {
            $modalInstance.close('/auth/login');
        };
    })
    .directive('compareTo', function(){
        return {
            require: 'ngModel',
            scope: {
                otherModelValue: '=compareTo'
            },
            link: function($scope, element, attributes, ngModel) {

                ngModel.$validators.compareTo = function(modelValue) {
                    return modelValue === $scope.otherModelValue;
                };

                $scope.$watch('otherModelValue', function() {
                    ngModel.$validate();
                });
            }
        };
    });
})();

(function(){
    'use strict';

    angular.module('ammicoBooks',['ngRoute', 'ui.sortable'])
    .controller('booksCtrl', function($scope, $location, $modal, Book, Slide){
        $scope.editable = true;
        
        $scope.books = Book.query({type: 'book', format:'json'}, function(data){
            data.sort(function (a, b) {
                return a.date < b.date;
            });

            for (var i = 0; i < data.length; i++) {
                data[i].slides = Slide.query({idBook:data[i].id, limit: 5, format:'json'});
            }
        });
        
//        $scope.$on('slideDeleted', function (event, data) {
//            console.log(data); // 'Data to send'
//        });

        $scope.addBook = function (idParent) {
            $modal.open({
                templateUrl: 'books/add_modal.html',
                controller: 'ModalAddBookCtrl'
            }).result.then(function (title) {
                Book.save({idParent:idParent, title: title}, function(newBook){
                    $scope.books.push(newBook);
                });
            });
        };
    })

    .controller('bookCtrl', function($scope, $location, $routeParams, $modal, Book, Slide, Order) {
        $scope.editable = true;
        
        $scope.book = Book.get({idBook:$routeParams.idBook, format:'json'}, function(data){
            data.slides = Slide.query({idBook: data.id, format:'json'}, function(data){
                data.sort(function (a, b) {
                    return a.orderIndex > b.orderIndex;
                });
            });
        });

        $scope.sortableOptions = {
                stop: function() {
                    var order = $scope.book.slides.map(function(i){
                        return i.id;
                    });
                    Order.save({idBook:$routeParams.idBook}, {order: order});
                }
        };
        
        $scope.deleteItem = function(item){
            if(window.confirm('Êtes-vous sûr(e) de vouloir effacer cet élément ? Cette action est irrémédiable.')){
                Slide.delete({idSlide: item.id}, function(){
                    $scope.book.slides.splice($scope.book.slides.indexOf(item), 1);
                },
                function(error) {
                    if (error.status === 404){
                        $scope.book.slides.splice($scope.book.indexOf(item), 1);
                    }
                });
            }
        };
    })
    .controller('ModalAddBookCtrl', function ($scope, Book, $modalInstance) {

        $scope.add = function(){
            $modalInstance.close($scope.title);
        };
        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        }
        ;
        $scope.books = Book.query({format:'json'});
        
        $scope.addToBook = function(idBook){
            $modalInstance.close(idBook);
        };

        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
    });
})();


(function(){
    'use strict';
    
    angular.module('ammicoCommon', ['ngRoute'])
    .factory('Book', function($resource, context) {
        var books = $resource(context.urls.ammicoUrl+'books/:idBook', {idBook:'@id', idExpo: context.idExpo}, {update: { method: 'PUT'}});
        return books;
    })
    .factory('Slide', function($resource, context, $modal) {
        var slides = $resource(context.urls.ammicoUrl+'slides/:idSlide', {idSlide:'@id'}, {update: { method: 'PUT'}});
        
        angular.extend(slides.prototype, {

            toggleFavorite: function () {
                this.favorite = !this.favorite;
                this.$update();
            },
            addToBook: function () {
                var _this = this;
                var modalInstance = $modal.open({
                    templateUrl: 'books/add_book_modal.html',
                    controller: 'ModalAddBookCtrl',
                    size: 'sm'
                });

                modalInstance.result.then(function (idBook) {
                    var newSlide = _this;
                    newSlide.book = idBook;
                    delete newSlide.id;
                    slides.save(newSlide);
                });
            },
            update: function(){
                console.log('test');
            },
            remove: function (array) {
                var _this = this;
                if(window.confirm('Êtes-vous sûr(e) de vouloir effacer cet élément ? Cette action est irrémédiable.')){
                    this.$delete(function(){
                        if (array){
                            array.splice(array.indexOf(_this), 1);
                        }
                        //$scope.$emit('slideDeleted', array);
                    },
                    function(error) {
                        if (error.status === 404 && array){
                                array.splice(array.indexOf(_this), 1);
                        }
                    });
                }
            }
        });
        
        return slides;
    })
    .factory('Order', function($resource, context) {
        return $resource(context.urls.ammicoUrl+'books/:idBook/order', {idBook:'@id'});
    })
    .service('Utils', function($resource, context, $sce) {
        this.sanitizeUrls = function(data){
            data.details.audio = $sce.trustAsResourceUrl(data.details.audio);
            data.details.video = $sce.trustAsResourceUrl(data.details.video);
            data.audio = $sce.trustAsResourceUrl(data.audio);
            data.video = $sce.trustAsResourceUrl(data.video);
            return data;
        };
    })
    .service('authApi', function($resource, context) {
        this.login = $resource(context.urls.ammicoUrl+'auth/api-token-auth', {idExpo: context.idExpo});
        this.logout = $resource(context.urls.ammicoUrl+'auth/logout');
        this.user = $resource(context.urls.ammicoUrl+'auth/user');
        this.test = $resource(context.urls.ammicoUrl+'auth/auth');
    })
    .service('searchApi', function($resource, context) {
        this.searchResource = function(params){
            return $resource(context.urls.searchUrl,  
                    {
                callback: 'JSON_CALLBACK'
                    },
                    {
                        getJsonp: {
                            method: 'JSONP',
                            params: params,
                            isArray: false,
                            transformResponse: function(data){
                                var i, j;
                                // Transform meta list into meta dict
                                if (typeof data.hits !== 'undefined'){
                                    var nb = data.hits.length;
                                    for(i=0;i<nb;i++){
                                        var nb_metas = data.hits[i].metas.length;
                                        data.hits[i].metas_dict = {};
                                        for(j=0;j<nb_metas;j++){
                                            if(typeof data.hits[i].metas[j].images==='undefined'){
                                                data.hits[i].metas_dict[data.hits[i].metas[j].name] = data.hits[i].metas[j].value;
                                            }
                                            else{
                                                data.hits[i].metas_dict.images = data.hits[i].metas[j].images[0].value;
                                            }
                                        }
                                    }
                                    return data;   
                                }
                                if (typeof data.response !== 'undefined'){
                                    var result = [];

                                    angular.forEach(data.response[0].collect, function(value) {
                                        var temp = {};
                                        angular.forEach(value, function(value2, key2) {
                                            temp[key2]= value2;
                                        });
                                        result.push(temp);
                                    });
                                }
                            }
                        }
                    });
        };
    })
    .directive('imgType', function(){
        return {
            restrict: 'AE',
            link: function(scope, elem) {
                elem.bind('error', function() {
                    elem.parent().addClass('no-img');
                    elem.remove();
                });
                elem.on('load', function() {
                    var w = elem.width(),
                        h = elem.height();
                    if (w > h){
                        elem.addClass('img-landscape');
                    }
                });
            }
        };
    });
    
})();

(function(){
    'use strict';


    angular.module('ammicoHome',['ngRoute'])
    .config(function ($routeProvider) {
        $routeProvider
        .when('/', {
            templateUrl: 'home/home.html',
            controller: 'homeCtrl'
        });
    })
    .controller('homeCtrl', function($scope, $location){
        $scope.searchSubmit = function(){
            $location.path('/search/' + $scope.q);
        };
    })
    .filter('meta', function() {
        return function(input, metaName) {
            var nb = input.length, i = 0, found = false;
            while(found===false && i<nb){
                if(input[i].name===metaName){
                    found = true;
                    return input[i].value;
                }
                i++;
            }
            return '';
        };
    });

})();

(function(){
    'use strict';

    angular.module('ammicoMyvisit',['ngRoute', 'ui.sortable'])
    .controller('my_visitCtrl', function($scope, $location, $modal, Book, Slide){

        //get list book
        Book.query({type: 'visit', format:'json'}, function(data){
            data.sort(function (a, b) {
                return a.date > b.date;
            });
            if (data.length >= 1){
                $scope.last_visit = data[0];
                $scope.last_visit.slides = Slide.query({idBook:data[0].id, format:'json'});
            }
        });

        $scope.addBook = function (idParent) {
            $modal.open({
                templateUrl: 'my_visit/add_modal_my_visit.html',
                controller: 'ModalAddMyvisitCtrl'
            }).result.then(function (title) {
                //add book with the title written in the modal
                Book.save({idParent:idParent, title: title}, function(newBook){
                    $scope.books.push(newBook);
                });
            });
        };        
    })
    .controller('ModalAddMyvisitCtrl', function ($scope, $modalInstance) {

        $scope.add = function(){
            $modalInstance.close($scope.title);
        };
        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
        $scope.share = function () {
            $modalInstance($scope.book);
        };
    });
})();


(function(){
    'use strict';

    angular.module('ammicoSearch',['ngResource', 'ngRoute', 'ui.bootstrap'])
    .config(function ($routeProvider) {
        $routeProvider
        .when('/', {
            templateUrl: 'search/search.html',
            controller: 'searchCtrl'
        });
    })
    .controller('searchCtrl', function($scope, $location, $routeParams, searchApi, searchApi2, $modal, Slide){
        $scope.q = $routeParams.q || '';
        if ($scope.q !== ''){
            $scope.results_ = searchApi.searchResource({q:$scope.q, of: 'json', synthesis: 'false', nresults:'10', callback: 'JSON_CALLBACK'}).getJsonp();
            $scope.results = searchApi2.searchResource({q:$scope.q, of: 'json', synthesis: 'false', nresults:'10', callback: 'JSON_CALLBACK'}).getJsonp();
        }
        
        $scope.toggleModal = function (index) {

            var modalInstance = $modal.open({
                templateUrl: 'search/modal.html',
                controller: 'ModalInstanceCtrl',
                size: 'sm'
            });

            modalInstance.result.then(function (idBook) {
                var newSlide = {
                    book: idBook,
                    research_id: $scope.results.hits[index].metas_dict.inventorynumber
                };
                Slide.save(newSlide);
            });
        };
    })
    .controller('ModalInstanceCtrl', function ($scope, $modalInstance, Book) {
        $scope.books = Book.query({format:'json'});
        
        $scope.addToBook = function(idBook){
            $modalInstance.close(idBook);
        };

        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
    });
})();

(function(){
    'use strict';

    angular.module('ammicoSlides',['ngResource', 'ngRoute'])
    .controller('slidesCtrl', function($scope, $routeParams, Slide, Utils){
        
        $scope.slide = Slide.get({idSlide:$routeParams.idSlide, format:'json'}, function(data){
            data = Utils.sanitizeUrls(data);
        });

    })
    .directive('slideEditor', function() {
        return {
            restrict: 'AE',
            replace: true,
            scope: false,
            templateUrl: 'slides/data_editor.html',
            controller: function($scope){
                $scope.slidesave = function(){
                    if(typeof $scope.slide.tags === 'string'){
                        $scope.slide.tags = $scope.slide.tags.split(',');
                        for (var i = $scope.slide.tags.length - 1; i >= 0; i--) {
                            $scope.slide.tags[i] = $scope.slide.tags[i].trim();
                        }
                    }
                    $scope.slide.editMode = false;
                    $scope.slide.$update({format:'json'});
                };
                $scope.doubleClick = function(){
                    $scope.slide.editMode = true;
                };
            }
        };
    });

})();

(function(){
    'use strict';

    angular.module('ammicoSlideshow',['ngResource', 'ngRoute', 'ui.bootstrap', 'ngTouch'])
    .controller('slideshowCtrl', function($scope, $routeParams, Slide, Book, Utils){
        $scope.slides = Slide.query({idBook:$routeParams.iSlide, format:'json'}, function(data){
            data.forEach(function(slide){
               slide = Utils.sanitizeUrls(slide);
            });
        });
        $scope.book = Book.get({idBook:$routeParams.iSlide, format:'json'});
    });
})();

(function(){
    'use strict';

    angular.module('ammicoVisites',['ngRoute', 'ui.sortable'])
    .controller('visitesCtrl', function($scope, $location, $modal, Book, Slide){

        //get list book
        $scope.visits = Book.query({type: 'visit', format:'json'}, function(data){
            data.sort(function (a, b) {
                return a.date < b.date;
            });

            for (var i = 0; i < data.length; i++) {
                data[i].slides = Slide.query({idBook:data[i].id, limit: 5, format:'json'});
            }    
        });

        $scope.toggleModal = function (index) {

            var modalInstance = $modal.open({
                templateUrl: 'visites/add_book_modal.html',
                controller: 'ModalAddVisitesCtrl',
                size: 'sm'
            });

            modalInstance.result.then(function (idBook) {
                var newSlide = {
                    book: idBook,
                    research_id: $scope.results.hits[index].metas_dict.inventorynumber
                };
                Slide.save(newSlide);
            });
        };


        $scope.addBook = function (idParent) {
            $modal.open({
                templateUrl: 'visites/add_modal_visites.html',
                controller: 'ModalAddVisitesCtrl'
            }).result.then(function (title) {
                //add book with the title written in the modal
                Book.save({idParent:idParent, title: title}, function(newBook){
                    $scope.books.push(newBook);
                });
            });
        };
        
    })


    .controller('visiteCtrl', function($scope, $routeParams, $modal, Book, Slide) {
        //get the slides of a book
      
       $scope.visit = Book.get({idBook:$routeParams.idVisit, format:'json'}, function(data){
           data.slides = Slide.query({idBook: data.id, format:'json'}, function(data){
              data.sort(function (a, b) {
                  return a.orderIndex > b.orderIndex;
              });
          });
       });
       $scope.addBook = function (idParent) {
            $modal.open({
                templateUrl: 'visites/add_modal_visites.html',
                controller: 'ModalAddVisitesCtrl'
            }).result.then(function (title) {
                //add book with the title written in the modal
                Book.save({idParent:idParent, title: title}, function(newBook){
                    $scope.books.push(newBook);
                });
            });
        };
    })


    .controller('ModalAddVisitesCtrl', function($scope, $modalInstance, Book) {

        $scope.add = function(){
            $modalInstance.close($scope.title);
//            ammicoApi.listBooks.save({title: $scope.title}, function(newBook){
//            });
        };
        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };

        $scope.books = Book.query({format:'json'});
        
        $scope.addToBook = function(idBook){
            $modalInstance.close(idBook);
        };

        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };

    
    });

})();
