PHP Classes

File: resources/assets/js/checkbox.js

Recommend this page to a friend!
  Classes of Naif Alshaye  >  PHP Twitter Bot  >  resources/assets/js/checkbox.js  >  Download  
File: resources/assets/js/checkbox.js
Role: Auxiliary data
Content type: text/plain
Description: Auxiliary data
Class: PHP Twitter Bot
Application to automate interactions using Twitter
Author: By
Last change:
Date: 1 year ago
Size: 10,052 bytes
 

Contents

Class file image Download
/**
 * $.inArray: friends with IE8. Use Array.prototype.indexOf in future.
 * Use this.element.hidden in future.
 * $.proxy: friends with IE8. Use Function.prototype.bind in future.
 */

'use strict';

(function(factory) {
    if (typeof define == 'function' && define.amd) {
        // AMD. Register as an anonymous module
        define(['jquery'], factory);
    }
    else if (typeof exports == 'object') {
        // Node/CommonJS
        module.exports = factory(require('jquery'));
    }
    else {
        // Browser globals
        factory(jQuery);
    }
})(function($) {
    $.create = function() {
        return $($.map(arguments, $.proxy(document, 'createElement')));
    };

    function Checkboxpicker(element, options) {
        this.element = element;
        this.$element = $(element);

        var data = this.$element.data();

        // <... data-reverse>
        if (data.reverse === '') {
            data.reverse = true;
        }

        // <... data-switch-always>
        if (data.switchAlways === '') {
            data.switchAlways = true;
        }

        // <... data-html>
        if (data.html === '') {
            data.html = true;
        }

        this.options = $.extend({}, $.fn.checkboxpicker.defaults, options, data);

        if (this.$element.closest('label').length) {
            console.warn(this.options.warningMessage);

            return;
        }

        this.$group = $.create('div');

        // .btn-group-justified works with <a> elements as the <button> doesn't pick up the styles
        this.$buttons = $.create('a', 'a');

        this.$off = this.$buttons.eq(this.options.reverse ? 1 : 0);
        this.$on = this.$buttons.eq(this.options.reverse ? 0 : 1);

        this.init();
    }

    Checkboxpicker.prototype = {
        init: function() {
            var fn = this.options.html ? 'html' : 'text';

            this.$element.addClass('hidden');
            this.$group.addClass(this.options.baseGroupCls).addClass(this.options.groupCls);
            this.$buttons.addClass(this.options.baseCls).addClass(this.options.cls);

            if (this.options.offLabel) {
                this.$off[fn](this.options.offLabel);
            }

            if (this.options.onLabel) {
                this.$on[fn](this.options.onLabel);
            }

            if (this.options.offIconCls) {
                if (this.options.offLabel) {
                    // &nbsp; -- whitespace (or wrap into span)
                    this.$off.prepend('&nbsp;');
                }

                // $.addClass for XSS check
                $.create('span').addClass(this.options.iconCls).addClass(this.options.offIconCls).prependTo(this.$off);
            }

            if (this.options.onIconCls) {
                if (this.options.onLabel) {
                    // &nbsp; -- whitespace (or wrap into span)
                    this.$on.prepend('&nbsp;');
                }

                // $.addClass for XSS check
                $.create('span').addClass(this.options.iconCls).addClass(this.options.onIconCls).prependTo(this.$on);
            }

            if (this.element.checked) {
                this.$on.addClass('active');
                this.$on.addClass(this.options.onActiveCls);
                this.$off.addClass(this.options.offCls);
            }
            else {
                this.$off.addClass('active');
                this.$off.addClass(this.options.offActiveCls);
                this.$on.addClass(this.options.onCls);
            }

            if (this.element.title) {
                this.$group.attr('title', this.element.title);
            }
            else {
                // Attribute title (offTitle, onTitle) on this.$buttons not work (native) if this.element.disabled, fine!
                if (this.options.offTitle) {
                    this.$off.attr('title', this.options.offTitle);
                }

                if (this.options.onTitle) {
                    this.$on.attr('title', this.options.onTitle);
                }
            }

            // Keydown event only trigger if set tabindex, fine!
            this.$group.on('keydown', $.proxy(this, 'keydown'));

            // Don't trigger if <a> element has .disabled class, fine!
            this.$buttons.on('click', $.proxy(this, 'click'));

            this.$element.on('change', $.proxy(this, 'toggleChecked'));
            $(this.element.labels).on('click', $.proxy(this, 'focus'));
            $(this.element.form).on('reset', $.proxy(this, 'reset'));

            this.$group.append(this.$buttons).insertAfter(this.element);

            // Necessarily after this.$group.append() (autofocus)
            if (this.element.disabled) {
                this.$buttons.addClass('disabled');

                if (this.options.disabledCursor) {
                    this.$group.css('cursor', this.options.disabledCursor);
                }
            }
            else {
                this.$group.attr('tabindex', this.element.tabIndex);

                if (this.element.autofocus) {
                    this.focus();
                }
            }
        },
        toggleChecked: function() {
            // this.$group not focus (incorrect on form reset)
            this.$buttons.toggleClass('active');

            this.$off.toggleClass(this.options.offCls);
            this.$off.toggleClass(this.options.offActiveCls);
            this.$on.toggleClass(this.options.onCls);
            this.$on.toggleClass(this.options.onActiveCls);
        },
        toggleDisabled: function() {
            this.$buttons.toggleClass('disabled');

            if (this.element.disabled) {
                this.$group.attr('tabindex', this.element.tabIndex);
                this.$group.css('cursor', '');
            }
            else {
                this.$group.removeAttr('tabindex');

                if (this.options.disabledCursor) {
                    this.$group.css('cursor', this.options.disabledCursor);
                }
            }
        },
        focus: function() {
            // Original behavior
            this.$group.trigger('focus');
        },
        click: function(event) {
            // Strictly event.currentTarget. Fix #19
            var $button = $(event.currentTarget);

            if (!$button.hasClass('active') || this.options.switchAlways) {
                this.change();
            }
        },
        change: function() {
            this.set(!this.element.checked);
        },
        set: function(value) {
            // Fix #12
            this.element.checked = value;

            this.$element.trigger('change');
        },
        keydown: function(event) {
            if ($.inArray(event.keyCode, this.options.toggleKeyCodes) != -1) {
                // Off vertical scrolling on Spacebar
                event.preventDefault();

                this.change();
            }
            else if (event.keyCode == 13) {
                $(this.element.form).trigger('submit');
            }
        },
        reset: function() {
            // this.element.checked not used (incorect on large number of form elements)
            if ((this.element.defaultChecked && this.$off.hasClass('active')) || (!this.element.defaultChecked && this.$on.hasClass('active'))) {
                this.set(this.element.defaultChecked);
            }
        }
    };

    // Be hooks friendly
    var oldPropHooks = $.extend({}, $.propHooks);

    // Support $.fn.prop setter (checked, disabled)
    $.extend($.propHooks, {
        checked: {
            set: function(element, value) {
                var data = $.data(element, 'bs.checkbox');

                if (data && element.checked != value) {
                    data.change(value);
                }

                if (oldPropHooks.checked && oldPropHooks.checked.set) {
                    oldPropHooks.checked.set(element, value);
                }
            }
        },
        disabled: {
            set: function(element, value) {
                var data = $.data(element, 'bs.checkbox');

                if (data && element.disabled != value) {
                    data.toggleDisabled();
                }

                if (oldPropHooks.disabled && oldPropHooks.disabled.set) {
                    oldPropHooks.disabled.set(element, value);
                }
            }
        }
    });

    var old = $.fn.checkboxpicker;

    // For AMD/Node/CommonJS used elements (optional)
    // http://learn.jquery.com/jquery-ui/environments/amd/
    $.fn.checkboxpicker = function(options, elements) {
        var $elements;

        if (this instanceof $) {
            $elements = this;
        }
        else if (typeof options == 'string') {
            $elements = $(options);
        }
        else {
            $elements = $(elements);
        }

        return $elements.each(function() {
            var data = $.data(this, 'bs.checkbox');

            if (!data) {
                data = new Checkboxpicker(this, options);

                $.data(this, 'bs.checkbox', data);
            }
        });
    };

    // HTML5 data-*.
    // <input data-on-label="43"> --> $('input').data('onLabel') == '43'.
    $.fn.checkboxpicker.defaults = {
        baseGroupCls: 'btn-group',
        baseCls: 'btn',
        groupCls: null,
        cls: null,
        offCls: 'btn-default',
        onCls: 'btn-default',
        offActiveCls: 'btn-danger',
        onActiveCls: 'btn-success',
        offLabel: 'Off',
        onLabel: 'On',
        offTitle: false,
        onTitle: false,
        iconCls: 'glyphicon',

        disabledCursor: 'not-allowed',

        // Event key codes:
        // 13: Return
        // 32: Spacebar
        toggleKeyCodes: [13, 32],

        warningMessage: 'Please do not use Bootstrap-checkbox element in label element.'
    };

    $.fn.checkboxpicker.Constructor = Checkboxpicker;
    $.fn.checkboxpicker.noConflict = function() {
        $.fn.checkboxpicker = old;
        return this;
    };

    return $.fn.checkboxpicker;
});

For more information send a message to info at phpclasses dot org.