initial code repo
[stor4nfv.git] / src / ceph / src / pybind / mgr / dashboard / static / AdminLTE-2.3.7 / plugins / bootstrap-slider / bootstrap-slider.js
diff --git a/src/ceph/src/pybind/mgr/dashboard/static/AdminLTE-2.3.7/plugins/bootstrap-slider/bootstrap-slider.js b/src/ceph/src/pybind/mgr/dashboard/static/AdminLTE-2.3.7/plugins/bootstrap-slider/bootstrap-slider.js
new file mode 100644 (file)
index 0000000..3a0e464
--- /dev/null
@@ -0,0 +1,1576 @@
+/*! =========================================================
+ * bootstrap-slider.js
+ *
+ * Maintainers:
+ *             Kyle Kemp
+ *                     - Twitter: @seiyria
+ *                     - Github:  seiyria
+ *             Rohit Kalkur
+ *                     - Twitter: @Rovolutionary
+ *                     - Github:  rovolution
+ *
+ * =========================================================
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+
+/**
+ * Bridget makes jQuery widgets
+ * v1.0.1
+ * MIT license
+ */
+
+(function(root, factory) {
+       if(typeof define === "function" && define.amd) {
+               define(["jquery"], factory);
+       }
+       else if(typeof module === "object" && module.exports) {
+               var jQuery;
+               try {
+                       jQuery = require("jquery");
+               }
+               catch (err) {
+                       jQuery = null;
+               }
+               module.exports = factory(jQuery);
+       }
+       else {
+               root.Slider = factory(root.jQuery);
+       }
+}(this, function($) {
+       // Reference to Slider constructor
+       var Slider;
+
+
+       (function( $ ) {
+
+               'use strict';
+
+               // -------------------------- utils -------------------------- //
+
+               var slice = Array.prototype.slice;
+
+               function noop() {}
+
+               // -------------------------- definition -------------------------- //
+
+               function defineBridget( $ ) {
+
+                       // bail if no jQuery
+                       if ( !$ ) {
+                               return;
+                       }
+
+                       // -------------------------- addOptionMethod -------------------------- //
+
+                       /**
+                        * adds option method -> $().plugin('option', {...})
+                        * @param {Function} PluginClass - constructor class
+                        */
+                       function addOptionMethod( PluginClass ) {
+                               // don't overwrite original option method
+                               if ( PluginClass.prototype.option ) {
+                                       return;
+                               }
+
+                         // option setter
+                         PluginClass.prototype.option = function( opts ) {
+                           // bail out if not an object
+                           if ( !$.isPlainObject( opts ) ){
+                             return;
+                           }
+                           this.options = $.extend( true, this.options, opts );
+                         };
+                       }
+
+
+                       // -------------------------- plugin bridge -------------------------- //
+
+                       // helper function for logging errors
+                       // $.error breaks jQuery chaining
+                       var logError = typeof console === 'undefined' ? noop :
+                         function( message ) {
+                           console.error( message );
+                         };
+
+                       /**
+                        * jQuery plugin bridge, access methods like $elem.plugin('method')
+                        * @param {String} namespace - plugin name
+                        * @param {Function} PluginClass - constructor class
+                        */
+                       function bridge( namespace, PluginClass ) {
+                         // add to jQuery fn namespace
+                         $.fn[ namespace ] = function( options ) {
+                           if ( typeof options === 'string' ) {
+                             // call plugin method when first argument is a string
+                             // get arguments for method
+                             var args = slice.call( arguments, 1 );
+
+                             for ( var i=0, len = this.length; i < len; i++ ) {
+                               var elem = this[i];
+                               var instance = $.data( elem, namespace );
+                               if ( !instance ) {
+                                 logError( "cannot call methods on " + namespace + " prior to initialization; " +
+                                   "attempted to call '" + options + "'" );
+                                 continue;
+                               }
+                               if ( !$.isFunction( instance[options] ) || options.charAt(0) === '_' ) {
+                                 logError( "no such method '" + options + "' for " + namespace + " instance" );
+                                 continue;
+                               }
+
+                               // trigger method with arguments
+                               var returnValue = instance[ options ].apply( instance, args);
+
+                               // break look and return first value if provided
+                               if ( returnValue !== undefined && returnValue !== instance) {
+                                 return returnValue;
+                               }
+                             }
+                             // return this if no return value
+                             return this;
+                           } else {
+                             var objects = this.map( function() {
+                               var instance = $.data( this, namespace );
+                               if ( instance ) {
+                                 // apply options & init
+                                 instance.option( options );
+                                 instance._init();
+                               } else {
+                                 // initialize new instance
+                                 instance = new PluginClass( this, options );
+                                 $.data( this, namespace, instance );
+                               }
+                               return $(this);
+                             });
+
+                             if(!objects || objects.length > 1) {
+                               return objects;
+                             } else {
+                               return objects[0];
+                             }
+                           }
+                         };
+
+                       }
+
+                       // -------------------------- bridget -------------------------- //
+
+                       /**
+                        * converts a Prototypical class into a proper jQuery plugin
+                        *   the class must have a ._init method
+                        * @param {String} namespace - plugin name, used in $().pluginName
+                        * @param {Function} PluginClass - constructor class
+                        */
+                       $.bridget = function( namespace, PluginClass ) {
+                         addOptionMethod( PluginClass );
+                         bridge( namespace, PluginClass );
+                       };
+
+                       return $.bridget;
+
+               }
+
+               // get jquery from browser global
+               defineBridget( $ );
+
+       })( $ );
+
+
+       /*************************************************
+
+                       BOOTSTRAP-SLIDER SOURCE CODE
+
+       **************************************************/
+
+       (function($) {
+
+               var ErrorMsgs = {
+                       formatInvalidInputErrorMsg : function(input) {
+                               return "Invalid input value '" + input + "' passed in";
+                       },
+                       callingContextNotSliderInstance : "Calling context element does not have instance of Slider bound to it. Check your code to make sure the JQuery object returned from the call to the slider() initializer is calling the method"
+               };
+
+               var SliderScale = {
+                       linear: {
+                               toValue: function(percentage) {
+                                       var rawValue = percentage/100 * (this.options.max - this.options.min);
+                                       if (this.options.ticks_positions.length > 0) {
+                                               var minv, maxv, minp, maxp = 0;
+                                               for (var i = 0; i < this.options.ticks_positions.length; i++) {
+                                                       if (percentage <= this.options.ticks_positions[i]) {
+                                                               minv = (i > 0) ? this.options.ticks[i-1] : 0;
+                                                               minp = (i > 0) ? this.options.ticks_positions[i-1] : 0;
+                                                               maxv = this.options.ticks[i];
+                                                               maxp = this.options.ticks_positions[i];
+
+                                                               break;
+                                                       }
+                                               }
+                                               if (i > 0) {
+                                                       var partialPercentage = (percentage - minp) / (maxp - minp);
+                                                       rawValue = minv + partialPercentage * (maxv - minv);
+                                               }
+                                       }
+
+                                       var value = this.options.min + Math.round(rawValue / this.options.step) * this.options.step;
+                                       if (value < this.options.min) {
+                                               return this.options.min;
+                                       } else if (value > this.options.max) {
+                                               return this.options.max;
+                                       } else {
+                                               return value;
+                                       }
+                               },
+                               toPercentage: function(value) {
+                                       if (this.options.max === this.options.min) {
+                                               return 0;
+                                       }
+
+                                       if (this.options.ticks_positions.length > 0) {
+                                               var minv, maxv, minp, maxp = 0;
+                                               for (var i = 0; i < this.options.ticks.length; i++) {
+                                                       if (value  <= this.options.ticks[i]) {
+                                                               minv = (i > 0) ? this.options.ticks[i-1] : 0;
+                                                               minp = (i > 0) ? this.options.ticks_positions[i-1] : 0;
+                                                               maxv = this.options.ticks[i];
+                                                               maxp = this.options.ticks_positions[i];
+
+                                                               break;
+                                                       }
+                                               }
+                                               if (i > 0) {
+                                                       var partialPercentage = (value - minv) / (maxv - minv);
+                                                       return minp + partialPercentage * (maxp - minp);
+                                               }
+                                       }
+
+                                       return 100 * (value - this.options.min) / (this.options.max - this.options.min);
+                               }
+                       },
+
+                       logarithmic: {
+                               /* Based on http://stackoverflow.com/questions/846221/logarithmic-slider */
+                               toValue: function(percentage) {
+                                       var min = (this.options.min === 0) ? 0 : Math.log(this.options.min);
+                                       var max = Math.log(this.options.max);
+                                       var value = Math.exp(min + (max - min) * percentage / 100);
+                                       value = this.options.min + Math.round((value - this.options.min) / this.options.step) * this.options.step;
+                                       /* Rounding to the nearest step could exceed the min or
+                                        * max, so clip to those values. */
+                                       if (value < this.options.min) {
+                                               return this.options.min;
+                                       } else if (value > this.options.max) {
+                                               return this.options.max;
+                                       } else {
+                                               return value;
+                                       }
+                               },
+                               toPercentage: function(value) {
+                                       if (this.options.max === this.options.min) {
+                                               return 0;
+                                       } else {
+                                               var max = Math.log(this.options.max);
+                                               var min = this.options.min === 0 ? 0 : Math.log(this.options.min);
+                                               var v = value === 0 ? 0 : Math.log(value);
+                                               return 100 * (v - min) / (max - min);
+                                       }
+                               }
+                       }
+               };
+
+
+               /*************************************************
+
+                                                       CONSTRUCTOR
+
+               **************************************************/
+               Slider = function(element, options) {
+                       createNewSlider.call(this, element, options);
+                       return this;
+               };
+
+               function createNewSlider(element, options) {
+
+                       /*
+                               The internal state object is used to store data about the current 'state' of slider.
+
+                               This includes values such as the `value`, `enabled`, etc...
+                       */
+                       this._state = {
+                               value: null,
+                               enabled: null,
+                               offset: null,
+                               size: null,
+                               percentage: null,
+                               inDrag: false,
+                               over: false
+                       };
+
+
+                       if(typeof element === "string") {
+                               this.element = document.querySelector(element);
+                       } else if(element instanceof HTMLElement) {
+                               this.element = element;
+                       }
+
+                       /*************************************************
+
+                                                       Process Options
+
+                       **************************************************/
+                       options = options ? options : {};
+                       var optionTypes = Object.keys(this.defaultOptions);
+
+                       for(var i = 0; i < optionTypes.length; i++) {
+                               var optName = optionTypes[i];
+
+                               // First check if an option was passed in via the constructor
+                               var val = options[optName];
+                               // If no data attrib, then check data atrributes
+                               val = (typeof val !== 'undefined') ? val : getDataAttrib(this.element, optName);
+                               // Finally, if nothing was specified, use the defaults
+                               val = (val !== null) ? val : this.defaultOptions[optName];
+
+                               // Set all options on the instance of the Slider
+                               if(!this.options) {
+                                       this.options = {};
+                               }
+                               this.options[optName] = val;
+                       }
+
+                       /*
+                               Validate `tooltip_position` against 'orientation`
+                               - if `tooltip_position` is incompatible with orientation, swith it to a default compatible with specified `orientation`
+                                       -- default for "vertical" -> "right"
+                                       -- default for "horizontal" -> "left"
+                       */
+                       if(this.options.orientation === "vertical" && (this.options.tooltip_position === "top" || this.options.tooltip_position === "bottom")) {
+
+                               this.options.tooltip_position   = "right";
+
+                       }
+                       else if(this.options.orientation === "horizontal" && (this.options.tooltip_position === "left" || this.options.tooltip_position === "right")) {
+
+                               this.options.tooltip_position   = "top";
+
+                       }
+
+                       function getDataAttrib(element, optName) {
+                               var dataName = "data-slider-" + optName.replace(/_/g, '-');
+                               var dataValString = element.getAttribute(dataName);
+
+                               try {
+                                       return JSON.parse(dataValString);
+                               }
+                               catch(err) {
+                                       return dataValString;
+                               }
+                       }
+
+                       /*************************************************
+
+                                                       Create Markup
+
+                       **************************************************/
+
+                       var origWidth = this.element.style.width;
+                       var updateSlider = false;
+                       var parent = this.element.parentNode;
+                       var sliderTrackSelection;
+                       var sliderTrackLow, sliderTrackHigh;
+                       var sliderMinHandle;
+                       var sliderMaxHandle;
+
+                       if (this.sliderElem) {
+                               updateSlider = true;
+                       } else {
+                               /* Create elements needed for slider */
+                               this.sliderElem = document.createElement("div");
+                               this.sliderElem.className = "slider";
+
+                               /* Create slider track elements */
+                               var sliderTrack = document.createElement("div");
+                               sliderTrack.className = "slider-track";
+
+                               sliderTrackLow = document.createElement("div");
+                               sliderTrackLow.className = "slider-track-low";
+
+                               sliderTrackSelection = document.createElement("div");
+                               sliderTrackSelection.className = "slider-selection";
+
+                               sliderTrackHigh = document.createElement("div");
+                               sliderTrackHigh.className = "slider-track-high";
+
+                               sliderMinHandle = document.createElement("div");
+                               sliderMinHandle.className = "slider-handle min-slider-handle";
+                               sliderMinHandle.setAttribute('role', 'slider');
+                               sliderMinHandle.setAttribute('aria-valuemin', this.options.min);
+                               sliderMinHandle.setAttribute('aria-valuemax', this.options.max);
+
+                               sliderMaxHandle = document.createElement("div");
+                               sliderMaxHandle.className = "slider-handle max-slider-handle";
+                               sliderMaxHandle.setAttribute('role', 'slider');
+                               sliderMaxHandle.setAttribute('aria-valuemin', this.options.min);
+                               sliderMaxHandle.setAttribute('aria-valuemax', this.options.max);
+
+                               sliderTrack.appendChild(sliderTrackLow);
+                               sliderTrack.appendChild(sliderTrackSelection);
+                               sliderTrack.appendChild(sliderTrackHigh);
+
+                               /* Add aria-labelledby to handle's */
+                               var isLabelledbyArray = Array.isArray(this.options.labelledby);
+                               if (isLabelledbyArray && this.options.labelledby[0]) {
+                                       sliderMinHandle.setAttribute('aria-labelledby', this.options.labelledby[0]);
+                               }
+                               if (isLabelledbyArray && this.options.labelledby[1]) {
+                                       sliderMaxHandle.setAttribute('aria-labelledby', this.options.labelledby[1]);
+                               }
+                               if (!isLabelledbyArray && this.options.labelledby) {
+                                       sliderMinHandle.setAttribute('aria-labelledby', this.options.labelledby);
+                                       sliderMaxHandle.setAttribute('aria-labelledby', this.options.labelledby);
+                               }
+
+                               /* Create ticks */
+                               this.ticks = [];
+                               if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) {
+                                       for (i = 0; i < this.options.ticks.length; i++) {
+                                               var tick = document.createElement('div');
+                                               tick.className = 'slider-tick';
+
+                                               this.ticks.push(tick);
+                                               sliderTrack.appendChild(tick);
+                                       }
+
+                                       sliderTrackSelection.className += " tick-slider-selection";
+                               }
+
+                               sliderTrack.appendChild(sliderMinHandle);
+                               sliderTrack.appendChild(sliderMaxHandle);
+
+                               this.tickLabels = [];
+                               if (Array.isArray(this.options.ticks_labels) && this.options.ticks_labels.length > 0) {
+                                       this.tickLabelContainer = document.createElement('div');
+                                       this.tickLabelContainer.className = 'slider-tick-label-container';
+
+                                       for (i = 0; i < this.options.ticks_labels.length; i++) {
+                                               var label = document.createElement('div');
+                                               var noTickPositionsSpecified = this.options.ticks_positions.length === 0;
+                                               var tickLabelsIndex = (this.options.reversed && noTickPositionsSpecified) ? (this.options.ticks_labels.length - (i + 1)) : i;
+                                               label.className = 'slider-tick-label';
+                                               label.innerHTML = this.options.ticks_labels[tickLabelsIndex];
+
+                                               this.tickLabels.push(label);
+                                               this.tickLabelContainer.appendChild(label);
+                                       }
+                               }
+
+
+                               var createAndAppendTooltipSubElements = function(tooltipElem) {
+                                       var arrow = document.createElement("div");
+                                       arrow.className = "tooltip-arrow";
+
+                                       var inner = document.createElement("div");
+                                       inner.className = "tooltip-inner";
+
+                                       tooltipElem.appendChild(arrow);
+                                       tooltipElem.appendChild(inner);
+
+                               };
+
+                               /* Create tooltip elements */
+                               var sliderTooltip = document.createElement("div");
+                               sliderTooltip.className = "tooltip tooltip-main";
+                               sliderTooltip.setAttribute('role', 'presentation');
+                               createAndAppendTooltipSubElements(sliderTooltip);
+
+                               var sliderTooltipMin = document.createElement("div");
+                               sliderTooltipMin.className = "tooltip tooltip-min";
+                               sliderTooltipMin.setAttribute('role', 'presentation');
+                               createAndAppendTooltipSubElements(sliderTooltipMin);
+
+                               var sliderTooltipMax = document.createElement("div");
+                               sliderTooltipMax.className = "tooltip tooltip-max";
+                               sliderTooltipMax.setAttribute('role', 'presentation');
+                               createAndAppendTooltipSubElements(sliderTooltipMax);
+
+
+                               /* Append components to sliderElem */
+                               this.sliderElem.appendChild(sliderTrack);
+                               this.sliderElem.appendChild(sliderTooltip);
+                               this.sliderElem.appendChild(sliderTooltipMin);
+                               this.sliderElem.appendChild(sliderTooltipMax);
+
+                               if (this.tickLabelContainer) {
+                                       this.sliderElem.appendChild(this.tickLabelContainer);
+                               }
+
+                               /* Append slider element to parent container, right before the original <input> element */
+                               parent.insertBefore(this.sliderElem, this.element);
+
+                               /* Hide original <input> element */
+                               this.element.style.display = "none";
+                       }
+                       /* If JQuery exists, cache JQ references */
+                       if($) {
+                               this.$element = $(this.element);
+                               this.$sliderElem = $(this.sliderElem);
+                       }
+
+                       /*************************************************
+
+                                                               Setup
+
+                       **************************************************/
+                       this.eventToCallbackMap = {};
+                       this.sliderElem.id = this.options.id;
+
+                       this.touchCapable = 'ontouchstart' in window || (window.DocumentTouch && document instanceof window.DocumentTouch);
+
+                       this.tooltip = this.sliderElem.querySelector('.tooltip-main');
+                       this.tooltipInner = this.tooltip.querySelector('.tooltip-inner');
+
+                       this.tooltip_min = this.sliderElem.querySelector('.tooltip-min');
+                       this.tooltipInner_min = this.tooltip_min.querySelector('.tooltip-inner');
+
+                       this.tooltip_max = this.sliderElem.querySelector('.tooltip-max');
+                       this.tooltipInner_max= this.tooltip_max.querySelector('.tooltip-inner');
+
+                       if (SliderScale[this.options.scale]) {
+                               this.options.scale = SliderScale[this.options.scale];
+                       }
+
+                       if (updateSlider === true) {
+                               // Reset classes
+                               this._removeClass(this.sliderElem, 'slider-horizontal');
+                               this._removeClass(this.sliderElem, 'slider-vertical');
+                               this._removeClass(this.tooltip, 'hide');
+                               this._removeClass(this.tooltip_min, 'hide');
+                               this._removeClass(this.tooltip_max, 'hide');
+
+                               // Undo existing inline styles for track
+                               ["left", "top", "width", "height"].forEach(function(prop) {
+                                       this._removeProperty(this.trackLow, prop);
+                                       this._removeProperty(this.trackSelection, prop);
+                                       this._removeProperty(this.trackHigh, prop);
+                               }, this);
+
+                               // Undo inline styles on handles
+                               [this.handle1, this.handle2].forEach(function(handle) {
+                                       this._removeProperty(handle, 'left');
+                                       this._removeProperty(handle, 'top');
+                               }, this);
+
+                               // Undo inline styles and classes on tooltips
+                               [this.tooltip, this.tooltip_min, this.tooltip_max].forEach(function(tooltip) {
+                                       this._removeProperty(tooltip, 'left');
+                                       this._removeProperty(tooltip, 'top');
+                                       this._removeProperty(tooltip, 'margin-left');
+                                       this._removeProperty(tooltip, 'margin-top');
+
+                                       this._removeClass(tooltip, 'right');
+                                       this._removeClass(tooltip, 'top');
+                               }, this);
+                       }
+
+                       if(this.options.orientation === 'vertical') {
+                               this._addClass(this.sliderElem,'slider-vertical');
+                               this.stylePos = 'top';
+                               this.mousePos = 'pageY';
+                               this.sizePos = 'offsetHeight';
+                       } else {
+                               this._addClass(this.sliderElem, 'slider-horizontal');
+                               this.sliderElem.style.width = origWidth;
+                               this.options.orientation = 'horizontal';
+                               this.stylePos = 'left';
+                               this.mousePos = 'pageX';
+                               this.sizePos = 'offsetWidth';
+
+                       }
+                       this._setTooltipPosition();
+                       /* In case ticks are specified, overwrite the min and max bounds */
+                       if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) {
+                                       this.options.max = Math.max.apply(Math, this.options.ticks);
+                                       this.options.min = Math.min.apply(Math, this.options.ticks);
+                       }
+
+                       if (Array.isArray(this.options.value)) {
+                               this.options.range = true;
+                               this._state.value = this.options.value;
+                       }
+                       else if (this.options.range) {
+                               // User wants a range, but value is not an array
+                               this._state.value = [this.options.value, this.options.max];
+                       }
+                       else {
+                               this._state.value = this.options.value;
+                       }
+
+                       this.trackLow = sliderTrackLow || this.trackLow;
+                       this.trackSelection = sliderTrackSelection || this.trackSelection;
+                       this.trackHigh = sliderTrackHigh || this.trackHigh;
+
+                       if (this.options.selection === 'none') {
+                               this._addClass(this.trackLow, 'hide');
+                               this._addClass(this.trackSelection, 'hide');
+                               this._addClass(this.trackHigh, 'hide');
+                       }
+
+                       this.handle1 = sliderMinHandle || this.handle1;
+                       this.handle2 = sliderMaxHandle || this.handle2;
+
+                       if (updateSlider === true) {
+                               // Reset classes
+                               this._removeClass(this.handle1, 'round triangle');
+                               this._removeClass(this.handle2, 'round triangle hide');
+
+                               for (i = 0; i < this.ticks.length; i++) {
+                                       this._removeClass(this.ticks[i], 'round triangle hide');
+                               }
+                       }
+
+                       var availableHandleModifiers = ['round', 'triangle', 'custom'];
+                       var isValidHandleType = availableHandleModifiers.indexOf(this.options.handle) !== -1;
+                       if (isValidHandleType) {
+                               this._addClass(this.handle1, this.options.handle);
+                               this._addClass(this.handle2, this.options.handle);
+
+                               for (i = 0; i < this.ticks.length; i++) {
+                                       this._addClass(this.ticks[i], this.options.handle);
+                               }
+                       }
+
+                       this._state.offset = this._offset(this.sliderElem);
+                       this._state.size = this.sliderElem[this.sizePos];
+                       this.setValue(this._state.value);
+
+                       /******************************************
+
+                                               Bind Event Listeners
+
+                       ******************************************/
+
+                       // Bind keyboard handlers
+                       this.handle1Keydown = this._keydown.bind(this, 0);
+                       this.handle1.addEventListener("keydown", this.handle1Keydown, false);
+
+                       this.handle2Keydown = this._keydown.bind(this, 1);
+                       this.handle2.addEventListener("keydown", this.handle2Keydown, false);
+
+                       this.mousedown = this._mousedown.bind(this);
+                       if (this.touchCapable) {
+                               // Bind touch handlers
+                               this.sliderElem.addEventListener("touchstart", this.mousedown, false);
+                       }
+                       this.sliderElem.addEventListener("mousedown", this.mousedown, false);
+
+
+                       // Bind tooltip-related handlers
+                       if(this.options.tooltip === 'hide') {
+                               this._addClass(this.tooltip, 'hide');
+                               this._addClass(this.tooltip_min, 'hide');
+                               this._addClass(this.tooltip_max, 'hide');
+                       }
+                       else if(this.options.tooltip === 'always') {
+                               this._showTooltip();
+                               this._alwaysShowTooltip = true;
+                       }
+                       else {
+                               this.showTooltip = this._showTooltip.bind(this);
+                               this.hideTooltip = this._hideTooltip.bind(this);
+
+                               this.sliderElem.addEventListener("mouseenter", this.showTooltip, false);
+                               this.sliderElem.addEventListener("mouseleave", this.hideTooltip, false);
+
+                               this.handle1.addEventListener("focus", this.showTooltip, false);
+                               this.handle1.addEventListener("blur", this.hideTooltip, false);
+
+                               this.handle2.addEventListener("focus", this.showTooltip, false);
+                               this.handle2.addEventListener("blur", this.hideTooltip, false);
+                       }
+
+                       if(this.options.enabled) {
+                               this.enable();
+                       } else {
+                               this.disable();
+                       }
+               }
+
+
+
+               /*************************************************
+
+                                       INSTANCE PROPERTIES/METHODS
+
+               - Any methods bound to the prototype are considered
+               part of the plugin's `public` interface
+
+               **************************************************/
+               Slider.prototype = {
+                       _init: function() {}, // NOTE: Must exist to support bridget
+
+                       constructor: Slider,
+
+                       defaultOptions: {
+                               id: "",
+                         min: 0,
+                               max: 10,
+                               step: 1,
+                               precision: 0,
+                               orientation: 'horizontal',
+                               value: 5,
+                               range: false,
+                               selection: 'before',
+                               tooltip: 'show',
+                               tooltip_split: false,
+                               handle: 'round',
+                               reversed: false,
+                               enabled: true,
+                               formatter: function(val) {
+                                       if (Array.isArray(val)) {
+                                               return val[0] + " : " + val[1];
+                                       } else {
+                                               return val;
+                                       }
+                               },
+                               natural_arrow_keys: false,
+                               ticks: [],
+                               ticks_positions: [],
+                               ticks_labels: [],
+                               ticks_snap_bounds: 0,
+                               scale: 'linear',
+                               focus: false,
+                               tooltip_position: null,
+                               labelledby: null
+                       },
+
+                       getElement: function() {
+                               return this.sliderElem;
+                       },
+
+                       getValue: function() {
+                               if (this.options.range) {
+                                       return this._state.value;
+                               }
+                               else {
+                                       return this._state.value[0];
+                               }
+                       },
+
+                       setValue: function(val, triggerSlideEvent, triggerChangeEvent) {
+                               if (!val) {
+                                       val = 0;
+                               }
+                               var oldValue = this.getValue();
+                               this._state.value = this._validateInputValue(val);
+                               var applyPrecision = this._applyPrecision.bind(this);
+
+                               if (this.options.range) {
+                                       this._state.value[0] = applyPrecision(this._state.value[0]);
+                                       this._state.value[1] = applyPrecision(this._state.value[1]);
+
+                                       this._state.value[0] = Math.max(this.options.min, Math.min(this.options.max, this._state.value[0]));
+                                       this._state.value[1] = Math.max(this.options.min, Math.min(this.options.max, this._state.value[1]));
+                               }
+                               else {
+                                       this._state.value = applyPrecision(this._state.value);
+                                       this._state.value = [ Math.max(this.options.min, Math.min(this.options.max, this._state.value))];
+                                       this._addClass(this.handle2, 'hide');
+                                       if (this.options.selection === 'after') {
+                                               this._state.value[1] = this.options.max;
+                                       } else {
+                                               this._state.value[1] = this.options.min;
+                                       }
+                               }
+
+                               if (this.options.max > this.options.min) {
+                                       this._state.percentage = [
+                                               this._toPercentage(this._state.value[0]),
+                                               this._toPercentage(this._state.value[1]),
+                                               this.options.step * 100 / (this.options.max - this.options.min)
+                                       ];
+                               } else {
+                                       this._state.percentage = [0, 0, 100];
+                               }
+
+                               this._layout();
+                               var newValue = this.options.range ? this._state.value : this._state.value[0];
+
+                               if(triggerSlideEvent === true) {
+                                       this._trigger('slide', newValue);
+                               }
+                               if( (oldValue !== newValue) && (triggerChangeEvent === true) ) {
+                                       this._trigger('change', {
+                                               oldValue: oldValue,
+                                               newValue: newValue
+                                       });
+                               }
+                               this._setDataVal(newValue);
+
+                               return this;
+                       },
+
+                       destroy: function(){
+                               // Remove event handlers on slider elements
+                               this._removeSliderEventHandlers();
+
+                               // Remove the slider from the DOM
+                               this.sliderElem.parentNode.removeChild(this.sliderElem);
+                               /* Show original <input> element */
+                               this.element.style.display = "";
+
+                               // Clear out custom event bindings
+                               this._cleanUpEventCallbacksMap();
+
+                               // Remove data values
+                               this.element.removeAttribute("data");
+
+                               // Remove JQuery handlers/data
+                               if($) {
+                                       this._unbindJQueryEventHandlers();
+                                       this.$element.removeData('slider');
+                               }
+                       },
+
+                       disable: function() {
+                               this._state.enabled = false;
+                               this.handle1.removeAttribute("tabindex");
+                               this.handle2.removeAttribute("tabindex");
+                               this._addClass(this.sliderElem, 'slider-disabled');
+                               this._trigger('slideDisabled');
+
+                               return this;
+                       },
+
+                       enable: function() {
+                               this._state.enabled = true;
+                               this.handle1.setAttribute("tabindex", 0);
+                               this.handle2.setAttribute("tabindex", 0);
+                               this._removeClass(this.sliderElem, 'slider-disabled');
+                               this._trigger('slideEnabled');
+
+                               return this;
+                       },
+
+                       toggle: function() {
+                               if(this._state.enabled) {
+                                       this.disable();
+                               } else {
+                                       this.enable();
+                               }
+                               return this;
+                       },
+
+                       isEnabled: function() {
+                               return this._state.enabled;
+                       },
+
+                       on: function(evt, callback) {
+                               this._bindNonQueryEventHandler(evt, callback);
+                               return this;
+                       },
+
+      off: function(evt, callback) {
+          if($) {
+              this.$element.off(evt, callback);
+              this.$sliderElem.off(evt, callback);
+          } else {
+              this._unbindNonQueryEventHandler(evt, callback);
+          }
+      },
+
+                       getAttribute: function(attribute) {
+                               if(attribute) {
+                                       return this.options[attribute];
+                               } else {
+                                       return this.options;
+                               }
+                       },
+
+                       setAttribute: function(attribute, value) {
+                               this.options[attribute] = value;
+                               return this;
+                       },
+
+                       refresh: function() {
+                               this._removeSliderEventHandlers();
+                               createNewSlider.call(this, this.element, this.options);
+                               if($) {
+                                       // Bind new instance of slider to the element
+                                       $.data(this.element, 'slider', this);
+                               }
+                               return this;
+                       },
+
+                       relayout: function() {
+                               this._layout();
+                               return this;
+                       },
+
+                       /******************************+
+
+                                               HELPERS
+
+                       - Any method that is not part of the public interface.
+                       - Place it underneath this comment block and write its signature like so:
+
+                                                               _fnName : function() {...}
+
+                       ********************************/
+                       _removeSliderEventHandlers: function() {
+                               // Remove keydown event listeners
+                               this.handle1.removeEventListener("keydown", this.handle1Keydown, false);
+                               this.handle2.removeEventListener("keydown", this.handle2Keydown, false);
+
+                               if (this.showTooltip) {
+                                       this.handle1.removeEventListener("focus", this.showTooltip, false);
+                                       this.handle2.removeEventListener("focus", this.showTooltip, false);
+                               }
+                               if (this.hideTooltip) {
+                                       this.handle1.removeEventListener("blur", this.hideTooltip, false);
+                                       this.handle2.removeEventListener("blur", this.hideTooltip, false);
+                               }
+
+                               // Remove event listeners from sliderElem
+                               if (this.showTooltip) {
+                                       this.sliderElem.removeEventListener("mouseenter", this.showTooltip, false);
+                               }
+                               if (this.hideTooltip) {
+                                       this.sliderElem.removeEventListener("mouseleave", this.hideTooltip, false);
+                               }
+                               this.sliderElem.removeEventListener("touchstart", this.mousedown, false);
+                               this.sliderElem.removeEventListener("mousedown", this.mousedown, false);
+                       },
+                       _bindNonQueryEventHandler: function(evt, callback) {
+                               if(this.eventToCallbackMap[evt] === undefined) {
+                                       this.eventToCallbackMap[evt] = [];
+                               }
+                               this.eventToCallbackMap[evt].push(callback);
+                       },
+      _unbindNonQueryEventHandler: function(evt, callback) {
+          var callbacks = this.eventToCallbackMap[evt];
+          if(callbacks !== undefined) {
+              for (var i = 0; i < callbacks.length; i++) {
+                  if (callbacks[i] === callback) {
+                      callbacks.splice(i, 1);
+                      break;
+                  }
+              }
+          }
+      },
+                       _cleanUpEventCallbacksMap: function() {
+                               var eventNames = Object.keys(this.eventToCallbackMap);
+                               for(var i = 0; i < eventNames.length; i++) {
+                                       var eventName = eventNames[i];
+                                       this.eventToCallbackMap[eventName] = null;
+                               }
+                       },
+                       _showTooltip: function() {
+                               if (this.options.tooltip_split === false ){
+               this._addClass(this.tooltip, 'in');
+               this.tooltip_min.style.display = 'none';
+               this.tooltip_max.style.display = 'none';
+                   } else {
+          this._addClass(this.tooltip_min, 'in');
+          this._addClass(this.tooltip_max, 'in');
+          this.tooltip.style.display = 'none';
+                   }
+                               this._state.over = true;
+                       },
+                       _hideTooltip: function() {
+                               if (this._state.inDrag === false && this.alwaysShowTooltip !== true) {
+                                       this._removeClass(this.tooltip, 'in');
+                                       this._removeClass(this.tooltip_min, 'in');
+                                       this._removeClass(this.tooltip_max, 'in');
+                               }
+                               this._state.over = false;
+                       },
+                       _layout: function() {
+                               var positionPercentages;
+
+                               if(this.options.reversed) {
+                                       positionPercentages = [ 100 - this._state.percentage[0], this.options.range ? 100 - this._state.percentage[1] : this._state.percentage[1]];
+                               }
+                               else {
+                                       positionPercentages = [ this._state.percentage[0], this._state.percentage[1] ];
+                               }
+
+                               this.handle1.style[this.stylePos] = positionPercentages[0]+'%';
+                               this.handle1.setAttribute('aria-valuenow', this._state.value[0]);
+
+                               this.handle2.style[this.stylePos] = positionPercentages[1]+'%';
+                               this.handle2.setAttribute('aria-valuenow', this._state.value[1]);
+
+                               /* Position ticks and labels */
+                               if (Array.isArray(this.options.ticks) && this.options.ticks.length > 0) {
+
+                                       var styleSize = this.options.orientation === 'vertical' ? 'height' : 'width';
+                                       var styleMargin = this.options.orientation === 'vertical' ? 'marginTop' : 'marginLeft';
+                                       var labelSize = this._state.size / (this.options.ticks.length - 1);
+
+                                       if (this.tickLabelContainer) {
+                                               var extraMargin = 0;
+                                               if (this.options.ticks_positions.length === 0) {
+                                                       if (this.options.orientation !== 'vertical') {
+                                                               this.tickLabelContainer.style[styleMargin] = -labelSize/2 + 'px';
+                                                       }
+
+                                                       extraMargin = this.tickLabelContainer.offsetHeight;
+                                               } else {
+                                                       /* Chidren are position absolute, calculate height by finding the max offsetHeight of a child */
+                                                       for (i = 0 ; i < this.tickLabelContainer.childNodes.length; i++) {
+                                                               if (this.tickLabelContainer.childNodes[i].offsetHeight > extraMargin) {
+                                                                       extraMargin = this.tickLabelContainer.childNodes[i].offsetHeight;
+                                                               }
+                                                       }
+                                               }
+                                               if (this.options.orientation === 'horizontal') {
+                                                       this.sliderElem.style.marginBottom = extraMargin + 'px';
+                                               }
+                                       }
+                                       for (var i = 0; i < this.options.ticks.length; i++) {
+
+                                               var percentage = this.options.ticks_positions[i] || this._toPercentage(this.options.ticks[i]);
+
+                                               if (this.options.reversed) {
+                                                       percentage = 100 - percentage;
+                                               }
+
+                                               this.ticks[i].style[this.stylePos] = percentage + '%';
+
+                                               /* Set class labels to denote whether ticks are in the selection */
+                                               this._removeClass(this.ticks[i], 'in-selection');
+                                               if (!this.options.range) {
+                                                       if (this.options.selection === 'after' && percentage >= positionPercentages[0]){
+                                                               this._addClass(this.ticks[i], 'in-selection');
+                                                       } else if (this.options.selection === 'before' && percentage <= positionPercentages[0]) {
+                                                               this._addClass(this.ticks[i], 'in-selection');
+                                                       }
+                                               } else if (percentage >= positionPercentages[0] && percentage <= positionPercentages[1]) {
+                                                       this._addClass(this.ticks[i], 'in-selection');
+                                               }
+
+                                               if (this.tickLabels[i]) {
+                                                       this.tickLabels[i].style[styleSize] = labelSize + 'px';
+
+                                                       if (this.options.orientation !== 'vertical' && this.options.ticks_positions[i] !== undefined) {
+                                                               this.tickLabels[i].style.position = 'absolute';
+                                                               this.tickLabels[i].style[this.stylePos] = percentage + '%';
+                                                               this.tickLabels[i].style[styleMargin] = -labelSize/2 + 'px';
+                                                       } else if (this.options.orientation === 'vertical') {
+                                                               this.tickLabels[i].style['marginLeft'] =  this.sliderElem.offsetWidth + 'px';
+                                                               this.tickLabelContainer.style['marginTop'] = this.sliderElem.offsetWidth / 2 * -1 + 'px';
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               var formattedTooltipVal;
+
+                               if (this.options.range) {
+                                       formattedTooltipVal = this.options.formatter(this._state.value);
+                                       this._setText(this.tooltipInner, formattedTooltipVal);
+                                       this.tooltip.style[this.stylePos] = (positionPercentages[1] + positionPercentages[0])/2 + '%';
+
+                                       if (this.options.orientation === 'vertical') {
+                                               this._css(this.tooltip, 'margin-top', -this.tooltip.offsetHeight / 2 + 'px');
+                                       } else {
+                                               this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px');
+                                       }
+
+                                       if (this.options.orientation === 'vertical') {
+                                               this._css(this.tooltip, 'margin-top', -this.tooltip.offsetHeight / 2 + 'px');
+                                       } else {
+                                               this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px');
+                                       }
+
+                                       var innerTooltipMinText = this.options.formatter(this._state.value[0]);
+                                       this._setText(this.tooltipInner_min, innerTooltipMinText);
+
+                                       var innerTooltipMaxText = this.options.formatter(this._state.value[1]);
+                                       this._setText(this.tooltipInner_max, innerTooltipMaxText);
+
+                                       this.tooltip_min.style[this.stylePos] = positionPercentages[0] + '%';
+
+                                       if (this.options.orientation === 'vertical') {
+                                               this._css(this.tooltip_min, 'margin-top', -this.tooltip_min.offsetHeight / 2 + 'px');
+                                       } else {
+                                               this._css(this.tooltip_min, 'margin-left', -this.tooltip_min.offsetWidth / 2 + 'px');
+                                       }
+
+                                       this.tooltip_max.style[this.stylePos] = positionPercentages[1] + '%';
+
+                                       if (this.options.orientation === 'vertical') {
+                                               this._css(this.tooltip_max, 'margin-top', -this.tooltip_max.offsetHeight / 2 + 'px');
+                                       } else {
+                                               this._css(this.tooltip_max, 'margin-left', -this.tooltip_max.offsetWidth / 2 + 'px');
+                                       }
+                               } else {
+                                       formattedTooltipVal = this.options.formatter(this._state.value[0]);
+                                       this._setText(this.tooltipInner, formattedTooltipVal);
+
+                                       this.tooltip.style[this.stylePos] = positionPercentages[0] + '%';
+                                       if (this.options.orientation === 'vertical') {
+                                               this._css(this.tooltip, 'margin-top', -this.tooltip.offsetHeight / 2 + 'px');
+                                       } else {
+                                               this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px');
+                                       }
+                               }
+
+                               if (this.options.orientation === 'vertical') {
+                                       this.trackLow.style.top = '0';
+                                       this.trackLow.style.height = Math.min(positionPercentages[0], positionPercentages[1]) +'%';
+
+                                       this.trackSelection.style.top = Math.min(positionPercentages[0], positionPercentages[1]) +'%';
+                                       this.trackSelection.style.height = Math.abs(positionPercentages[0] - positionPercentages[1]) +'%';
+
+                                       this.trackHigh.style.bottom = '0';
+                                       this.trackHigh.style.height = (100 - Math.min(positionPercentages[0], positionPercentages[1]) - Math.abs(positionPercentages[0] - positionPercentages[1])) +'%';
+                               }
+                               else {
+                                       this.trackLow.style.left = '0';
+                                       this.trackLow.style.width = Math.min(positionPercentages[0], positionPercentages[1]) +'%';
+
+                                       this.trackSelection.style.left = Math.min(positionPercentages[0], positionPercentages[1]) +'%';
+                                       this.trackSelection.style.width = Math.abs(positionPercentages[0] - positionPercentages[1]) +'%';
+
+                                       this.trackHigh.style.right = '0';
+                                       this.trackHigh.style.width = (100 - Math.min(positionPercentages[0], positionPercentages[1]) - Math.abs(positionPercentages[0] - positionPercentages[1])) +'%';
+
+                               var offset_min = this.tooltip_min.getBoundingClientRect();
+                               var offset_max = this.tooltip_max.getBoundingClientRect();
+
+                               if (offset_min.right > offset_max.left) {
+                                   this._removeClass(this.tooltip_max, 'top');
+                                   this._addClass(this.tooltip_max, 'bottom');
+                                   this.tooltip_max.style.top = 18 + 'px';
+                               } else {
+                                   this._removeClass(this.tooltip_max, 'bottom');
+                                   this._addClass(this.tooltip_max, 'top');
+                                   this.tooltip_max.style.top = this.tooltip_min.style.top;
+                               }
+                               }
+                       },
+                       _removeProperty: function(element, prop) {
+                               if (element.style.removeProperty) {
+                                   element.style.removeProperty(prop);
+                               } else {
+                                   element.style.removeAttribute(prop);
+                               }
+                       },
+                       _mousedown: function(ev) {
+                               if(!this._state.enabled) {
+                                       return false;
+                               }
+
+                               this._state.offset = this._offset(this.sliderElem);
+                               this._state.size = this.sliderElem[this.sizePos];
+
+                               var percentage = this._getPercentage(ev);
+
+                               if (this.options.range) {
+                                       var diff1 = Math.abs(this._state.percentage[0] - percentage);
+                                       var diff2 = Math.abs(this._state.percentage[1] - percentage);
+                                       this._state.dragged = (diff1 < diff2) ? 0 : 1;
+                               } else {
+                                       this._state.dragged = 0;
+                               }
+
+                               this._state.percentage[this._state.dragged] = percentage;
+                               this._layout();
+
+                               if (this.touchCapable) {
+                                       document.removeEventListener("touchmove", this.mousemove, false);
+                                       document.removeEventListener("touchend", this.mouseup, false);
+                               }
+
+                               if(this.mousemove){
+                                       document.removeEventListener("mousemove", this.mousemove, false);
+                               }
+                               if(this.mouseup){
+                                       document.removeEventListener("mouseup", this.mouseup, false);
+                               }
+
+                               this.mousemove = this._mousemove.bind(this);
+                               this.mouseup = this._mouseup.bind(this);
+
+                               if (this.touchCapable) {
+                                       // Touch: Bind touch events:
+                                       document.addEventListener("touchmove", this.mousemove, false);
+                                       document.addEventListener("touchend", this.mouseup, false);
+                               }
+                               // Bind mouse events:
+                               document.addEventListener("mousemove", this.mousemove, false);
+                               document.addEventListener("mouseup", this.mouseup, false);
+
+                               this._state.inDrag = true;
+                               var newValue = this._calculateValue();
+
+                               this._trigger('slideStart', newValue);
+
+                               this._setDataVal(newValue);
+                               this.setValue(newValue, false, true);
+
+                               this._pauseEvent(ev);
+
+                               if (this.options.focus) {
+                                       this._triggerFocusOnHandle(this._state.dragged);
+                               }
+
+                               return true;
+                       },
+                       _triggerFocusOnHandle: function(handleIdx) {
+                               if(handleIdx === 0) {
+                                       this.handle1.focus();
+                               }
+                               if(handleIdx === 1) {
+                                       this.handle2.focus();
+                               }
+                       },
+                       _keydown: function(handleIdx, ev) {
+                               if(!this._state.enabled) {
+                                       return false;
+                               }
+
+                               var dir;
+                               switch (ev.keyCode) {
+                                       case 37: // left
+                                       case 40: // down
+                                               dir = -1;
+                                               break;
+                                       case 39: // right
+                                       case 38: // up
+                                               dir = 1;
+                                               break;
+                               }
+                               if (!dir) {
+                                       return;
+                               }
+
+                               // use natural arrow keys instead of from min to max
+                               if (this.options.natural_arrow_keys) {
+                                       var ifVerticalAndNotReversed = (this.options.orientation === 'vertical' && !this.options.reversed);
+                                       var ifHorizontalAndReversed = (this.options.orientation === 'horizontal' && this.options.reversed);
+
+                                       if (ifVerticalAndNotReversed || ifHorizontalAndReversed) {
+                                               dir = -dir;
+                                       }
+                               }
+
+                               var val = this._state.value[handleIdx] + dir * this.options.step;
+                               if (this.options.range) {
+                                       val = [ (!handleIdx) ? val : this._state.value[0],
+                                                   ( handleIdx) ? val : this._state.value[1]];
+                               }
+
+                               this._trigger('slideStart', val);
+                               this._setDataVal(val);
+                               this.setValue(val, true, true);
+
+                               this._setDataVal(val);
+                               this._trigger('slideStop', val);
+                               this._layout();
+
+                               this._pauseEvent(ev);
+
+                               return false;
+                       },
+                       _pauseEvent: function(ev) {
+                               if(ev.stopPropagation) {
+                                       ev.stopPropagation();
+                               }
+                           if(ev.preventDefault) {
+                               ev.preventDefault();
+                           }
+                           ev.cancelBubble=true;
+                           ev.returnValue=false;
+                       },
+                       _mousemove: function(ev) {
+                               if(!this._state.enabled) {
+                                       return false;
+                               }
+
+                               var percentage = this._getPercentage(ev);
+                               this._adjustPercentageForRangeSliders(percentage);
+                               this._state.percentage[this._state.dragged] = percentage;
+                               this._layout();
+
+                               var val = this._calculateValue(true);
+                               this.setValue(val, true, true);
+
+                               return false;
+                       },
+                       _adjustPercentageForRangeSliders: function(percentage) {
+                               if (this.options.range) {
+                                       var precision = this._getNumDigitsAfterDecimalPlace(percentage);
+                                       precision = precision ? precision - 1 : 0;
+                                       var percentageWithAdjustedPrecision = this._applyToFixedAndParseFloat(percentage, precision);
+                                       if (this._state.dragged === 0 && this._applyToFixedAndParseFloat(this._state.percentage[1], precision) < percentageWithAdjustedPrecision) {
+                                               this._state.percentage[0] = this._state.percentage[1];
+                                               this._state.dragged = 1;
+                                       } else if (this._state.dragged === 1 && this._applyToFixedAndParseFloat(this._state.percentage[0], precision) > percentageWithAdjustedPrecision) {
+                                               this._state.percentage[1] = this._state.percentage[0];
+                                               this._state.dragged = 0;
+                                       }
+                               }
+                       },
+                       _mouseup: function() {
+                               if(!this._state.enabled) {
+                                       return false;
+                               }
+                               if (this.touchCapable) {
+                                       // Touch: Unbind touch event handlers:
+                                       document.removeEventListener("touchmove", this.mousemove, false);
+                                       document.removeEventListener("touchend", this.mouseup, false);
+                               }
+                // Unbind mouse event handlers:
+                document.removeEventListener("mousemove", this.mousemove, false);
+                document.removeEventListener("mouseup", this.mouseup, false);
+
+                               this._state.inDrag = false;
+                               if (this._state.over === false) {
+                                       this._hideTooltip();
+                               }
+                               var val = this._calculateValue(true);
+
+                               this._layout();
+                               this._setDataVal(val);
+                               this._trigger('slideStop', val);
+
+                               return false;
+                       },
+                       _calculateValue: function(snapToClosestTick) {
+                               var val;
+                               if (this.options.range) {
+                                       val = [this.options.min,this.options.max];
+                               if (this._state.percentage[0] !== 0){
+                                   val[0] = this._toValue(this._state.percentage[0]);
+                                   val[0] = this._applyPrecision(val[0]);
+                               }
+                               if (this._state.percentage[1] !== 100){
+                                   val[1] = this._toValue(this._state.percentage[1]);
+                                   val[1] = this._applyPrecision(val[1]);
+                               }
+                               } else {
+                           val = this._toValue(this._state.percentage[0]);
+                                       val = parseFloat(val);
+                                       val = this._applyPrecision(val);
+                               }
+
+                               if (snapToClosestTick) {
+                                       var min = [val, Infinity];
+                                       for (var i = 0; i < this.options.ticks.length; i++) {
+                                               var diff = Math.abs(this.options.ticks[i] - val);
+                                               if (diff <= min[1]) {
+                                                       min = [this.options.ticks[i], diff];
+                                               }
+                                       }
+                                       if (min[1] <= this.options.ticks_snap_bounds) {
+                                               return min[0];
+                                       }
+                               }
+
+                               return val;
+                       },
+                       _applyPrecision: function(val) {
+                               var precision = this.options.precision || this._getNumDigitsAfterDecimalPlace(this.options.step);
+                               return this._applyToFixedAndParseFloat(val, precision);
+                       },
+                       _getNumDigitsAfterDecimalPlace: function(num) {
+                               var match = (''+num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
+                               if (!match) { return 0; }
+                               return Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0));
+                       },
+                       _applyToFixedAndParseFloat: function(num, toFixedInput) {
+                               var truncatedNum = num.toFixed(toFixedInput);
+                               return parseFloat(truncatedNum);
+                       },
+                       /*
+                               Credits to Mike Samuel for the following method!
+                               Source: http://stackoverflow.com/questions/10454518/javascript-how-to-retrieve-the-number-of-decimals-of-a-string-number
+                       */
+                       _getPercentage: function(ev) {
+                               if (this.touchCapable && (ev.type === 'touchstart' || ev.type === 'touchmove')) {
+                                       ev = ev.touches[0];
+                               }
+
+                               var eventPosition = ev[this.mousePos];
+                               var sliderOffset = this._state.offset[this.stylePos];
+                               var distanceToSlide = eventPosition - sliderOffset;
+                               // Calculate what percent of the length the slider handle has slid
+                               var percentage = (distanceToSlide / this._state.size) * 100;
+                               percentage = Math.round(percentage / this._state.percentage[2]) * this._state.percentage[2];
+                               if (this.options.reversed) {
+                                       percentage = 100 - percentage;
+                               }
+
+                               // Make sure the percent is within the bounds of the slider.
+                               // 0% corresponds to the 'min' value of the slide
+                               // 100% corresponds to the 'max' value of the slide
+                               return Math.max(0, Math.min(100, percentage));
+                       },
+                       _validateInputValue: function(val) {
+                               if (typeof val === 'number') {
+                                       return val;
+                               } else if (Array.isArray(val)) {
+                                       this._validateArray(val);
+                                       return val;
+                               } else {
+                                       throw new Error( ErrorMsgs.formatInvalidInputErrorMsg(val) );
+                               }
+                       },
+                       _validateArray: function(val) {
+                               for(var i = 0; i < val.length; i++) {
+                                       var input =  val[i];
+                                       if (typeof input !== 'number') { throw new Error( ErrorMsgs.formatInvalidInputErrorMsg(input) ); }
+                               }
+                       },
+                       _setDataVal: function(val) {
+                               this.element.setAttribute('data-value', val);
+                               this.element.setAttribute('value', val);
+        this.element.value = val;
+                       },
+                       _trigger: function(evt, val) {
+                               val = (val || val === 0) ? val : undefined;
+
+                               var callbackFnArray = this.eventToCallbackMap[evt];
+                               if(callbackFnArray && callbackFnArray.length) {
+                                       for(var i = 0; i < callbackFnArray.length; i++) {
+                                               var callbackFn = callbackFnArray[i];
+                                               callbackFn(val);
+                                       }
+                               }
+
+                               /* If JQuery exists, trigger JQuery events */
+                               if($) {
+                                       this._triggerJQueryEvent(evt, val);
+                               }
+                       },
+                       _triggerJQueryEvent: function(evt, val) {
+                               var eventData = {
+                                       type: evt,
+                                       value: val
+                               };
+                               this.$element.trigger(eventData);
+                               this.$sliderElem.trigger(eventData);
+                       },
+                       _unbindJQueryEventHandlers: function() {
+                               this.$element.off();
+                               this.$sliderElem.off();
+                       },
+                       _setText: function(element, text) {
+                               if(typeof element.innerText !== "undefined") {
+                                       element.innerText = text;
+                               } else if(typeof element.textContent !== "undefined") {
+                                       element.textContent = text;
+                               }
+                       },
+                       _removeClass: function(element, classString) {
+                               var classes = classString.split(" ");
+                               var newClasses = element.className;
+
+                               for(var i = 0; i < classes.length; i++) {
+                                       var classTag = classes[i];
+                                       var regex = new RegExp("(?:\\s|^)" + classTag + "(?:\\s|$)");
+                                       newClasses = newClasses.replace(regex, " ");
+                               }
+
+                               element.className = newClasses.trim();
+                       },
+                       _addClass: function(element, classString) {
+                               var classes = classString.split(" ");
+                               var newClasses = element.className;
+
+                               for(var i = 0; i < classes.length; i++) {
+                                       var classTag = classes[i];
+                                       var regex = new RegExp("(?:\\s|^)" + classTag + "(?:\\s|$)");
+                                       var ifClassExists = regex.test(newClasses);
+
+                                       if(!ifClassExists) {
+                                               newClasses += " " + classTag;
+                                       }
+                               }
+
+                               element.className = newClasses.trim();
+                       },
+                       _offsetLeft: function(obj){
+                               return obj.getBoundingClientRect().left;
+                       },
+                       _offsetTop: function(obj){
+                               var offsetTop = obj.offsetTop;
+                               while((obj = obj.offsetParent) && !isNaN(obj.offsetTop)){
+                                       offsetTop += obj.offsetTop;
+                               }
+                               return offsetTop;
+                       },
+                   _offset: function (obj) {
+                               return {
+                                       left: this._offsetLeft(obj),
+                                       top: this._offsetTop(obj)
+                               };
+                   },
+                       _css: function(elementRef, styleName, value) {
+                if ($) {
+                    $.style(elementRef, styleName, value);
+                } else {
+                    var style = styleName.replace(/^-ms-/, "ms-").replace(/-([\da-z])/gi, function (all, letter) {
+                        return letter.toUpperCase();
+                    });
+                    elementRef.style[style] = value;
+                }
+                       },
+                       _toValue: function(percentage) {
+                               return this.options.scale.toValue.apply(this, [percentage]);
+                       },
+                       _toPercentage: function(value) {
+                               return this.options.scale.toPercentage.apply(this, [value]);
+                       },
+                       _setTooltipPosition: function(){
+                               var tooltips = [this.tooltip, this.tooltip_min, this.tooltip_max];
+                               if (this.options.orientation === 'vertical'){
+                                       var tooltipPos = this.options.tooltip_position || 'right';
+                                       var oppositeSide = (tooltipPos === 'left') ? 'right' : 'left';
+                                       tooltips.forEach(function(tooltip){
+                                               this._addClass(tooltip, tooltipPos);
+                                               tooltip.style[oppositeSide] = '100%';
+                                       }.bind(this));
+                               } else if(this.options.tooltip_position === 'bottom') {
+                                       tooltips.forEach(function(tooltip){
+                                               this._addClass(tooltip, 'bottom');
+                                               tooltip.style.top = 22 + 'px';
+                                       }.bind(this));
+                               } else {
+                                       tooltips.forEach(function(tooltip){
+                                               this._addClass(tooltip, 'top');
+                                               tooltip.style.top = -this.tooltip.outerHeight - 14 + 'px';
+                                       }.bind(this));
+                               }
+                       }
+               };
+
+               /*********************************
+
+                       Attach to global namespace
+
+               *********************************/
+               if($) {
+                       var namespace = $.fn.slider ? 'bootstrapSlider' : 'slider';
+                       $.bridget(namespace, Slider);
+               }
+
+       })( $ );
+
+       return Slider;
+}));