UNPKG

metro4

Version:

The front-end framework for Build responsive, mobile-first projects on the web with the first front-end component library in Metro Style

141 lines (111 loc) 3.76 kB
var Checkbox = { init: function( options, elem ) { this.options = $.extend( {}, this.options, options ); this.elem = elem; this.element = $(elem); this.origin = { className: "" }; this._setOptionsFromDOM(); this._create(); Utils.exec(this.options.onCheckboxCreate, [this.element]); return this; }, options: { style: 1, caption: "", captionPosition: "right", indeterminate: false, clsCheckbox: "", clsCheck: "", clsCaption: "", onCheckboxCreate: Metro.noop }, _setOptionsFromDOM: function(){ var element = this.element, o = this.options; $.each(element.data(), function(key, value){ if (key in o) { try { o[key] = JSON.parse(value); } catch (e) { o[key] = value; } } }); }, _create: function(){ var element = this.element, o = this.options; var checkbox = $("<label>").addClass("checkbox " + element[0].className).addClass(o.style === 2 ? "style2" : ""); var check = $("<span>").addClass("check"); var caption = $("<span>").addClass("caption").html(o.caption); if (element.attr('id') === undefined) { element.attr('id', Utils.elementId("checkbox")); } checkbox.attr('for', element.attr('id')); element.attr("type", "checkbox"); checkbox.insertBefore(element); element.appendTo(checkbox); check.appendTo(checkbox); caption.appendTo(checkbox); if (o.captionPosition === 'left') { checkbox.addClass("caption-left"); } this.origin.className = element[0].className; element[0].className = ''; checkbox.addClass(o.clsCheckbox); caption.addClass(o.clsCaption); check.addClass(o.clsCheck); if (o.indeterminate) { element[0].indeterminate = true; } if (element.is(':disabled')) { this.disable(); } else { this.enable(); } }, indeterminate: function(){ this.element[0].indeterminate = true; }, disable: function(){ this.element.data("disabled", true); this.element.parent().addClass("disabled"); }, enable: function(){ this.element.data("disabled", false); this.element.parent().removeClass("disabled"); }, toggleState: function(){ if (this.elem.disabled) { this.disable(); } else { this.enable(); } }, changeAttribute: function(attributeName){ var element = this.element, o = this.options; var parent = element.parent(); var changeStyle = function(){ var new_style = parseInt(element.attr("data-style")); if (!Utils.isInt(new_style)) return; o.style = new_style; parent.removeClass("style1 style2").addClass("style"+new_style); }; var indeterminateState = function(){ element[0].indeterminate = JSON.parse(element.attr("data-indeterminate")) === true; }; switch (attributeName) { case 'disabled': this.toggleState(); break; case 'data-indeterminate': indeterminateState(); break; case 'data-style': changeStyle(); break; } }, destroy: function(){ var element = this.element; var parent = element.parent(); element[0].className = this.origin.className; element.insertBefore(parent); parent.remove(); } }; Metro.plugin('checkbox', Checkbox);