/* TodoList()

 * =========

 * Converts a list into a todoList.

 *

 * @Usage: $('.my-list').todoList(options)

 *         or add [data-widget="todo-list"] to the ul element

 *         Pass any option as data-option="value"

 */

+function ($) {

  'use strict';



  var DataKey = 'lte.todolist';



  var Default = {

    onCheck  : function (item) {

      return item;

    },

    onUnCheck: function (item) {

      return item;

    }

  };



  var Selector = {

    data: '[data-widget="todo-list"]'

  };



  var ClassName = {

    done: 'done'

  };



  // TodoList Class Definition

  // =========================

  var TodoList = function (element, options) {

    this.element = element;

    this.options = options;



    this._setUpListeners();

  };



  TodoList.prototype.toggle = function (item) {

    item.parents(Selector.li).first().toggleClass(ClassName.done);

    if (!item.prop('checked')) {

      this.unCheck(item);

      return;

    }



    this.check(item);

  };



  TodoList.prototype.check = function (item) {

    this.options.onCheck.call(item);

  };



  TodoList.prototype.unCheck = function (item) {

    this.options.onUnCheck.call(item);

  };



  // Private



  TodoList.prototype._setUpListeners = function () {

    var that = this;

    $(this.element).on('change ifChanged', 'input:checkbox', function () {

      that.toggle($(this));

    });

  };



  // Plugin Definition

  // =================

  function Plugin(option) {

    return this.each(function () {

      var $this = $(this);

      var data  = $this.data(DataKey);



      if (!data) {

        var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);

        $this.data(DataKey, (data = new TodoList($this, options)));

      }



      if (typeof data == 'string') {

        if (typeof data[option] == 'undefined') {

          throw new Error('No method named ' + option);

        }

        data[option]();

      }

    });

  }



  var old = $.fn.todoList;



  $.fn.todoList             = Plugin;

  $.fn.todoList.Constructor = TodoList;



  // No Conflict Mode

  // ================

  $.fn.todoList.noConflict = function () {

    $.fn.todoList = old;

    return this;

  };



  // TodoList Data API

  // =================

  $(window).on('load', function () {

    $(Selector.data).each(function () {

      Plugin.call($(this));

    });

  });



}(jQuery);

