(function () {
  'use strict';
  // Source: src/html/scripts/search-forms/search-forms.js
  angular.module('searchForms', [
    'air',
    'lodge',
    'travel',
    'ui.bootstrap',
    'ngAnimate'
  ]);
  /*.constant('settings', {
        links: {
            airports: '/airports'
        },
        destinations: {
            'search': 'https://apollo.atlasvoyages.com/pois?lang=fr&limit=10&qt=byName&skip=0&str=:term&type=locality',
            'index': 'https://apollo.atlasvoyages.com/pois?lang=fr&limit=10&qt=byName&skip=0&str=:term&type=locality'
        },
        lodge: {
            standaloneSearchForm: true,
            salesApp: '/hotels'
        },
        air: {
            standaloneSearchForm: true,
            salesApp: '/reservation-vols#/',
            airlinesSearch: 'https://apollo.atlasvoyages.com/airlines?qt=search&term=:term',
            airportsSearch: 'https://apollo.atlasvoyages.com/airports?qt=search&term=:term',
            airportsResolve: 'https://apollo.atlasvoyages.com/airports?qt=codes&codes=:codes',
            legs: [
                { code: 1, label: 'Aller simple' },
                { code: 2, label: 'Aller retour' },
                { code: 3, label: 'Multi-segments' }
            ],
            // this should be refactored into: searchFlags: ['direct','airline',...etc]
            searchCriteria: {
                direct: true,
                flexDates: true,
                airline: true,
                budget: true,
                refundable: true
            }
        },
        default: {
            countries: [{
                "code": "TR",
                "name": "Turquie"
            }, {
                "code": "TH",
                "name": "Thailande"
            }, {
                "code": "RU",
                "name": "Russie"
            }, {
                "code": "IN",
                "name": "Inde"
            }, {
                "code": "CN",
                "name": "Chine"
            }, {
                "code": "HK",
                "name": "Hong Kong"
            }, {
                "code": "BR",
                "name": "Brésil"
            }, {
                "code": "VN",
                "name": "Vietnam"
            }, {
                "code": "GB",
                "name": "Grande Bretagne"
            }, {
                "code": "MY",
                "name": "Malaisie"
            }, {
                "code": "AE",
                "name": "Emirats Arabes Unis"
            }, {
                "code": "IT",
                "name": "Italie"
            }, {
                "code": "GR",
                "name": "Grèce"
            }, {
                "code": "SG",
                "name": "Singapour"
            }, {
                "code": "CV",
                "name": "Cap Vert"
            }, {
                "code": "ES",
                "name": "Espagne"
            }]
        },
        travel: {
            standaloneSearchForm: true,
        },
        routes: {
            airSales: 'ngapps/air-sales',
            lodgeSales: 'ngapps/lodge-sales',
            travelSales: 'ngapps/travel-sales'
        }
    });*/
  angular.module('searchForms').controller('MainCtrl', [
    '$scope',
    function ($scope) {
      var forms = {
          'air': {
            name: 'air',
            form: 'air_form'
          },
          'lodge': {
            name: 'lodge',
            form: 'lodge_form'
          },
          'package': {
            name: 'package',
            form: 'travel_form'
          }
        };
      function toggleForm(name) {
        $scope.current = forms[name];
      }
      $scope.toggleForm = toggleForm;
      $scope.query = {
        dstart: '',
        dend: '',
        destination: null,
        adults: 1,
        children: 0,
        ages: []
      };  //toggleForm('air');
    }
  ]);
  // Source: src/html/scripts/search-forms/ui-datepicker-ext.js
  angular.module('ui.bootstrap.datepicker').controller('DatepickerController', [
    '$scope',
    '$attrs',
    '$parse',
    '$interpolate',
    '$timeout',
    '$log',
    'dateFilter',
    'datepickerConfig',
    function ($scope, $attrs, $parse, $interpolate, $timeout, $log, dateFilter, datepickerConfig) {
      var self = this, ngModelCtrl = { $setViewValue: angular.noop };
      // nullModelCtrl;
      // Modes chain
      this.modes = [
        'day',
        'month',
        'year'
      ];
      // Configuration attributes
      angular.forEach([
        'formatDay',
        'formatMonth',
        'formatYear',
        'formatDayHeader',
        'formatDayTitle',
        'formatMonthTitle',
        'minMode',
        'maxMode',
        'showWeeks',
        'startingDay',
        'yearRange'
      ], function (key, index) {
        self[key] = angular.isDefined($attrs[key]) ? index < 8 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key]) : datepickerConfig[key];
      });
      // Watchable date attributes
      angular.forEach([
        'minDate',
        'maxDate'
      ], function (key) {
        if ($attrs[key]) {
          $scope.$parent.$watch($parse($attrs[key]), function (value) {
            self[key] = value ? new Date(value) : null;
            self.refreshView();
          });
        } else {
          self[key] = datepickerConfig[key] ? new Date(datepickerConfig[key]) : null;
        }
      });
      if (angular.isDefined($attrs.initDate)) {
        console.log($attrs.initDate, $parse($attrs.initDate));
        $scope.$parent.$watch($parse('$parent.$parent.' + $attrs.initDate), function (value) {
          console.log('initdare ' + value);
          if (!ngModelCtrl.$modelValue) {
            self.activeDate = value ? new Date(value) : new Date();
            self.refreshView();
          }
        });
      }
      $scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode;
      $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000);
      this.activeDate = angular.isDefined($attrs.initDate) ? $scope.$parent.$eval($attrs.initDate) : new Date();
      $scope.isActive = function (dateObject) {
        if (self.compare(dateObject.date, self.activeDate) === 0) {
          $scope.activeDateId = dateObject.uid;
          return true;
        }
        return false;
      };
      this.init = function (ngModelCtrl_) {
        ngModelCtrl = ngModelCtrl_;
        ngModelCtrl.$render = function () {
          self.render();
        };
      };
      this.render = function () {
        if (ngModelCtrl.$modelValue) {
          var date = new Date(ngModelCtrl.$modelValue), isValid = !isNaN(date);
          if (isValid) {
            this.activeDate = date;
          } else {
            $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');
          }
          ngModelCtrl.$setValidity('date', isValid);
        }
        this.refreshView();
      };
      this.refreshView = function () {
        if (this.element) {
          this._refreshView();
          var date = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null;
          ngModelCtrl.$setValidity('date-disabled', !date || this.element && !this.isDisabled(date));
        }
      };
      this.createDateObject = function (date, format) {
        var model = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null;
        return {
          date: date,
          label: dateFilter(date, format),
          selected: model && this.compare(date, model) === 0,
          disabled: this.isDisabled(date),
          current: this.compare(date, new Date()) === 0,
          classes: $attrs.dateClasses && $scope.dateClasses({
            date: date,
            mode: $scope.datepickerMode
          }) || ''
        };
      };
      this.isDisabled = function (date) {
        return this.minDate && this.compare(date, this.minDate) < 0 || this.maxDate && this.compare(date, this.maxDate) > 0 || $attrs.dateDisabled && $scope.dateDisabled({
          date: date,
          mode: $scope.datepickerMode
        });
      };
      // Split array into smaller arrays
      this.split = function (arr, size) {
        var arrays = [];
        while (arr.length > 0) {
          arrays.push(arr.splice(0, size));
        }
        return arrays;
      };
      $scope.select = function (date) {
        if ($scope.datepickerMode === self.minMode) {
          var dt = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : new Date(0, 0, 0, 0, 0, 0, 0);
          dt.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
          ngModelCtrl.$setViewValue(dt);
          ngModelCtrl.$render();
        } else {
          self.activeDate = date;
          $scope.datepickerMode = self.modes[self.modes.indexOf($scope.datepickerMode) - 1];
        }
      };
      $scope.move = function (direction) {
        var year = self.activeDate.getFullYear() + direction * (self.step.years || 0), month = self.activeDate.getMonth() + direction * (self.step.months || 0);
        self.activeDate.setFullYear(year, month, 1);
        self.refreshView();
      };
      $scope.toggleMode = function (direction) {
        direction = direction || 1;
        if ($scope.datepickerMode === self.maxMode && direction === 1 || $scope.datepickerMode === self.minMode && direction === -1) {
          return;
        }
        $scope.datepickerMode = self.modes[self.modes.indexOf($scope.datepickerMode) + direction];
      };
      // Key event mapper
      $scope.keys = {
        13: 'enter',
        32: 'space',
        33: 'pageup',
        34: 'pagedown',
        35: 'end',
        36: 'home',
        37: 'left',
        38: 'up',
        39: 'right',
        40: 'down'
      };
      var focusElement = function () {
        $timeout(function () {
          self.element[0].focus();
        }, 0, false);
      };
      // Listen for focus requests from popup directive
      $scope.$on('datepicker.focus', focusElement);
      $scope.keydown = function (evt) {
        var key = $scope.keys[evt.which];
        if (!key || evt.shiftKey || evt.altKey) {
          return;
        }
        evt.preventDefault();
        evt.stopPropagation();
        if (key === 'enter' || key === 'space') {
          if (self.isDisabled(self.activeDate)) {
            return;  // do nothing
          }
          $scope.select(self.activeDate);
          focusElement();
        } else if (evt.ctrlKey && (key === 'up' || key === 'down')) {
          $scope.toggleMode(key === 'up' ? 1 : -1);
          focusElement();
        } else {
          self.handleKeyDown(key, evt);
          self.refreshView();
        }
      };
    }
  ]);
}());