aboutsummaryrefslogtreecommitdiffstats
path: root/app/assets/javascripts/banners/jquery.tristate.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/banners/jquery.tristate.js')
-rw-r--r--app/assets/javascripts/banners/jquery.tristate.js94
1 files changed, 94 insertions, 0 deletions
diff --git a/app/assets/javascripts/banners/jquery.tristate.js b/app/assets/javascripts/banners/jquery.tristate.js
new file mode 100644
index 0000000..2d2903d
--- /dev/null
+++ b/app/assets/javascripts/banners/jquery.tristate.js
@@ -0,0 +1,94 @@
+/**********************************************************************************
+ **
+ ** jQuery Tristate Checkbox Plugin
+ ** version: 1.0
+ **
+ ** Dual licensed under the MIT and GPL licenses:
+ ** http://www.opensource.org/licenses/mit-license.php
+ ** http://www.gnu.org/licenses/gpl.html
+ **
+ ** author: Jeff Leombruno
+ ** creation date: 09.20.2011
+ ** dependencies: jQuery v1.6 or higher
+ **
+ ** This file contains the functionality for implementing 3 state checkboxes.
+ ** Inspired by:
+ ** http://code.google.com/p/jquery-tristate-checkbox/
+ ** http://css-tricks.com/13467-indeterminate-checkboxes/
+ **
+ **********************************************************************************/
+
+(function($){
+ $.fn.tristate = function(options){
+
+ var config = {
+ selector: $(this).selector,
+ checked: null,
+ container: null,
+ siblings: null
+ };
+ var opts = $.extend(config, options);
+
+ return this.each(function(){
+ var obj = $(this);
+
+ var triState = function() {
+
+ var pub = {};
+
+ pub.init = function(){
+ $('input[type="checkbox"]', obj).change(function(e) {
+ config.checked = $(this).prop("checked")
+ config.container = $(this).parent()
+ config.siblings = config.container.siblings();
+
+ config.container.find('input[type="checkbox"]').prop({
+ indeterminate: false,
+ checked: config.checked
+ });
+
+ pub.checkSiblings(config.container);
+ });
+ // run checkSiblings for every checked checkbox when the page loads
+ $('input[type=checkbox]:checked', obj).each( function() {
+ pub.checkSiblings($(this).parent());
+ });
+ };
+
+ pub.checkSiblings = function(el) {
+ var parent = el.parent().parent();
+ var all = true;
+
+ el.siblings().each(function() {
+ return all = ($(this).children('input[type="checkbox"]').prop("checked") === config.checked);
+ });
+
+ if (all && config.checked) {
+ parent.children('input[type="checkbox"]').prop({
+ indeterminate: false,
+ checked: config.checked
+ });
+ pub.checkSiblings(parent);
+ } else if (all && !config.checked) {
+ parent.children('input[type="checkbox"]').prop("checked", config.checked);
+ parent.children('input[type="checkbox"]').prop("indeterminate", (parent.find('input[type="checkbox"]:checked').length > 0));
+ pub.checkSiblings(parent);
+ } else {
+ el.parents("li").children('input[type="checkbox"]').prop({
+ indeterminate: true,
+ checked: false
+ });
+ }
+ };
+
+ return pub;
+
+ }();
+
+ triState.init();
+ triState.checkSiblings(obj);
+
+
+ });
+ };
+})(jQuery);