express-8.x-1.x-dev/themes/contrib/bootstrap/js/attributes.js
themes/contrib/bootstrap/js/attributes.js
(function ($, _) { /** * Class to help modify attributes. * * @param {object} object * An object to initialize attributes with. * * @constructor */ var Attributes = function (object) { this.data = object && _.isObject(object) && _.clone(object) || {}; }; /** * Renders the attributes object as a string to inject into an HTML element. * * @returns {string} */ Attributes.prototype.toString = function () { var output = ''; var name, value; var checkPlain = function (str) { return str && str.toString().replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>') || ''; }; for (name in this.data) { if (!this.data.hasOwnProperty(name)) continue; value = this.data[name]; if (_.isFunction(value)) value = value(); if (_.isObject(value)) value = _.values(value); if (_.isArray(value)) value = value.join(' '); output += ' ' + checkPlain(name) + '="' + checkPlain(value) + '"'; } return output; }; /** * Add class(es) to the array. * * @param {string|Array} value * An individual class or an array of classes to add. * * @return {Attributes} * * @chainable */ Attributes.prototype.addClass = function (value) { var classes = this.getClasses(); value = [].concat(classes, value); this.set('class', _.uniq(value)); return this; }; /** * Returns whether the requested attribute exists. * * @param {string} name * An attribute name to check. * * @return {boolean} * TRUE or FALSE */ Attributes.prototype.exists = function (name) { return this.data[name] !== void(0) && this.data[name] !== null; }; /** * Retrieve a specific attribute from the array. * * @param {string} name * The specific attribute to retrieve. * @param {*} defaultValue * (optional) The default value to set if the attribute does not exist. * * @return {*} * A specific attribute value, passed by reference. */ Attributes.prototype.get = function (name, defaultValue) { if (!this.exists(name)) this.data[name] = defaultValue; return this.data[name]; }; /** * Retrieves a cloned copy of the internal attributes data object. * * @returns {Object} */ Attributes.prototype.getData = function () { return _.clone(this.data); }; /** * Retrieves classes from the array. * * @return {Array} * The classes array. */ Attributes.prototype.getClasses = function () { var classes = [].concat(this.get('class', [])); return _.uniq(classes); }; /** * Indicates whether a class is present in the array. * * @param {string|Array} name * The class(es) to search for. * * @return {boolean} * TRUE or FALSE */ Attributes.prototype.hasClass = function (name) { name = [].concat(name); var classes = this.getClasses(); var found = false; _.each(name, function (value) { if (_.indexOf(classes, value) !== -1) found = true; }); return found; }; /** * Merges multiple values into the array. * * @param {object} values * An associative key/value array. * @param {boolean} [recursive] * Flag determining whether or not to recursively merge key/value pairs. * * @return {Attributes} * * @chainable */ Attributes.prototype.merge = function (values, recursive) { values = values instanceof Attributes ? values.getData() : values; if (recursive === void(0) || recursive) { this.data = $.extend(true, {}, this.data, values); } else { $.extend(this.data, values); } return this; }; /** * Removes an attribute from the array. * * @param {string} name * The name of the attribute to remove. * * @return {Attributes} * * @chainable */ Attributes.prototype.remove = function (name) { if (this.exists(name)) delete this.data[name]; return this; }; /** * Removes a class from the attributes array. * * @param {string|Array} value * An individual class or an array of classes to remove. * * @return {Attributes} * * @chainable */ Attributes.prototype.removeClass = function (value) { this.set('class', _.without(this.getClasses(), [].concat(value))); return this; }; /** * Replaces a class in the attributes array. * * @param {string} oldValue * The old class to remove. * @param {string} newValue * The new class. It will not be added if the old class does not exist. * * @return {Attributes} * * @chainable */ Attributes.prototype.replaceClass = function (oldValue, newValue) { var classes = this.getClasses(); var i = _.indexOf(oldValue, classes); if (i >= 0) { classes[i] = newValue; this.set('class', classes); } return this; }; /** * Sets an attribute on the array. * * @param {string} name * The name of the attribute to set. * @param {*} value * The value of the attribute to set. * * @return {Attributes} * * @chainable */ Attributes.prototype.set = function (name, value) { this.data[name] = value; return this; }; /** * Creates an Attributes instance. * * @param {object|Attributes} object * An object to initialize attributes with. * * @returns {Attributes} * * @global * * @constructor */ window.Attributes = function (object) { return object instanceof Attributes ? object : new Attributes(object); }; })(window.jQuery, window._);