/* 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);