// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

define([
       "app",
       "api",
       "addons/activetasks/resources"
],

function (app, FauxtonAPI, activetasks) {

  var Views = {},
      Events = {},
      pollingInfo ={
        rate: "5",
        intervalId: null
      };


  Views.Events = _.extend(Events, Backbone.Events);

  Views.TabMenu = FauxtonAPI.View.extend({
    template: "addons/activetasks/templates/tabs",
    events: {
      "click .task-tabs li": "requestByType",
      "change #pollingRange": "changePollInterval"
    },
    establish: function(){
      return [this.model.fetch({reset: true})];
    },
    serialize: function(){
      return {
        filters: this.model.alltypes
      };
    },
    afterRender: function(){
      this.$('.task-tabs').find('li').eq(0).addClass('active');
    },
    changePollInterval: function(e){
      var range = this.$(e.currentTarget).val();
      this.$('label[for="pollingRange"] span').text(range);
      pollingInfo.rate = range;
      clearInterval(pollingInfo.intervalId);
      Events.trigger('update:poll');
    },

    cleanup: function () {
      clearInterval(pollingInfo.intervalId);
    },

    requestByType: function(e){
      var currentTarget = e.currentTarget;
      datatype = this.$(currentTarget).attr("data-type");

      this.$('.task-tabs').find('li').removeClass('active');
      this.$(currentTarget).addClass('active');
      this.model.changeView(datatype);
    }
  });

  Views.DataSection = FauxtonAPI.View.extend({
    showData: function(){
      var currentData = this.model.getCurrentViewData();

      if (this.dataView) {
       this.dataView.update(currentData, this.model.get('currentView').replace('_',' '));
      } else {
        this.dataView = this.insertView( new Views.TableData({ 
          collection: currentData,
          currentView: this.model.get('currentView').replace('_',' ')
        }));
      }
    },
    showDataAndRender: function () {
      this.showData();
      this.dataView.render();
    },

    beforeRender: function () {
      this.showData();
    },
    establish: function(){
      return [this.model.fetch()];
    },
    setPolling: function(){
      var that = this;
      clearInterval(pollingInfo.intervalId);
      pollingInfo.intervalId = setInterval(function() {
        that.establish();
      }, pollingInfo.rate*1000);
    },
    cleanup: function(){
      clearInterval(pollingInfo.intervalId);
    },
    afterRender: function(){
      this.listenTo(this.model, "change", this.showDataAndRender);
      Events.bind('update:poll', this.setPolling, this);
      this.setPolling();
    }
  });

  Views.TableData = FauxtonAPI.View.extend({
    tagName: "table",
    className: "table table-bordered table-striped active-tasks",
    template: "addons/activetasks/templates/table",
    events: {
      "click th": "sortByType"
    },
    initialize: function(){
      currentView = this.options.currentView;
    },
    sortByType:  function(e){
      var currentTarget = e.currentTarget;
      datatype = $(currentTarget).attr("data-type");
      this.collection.sortByColumn(datatype);
      this.render();
    },
    serialize: function(){
      return {
        currentView: currentView,
        collection: this.collection
      };
    },

    update: function (collection, currentView) {
      this.collection = collection;
      this.currentView = currentView;
    },

    beforeRender: function(){
      //iterate over the collection to add each
      this.collection.forEach(function(item) {
        this.insertView("#tasks_go_here", new Views.TableDetail({ 
          model: item
        }));
      }, this);
    }
  });

  Views.TableDetail = FauxtonAPI.View.extend({
    tagName: 'tr',
    template: "addons/activetasks/templates/tabledetail",
    initialize: function(){
      this.type = this.model.get('type');
    },
    getObject: function(){
      var objectField = this.model.get('database');
      if (this.type === "replication"){
        objectField = this.model.get('source') + " to " + this.model.get('target');
      }
      return objectField;
    },
    getProgress:  function(){
      var progress = "";
      if (this.type === "indexer"){
        progress = "Processed " +this.model.get('changes_done')+ " of "+this.model.get('total_changes')+ ' changes.';
      } else if (this.type === "replication"){
        progress = this.model.get('docs_written')+ " docs written. ";
        if (this.model.get('changes_pending') !== null) { 
          progress += this.model.get('changes_pending')+' pending changes.';
        }
      }
      return progress;
    },
    serialize: function(){
      return {
        model: this.model,
        objectField: this.getObject(),
        progress: this.getProgress()
      };
    }
  });



  return Views;
});

@@ -5001,16 +5001,20 @@
 !== 
-null
+undefined
 ) %7B
- 
 %0A   
@@ -5065,17 +5065,19 @@
 ending')
-+
+ + 
 ' pendin
@@ -5078,32 +5078,33 @@
 pending changes.
+ 
 ';%0A        %7D%0A   
@@ -5100,32 +5100,451 @@
       %7D%0A      %7D%0A
+      if (this.model.get('source_seq') !== undefined) %7B%0A        progress += %22Current source sequence: %22 + this.model.get('source_seq') + %22. %22%0A      %7D%0A      if (this.model.get('changes_done') !== undefined) %7B%0A        progress += this.model.get('changes_done') + %22 Changes done. %22%0A      %7D%0A      if (this.model.get('progress') !== undefined) %7B%0A        progress += %22Progress: %22 + this.model.get('progress') + %22%25 %22%0A      %7D%0A%0A
       return pro

Fix status messages in Active Tasks