| /*! AdminLTE app.js |
| * ================ |
| * Main JS application file for AdminLTE v2. This file |
| * should be included in all pages. It controls some layout |
| * options and implements exclusive AdminLTE plugins. |
| * |
| * @Author Almsaeed Studio |
| * @Support <http://www.almsaeedstudio.com> |
| * @Email <abdullah@almsaeedstudio.com> |
| * @version 2.3.8 |
| * @license MIT <http://opensource.org/licenses/MIT> |
| */ |
| |
| //Make sure jQuery has been loaded before app.js |
| if (typeof jQuery === "undefined") { |
| throw new Error("AdminLTE requires jQuery"); |
| } |
| |
| /* AdminLTE |
| * |
| * @type Object |
| * @description $.AdminLTE is the main object for the template's app. |
| * It's used for implementing functions and options related |
| * to the template. Keeping everything wrapped in an object |
| * prevents conflict with other plugins and is a better |
| * way to organize our code. |
| */ |
| $.AdminLTE = {}; |
| |
| /* -------------------- |
| * - AdminLTE Options - |
| * -------------------- |
| * Modify these options to suit your implementation |
| */ |
| $.AdminLTE.options = { |
| //Add slimscroll to navbar menus |
| //This requires you to load the slimscroll plugin |
| //in every page before app.js |
| navbarMenuSlimscroll: true, |
| navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar |
| navbarMenuHeight: "200px", //The height of the inner menu |
| //General animation speed for JS animated elements such as box collapse/expand and |
| //sidebar treeview slide up/down. This options accepts an integer as milliseconds, |
| //'fast', 'normal', or 'slow' |
| animationSpeed: 500, |
| //Sidebar push menu toggle button selector |
| sidebarToggleSelector: "[data-toggle='offcanvas']", |
| //Activate sidebar push menu |
| sidebarPushMenu: true, |
| //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin) |
| sidebarSlimScroll: true, |
| //Enable sidebar expand on hover effect for sidebar mini |
| //This option is forced to true if both the fixed layout and sidebar mini |
| //are used together |
| sidebarExpandOnHover: false, |
| //BoxRefresh Plugin |
| enableBoxRefresh: true, |
| //Bootstrap.js tooltip |
| enableBSToppltip: true, |
| BSTooltipSelector: "[data-toggle='tooltip']", |
| //Enable Fast Click. Fastclick.js creates a more |
| //native touch experience with touch devices. If you |
| //choose to enable the plugin, make sure you load the script |
| //before AdminLTE's app.js |
| enableFastclick: false, |
| //Control Sidebar Tree views |
| enableControlTreeView: true, |
| //Control Sidebar Options |
| enableControlSidebar: true, |
| controlSidebarOptions: { |
| //Which button should trigger the open/close event |
| toggleBtnSelector: "[data-toggle='control-sidebar']", |
| //The sidebar selector |
| selector: ".control-sidebar", |
| //Enable slide over content |
| slide: true |
| }, |
| //Box Widget Plugin. Enable this plugin |
| //to allow boxes to be collapsed and/or removed |
| enableBoxWidget: true, |
| //Box Widget plugin options |
| boxWidgetOptions: { |
| boxWidgetIcons: { |
| //Collapse icon |
| collapse: 'fa-minus', |
| //Open icon |
| open: 'fa-plus', |
| //Remove icon |
| remove: 'fa-times' |
| }, |
| boxWidgetSelectors: { |
| //Remove button selector |
| remove: '[data-widget="remove"]', |
| //Collapse button selector |
| collapse: '[data-widget="collapse"]' |
| } |
| }, |
| //Direct Chat plugin options |
| directChat: { |
| //Enable direct chat by default |
| enable: true, |
| //The button to open and close the chat contacts pane |
| contactToggleSelector: '[data-widget="chat-pane-toggle"]' |
| }, |
| //Define the set of colors to use globally around the website |
| colors: { |
| lightBlue: "#3c8dbc", |
| red: "#f56954", |
| green: "#00a65a", |
| aqua: "#00c0ef", |
| yellow: "#f39c12", |
| blue: "#0073b7", |
| navy: "#001F3F", |
| teal: "#39CCCC", |
| olive: "#3D9970", |
| lime: "#01FF70", |
| orange: "#FF851B", |
| fuchsia: "#F012BE", |
| purple: "#8E24AA", |
| maroon: "#D81B60", |
| black: "#222222", |
| gray: "#d2d6de" |
| }, |
| //The standard screen sizes that bootstrap uses. |
| //If you change these in the variables.less file, change |
| //them here too. |
| screenSizes: { |
| xs: 480, |
| sm: 768, |
| md: 992, |
| lg: 1200 |
| } |
| }; |
| |
| /* ------------------ |
| * - Implementation - |
| * ------------------ |
| * The next block of code implements AdminLTE's |
| * functions and plugins as specified by the |
| * options above. |
| */ |
| $(function () { |
| "use strict"; |
| |
| //Fix for IE page transitions |
| $("body").removeClass("hold-transition"); |
| |
| //Extend options if external options exist |
| if (typeof AdminLTEOptions !== "undefined") { |
| $.extend(true, |
| $.AdminLTE.options, |
| AdminLTEOptions); |
| } |
| |
| //Easy access to options |
| var o = $.AdminLTE.options; |
| |
| //Set up the object |
| _init(); |
| |
| //Activate the layout maker |
| $.AdminLTE.layout.activate(); |
| |
| //Enable sidebar tree view controls |
| if (o.enableControlTreeView) { |
| $.AdminLTE.tree('.sidebar'); |
| } |
| |
| //Enable control sidebar |
| if (o.enableControlSidebar) { |
| $.AdminLTE.controlSidebar.activate(); |
| } |
| |
| //Add slimscroll to navbar dropdown |
| if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') { |
| $(".navbar .menu").slimscroll({ |
| height: o.navbarMenuHeight, |
| alwaysVisible: false, |
| size: o.navbarMenuSlimscrollWidth |
| }).css("width", "100%"); |
| } |
| |
| //Activate sidebar push menu |
| if (o.sidebarPushMenu) { |
| $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector); |
| } |
| |
| //Activate Bootstrap tooltip |
| if (o.enableBSToppltip) { |
| $('body').tooltip({ |
| selector: o.BSTooltipSelector, |
| container: 'body' |
| }); |
| } |
| |
| //Activate box widget |
| if (o.enableBoxWidget) { |
| $.AdminLTE.boxWidget.activate(); |
| } |
| |
| //Activate fast click |
| if (o.enableFastclick && typeof FastClick != 'undefined') { |
| FastClick.attach(document.body); |
| } |
| |
| //Activate direct chat widget |
| if (o.directChat.enable) { |
| $(document).on('click', o.directChat.contactToggleSelector, function () { |
| var box = $(this).parents('.direct-chat').first(); |
| box.toggleClass('direct-chat-contacts-open'); |
| }); |
| } |
| |
| /* |
| * INITIALIZE BUTTON TOGGLE |
| * ------------------------ |
| */ |
| $('.btn-group[data-toggle="btn-toggle"]').each(function () { |
| var group = $(this); |
| $(this).find(".btn").on('click', function (e) { |
| group.find(".btn.active").removeClass("active"); |
| $(this).addClass("active"); |
| e.preventDefault(); |
| }); |
| |
| }); |
| }); |
| |
| /* ---------------------------------- |
| * - Initialize the AdminLTE Object - |
| * ---------------------------------- |
| * All AdminLTE functions are implemented below. |
| */ |
| function _init() { |
| 'use strict'; |
| /* Layout |
| * ====== |
| * Fixes the layout height in case min-height fails. |
| * |
| * @type Object |
| * @usage $.AdminLTE.layout.activate() |
| * $.AdminLTE.layout.fix() |
| * $.AdminLTE.layout.fixSidebar() |
| */ |
| $.AdminLTE.layout = { |
| activate: function () { |
| var _this = this; |
| _this.fix(); |
| _this.fixSidebar(); |
| $('body, html, .wrapper').css('height', 'auto'); |
| $(window, ".wrapper").resize(function () { |
| _this.fix(); |
| _this.fixSidebar(); |
| }); |
| }, |
| fix: function () { |
| // Remove overflow from .wrapper if layout-boxed exists |
| $(".layout-boxed > .wrapper").css('overflow', 'hidden'); |
| //Get window height and the wrapper height |
| var footer_height = $('.main-footer').outerHeight() || 0; |
| var neg = $('.main-header').outerHeight() + footer_height; |
| var window_height = $(window).height(); |
| var sidebar_height = $(".sidebar").height() || 0; |
| //Set the min-height of the content and sidebar based on the |
| //the height of the document. |
| if ($("body").hasClass("fixed")) { |
| $(".content-wrapper, .right-side").css('min-height', window_height - footer_height); |
| } else { |
| var postSetWidth; |
| if (window_height >= sidebar_height) { |
| $(".content-wrapper, .right-side").css('min-height', window_height - neg); |
| postSetWidth = window_height - neg; |
| } else { |
| $(".content-wrapper, .right-side").css('min-height', sidebar_height); |
| postSetWidth = sidebar_height; |
| } |
| |
| //Fix for the control sidebar height |
| var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector); |
| if (typeof controlSidebar !== "undefined") { |
| if (controlSidebar.height() > postSetWidth) |
| $(".content-wrapper, .right-side").css('min-height', controlSidebar.height()); |
| } |
| |
| } |
| }, |
| fixSidebar: function () { |
| //Make sure the body tag has the .fixed class |
| if (!$("body").hasClass("fixed")) { |
| if (typeof $.fn.slimScroll != 'undefined') { |
| $(".sidebar").slimScroll({destroy: true}).height("auto"); |
| } |
| return; |
| } else if (typeof $.fn.slimScroll == 'undefined' && window.console) { |
| window.console.error("Error: the fixed layout requires the slimscroll plugin!"); |
| } |
| //Enable slimscroll for fixed layout |
| if ($.AdminLTE.options.sidebarSlimScroll) { |
| if (typeof $.fn.slimScroll != 'undefined') { |
| //Destroy if it exists |
| $(".sidebar").slimScroll({destroy: true}).height("auto"); |
| //Add slimscroll |
| $(".sidebar").slimScroll({ |
| height: ($(window).height() - $(".main-header").height()) + "px", |
| color: "rgba(0,0,0,0.2)", |
| size: "3px" |
| }); |
| } |
| } |
| } |
| }; |
| |
| /* PushMenu() |
| * ========== |
| * Adds the push menu functionality to the sidebar. |
| * |
| * @type Function |
| * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']") |
| */ |
| $.AdminLTE.pushMenu = { |
| activate: function (toggleBtn) { |
| //Get the screen sizes |
| var screenSizes = $.AdminLTE.options.screenSizes; |
| |
| //Enable sidebar toggle |
| $(document).on('click', toggleBtn, function (e) { |
| e.preventDefault(); |
| |
| //Enable sidebar push menu |
| if ($(window).width() > (screenSizes.sm - 1)) { |
| if ($("body").hasClass('sidebar-collapse')) { |
| $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu'); |
| } else { |
| $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu'); |
| } |
| } |
| //Handle sidebar push menu for small screens |
| else { |
| if ($("body").hasClass('sidebar-open')) { |
| $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu'); |
| } else { |
| $("body").addClass('sidebar-open').trigger('expanded.pushMenu'); |
| } |
| } |
| }); |
| |
| $(".content-wrapper").click(function () { |
| //Enable hide menu when clicking on the content-wrapper on small screens |
| if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) { |
| $("body").removeClass('sidebar-open'); |
| } |
| }); |
| |
| //Enable expand on hover for sidebar mini |
| if ($.AdminLTE.options.sidebarExpandOnHover |
| || ($('body').hasClass('fixed') |
| && $('body').hasClass('sidebar-mini'))) { |
| this.expandOnHover(); |
| } |
| }, |
| expandOnHover: function () { |
| var _this = this; |
| var screenWidth = $.AdminLTE.options.screenSizes.sm - 1; |
| //Expand sidebar on hover |
| $('.main-sidebar').hover(function () { |
| if ($('body').hasClass('sidebar-mini') |
| && $("body").hasClass('sidebar-collapse') |
| && $(window).width() > screenWidth) { |
| _this.expand(); |
| } |
| }, function () { |
| if ($('body').hasClass('sidebar-mini') |
| && $('body').hasClass('sidebar-expanded-on-hover') |
| && $(window).width() > screenWidth) { |
| _this.collapse(); |
| } |
| }); |
| }, |
| expand: function () { |
| $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover'); |
| }, |
| collapse: function () { |
| if ($('body').hasClass('sidebar-expanded-on-hover')) { |
| $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse'); |
| } |
| } |
| }; |
| |
| /* Tree() |
| * ====== |
| * Converts the sidebar into a multilevel |
| * tree view menu. |
| * |
| * @type Function |
| * @Usage: $.AdminLTE.tree('.sidebar') |
| */ |
| $.AdminLTE.tree = function (menu) { |
| var _this = this; |
| var animationSpeed = $.AdminLTE.options.animationSpeed; |
| $(document).off('click', menu + ' li a') |
| .on('click', menu + ' li a', function (e) { |
| //Get the clicked link and the next element |
| var $this = $(this); |
| var checkElement = $this.next(); |
| |
| //Check if the next element is a menu and is visible |
| if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible')) && (!$('body').hasClass('sidebar-collapse'))) { |
| //Close the menu |
| checkElement.slideUp(animationSpeed, function () { |
| checkElement.removeClass('menu-open'); |
| //Fix the layout in case the sidebar stretches over the height of the window |
| //_this.layout.fix(); |
| }); |
| checkElement.parent("li").removeClass("active"); |
| } |
| //If the menu is not visible |
| else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) { |
| //Get the parent menu |
| var parent = $this.parents('ul').first(); |
| //Close all open menus within the parent |
| var ul = parent.find('ul:visible').slideUp(animationSpeed); |
| //Remove the menu-open class from the parent |
| ul.removeClass('menu-open'); |
| //Get the parent li |
| var parent_li = $this.parent("li"); |
| |
| //Open the target menu and add the menu-open class |
| checkElement.slideDown(animationSpeed, function () { |
| //Add the class active to the parent li |
| checkElement.addClass('menu-open'); |
| parent.find('li.active').removeClass('active'); |
| parent_li.addClass('active'); |
| //Fix the layout in case the sidebar stretches over the height of the window |
| _this.layout.fix(); |
| }); |
| } |
| //if this isn't a link, prevent the page from being redirected |
| if (checkElement.is('.treeview-menu')) { |
| e.preventDefault(); |
| } |
| }); |
| }; |
| |
| /* ControlSidebar |
| * ============== |
| * Adds functionality to the right sidebar |
| * |
| * @type Object |
| * @usage $.AdminLTE.controlSidebar.activate(options) |
| */ |
| $.AdminLTE.controlSidebar = { |
| //instantiate the object |
| activate: function () { |
| //Get the object |
| var _this = this; |
| //Update options |
| var o = $.AdminLTE.options.controlSidebarOptions; |
| //Get the sidebar |
| var sidebar = $(o.selector); |
| //The toggle button |
| var btn = $(o.toggleBtnSelector); |
| |
| //Listen to the click event |
| btn.on('click', function (e) { |
| e.preventDefault(); |
| //If the sidebar is not open |
| if (!sidebar.hasClass('control-sidebar-open') |
| && !$('body').hasClass('control-sidebar-open')) { |
| //Open the sidebar |
| _this.open(sidebar, o.slide); |
| } else { |
| _this.close(sidebar, o.slide); |
| } |
| }); |
| |
| //If the body has a boxed layout, fix the sidebar bg position |
| var bg = $(".control-sidebar-bg"); |
| _this._fix(bg); |
| |
| //If the body has a fixed layout, make the control sidebar fixed |
| if ($('body').hasClass('fixed')) { |
| _this._fixForFixed(sidebar); |
| } else { |
| //If the content height is less than the sidebar's height, force max height |
| if ($('.content-wrapper, .right-side').height() < sidebar.height()) { |
| _this._fixForContent(sidebar); |
| } |
| } |
| }, |
| //Open the control sidebar |
| open: function (sidebar, slide) { |
| //Slide over content |
| if (slide) { |
| sidebar.addClass('control-sidebar-open'); |
| } else { |
| //Push the content by adding the open class to the body instead |
| //of the sidebar itself |
| $('body').addClass('control-sidebar-open'); |
| } |
| }, |
| //Close the control sidebar |
| close: function (sidebar, slide) { |
| if (slide) { |
| sidebar.removeClass('control-sidebar-open'); |
| } else { |
| $('body').removeClass('control-sidebar-open'); |
| } |
| }, |
| _fix: function (sidebar) { |
| var _this = this; |
| if ($("body").hasClass('layout-boxed')) { |
| sidebar.css('position', 'absolute'); |
| sidebar.height($(".wrapper").height()); |
| if (_this.hasBindedResize) { |
| return; |
| } |
| $(window).resize(function () { |
| _this._fix(sidebar); |
| }); |
| _this.hasBindedResize = true; |
| } else { |
| sidebar.css({ |
| 'position': 'fixed', |
| 'height': 'auto' |
| }); |
| } |
| }, |
| _fixForFixed: function (sidebar) { |
| sidebar.css({ |
| 'position': 'fixed', |
| 'max-height': '100%', |
| 'overflow': 'auto', |
| 'padding-bottom': '50px' |
| }); |
| }, |
| _fixForContent: function (sidebar) { |
| $(".content-wrapper, .right-side").css('min-height', sidebar.height()); |
| } |
| }; |
| |
| /* BoxWidget |
| * ========= |
| * BoxWidget is a plugin to handle collapsing and |
| * removing boxes from the screen. |
| * |
| * @type Object |
| * @usage $.AdminLTE.boxWidget.activate() |
| * Set all your options in the main $.AdminLTE.options object |
| */ |
| $.AdminLTE.boxWidget = { |
| selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors, |
| icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons, |
| animationSpeed: $.AdminLTE.options.animationSpeed, |
| activate: function (_box) { |
| var _this = this; |
| if (!_box) { |
| _box = document; // activate all boxes per default |
| } |
| //Listen for collapse event triggers |
| $(_box).on('click', _this.selectors.collapse, function (e) { |
| e.preventDefault(); |
| _this.collapse($(this)); |
| }); |
| |
| //Listen for remove event triggers |
| $(_box).on('click', _this.selectors.remove, function (e) { |
| e.preventDefault(); |
| _this.remove($(this)); |
| }); |
| }, |
| collapse: function (element) { |
| var _this = this; |
| //Find the box parent |
| var box = element.parents(".box").first(); |
| //Find the body and the footer |
| var box_content = box.find("> .box-body, > .box-footer, > form >.box-body, > form > .box-footer"); |
| if (!box.hasClass("collapsed-box")) { |
| //Convert minus into plus |
| element.children(":first") |
| .removeClass(_this.icons.collapse) |
| .addClass(_this.icons.open); |
| //Hide the content |
| box_content.slideUp(_this.animationSpeed, function () { |
| box.addClass("collapsed-box"); |
| }); |
| } else { |
| //Convert plus into minus |
| element.children(":first") |
| .removeClass(_this.icons.open) |
| .addClass(_this.icons.collapse); |
| //Show the content |
| box_content.slideDown(_this.animationSpeed, function () { |
| box.removeClass("collapsed-box"); |
| }); |
| } |
| }, |
| remove: function (element) { |
| //Find the box parent |
| var box = element.parents(".box").first(); |
| box.slideUp(this.animationSpeed); |
| } |
| }; |
| } |
| |
| /* ------------------ |
| * - Custom Plugins - |
| * ------------------ |
| * All custom plugins are defined below. |
| */ |
| |
| /* |
| * BOX REFRESH BUTTON |
| * ------------------ |
| * This is a custom plugin to use with the component BOX. It allows you to add |
| * a refresh button to the box. It converts the box's state to a loading state. |
| * |
| * @type plugin |
| * @usage $("#box-widget").boxRefresh( options ); |
| */ |
| (function ($) { |
| |
| "use strict"; |
| |
| $.fn.boxRefresh = function (options) { |
| |
| // Render options |
| var settings = $.extend({ |
| //Refresh button selector |
| trigger: ".refresh-btn", |
| //File source to be loaded (e.g: ajax/src.php) |
| source: "", |
| //Callbacks |
| onLoadStart: function (box) { |
| return box; |
| }, //Right after the button has been clicked |
| onLoadDone: function (box) { |
| return box; |
| } //When the source has been loaded |
| |
| }, options); |
| |
| //The overlay |
| var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>'); |
| |
| return this.each(function () { |
| //if a source is specified |
| if (settings.source === "") { |
| if (window.console) { |
| window.console.log("Please specify a source first - boxRefresh()"); |
| } |
| return; |
| } |
| //the box |
| var box = $(this); |
| //the button |
| var rBtn = box.find(settings.trigger).first(); |
| |
| //On trigger click |
| rBtn.on('click', function (e) { |
| e.preventDefault(); |
| //Add loading overlay |
| start(box); |
| |
| //Perform ajax call |
| box.find(".box-body").load(settings.source, function () { |
| done(box); |
| }); |
| }); |
| }); |
| |
| function start(box) { |
| //Add overlay and loading img |
| box.append(overlay); |
| |
| settings.onLoadStart.call(box); |
| } |
| |
| function done(box) { |
| //Remove overlay and loading img |
| box.find(overlay).remove(); |
| |
| settings.onLoadDone.call(box); |
| } |
| |
| }; |
| |
| })(jQuery); |
| |
| /* |
| * EXPLICIT BOX CONTROLS |
| * ----------------------- |
| * This is a custom plugin to use with the component BOX. It allows you to activate |
| * a box inserted in the DOM after the app.js was loaded, toggle and remove box. |
| * |
| * @type plugin |
| * @usage $("#box-widget").activateBox(); |
| * @usage $("#box-widget").toggleBox(); |
| * @usage $("#box-widget").removeBox(); |
| */ |
| (function ($) { |
| |
| 'use strict'; |
| |
| $.fn.activateBox = function () { |
| $.AdminLTE.boxWidget.activate(this); |
| }; |
| |
| $.fn.toggleBox = function () { |
| var button = $($.AdminLTE.boxWidget.selectors.collapse, this); |
| $.AdminLTE.boxWidget.collapse(button); |
| }; |
| |
| $.fn.removeBox = function () { |
| var button = $($.AdminLTE.boxWidget.selectors.remove, this); |
| $.AdminLTE.boxWidget.remove(button); |
| }; |
| |
| })(jQuery); |
| |
| /* |
| * TODO LIST CUSTOM PLUGIN |
| * ----------------------- |
| * This plugin depends on iCheck plugin for checkbox and radio inputs |
| * |
| * @type plugin |
| * @usage $("#todo-widget").todolist( options ); |
| */ |
| (function ($) { |
| |
| 'use strict'; |
| |
| $.fn.todolist = function (options) { |
| // Render options |
| var settings = $.extend({ |
| //When the user checks the input |
| onCheck: function (ele) { |
| return ele; |
| }, |
| //When the user unchecks the input |
| onUncheck: function (ele) { |
| return ele; |
| } |
| }, options); |
| |
| return this.each(function () { |
| |
| if (typeof $.fn.iCheck != 'undefined') { |
| $('input', this).on('ifChecked', function () { |
| var ele = $(this).parents("li").first(); |
| ele.toggleClass("done"); |
| settings.onCheck.call(ele); |
| }); |
| |
| $('input', this).on('ifUnchecked', function () { |
| var ele = $(this).parents("li").first(); |
| ele.toggleClass("done"); |
| settings.onUncheck.call(ele); |
| }); |
| } else { |
| $('input', this).on('change', function () { |
| var ele = $(this).parents("li").first(); |
| ele.toggleClass("done"); |
| if ($('input', ele).is(":checked")) { |
| settings.onCheck.call(ele); |
| } else { |
| settings.onUncheck.call(ele); |
| } |
| }); |
| } |
| }); |
| }; |
| }(jQuery)); |