var Events = function() {
  return {
      FormId: 'event-filter-form',
      MapLoaded: false,
      analyticsTagUrl: '/events',
      clearErrors: function() {

      },
      loader: function(mode, location) {
        var LoaderElement = $('.pag-loader');
        if(location && 'form' == location) {
            LoaderElement = $('.loader3');
        }
        if('show' == mode) {
            //show only one
            LoaderElement.show();
        } else {
            //hide all
            $('.loader3').hide();
            $('.pag-loader').hide();
        }
      },
      search: function(SearchUrl) {
          if(this.validate()) {
              this.clearErrors();
              var Url = SearchUrl + '/ajax/1';
              this.analyticsTagUrl = Url;
              var Data = $('#'+this.FormId).serialize();
              this.loader('show', 'form');
              $.ajax({
                  url: Url,
                  type: 'post',
                  timeout: '20000',
                  data: Data,
                  dataType: 'json',
                  error: this.onError,
                  success: this.onSuccess
              });
          }
          return false;
      },
      //pagination and sorting
      update: function(Url) {
          this.analyticsTagUrl = Url;
          this.loader('show');
          $.ajax({
              url: Url + '/ajax/1',
              timeout: '20000',
              dataType: 'json',
              error: this.onError,
              success: this.onSuccess
          });
          return false;
      },
      submit: function(FormObject) {
        if(FormObject && FormObject.action) {
            var Url = FormObject.action + '/ajax/1';
            this.analyticsTagUrl = Url;
            var Data = $(FormObject).serialize();
            //PAGINATION HACK FOR FF - on first load always sends both page dropdown values
            if($(FormObject).attr('id') && ('paggination-top-form' == $(FormObject).attr('id') || 'paggination-bottom-form' == $(FormObject).attr('id')))  {
                Data = 'page='+$('#' + $(FormObject).attr('id') + ' #page').val();
            }
            this.loader('show');
            $.ajax({
                url: Url,
                type: 'post',
                timeout: '10000',
                data: Data,
                dataType: 'json',
                error: this.onError,
                success: this.onSuccess
            });
        }
      },
      validate: function() {
        //if postcode entered, look for distance
        errors = [];
        /*if('' != $('#epostcode').val() && '' == $('#edistance').val()) {
            errors.push('please selet distance');
        }*/
        //if distance entered look for postcode
        /*if('' != $('#edistance').val() && '' == $('#epostcode').val()) {
            errors.push('please enter postcode');
        }*/
        if(0 == errors.length) {
            return true;
        } else {
            for(var i = 0; i < errors.length; i++) {
                alert(errors[i]);
            }
            return false;
        }
      },
      onError: function() {
          Events.loader('hide');
      },
      onSuccess: function(Response) {
          Events.loader('hide');
          if(Response.Status && 'ok' == Response.Status ) {
              if(Response.Url) {
                  $('#print_page_btn').attr('href', '/print-preview' + Response.Url);
              }
              if(Response.Results) {
                  $('#event-search-results').html(Response.Results);
              }
              if(Response.Form) {
                  $('#event-search-form').html(Response.Form);
              }
              Defaults.init();
              trackView(Events.analyticsTagUrl);
              
          }
      },
      showTab: function(Tab) {
          //load map if not loaded
          $('#listmap_nav a').removeClass('selected');
          $('#listmap_nav li.'+Tab+' a').addClass('selected');

          if('map' == Tab) {
              $('#map-view').show();
              $('#list-view').hide();
              $('#search-container').removeClass('event-search');
              $('#search-container').addClass('gmap-item');
              if(false === this.MapLoaded) {
                  this.loadMap(MAP_URL, MAP_TYPE);
              }
          } else {
              $('#list-view').show();
              $('#map-view').hide();              
              $('#search-container').removeClass('gmap-item');
              $('#search-container').addClass('event-search');

          }
          /* What is it meant to do here? Response is not defined, breaks all Js. (ZE)
           *if(Response.Url) {
              $('#print_page_btn').attr('href', '/print-preview' + Response.Url + '/show/' + Tab);
          }*/
          
          var print_url = $('#print_page_btn').attr('href');
          print_url = print_url.replace(/\/show\/map/, '');
          print_url = print_url.replace(/\/show\/list/, '');
          print_url += '/show/'+Tab;
          $('#print_page_btn').attr('href', print_url);
          $('#view_mode').val(Tab);
          return false;
      },
      loadMap: function(MapUrl, MapType) {
          if(document.getElementById('map-container')) {
            loadMap('map-container', MapUrl, MapType);
            this.MapLoaded = true;
          }
      },
      showMapType: function(Selected) {
          $('#gmap_nav a').removeClass('selected');
          $('#'+Selected).addClass('selected');
      }
  };
}();

