text: Tasks = new Mongo.Collection("tasks");
  
  Router.route('/', function () {
    this.render('appLayout');
    //this.layout('appLayout');
    //this.render('aTask', {to: 'aTask'});
  });
  
  Router.route('/about');
  
  if (Meteor.isServer) {
    // This code only runs on the server
    // Only publish tasks that are public or belong to the current user
    Meteor.publish("tasks", function () {
      return Tasks.find({
        $or: [
          { private: {$ne: true} },
          { owner: this.userId }
        ]
      });
    });
  }
  
  if (Meteor.isClient) {
    // This code only runs on the client
    Meteor.subscribe("tasks");
  
    Template.appLayout.helpers({
      tasks: function () {
        if (Session.get("hideCompleted")) {
          // If hide completed is checked, filter tasks
          return Tasks.find({checked: {$ne: true}}, {sort: {createdAt: -1}});
        } else {
          // Otherwise, return all of the tasks
          return Tasks.find({}, {sort: {createdAt: -1}});
        }
      },
      hideCompleted: function () {
        return Session.get("hideCompleted");
      },
      incompleteCount: function () {
        return Tasks.find({checked: {$ne: true}}).count();
      }
    });
  
    Template.appLayout.events({
      "submit .new-task": function (event) {
        // Prevent default browser form submit
        event.preventDefault();
  
        // Get value from form element
        var text = event.target.text.value;
  
        // Insert a task into the collection
        if (text != "")
          Meteor.call("addTask", text);
  
        // Clear form
        event.target.text.value = "";
      },
      "change .hide-completed input": function (event) {
        Session.set("hideCompleted", event.target.checked);
      }
    });
  
    Template.aTask.helpers({
      isOwner: function () {
        return this.owner === Meteor.userId();
      }
    });
  
    Template.aTask.events({
      "click .toggle-checked": function () {
        // Set the checked property to the opposite of its current value
        //console.log("check _id: ", Template.currentData()._id, this._id);
        Meteor.call("setChecked", this._id, ! this.checked);
      },
      "click .delete": function () {
        //console.log("delete _id: ", Template.currentData()._id, this._id);
        Meteor.call("deleteTask", this._id);
      },
      "click .toggle-private": function () {
        //console.log("priv _id: ", Template.currentData()._id, this._id);
        Meteor.call("setPrivate", this._id, ! this.private);
      }
    });
  
    Accounts.ui.config({
      passwordSignupFields: "USERNAME_ONLY"
    });
  }
  
  Meteor.methods({
    addTask: function (text) {
      // Make sure the user is logged in before inserting a task
      if (! Meteor.userId()) {
        throw new Meteor.Error("not-authorized");
      }
  
      Tasks.insert({
        text: text,
        createdAt: new Date(),
        owner: Meteor.userId(),
        username: Meteor.user().username
      });
    },
    deleteTask: function (taskId) {
      var task = Tasks.findOne(taskId);
      if (task.private && task.owner !== Meteor.userId()) {
        // If the task is private, make sure only the owner can delete it
        throw new Meteor.Error("not-authorized");
      }
  
      Tasks.remove(taskId);
    },
    setChecked: function (taskId, setChecked) {
      var task = Tasks.findOne(taskId);
      if (task.private && task.owner !== Meteor.userId()) {
        // If the task is private, make sure only the owner can check it off
        throw new Meteor.Error("not-authorized");
      }
  
      Tasks.update(taskId, { $set: { checked: setChecked} });
    },
    setPrivate: function (taskId, setToPrivate) {
      var task = Tasks.findOne(taskId);
  
      // Make sure only the task owner can make a task private
      if (task.owner !== Meteor.userId()) {
        throw new Meteor.Error("not-authorized");
      }
  
      Tasks.update(taskId, { $set: { private: setToPrivate } });
    }
  });
  