{"version":3,"sources":["jsdelivr-header.js","/npm/@cschear/angularjs-slider@4.0.2/dist/rzslider.js"],"names":[],"mappings":"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","file":"/npm/@cschear/angularjs-slider@4.0.2/dist/rzslider.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@cschear/angularjs-slider@4.0.2/dist/rzslider.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*! angularjs-slider - v4.0.2 - \r\n (c) Rafal Zajac <rzajac@gmail.com>, Valentin Hervieu <valentin@hervieu.me>, Jussi Saarivirta <jusasi@gmail.com>, Angelin Sirbu <angelin.sirbu@gmail.com> - \r\n https://github.com/angular-slider/angularjs-slider - \r\n 2016-06-07 */\r\n/*jslint unparam: true */\r\n/*global angular: false, console: false, define, module */\r\n(function (root, factory) {\r\n  if (typeof define === 'function' && define.amd) {\r\n    // AMD. Register as an anonymous module unless amdModuleId is set\r\n    define([], function () {\r\n      return (factory());\r\n    });\r\n  } else if (typeof exports === 'object') {\r\n    // Node. Does not work with strict CommonJS, but\r\n    // only CommonJS-like environments that support module.exports,\r\n    // like Node.\r\n    module.exports = factory();\r\n  } else {\r\n    factory();\r\n  }\r\n}(this, function () {\r\n  'use strict';\r\n  var module = angular.module('rzModule', [])\r\n\r\n  .factory('RzSliderOptions', function() {\r\n    var defaultOptions = {\r\n      floor: 0,\r\n      ceil: null, //defaults to rz-slider-model\r\n      step: 1,\r\n      precision: 0,\r\n      minRange: null,\r\n      maxRange: null,\r\n      minLimit: null,\r\n      maxLimit: null,\r\n      id: null,\r\n      translate: null,\r\n      getLegend: null,\r\n      stepsArray: null,\r\n      draggableRange: false,\r\n      draggableRangeOnly: false,\r\n      showSelectionBar: false,\r\n      showSelectionBarEnd: false,\r\n      showSelectionBarFromValue: null,\r\n      hidePointerLabels: false,\r\n      hideLimitLabels: false,\r\n      readOnly: false,\r\n      disabled: false,\r\n      interval: 350,\r\n      showTicks: false,\r\n      showTicksValues: false,\r\n      ticksTooltip: null,\r\n      ticksValuesTooltip: null,\r\n      vertical: false,\r\n      getSelectionBarColor: null,\r\n      getPointerColor: null,\r\n      keyboardSupport: true,\r\n      scale: 1,\r\n      enforceStep: true,\r\n      enforceRange: false,\r\n      noSwitching: false,\r\n      onlyBindHandles: false,\r\n      onStart: null,\r\n      onChange: null,\r\n      onEnd: null,\r\n      rightToLeft: false,\r\n      boundPointerLabels: true,\r\n      mergeRangeLabelsIfSame: false\r\n    };\r\n    var globalOptions = {};\r\n\r\n    var factory = {};\r\n    /**\r\n     * `options({})` allows global configuration of all sliders in the\r\n     * application.\r\n     *\r\n     *   var app = angular.module( 'App', ['rzModule'], function( RzSliderOptions ) {\r\n     *     // show ticks for all sliders\r\n     *     RzSliderOptions.options( { showTicks: true } );\r\n     *   });\r\n     */\r\n    factory.options = function(value) {\r\n      angular.extend(globalOptions, value);\r\n    };\r\n\r\n    factory.getOptions = function(options) {\r\n      return angular.extend({}, defaultOptions, globalOptions, options);\r\n    };\r\n\r\n    return factory;\r\n  })\r\n\r\n  .factory('rzThrottle', ['$timeout', function($timeout) {\r\n    /**\r\n     * rzThrottle\r\n     *\r\n     * Taken from underscore project\r\n     *\r\n     * @param {Function} func\r\n     * @param {number} wait\r\n     * @param {ThrottleOptions} options\r\n     * @returns {Function}\r\n     */\r\n    return function(func, wait, options) {\r\n      'use strict';\r\n      /* istanbul ignore next */\r\n      var getTime = (Date.now || function() {\r\n        return new Date().getTime();\r\n      });\r\n      var context, args, result;\r\n      var timeout = null;\r\n      var previous = 0;\r\n      options = options || {};\r\n      var later = function() {\r\n        previous = getTime();\r\n        timeout = null;\r\n        result = func.apply(context, args);\r\n        context = args = null;\r\n      };\r\n      return function() {\r\n        var now = getTime();\r\n        var remaining = wait - (now - previous);\r\n        context = this;\r\n        args = arguments;\r\n        if (remaining <= 0) {\r\n          $timeout.cancel(timeout);\r\n          timeout = null;\r\n          previous = now;\r\n          result = func.apply(context, args);\r\n          context = args = null;\r\n        } else if (!timeout && options.trailing !== false) {\r\n          timeout = $timeout(later, remaining);\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n  }])\r\n\r\n  .factory('RzSlider', ['$timeout', '$document', '$window', '$compile', 'RzSliderOptions', 'rzThrottle', function($timeout, $document, $window, $compile, RzSliderOptions, rzThrottle) {\r\n    'use strict';\r\n\r\n    /**\r\n     * Slider\r\n     *\r\n     * @param {ngScope} scope            The AngularJS scope\r\n     * @param {Element} sliderElem The slider directive element wrapped in jqLite\r\n     * @constructor\r\n     */\r\n    var Slider = function(scope, sliderElem) {\r\n      /**\r\n       * The slider's scope\r\n       *\r\n       * @type {ngScope}\r\n       */\r\n      this.scope = scope;\r\n\r\n      /**\r\n       * The slider inner low value (linked to rzSliderModel)\r\n       * @type {number}\r\n       */\r\n      this.lowValue = 0;\r\n\r\n      /**\r\n       * The slider inner high value (linked to rzSliderHigh)\r\n       * @type {number}\r\n       */\r\n      this.highValue = 0;\r\n\r\n      /**\r\n       * Slider element wrapped in jqLite\r\n       *\r\n       * @type {jqLite}\r\n       */\r\n      this.sliderElem = sliderElem;\r\n\r\n      /**\r\n       * Slider type\r\n       *\r\n       * @type {boolean} Set to true for range slider\r\n       */\r\n      this.range = this.scope.rzSliderModel !== undefined && this.scope.rzSliderHigh !== undefined;\r\n\r\n      /**\r\n       * Values recorded when first dragging the bar\r\n       *\r\n       * @type {Object}\r\n       */\r\n      this.dragging = {\r\n        active: false,\r\n        value: 0,\r\n        difference: 0,\r\n        offset: 0,\r\n        lowLimit: 0,\r\n        highLimit: 0\r\n      };\r\n\r\n      /**\r\n       * property that handle position (defaults to left for horizontal)\r\n       * @type {string}\r\n       */\r\n      this.positionProperty = 'left';\r\n\r\n      /**\r\n       * property that handle dimension (defaults to width for horizontal)\r\n       * @type {string}\r\n       */\r\n      this.dimensionProperty = 'width';\r\n\r\n      /**\r\n       * Half of the width or height of the slider handles\r\n       *\r\n       * @type {number}\r\n       */\r\n      this.handleHalfDim = 0;\r\n\r\n      /**\r\n       * Maximum position the slider handle can have\r\n       *\r\n       * @type {number}\r\n       */\r\n      this.maxPos = 0;\r\n\r\n      /**\r\n       * Precision\r\n       *\r\n       * @type {number}\r\n       */\r\n      this.precision = 0;\r\n\r\n      /**\r\n       * Step\r\n       *\r\n       * @type {number}\r\n       */\r\n      this.step = 1;\r\n\r\n      /**\r\n       * The name of the handle we are currently tracking\r\n       *\r\n       * @type {string}\r\n       */\r\n      this.tracking = '';\r\n\r\n      /**\r\n       * Minimum value (floor) of the model\r\n       *\r\n       * @type {number}\r\n       */\r\n      this.minValue = 0;\r\n\r\n      /**\r\n       * Maximum value (ceiling) of the model\r\n       *\r\n       * @type {number}\r\n       */\r\n      this.maxValue = 0;\r\n\r\n\r\n      /**\r\n       * The delta between min and max value\r\n       *\r\n       * @type {number}\r\n       */\r\n      this.valueRange = 0;\r\n\r\n\r\n      /**\r\n       * If showTicks/showTicksValues options are number.\r\n       * In this case, ticks values should be displayed below the slider.\r\n       * @type {boolean}\r\n       */\r\n      this.intermediateTicks = false;\r\n\r\n      /**\r\n       * Set to true if init method already executed\r\n       *\r\n       * @type {boolean}\r\n       */\r\n      this.initHasRun = false;\r\n\r\n      /**\r\n       * Used to call onStart on the first keydown event\r\n       *\r\n       * @type {boolean}\r\n       */\r\n      this.firstKeyDown = false;\r\n\r\n      /**\r\n       * Internal flag to prevent watchers to be called when the sliders value are modified internally.\r\n       * @type {boolean}\r\n       */\r\n      this.internalChange = false;\r\n\r\n      // Slider DOM elements wrapped in jqLite\r\n      this.fullBar = null; // The whole slider bar\r\n      this.selBar = null; // Highlight between two handles\r\n      this.minH = null; // Left slider handle\r\n      this.maxH = null; // Right slider handle\r\n      this.flrLab = null; // Floor label\r\n      this.ceilLab = null; // Ceiling label\r\n      this.minLab = null; // Label above the low value\r\n      this.maxLab = null; // Label above the high value\r\n      this.cmbLab = null; // Combined label\r\n      this.ticks = null; // The ticks\r\n\r\n      // Initialize slider\r\n      this.init();\r\n    };\r\n\r\n    // Add instance methods\r\n    Slider.prototype = {\r\n\r\n      /**\r\n       * Initialize slider\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      init: function() {\r\n        var thrLow, thrHigh,\r\n          self = this;\r\n\r\n        var calcDimFn = function() {\r\n          self.calcViewDimensions();\r\n        };\r\n\r\n        this.applyOptions();\r\n        this.syncLowValue();\r\n        if (this.range)\r\n          this.syncHighValue();\r\n        this.initElemHandles();\r\n        this.manageElementsStyle();\r\n        this.setDisabledState();\r\n        this.calcViewDimensions();\r\n        this.setMinAndMax();\r\n        this.addAccessibility();\r\n        this.updateCeilLab();\r\n        this.updateFloorLab();\r\n        this.initHandles();\r\n        this.manageEventsBindings();\r\n\r\n        // Recalculate slider view dimensions\r\n        this.scope.$on('reCalcViewDimensions', calcDimFn);\r\n\r\n        // Recalculate stuff if view port dimensions have changed\r\n        angular.element($window).on('resize', calcDimFn);\r\n\r\n        this.initHasRun = true;\r\n\r\n        // Watch for changes to the model\r\n        thrLow = rzThrottle(function() {\r\n          self.onLowHandleChange();\r\n        }, self.options.interval);\r\n\r\n        thrHigh = rzThrottle(function() {\r\n          self.onHighHandleChange();\r\n        }, self.options.interval);\r\n\r\n        this.scope.$on('rzSliderForceRender', function() {\r\n          self.resetLabelsValue();\r\n          thrLow();\r\n          if (self.range) {\r\n            thrHigh();\r\n          }\r\n          self.resetSlider();\r\n        });\r\n\r\n        // Watchers (order is important because in case of simultaneous change,\r\n        // watchers will be called in the same order)\r\n        this.scope.$watch('rzSliderOptions()', function(newValue, oldValue) {\r\n          if (newValue === oldValue)\r\n            return;\r\n          self.applyOptions(); // need to be called before synchronizing the values\r\n          self.syncLowValue();\r\n          if (self.range)\r\n            self.syncHighValue();\r\n          self.resetSlider();\r\n        }, true);\r\n\r\n        this.scope.$watch('rzSliderModel', function(newValue, oldValue) {\r\n          if (self.internalChange)\r\n            return;\r\n          if (newValue === oldValue)\r\n            return;\r\n          thrLow();\r\n        });\r\n\r\n        this.scope.$watch('rzSliderHigh', function(newValue, oldValue) {\r\n          if (self.internalChange)\r\n            return;\r\n          if (newValue === oldValue)\r\n            return;\r\n          if (newValue != null)\r\n            thrHigh();\r\n          if (self.range && newValue == null || !self.range && newValue != null) {\r\n            self.applyOptions();\r\n            self.resetSlider();\r\n          }\r\n        });\r\n\r\n        this.scope.$on('$destroy', function() {\r\n          self.unbindEvents();\r\n          angular.element($window).off('resize', calcDimFn);\r\n        });\r\n      },\r\n\r\n      findStepIndex: function(modelValue) {\r\n        var index = 0;\r\n        for (var i = 0; i < this.options.stepsArray.length; i++) {\r\n          var step = this.options.stepsArray[i];\r\n          if (step === modelValue) {\r\n            index = i;\r\n            break;\r\n          }\r\n          else if (angular.isObject(step) && step.value === modelValue) {\r\n            index = i;\r\n            break;\r\n          }\r\n        }\r\n        return index;\r\n      },\r\n\r\n      syncLowValue: function() {\r\n        if (this.options.stepsArray)\r\n          this.lowValue = this.findStepIndex(this.scope.rzSliderModel);\r\n        else\r\n          this.lowValue = this.scope.rzSliderModel;\r\n      },\r\n\r\n      syncHighValue: function() {\r\n        if (this.options.stepsArray)\r\n          this.highValue = this.findStepIndex(this.scope.rzSliderHigh);\r\n        else\r\n          this.highValue = this.scope.rzSliderHigh;\r\n      },\r\n\r\n      getStepValue: function(sliderValue) {\r\n        var step = this.options.stepsArray[sliderValue];\r\n        if (angular.isObject(step))\r\n          return step.value;\r\n        return step;\r\n      },\r\n\r\n      applyLowValue: function() {\r\n        if (this.options.stepsArray)\r\n          this.scope.rzSliderModel = this.getStepValue(this.lowValue);\r\n        else\r\n          this.scope.rzSliderModel = this.lowValue;\r\n      },\r\n\r\n      applyHighValue: function() {\r\n        if (this.options.stepsArray)\r\n          this.scope.rzSliderHigh = this.getStepValue(this.highValue);\r\n        else\r\n          this.scope.rzSliderHigh = this.highValue;\r\n      },\r\n\r\n      /*\r\n       * Reflow the slider when the low handle changes (called with throttle)\r\n       */\r\n      onLowHandleChange: function() {\r\n        this.syncLowValue();\r\n        if (this.range)\r\n          this.syncHighValue();\r\n        this.setMinAndMax();\r\n        this.updateLowHandle(this.valueToOffset(this.lowValue));\r\n        this.updateSelectionBar();\r\n        this.updateTicksScale();\r\n        this.updateAriaAttributes();\r\n        if (this.range) {\r\n          this.updateCmbLabel();\r\n        }\r\n      },\r\n\r\n      /*\r\n       * Reflow the slider when the high handle changes (called with throttle)\r\n       */\r\n      onHighHandleChange: function() {\r\n        this.syncLowValue();\r\n        this.syncHighValue();\r\n        this.setMinAndMax();\r\n        this.updateHighHandle(this.valueToOffset(this.highValue));\r\n        this.updateSelectionBar();\r\n        this.updateTicksScale();\r\n        this.updateCmbLabel();\r\n        this.updateAriaAttributes();\r\n      },\r\n\r\n      /**\r\n       * Read the user options and apply them to the slider model\r\n       */\r\n      applyOptions: function() {\r\n        var sliderOptions;\r\n        if (this.scope.rzSliderOptions)\r\n          sliderOptions = this.scope.rzSliderOptions();\r\n        else\r\n          sliderOptions = {};\r\n\r\n        this.options = RzSliderOptions.getOptions(sliderOptions);\r\n\r\n        if (this.options.step <= 0)\r\n          this.options.step = 1;\r\n\r\n        this.range = this.scope.rzSliderModel !== undefined && this.scope.rzSliderHigh !== undefined;\r\n        this.options.draggableRange = this.range && this.options.draggableRange;\r\n        this.options.draggableRangeOnly = this.range && this.options.draggableRangeOnly;\r\n        if (this.options.draggableRangeOnly) {\r\n          this.options.draggableRange = true;\r\n        }\r\n\r\n        this.options.showTicks = this.options.showTicks || this.options.showTicksValues;\r\n        this.scope.showTicks = this.options.showTicks; //scope is used in the template\r\n        if (angular.isNumber(this.options.showTicks))\r\n          this.intermediateTicks = true;\r\n\r\n        this.options.showSelectionBar = this.options.showSelectionBar || this.options.showSelectionBarEnd\r\n          || this.options.showSelectionBarFromValue !== null;\r\n\r\n        if (this.options.stepsArray) {\r\n          this.parseStepsArray();\r\n        } else {\r\n          if (this.options.translate)\r\n            this.customTrFn = this.options.translate;\r\n          else\r\n            this.customTrFn = function(value) {\r\n              return String(value);\r\n            };\r\n\r\n          if (this.options.getLegend) {\r\n            this.getLegend = this.options.getLegend;\r\n          }\r\n        }\r\n\r\n        if (this.options.vertical) {\r\n          this.positionProperty = 'bottom';\r\n          this.dimensionProperty = 'height';\r\n        }\r\n      },\r\n\r\n      parseStepsArray: function() {\r\n        this.options.floor = 0;\r\n        this.options.ceil = this.options.stepsArray.length - 1;\r\n        this.options.step = 1;\r\n\r\n        if (this.options.translate) {\r\n          this.customTrFn = this.options.translate;\r\n        }\r\n        else {\r\n          this.customTrFn = function(modelValue) {\r\n            return modelValue;\r\n          };\r\n        }\r\n\r\n        this.getLegend = function(index) {\r\n          var step = this.options.stepsArray[index];\r\n          if (angular.isObject(step))\r\n            return step.legend;\r\n          return null;\r\n        };\r\n      },\r\n\r\n      /**\r\n       * Resets slider\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      resetSlider: function() {\r\n        this.manageElementsStyle();\r\n        this.addAccessibility();\r\n        this.setMinAndMax();\r\n        this.updateCeilLab();\r\n        this.updateFloorLab();\r\n        this.unbindEvents();\r\n        this.manageEventsBindings();\r\n        this.setDisabledState();\r\n        this.calcViewDimensions();\r\n      },\r\n\r\n      /**\r\n       * Set the slider children to variables for easy access\r\n       *\r\n       * Run only once during initialization\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      initElemHandles: function() {\r\n        // Assign all slider elements to object properties for easy access\r\n        angular.forEach(this.sliderElem.children(), function(elem, index) {\r\n          var jElem = angular.element(elem);\r\n\r\n          switch (index) {\r\n            case 0:\r\n              this.fullBar = jElem;\r\n              break;\r\n            case 1:\r\n              this.selBar = jElem;\r\n              break;\r\n            case 2:\r\n              this.minH = jElem;\r\n              break;\r\n            case 3:\r\n              this.maxH = jElem;\r\n              break;\r\n            case 4:\r\n              this.flrLab = jElem;\r\n              break;\r\n            case 5:\r\n              this.ceilLab = jElem;\r\n              break;\r\n            case 6:\r\n              this.minLab = jElem;\r\n              break;\r\n            case 7:\r\n              this.maxLab = jElem;\r\n              break;\r\n            case 8:\r\n              this.cmbLab = jElem;\r\n              break;\r\n            case 9:\r\n              this.ticks = jElem;\r\n              break;\r\n          }\r\n\r\n        }, this);\r\n\r\n        // Initialize offset cache properties\r\n        this.selBar.rzsp = 0;\r\n        this.minH.rzsp = 0;\r\n        this.maxH.rzsp = 0;\r\n        this.flrLab.rzsp = 0;\r\n        this.ceilLab.rzsp = 0;\r\n        this.minLab.rzsp = 0;\r\n        this.maxLab.rzsp = 0;\r\n        this.cmbLab.rzsp = 0;\r\n      },\r\n\r\n      /**\r\n       * Update each elements style based on options\r\n       */\r\n      manageElementsStyle: function() {\r\n\r\n        if (!this.range)\r\n          this.maxH.css('display', 'none');\r\n        else\r\n          this.maxH.css('display', '');\r\n\r\n\r\n        this.alwaysHide(this.flrLab, this.options.showTicksValues || this.options.hideLimitLabels);\r\n        this.alwaysHide(this.ceilLab, this.options.showTicksValues || this.options.hideLimitLabels);\r\n\r\n        var hideLabelsForTicks = this.options.showTicksValues && !this.intermediateTicks;\r\n        this.alwaysHide(this.minLab, hideLabelsForTicks || this.options.hidePointerLabels);\r\n        this.alwaysHide(this.maxLab, hideLabelsForTicks || !this.range || this.options.hidePointerLabels);\r\n        this.alwaysHide(this.cmbLab, hideLabelsForTicks || !this.range || this.options.hidePointerLabels);\r\n        this.alwaysHide(this.selBar, !this.range && !this.options.showSelectionBar);\r\n\r\n        if (this.options.vertical)\r\n          this.sliderElem.addClass('rz-vertical');\r\n\r\n        if (this.options.draggableRange)\r\n          this.selBar.addClass('rz-draggable');\r\n        else\r\n          this.selBar.removeClass('rz-draggable');\r\n\r\n        if (this.intermediateTicks && this.options.showTicksValues)\r\n          this.ticks.addClass('rz-ticks-values-under');\r\n      },\r\n\r\n      alwaysHide: function(el, hide) {\r\n        el.rzAlwaysHide = hide;\r\n        if (hide)\r\n          this.hideEl(el);\r\n        else\r\n          this.showEl(el)\r\n      },\r\n\r\n      /**\r\n       * Manage the events bindings based on readOnly and disabled options\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      manageEventsBindings: function() {\r\n        if (this.options.disabled || this.options.readOnly)\r\n          this.unbindEvents();\r\n        else\r\n          this.bindEvents();\r\n      },\r\n\r\n      /**\r\n       * Set the disabled state based on rzSliderDisabled\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      setDisabledState: function() {\r\n        if (this.options.disabled) {\r\n          this.sliderElem.attr('disabled', 'disabled');\r\n        } else {\r\n          this.sliderElem.attr('disabled', null);\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Reset label values\r\n       *\r\n       * @return {undefined}\r\n       */\r\n      resetLabelsValue: function() {\r\n        this.minLab.rzsv = undefined;\r\n        this.maxLab.rzsv = undefined;\r\n      },\r\n\r\n      /**\r\n       * Initialize slider handles positions and labels\r\n       *\r\n       * Run only once during initialization and every time view port changes size\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      initHandles: function() {\r\n        this.updateLowHandle(this.valueToOffset(this.lowValue));\r\n\r\n        /*\r\n         the order here is important since the selection bar should be\r\n         updated after the high handle but before the combined label\r\n         */\r\n        if (this.range)\r\n          this.updateHighHandle(this.valueToOffset(this.highValue));\r\n        this.updateSelectionBar();\r\n        if (this.range)\r\n          this.updateCmbLabel();\r\n\r\n        this.updateTicksScale();\r\n      },\r\n\r\n      /**\r\n       * Translate value to human readable format\r\n       *\r\n       * @param {number|string} value\r\n       * @param {jqLite} label\r\n       * @param {String} which\r\n       * @param {boolean} [useCustomTr]\r\n       * @returns {undefined}\r\n       */\r\n      translateFn: function(value, label, which, useCustomTr) {\r\n        useCustomTr = useCustomTr === undefined ? true : useCustomTr;\r\n\r\n        var valStr = '',\r\n          getDimension = false;\r\n\r\n        if (useCustomTr) {\r\n          if (this.options.stepsArray)\r\n            value = this.getStepValue(value);\r\n          valStr = String(this.customTrFn(value, this.options.id, which));\r\n        }\r\n        else {\r\n          valStr = String(value)\r\n        }\r\n\r\n        if (label.rzsv === undefined || label.rzsv.length !== valStr.length || (label.rzsv.length > 0 && label.rzsd === 0)) {\r\n          getDimension = true;\r\n          label.rzsv = valStr;\r\n        }\r\n\r\n        label.html(valStr);\r\n\r\n        // Update width only when length of the label have changed\r\n        if (getDimension) {\r\n          this.getDimension(label);\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Set maximum and minimum values for the slider and ensure the model and high\r\n       * value match these limits\r\n       * @returns {undefined}\r\n       */\r\n      setMinAndMax: function() {\r\n\r\n        this.step = +this.options.step;\r\n        this.precision = +this.options.precision;\r\n\r\n        this.minValue = this.options.floor;\r\n\r\n        if (this.options.enforceStep) {\r\n          this.lowValue = this.roundStep(this.lowValue);\r\n          if (this.range)\r\n            this.highValue = this.roundStep(this.highValue);\r\n        }\r\n\r\n        if (this.options.ceil != null)\r\n          this.maxValue = this.options.ceil;\r\n        else\r\n          this.maxValue = this.options.ceil = this.range ? this.highValue : this.lowValue;\r\n\r\n        if (this.options.enforceRange) {\r\n          this.lowValue = this.sanitizeValue(this.lowValue);\r\n          if (this.range)\r\n            this.highValue = this.sanitizeValue(this.highValue);\r\n        }\r\n\r\n        this.applyLowValue();\r\n        if (this.range)\r\n          this.applyHighValue();\r\n\r\n        this.valueRange = this.maxValue - this.minValue;\r\n      },\r\n\r\n      /**\r\n       * Adds accessibility attributes\r\n       *\r\n       * Run only once during initialization\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      addAccessibility: function() {\r\n        this.minH.attr('role', 'slider');\r\n        this.updateAriaAttributes();\r\n        if (this.options.keyboardSupport && !(this.options.readOnly || this.options.disabled))\r\n          this.minH.attr('tabindex', '0');\r\n        else\r\n          this.minH.attr('tabindex', '');\r\n        if (this.options.vertical)\r\n          this.minH.attr('aria-orientation', 'vertical');\r\n\r\n        if (this.range) {\r\n          this.maxH.attr('role', 'slider');\r\n          if (this.options.keyboardSupport && !(this.options.readOnly || this.options.disabled))\r\n            this.maxH.attr('tabindex', '0');\r\n          else\r\n            this.maxH.attr('tabindex', '');\r\n          if (this.options.vertical)\r\n            this.maxH.attr('aria-orientation', 'vertical');\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Updates aria attributes according to current values\r\n       */\r\n      updateAriaAttributes: function() {\r\n        this.minH.attr({\r\n          'aria-valuenow': this.scope.rzSliderModel,\r\n          'aria-valuetext': this.customTrFn(this.scope.rzSliderModel, this.options.id, 'model'),\r\n          'aria-valuemin': this.minValue,\r\n          'aria-valuemax': this.maxValue\r\n        });\r\n        if (this.range) {\r\n          this.maxH.attr({\r\n            'aria-valuenow': this.scope.rzSliderHigh,\r\n            'aria-valuetext': this.customTrFn(this.scope.rzSliderHigh, this.options.id, 'high'),\r\n            'aria-valuemin': this.minValue,\r\n            'aria-valuemax': this.maxValue\r\n          });\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Calculate dimensions that are dependent on view port size\r\n       *\r\n       * Run once during initialization and every time view port changes size.\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      calcViewDimensions: function() {\r\n        var handleWidth = this.getDimension(this.minH);\r\n\r\n        this.handleHalfDim = handleWidth / 2;\r\n        this.barDimension = this.getDimension(this.fullBar);\r\n\r\n        this.maxPos = this.barDimension - handleWidth;\r\n\r\n        this.getDimension(this.sliderElem);\r\n        this.sliderElem.rzsp = this.sliderElem[0].getBoundingClientRect()[this.positionProperty];\r\n\r\n        if (this.initHasRun) {\r\n          this.updateFloorLab();\r\n          this.updateCeilLab();\r\n          this.initHandles();\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Update the ticks position\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      updateTicksScale: function() {\r\n        if (!this.options.showTicks) return;\r\n        var step = this.step;\r\n        if (this.intermediateTicks)\r\n          step = this.options.showTicks;\r\n        var ticksCount = Math.round((this.maxValue - this.minValue) / step) + 1;\r\n        this.scope.ticks = [];\r\n        for (var i = 0; i < ticksCount; i++) {\r\n          var value = this.roundStep(this.minValue + i * step);\r\n          var tick = {\r\n            selected: this.isTickSelected(value)\r\n          };\r\n          if (tick.selected && this.options.getSelectionBarColor) {\r\n            tick.style = {\r\n              'background-color': this.getSelectionBarColor()\r\n            };\r\n          }\r\n          if (this.options.ticksTooltip) {\r\n            tick.tooltip = this.options.ticksTooltip(value);\r\n            tick.tooltipPlacement = this.options.vertical ? 'right' : 'top';\r\n          }\r\n          if (this.options.showTicksValues) {\r\n            tick.value = this.getDisplayValue(value, 'tick-value');\r\n            if (this.options.ticksValuesTooltip) {\r\n              tick.valueTooltip = this.options.ticksValuesTooltip(value);\r\n              tick.valueTooltipPlacement = this.options.vertical ? 'right' : 'top';\r\n            }\r\n          }\r\n          if (this.getLegend) {\r\n            var legend = this.getLegend(value, this.options.id);\r\n            if (legend)\r\n              tick.legend = legend;\r\n          }\r\n          if (!this.options.rightToLeft) {\r\n            this.scope.ticks.push(tick);\r\n          } else {\r\n            this.scope.ticks.unshift(tick);\r\n          }\r\n        }\r\n      },\r\n\r\n      isTickSelected: function(value) {\r\n        if (!this.range) {\r\n          if (this.options.showSelectionBarFromValue !== null) {\r\n            var center = this.options.showSelectionBarFromValue;\r\n            if (this.lowValue > center && value >= center && value <= this.lowValue)\r\n              return true;\r\n            else if (this.lowValue < center && value <= center && value >= this.lowValue)\r\n              return true;\r\n          }\r\n          else if (this.options.showSelectionBarEnd) {\r\n            if (value >= this.lowValue)\r\n              return true;\r\n          }\r\n          else if (this.options.showSelectionBar && value <= this.lowValue)\r\n            return true;\r\n        }\r\n        if (this.range && value >= this.lowValue && value <= this.highValue)\r\n          return true;\r\n        return false;\r\n      },\r\n\r\n      /**\r\n       * Update position of the floor label\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      updateFloorLab: function() {\r\n        this.translateFn(this.minValue, this.flrLab, 'floor');\r\n        this.getDimension(this.flrLab);\r\n        var position = this.options.rightToLeft ? this.barDimension - this.flrLab.rzsd : 0;\r\n        this.setPosition(this.flrLab, position);\r\n      },\r\n\r\n      /**\r\n       * Update position of the ceiling label\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      updateCeilLab: function() {\r\n        this.translateFn(this.maxValue, this.ceilLab, 'ceil');\r\n        this.getDimension(this.ceilLab);\r\n        var position = this.options.rightToLeft ? 0 : this.barDimension - this.ceilLab.rzsd;\r\n        this.setPosition(this.ceilLab, position);\r\n      },\r\n\r\n      /**\r\n       * Update slider handles and label positions\r\n       *\r\n       * @param {string} which\r\n       * @param {number} newOffset\r\n       */\r\n      updateHandles: function(which, newOffset) {\r\n        if (which === 'lowValue')\r\n          this.updateLowHandle(newOffset);\r\n        else\r\n          this.updateHighHandle(newOffset);\r\n\r\n        this.updateSelectionBar();\r\n        this.updateTicksScale();\r\n        if (this.range)\r\n          this.updateCmbLabel();\r\n      },\r\n\r\n      /**\r\n       * Helper function to work out the position for handle labels depending on RTL or not\r\n       *\r\n       * @param {string} labelName maxLab or minLab\r\n       * @param newOffset\r\n       *\r\n       * @returns {number}\r\n       */\r\n      getHandleLabelPos: function(labelName, newOffset) {\r\n        var labelRzsd = this[labelName].rzsd,\r\n          nearHandlePos = newOffset - labelRzsd / 2 + this.handleHalfDim,\r\n          endOfBarPos = this.barDimension - labelRzsd;\r\n\r\n        if (!this.options.boundPointerLabels)\r\n          return nearHandlePos;\r\n\r\n        if (this.options.rightToLeft && labelName === 'minLab' || !this.options.rightToLeft && labelName === 'maxLab') {\r\n          return Math.min(nearHandlePos, endOfBarPos);\r\n        } else {\r\n          return Math.min(Math.max(nearHandlePos, 0), endOfBarPos);\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Update low slider handle position and label\r\n       *\r\n       * @param {number} newOffset\r\n       * @returns {undefined}\r\n       */\r\n      updateLowHandle: function(newOffset) {\r\n        this.setPosition(this.minH, newOffset);\r\n        this.translateFn(this.lowValue, this.minLab, 'model');\r\n        this.setPosition(this.minLab, this.getHandleLabelPos('minLab', newOffset));\r\n\r\n        if (this.options.getPointerColor) {\r\n          var pointercolor = this.getPointerColor('min');\r\n          this.scope.minPointerStyle = {\r\n            backgroundColor: pointercolor\r\n          };\r\n        }\r\n\r\n        this.shFloorCeil();\r\n      },\r\n\r\n      /**\r\n       * Update high slider handle position and label\r\n       *\r\n       * @param {number} newOffset\r\n       * @returns {undefined}\r\n       */\r\n      updateHighHandle: function(newOffset) {\r\n        this.setPosition(this.maxH, newOffset);\r\n        this.translateFn(this.highValue, this.maxLab, 'high');\r\n        this.setPosition(this.maxLab, this.getHandleLabelPos('maxLab', newOffset));\r\n\r\n        if (this.options.getPointerColor) {\r\n          var pointercolor = this.getPointerColor('max');\r\n          this.scope.maxPointerStyle = {\r\n            backgroundColor: pointercolor\r\n          };\r\n        }\r\n\r\n        this.shFloorCeil();\r\n      },\r\n\r\n      /**\r\n       * Show/hide floor/ceiling label\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      shFloorCeil: function() {\r\n        var flHidden = false,\r\n          clHidden = false,\r\n          isRTL = this.options.rightToLeft,\r\n          flrLabPos = this.flrLab.rzsp,\r\n          flrLabDim = this.flrLab.rzsd,\r\n          minLabPos = this.minLab.rzsp,\r\n          minLabDim = this.minLab.rzsd,\r\n          maxLabPos = this.maxLab.rzsp,\r\n          maxLabDim = this.maxLab.rzsd,\r\n          ceilLabPos = this.ceilLab.rzsp,\r\n          halfHandle = this.handleHalfDim,\r\n          isMinLabAtFloor = isRTL ? minLabPos + minLabDim >= flrLabPos - flrLabDim - 5 : minLabPos <= flrLabPos + flrLabDim + 5,\r\n          isMinLabAtCeil = isRTL ? minLabPos - minLabDim <= ceilLabPos + halfHandle + 10 : minLabPos + minLabDim >= ceilLabPos - halfHandle - 10,\r\n          isMaxLabAtFloor = isRTL ? maxLabPos >= flrLabPos - flrLabDim - halfHandle : maxLabPos <= flrLabPos + flrLabDim + halfHandle,\r\n          isMaxLabAtCeil = isRTL ? maxLabPos - maxLabDim <= ceilLabPos + 10 : maxLabPos + maxLabDim >= ceilLabPos - 10;\r\n\r\n\r\n        if (isMinLabAtFloor) {\r\n          flHidden = true;\r\n          this.hideEl(this.flrLab);\r\n        } else {\r\n          flHidden = false;\r\n          this.showEl(this.flrLab);\r\n        }\r\n\r\n        if (isMinLabAtCeil) {\r\n          clHidden = true;\r\n          this.hideEl(this.ceilLab);\r\n        } else {\r\n          clHidden = false;\r\n          this.showEl(this.ceilLab);\r\n        }\r\n\r\n        if (this.range) {\r\n          if (isMaxLabAtCeil) {\r\n            this.hideEl(this.ceilLab);\r\n          } else if (!clHidden) {\r\n            this.showEl(this.ceilLab);\r\n          }\r\n\r\n          // Hide or show floor label\r\n          if (isMaxLabAtFloor) {\r\n            this.hideEl(this.flrLab);\r\n          } else if (!flHidden) {\r\n            this.showEl(this.flrLab);\r\n          }\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Update slider selection bar, combined label and range label\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      updateSelectionBar: function() {\r\n        var position = 0,\r\n          dimension = 0,\r\n          isSelectionBarFromRight = this.options.rightToLeft ? !this.options.showSelectionBarEnd : this.options.showSelectionBarEnd,\r\n          positionForRange = this.options.rightToLeft ? this.maxH.rzsp + this.handleHalfDim : this.minH.rzsp + this.handleHalfDim;\r\n\r\n        if (this.range) {\r\n          dimension = Math.abs(this.maxH.rzsp - this.minH.rzsp);\r\n          position = positionForRange;\r\n        }\r\n        else {\r\n          if (this.options.showSelectionBarFromValue !== null) {\r\n            var center = this.options.showSelectionBarFromValue,\r\n              centerPosition = this.valueToOffset(center),\r\n              isModelGreaterThanCenter = this.options.rightToLeft ? this.lowValue <= center : this.lowValue > center;\r\n            if (isModelGreaterThanCenter) {\r\n              dimension = this.minH.rzsp - centerPosition;\r\n              position = centerPosition + this.handleHalfDim;\r\n            }\r\n            else {\r\n              dimension = centerPosition - this.minH.rzsp;\r\n              position = this.minH.rzsp + this.handleHalfDim;\r\n            }\r\n          }\r\n          else if (isSelectionBarFromRight) {\r\n            dimension = Math.abs(this.maxPos - this.minH.rzsp) + this.handleHalfDim;\r\n            position = this.minH.rzsp + this.handleHalfDim;\r\n          } else {\r\n            dimension = Math.abs(this.maxH.rzsp - this.minH.rzsp) + this.handleHalfDim;\r\n            position = 0;\r\n          }\r\n        }\r\n        this.setDimension(this.selBar, dimension);\r\n        this.setPosition(this.selBar, position);\r\n        if (this.options.getSelectionBarColor) {\r\n          var color = this.getSelectionBarColor();\r\n          this.scope.barStyle = {\r\n            backgroundColor: color\r\n          };\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Wrapper around the getSelectionBarColor of the user to pass to\r\n       * correct parameters\r\n       */\r\n      getSelectionBarColor: function() {\r\n        if (this.range)\r\n          return this.options.getSelectionBarColor(this.scope.rzSliderModel, this.scope.rzSliderHigh);\r\n        return this.options.getSelectionBarColor(this.scope.rzSliderModel);\r\n      },\r\n\r\n      /**\r\n       * Wrapper around the getPointerColor of the user to pass to\r\n       * correct parameters\r\n       */\r\n      getPointerColor: function(pointerType) {\r\n        if (pointerType === 'max') {\r\n          return this.options.getPointerColor(this.scope.rzSliderHigh, pointerType);\r\n        }\r\n        return this.options.getPointerColor(this.scope.rzSliderModel, pointerType);\r\n      },\r\n\r\n      /**\r\n       * Update combined label position and value\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      updateCmbLabel: function() {\r\n        var isLabelOverlap = null;\r\n        if (this.options.rightToLeft) {\r\n          isLabelOverlap = this.minLab.rzsp - this.minLab.rzsd - 10 <= this.maxLab.rzsp;\r\n        } else {\r\n          isLabelOverlap = this.minLab.rzsp + this.minLab.rzsd + 10 >= this.maxLab.rzsp;\r\n        }\r\n\r\n        if (isLabelOverlap) {\r\n          var lowTr = this.getDisplayValue(this.lowValue, 'model'),\r\n            highTr = this.getDisplayValue(this.highValue, 'high'),\r\n            labelVal = '';\r\n          if (this.options.mergeRangeLabelsIfSame && lowTr === highTr) {\r\n            labelVal = lowTr;\r\n          } else {\r\n            labelVal = this.options.rightToLeft ? highTr + ' - ' + lowTr : lowTr + ' - ' + highTr;\r\n          }\r\n\r\n          this.translateFn(labelVal, this.cmbLab, 'cmb', false);\r\n          var pos = this.options.boundPointerLabels ? Math.min(\r\n            Math.max(\r\n              this.selBar.rzsp + this.selBar.rzsd / 2 - this.cmbLab.rzsd / 2,\r\n              0\r\n            ),\r\n            this.barDimension - this.cmbLab.rzsd\r\n          ) : this.selBar.rzsp + this.selBar.rzsd / 2 - this.cmbLab.rzsd / 2;\r\n\r\n          this.setPosition(this.cmbLab, pos);\r\n          this.hideEl(this.minLab);\r\n          this.hideEl(this.maxLab);\r\n          this.showEl(this.cmbLab);\r\n        } else {\r\n          this.showEl(this.maxLab);\r\n          this.showEl(this.minLab);\r\n          this.hideEl(this.cmbLab);\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Return the translated value if a translate function is provided else the original value\r\n       * @param value\r\n       * @param which if it's min or max handle\r\n       * @returns {*}\r\n       */\r\n      getDisplayValue: function(value, which) {\r\n        if (this.options.stepsArray) {\r\n          value = this.getStepValue(value);\r\n        }\r\n        return this.customTrFn(value, this.options.id, which);\r\n      },\r\n\r\n      /**\r\n       * Round value to step and precision based on minValue\r\n       *\r\n       * @param {number} value\r\n       * @param {number} customStep a custom step to override the defined step\r\n       * @returns {number}\r\n       */\r\n      roundStep: function(value, customStep) {\r\n        var step = customStep ? customStep : this.step,\r\n          steppedDifference = parseFloat((value - this.minValue) / step).toPrecision(12);\r\n        steppedDifference = Math.round(+steppedDifference) * step;\r\n        var newValue = (this.minValue + steppedDifference).toFixed(this.precision);\r\n        return +newValue;\r\n      },\r\n\r\n      /**\r\n       * Hide element\r\n       *\r\n       * @param element\r\n       * @returns {jqLite} The jqLite wrapped DOM element\r\n       */\r\n      hideEl: function(element) {\r\n        return element.css({\r\n          opacity: 0\r\n        });\r\n      },\r\n\r\n      /**\r\n       * Show element\r\n       *\r\n       * @param element The jqLite wrapped DOM element\r\n       * @returns {jqLite} The jqLite\r\n       */\r\n      showEl: function(element) {\r\n        if (!!element.rzAlwaysHide) {\r\n          return element;\r\n        }\r\n\r\n        return element.css({\r\n          opacity: 1\r\n        });\r\n      },\r\n\r\n      /**\r\n       * Set element left/top offset depending on whether slider is horizontal or vertical\r\n       *\r\n       * @param {jqLite} elem The jqLite wrapped DOM element\r\n       * @param {number} pos\r\n       * @returns {number}\r\n       */\r\n      setPosition: function(elem, pos) {\r\n        elem.rzsp = pos;\r\n        var css = {};\r\n        css[this.positionProperty] = pos + 'px';\r\n        elem.css(css);\r\n        return pos;\r\n      },\r\n\r\n      /**\r\n       * Get element width/height depending on whether slider is horizontal or vertical\r\n       *\r\n       * @param {jqLite} elem The jqLite wrapped DOM element\r\n       * @returns {number}\r\n       */\r\n      getDimension: function(elem) {\r\n        var val = elem[0].getBoundingClientRect();\r\n        if (this.options.vertical)\r\n          elem.rzsd = (val.bottom - val.top) * this.options.scale;\r\n        else\r\n          elem.rzsd = (val.right - val.left) * this.options.scale;\r\n        return elem.rzsd;\r\n      },\r\n\r\n      /**\r\n       * Set element width/height depending on whether slider is horizontal or vertical\r\n       *\r\n       * @param {jqLite} elem  The jqLite wrapped DOM element\r\n       * @param {number} dim\r\n       * @returns {number}\r\n       */\r\n      setDimension: function(elem, dim) {\r\n        elem.rzsd = dim;\r\n        var css = {};\r\n        css[this.dimensionProperty] = dim + 'px';\r\n        elem.css(css);\r\n        return dim;\r\n      },\r\n\r\n      /**\r\n       * Translate value to pixel offset\r\n       *\r\n       * @param {number} val\r\n       * @returns {number}\r\n       */\r\n      valueToOffset: function(val) {\r\n        if (this.options.rightToLeft) {\r\n          return (this.maxValue - this.sanitizeValue(val)) * this.maxPos / this.valueRange || 0;\r\n        }\r\n        return (this.sanitizeValue(val) - this.minValue) * this.maxPos / this.valueRange || 0;\r\n      },\r\n\r\n      /**\r\n       * Returns a value that is within slider range\r\n       *\r\n       * @param {number} val\r\n       * @returns {number}\r\n       */\r\n      sanitizeValue: function(val) {\r\n        return Math.min(Math.max(val, this.minValue), this.maxValue);\r\n      },\r\n\r\n      /**\r\n       * Translate offset to model value\r\n       *\r\n       * @param {number} offset\r\n       * @returns {number}\r\n       */\r\n      offsetToValue: function(offset) {\r\n        if (this.options.rightToLeft) {\r\n          return (1 - (offset / this.maxPos)) * this.valueRange + this.minValue;\r\n        }\r\n        return (offset / this.maxPos) * this.valueRange + this.minValue;\r\n      },\r\n\r\n      // Events\r\n\r\n      /**\r\n       * Get the X-coordinate or Y-coordinate of an event\r\n       *\r\n       * @param {Object} event  The event\r\n       * @returns {number}\r\n       */\r\n      getEventXY: function(event) {\r\n        /* http://stackoverflow.com/a/12336075/282882 */\r\n        //noinspection JSLint\r\n        var clientXY = this.options.vertical ? 'clientY' : 'clientX';\r\n        if (clientXY in event) {\r\n          return event[clientXY];\r\n        }\r\n\r\n        return event.originalEvent === undefined ?\r\n          event.touches[0][clientXY] : event.originalEvent.touches[0][clientXY];\r\n      },\r\n\r\n      /**\r\n       * Compute the event position depending on whether the slider is horizontal or vertical\r\n       * @param event\r\n       * @returns {number}\r\n       */\r\n      getEventPosition: function(event) {\r\n        var sliderPos = this.sliderElem.rzsp,\r\n          eventPos = 0;\r\n        if (this.options.vertical)\r\n          eventPos = -this.getEventXY(event) + sliderPos;\r\n        else\r\n          eventPos = this.getEventXY(event) - sliderPos;\r\n        return (eventPos - this.handleHalfDim) * this.options.scale;\r\n      },\r\n\r\n      /**\r\n       * Get event names for move and event end\r\n       *\r\n       * @param {Event}    event    The event\r\n       *\r\n       * @return {{moveEvent: string, endEvent: string}}\r\n       */\r\n      getEventNames: function(event) {\r\n        var eventNames = {\r\n          moveEvent: '',\r\n          endEvent: ''\r\n        };\r\n\r\n        if (event.touches || (event.originalEvent !== undefined && event.originalEvent.touches)) {\r\n          eventNames.moveEvent = 'touchmove';\r\n          eventNames.endEvent = 'touchend';\r\n        } else {\r\n          eventNames.moveEvent = 'mousemove';\r\n          eventNames.endEvent = 'mouseup';\r\n        }\r\n\r\n        return eventNames;\r\n      },\r\n\r\n      /**\r\n       * Get the handle closest to an event.\r\n       *\r\n       * @param event {Event} The event\r\n       * @returns {jqLite} The handle closest to the event.\r\n       */\r\n      getNearestHandle: function(event) {\r\n        if (!this.range) {\r\n          return this.minH;\r\n        }\r\n        var offset = this.getEventPosition(event),\r\n          distanceMin = Math.abs(offset - this.minH.rzsp),\r\n          distanceMax = Math.abs(offset - this.maxH.rzsp);\r\n        if (distanceMin < distanceMax)\r\n          return this.minH;\r\n        else if (distanceMin > distanceMax)\r\n          return this.maxH;\r\n        else if (!this.options.rightToLeft)\r\n        //if event is at the same distance from min/max then if it's at left of minH, we return minH else maxH\r\n          return offset < this.minH.rzsp ? this.minH : this.maxH;\r\n        else\r\n        //reverse in rtl\r\n          return offset > this.minH.rzsp ? this.minH : this.maxH;\r\n      },\r\n\r\n      /**\r\n       * Wrapper function to focus an angular element\r\n       *\r\n       * @param el {AngularElement} the element to focus\r\n       */\r\n      focusElement: function(el) {\r\n        var DOM_ELEMENT = 0;\r\n        el[DOM_ELEMENT].focus();\r\n      },\r\n\r\n      /**\r\n       * Bind mouse and touch events to slider handles\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      bindEvents: function() {\r\n        var barTracking, barStart, barMove;\r\n\r\n        if (this.options.draggableRange) {\r\n          barTracking = 'rzSliderDrag';\r\n          barStart = this.onDragStart;\r\n          barMove = this.onDragMove;\r\n        } else {\r\n          barTracking = 'lowValue';\r\n          barStart = this.onStart;\r\n          barMove = this.onMove;\r\n        }\r\n\r\n        if (!this.options.onlyBindHandles) {\r\n          this.selBar.on('mousedown', angular.bind(this, barStart, null, barTracking));\r\n          this.selBar.on('mousedown', angular.bind(this, barMove, this.selBar));\r\n        }\r\n\r\n        if (this.options.draggableRangeOnly) {\r\n          this.minH.on('mousedown', angular.bind(this, barStart, null, barTracking));\r\n          this.maxH.on('mousedown', angular.bind(this, barStart, null, barTracking));\r\n        } else {\r\n          this.minH.on('mousedown', angular.bind(this, this.onStart, this.minH, 'lowValue'));\r\n          if (this.range) {\r\n            this.maxH.on('mousedown', angular.bind(this, this.onStart, this.maxH, 'highValue'));\r\n          }\r\n          if (!this.options.onlyBindHandles) {\r\n            this.fullBar.on('mousedown', angular.bind(this, this.onStart, null, null));\r\n            this.fullBar.on('mousedown', angular.bind(this, this.onMove, this.fullBar));\r\n            this.ticks.on('mousedown', angular.bind(this, this.onStart, null, null));\r\n            this.ticks.on('mousedown', angular.bind(this, this.onTickClick, this.ticks));\r\n          }\r\n        }\r\n\r\n        if (!this.options.onlyBindHandles) {\r\n          this.selBar.on('touchstart', angular.bind(this, barStart, null, barTracking));\r\n          this.selBar.on('touchstart', angular.bind(this, barMove, this.selBar));\r\n        }\r\n        if (this.options.draggableRangeOnly) {\r\n          this.minH.on('touchstart', angular.bind(this, barStart, null, barTracking));\r\n          this.maxH.on('touchstart', angular.bind(this, barStart, null, barTracking));\r\n        } else {\r\n          this.minH.on('touchstart', angular.bind(this, this.onStart, this.minH, 'lowValue'));\r\n          if (this.range) {\r\n            this.maxH.on('touchstart', angular.bind(this, this.onStart, this.maxH, 'highValue'));\r\n          }\r\n          if (!this.options.onlyBindHandles) {\r\n            this.fullBar.on('touchstart', angular.bind(this, this.onStart, null, null));\r\n            this.fullBar.on('touchstart', angular.bind(this, this.onMove, this.fullBar));\r\n            this.ticks.on('touchstart', angular.bind(this, this.onStart, null, null));\r\n            this.ticks.on('touchstart', angular.bind(this, this.onTickClick, this.ticks));\r\n          }\r\n        }\r\n\r\n        if (this.options.keyboardSupport) {\r\n          this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'lowValue'));\r\n          if (this.range) {\r\n            this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'highValue'));\r\n          }\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Unbind mouse and touch events to slider handles\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      unbindEvents: function() {\r\n        this.minH.off();\r\n        this.maxH.off();\r\n        this.fullBar.off();\r\n        this.selBar.off();\r\n        this.ticks.off();\r\n      },\r\n\r\n      /**\r\n       * onStart event handler\r\n       *\r\n       * @param {?Object} pointer The jqLite wrapped DOM element; if null, the closest handle is used\r\n       * @param {?string} ref     The name of the handle being changed; if null, the closest handle's value is modified\r\n       * @param {Event}   event   The event\r\n       * @returns {undefined}\r\n       */\r\n      onStart: function(pointer, ref, event) {\r\n        var ehMove, ehEnd,\r\n          eventNames = this.getEventNames(event);\r\n\r\n        event.stopPropagation();\r\n        event.preventDefault();\r\n\r\n        // We have to do this in case the HTML where the sliders are on\r\n        // have been animated into view.\r\n        this.calcViewDimensions();\r\n\r\n        if (pointer) {\r\n          this.tracking = ref;\r\n        } else {\r\n          pointer = this.getNearestHandle(event);\r\n          this.tracking = pointer === this.minH ? 'lowValue' : 'highValue';\r\n        }\r\n\r\n        pointer.addClass('rz-active');\r\n\r\n        if (this.options.keyboardSupport)\r\n          this.focusElement(pointer);\r\n\r\n        ehMove = angular.bind(this, this.dragging.active ? this.onDragMove : this.onMove, pointer);\r\n        ehEnd = angular.bind(this, this.onEnd, ehMove);\r\n\r\n        $document.on(eventNames.moveEvent, ehMove);\r\n        $document.one(eventNames.endEvent, ehEnd);\r\n        this.callOnStart();\r\n      },\r\n\r\n      /**\r\n       * onMove event handler\r\n       *\r\n       * @param {jqLite} pointer\r\n       * @param {Event}  event The event\r\n       * @param {boolean}  fromTick if the event occured on a tick or not\r\n       * @returns {undefined}\r\n       */\r\n      onMove: function(pointer, event, fromTick) {\r\n        var newOffset = this.getEventPosition(event),\r\n          newValue,\r\n          ceilValue = this.options.rightToLeft ? this.minValue : this.maxValue,\r\n          flrValue = this.options.rightToLeft ? this.maxValue : this.minValue;\r\n\r\n        if (newOffset <= 0) {\r\n          newValue = flrValue;\r\n        } else if (newOffset >= this.maxPos) {\r\n          newValue = ceilValue;\r\n        } else {\r\n          newValue = this.offsetToValue(newOffset);\r\n          if (fromTick && angular.isNumber(this.options.showTicks))\r\n            newValue = this.roundStep(newValue, this.options.showTicks);\r\n          else\r\n            newValue = this.roundStep(newValue);\r\n        }\r\n        this.positionTrackingHandle(newValue);\r\n      },\r\n\r\n      /**\r\n       * onEnd event handler\r\n       *\r\n       * @param {Event}    event    The event\r\n       * @param {Function} ehMove   The the bound move event handler\r\n       * @returns {undefined}\r\n       */\r\n      onEnd: function(ehMove, event) {\r\n        var moveEventName = this.getEventNames(event).moveEvent;\r\n\r\n        if (!this.options.keyboardSupport) {\r\n          this.minH.removeClass('rz-active');\r\n          this.maxH.removeClass('rz-active');\r\n          this.tracking = '';\r\n        }\r\n        this.dragging.active = false;\r\n\r\n        $document.off(moveEventName, ehMove);\r\n        this.callOnEnd();\r\n      },\r\n\r\n      onTickClick: function(pointer, event) {\r\n        this.onMove(pointer, event, true);\r\n      },\r\n\r\n      onPointerFocus: function(pointer, ref) {\r\n        this.tracking = ref;\r\n        pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer));\r\n        pointer.on('keydown', angular.bind(this, this.onKeyboardEvent));\r\n        pointer.on('keyup', angular.bind(this, this.onKeyUp));\r\n        this.firstKeyDown = true;\r\n        pointer.addClass('rz-active');\r\n      },\r\n\r\n      onKeyUp: function() {\r\n        this.firstKeyDown = true;\r\n        this.callOnEnd();\r\n      },\r\n\r\n      onPointerBlur: function(pointer) {\r\n        pointer.off('keydown');\r\n        pointer.off('keyup');\r\n        this.tracking = '';\r\n        pointer.removeClass('rz-active');\r\n      },\r\n\r\n      /**\r\n       * Key actions helper function\r\n       *\r\n       * @param {number} currentValue value of the slider\r\n       *\r\n       * @returns {?Object} action value mappings\r\n       */\r\n      getKeyActions: function(currentValue) {\r\n        var increaseStep = currentValue + this.step,\r\n          decreaseStep = currentValue - this.step,\r\n          increasePage = currentValue + this.valueRange / 10,\r\n          decreasePage = currentValue - this.valueRange / 10;\r\n\r\n        //Left to right default actions\r\n        var actions = {\r\n          'UP': increaseStep,\r\n          'DOWN': decreaseStep,\r\n          'LEFT': decreaseStep,\r\n          'RIGHT': increaseStep,\r\n          'PAGEUP': increasePage,\r\n          'PAGEDOWN': decreasePage,\r\n          'HOME': this.minValue,\r\n          'END': this.maxValue\r\n        };\r\n        //right to left means swapping right and left arrows\r\n        if (this.options.rightToLeft) {\r\n          actions.LEFT = increaseStep;\r\n          actions.RIGHT = decreaseStep;\r\n          // right to left and vertical means we also swap up and down\r\n          if (this.options.vertical) {\r\n            actions.UP = decreaseStep;\r\n            actions.DOWN = increaseStep;\r\n          }\r\n        }\r\n        return actions;\r\n      },\r\n\r\n      onKeyboardEvent: function(event) {\r\n        var currentValue = this[this.tracking],\r\n          keyCode = event.keyCode || event.which,\r\n          keys = {\r\n            38: 'UP',\r\n            40: 'DOWN',\r\n            37: 'LEFT',\r\n            39: 'RIGHT',\r\n            33: 'PAGEUP',\r\n            34: 'PAGEDOWN',\r\n            36: 'HOME',\r\n            35: 'END'\r\n          },\r\n          actions = this.getKeyActions(currentValue),\r\n          key = keys[keyCode],\r\n          action = actions[key];\r\n        if (action == null || this.tracking === '') return;\r\n        event.preventDefault();\r\n\r\n        if (this.firstKeyDown) {\r\n          this.firstKeyDown = false;\r\n          this.callOnStart();\r\n        }\r\n\r\n        var self = this;\r\n        $timeout(function() {\r\n          var newValue = self.roundStep(self.sanitizeValue(action));\r\n          if (!self.options.draggableRangeOnly) {\r\n            self.positionTrackingHandle(newValue);\r\n          }\r\n          else {\r\n            var difference = self.highValue - self.lowValue,\r\n              newMinValue, newMaxValue;\r\n            if (self.tracking === 'lowValue') {\r\n              newMinValue = newValue;\r\n              newMaxValue = newValue + difference;\r\n              if (newMaxValue > self.maxValue) {\r\n                newMaxValue = self.maxValue;\r\n                newMinValue = newMaxValue - difference;\r\n              }\r\n            } else {\r\n              newMaxValue = newValue;\r\n              newMinValue = newValue - difference;\r\n              if (newMinValue < self.minValue) {\r\n                newMinValue = self.minValue;\r\n                newMaxValue = newMinValue + difference;\r\n              }\r\n            }\r\n            self.positionTrackingBar(newMinValue, newMaxValue);\r\n          }\r\n        });\r\n      },\r\n\r\n      /**\r\n       * onDragStart event handler\r\n       *\r\n       * Handles dragging of the middle bar.\r\n       *\r\n       * @param {Object} pointer The jqLite wrapped DOM element\r\n       * @param {string} ref     One of the refLow, refHigh values\r\n       * @param {Event}  event   The event\r\n       * @returns {undefined}\r\n       */\r\n      onDragStart: function(pointer, ref, event) {\r\n        var offset = this.getEventPosition(event);\r\n        this.dragging = {\r\n          active: true,\r\n          value: this.offsetToValue(offset),\r\n          difference: this.highValue - this.lowValue,\r\n          lowLimit: this.options.rightToLeft ? this.minH.rzsp - offset : offset - this.minH.rzsp,\r\n          highLimit: this.options.rightToLeft ? offset - this.maxH.rzsp : this.maxH.rzsp - offset\r\n        };\r\n\r\n        this.onStart(pointer, ref, event);\r\n      },\r\n\r\n      /**\r\n       * getValue helper function\r\n       *\r\n       * gets max or min value depending on whether the newOffset is outOfBounds above or below the bar and rightToLeft\r\n       *\r\n       * @param {string} type 'max' || 'min' The value we are calculating\r\n       * @param {number} newOffset  The new offset\r\n       * @param {boolean} outOfBounds Is the new offset above or below the max/min?\r\n       * @param {boolean} isAbove Is the new offset above the bar if out of bounds?\r\n       *\r\n       * @returns {number}\r\n       */\r\n      getValue: function(type, newOffset, outOfBounds, isAbove) {\r\n        var isRTL = this.options.rightToLeft,\r\n          value = null;\r\n\r\n        if (type === 'min') {\r\n          if (outOfBounds) {\r\n            if (isAbove) {\r\n              value = isRTL ? this.minValue : this.maxValue - this.dragging.difference;\r\n            } else {\r\n              value = isRTL ? this.maxValue - this.dragging.difference : this.minValue;\r\n            }\r\n          } else {\r\n            value = isRTL ? this.offsetToValue(newOffset + this.dragging.lowLimit) : this.offsetToValue(newOffset - this.dragging.lowLimit)\r\n          }\r\n        } else {\r\n          if (outOfBounds) {\r\n            if (isAbove) {\r\n              value = isRTL ? this.minValue + this.dragging.difference : this.maxValue;\r\n            } else {\r\n              value = isRTL ? this.maxValue : this.minValue + this.dragging.difference;\r\n            }\r\n          } else {\r\n            if (isRTL) {\r\n              value = this.offsetToValue(newOffset + this.dragging.lowLimit) + this.dragging.difference\r\n            } else {\r\n              value = this.offsetToValue(newOffset - this.dragging.lowLimit) + this.dragging.difference;\r\n            }\r\n          }\r\n        }\r\n        return this.roundStep(value);\r\n      },\r\n\r\n      /**\r\n       * onDragMove event handler\r\n       *\r\n       * Handles dragging of the middle bar.\r\n       *\r\n       * @param {jqLite} pointer\r\n       * @param {Event}  event The event\r\n       * @returns {undefined}\r\n       */\r\n      onDragMove: function(pointer, event) {\r\n        var newOffset = this.getEventPosition(event),\r\n          newMinValue, newMaxValue,\r\n          ceilLimit, flrLimit,\r\n          isUnderFlrLimit, isOverCeilLimit,\r\n          flrH, ceilH;\r\n\r\n        if (this.options.rightToLeft) {\r\n          ceilLimit = this.dragging.lowLimit;\r\n          flrLimit = this.dragging.highLimit;\r\n          flrH = this.maxH;\r\n          ceilH = this.minH;\r\n        } else {\r\n          ceilLimit = this.dragging.highLimit;\r\n          flrLimit = this.dragging.lowLimit;\r\n          flrH = this.minH;\r\n          ceilH = this.maxH;\r\n        }\r\n        isUnderFlrLimit = newOffset <= flrLimit;\r\n        isOverCeilLimit = newOffset >= this.maxPos - ceilLimit;\r\n\r\n        if (isUnderFlrLimit) {\r\n          if (flrH.rzsp === 0)\r\n            return;\r\n          newMinValue = this.getValue('min', newOffset, true, false);\r\n          newMaxValue = this.getValue('max', newOffset, true, false);\r\n        } else if (isOverCeilLimit) {\r\n          if (ceilH.rzsp === this.maxPos)\r\n            return;\r\n          newMaxValue = this.getValue('max', newOffset, true, true);\r\n          newMinValue = this.getValue('min', newOffset, true, true);\r\n        } else {\r\n          newMinValue = this.getValue('min', newOffset, false);\r\n          newMaxValue = this.getValue('max', newOffset, false);\r\n        }\r\n        this.positionTrackingBar(newMinValue, newMaxValue);\r\n      },\r\n\r\n      /**\r\n       * Set the new value and offset for the entire bar\r\n       *\r\n       * @param {number} newMinValue   the new minimum value\r\n       * @param {number} newMaxValue   the new maximum value\r\n       */\r\n      positionTrackingBar: function(newMinValue, newMaxValue) {\r\n        this.lowValue = newMinValue;\r\n        this.highValue = newMaxValue;\r\n        this.applyLowValue();\r\n        if (this.range)\r\n          this.applyHighValue();\r\n        this.applyModel();\r\n        this.updateHandles('lowValue', this.valueToOffset(newMinValue));\r\n        this.updateHandles('highValue', this.valueToOffset(newMaxValue));\r\n      },\r\n\r\n      /**\r\n       * Set the new value and offset to the current tracking handle\r\n       *\r\n       * @param {number} newValue new model value\r\n       */\r\n      positionTrackingHandle: function(newValue) {\r\n        var valueChanged = false;\r\n\r\n        newValue = this.applyMinMaxLimit(newValue);\r\n        if (this.range) {\r\n          newValue = this.applyMinMaxRange(newValue);\r\n          /* This is to check if we need to switch the min and max handles */\r\n          if (this.tracking === 'lowValue' && newValue > this.highValue) {\r\n            if (this.options.noSwitching && this.highValue !== this.minValue) {\r\n              newValue = this.applyMinMaxRange(this.highValue);\r\n            }\r\n            else {\r\n              this.lowValue = this.highValue;\r\n              this.applyLowValue();\r\n              this.updateHandles(this.tracking, this.maxH.rzsp);\r\n              this.updateAriaAttributes();\r\n              this.tracking = 'highValue';\r\n              this.minH.removeClass('rz-active');\r\n              this.maxH.addClass('rz-active');\r\n              if (this.options.keyboardSupport)\r\n                this.focusElement(this.maxH);\r\n            }\r\n            valueChanged = true;\r\n          } else if (this.tracking === 'highValue' && newValue < this.lowValue) {\r\n            if (this.options.noSwitching && this.lowValue !== this.maxValue) {\r\n              newValue = this.applyMinMaxRange(this.lowValue);\r\n            }\r\n            else {\r\n              this.highValue = this.lowValue;\r\n              this.applyHighValue();\r\n              this.updateHandles(this.tracking, this.minH.rzsp);\r\n              this.updateAriaAttributes();\r\n              this.tracking = 'lowValue';\r\n              this.maxH.removeClass('rz-active');\r\n              this.minH.addClass('rz-active');\r\n              if (this.options.keyboardSupport)\r\n                this.focusElement(this.minH);\r\n            }\r\n            valueChanged = true;\r\n          }\r\n        }\r\n\r\n        if (this[this.tracking] !== newValue) {\r\n          this[this.tracking] = newValue;\r\n          if (this.tracking === 'lowValue')\r\n            this.applyLowValue();\r\n          else\r\n            this.applyHighValue();\r\n          this.updateHandles(this.tracking, this.valueToOffset(newValue));\r\n          this.updateAriaAttributes();\r\n          valueChanged = true;\r\n        }\r\n\r\n        if (valueChanged)\r\n          this.applyModel();\r\n      },\r\n\r\n      applyMinMaxLimit: function(newValue) {\r\n        if (this.options.minLimit != null && newValue < this.options.minLimit)\r\n          return this.options.minLimit;\r\n        if (this.options.maxLimit != null && newValue > this.options.maxLimit)\r\n          return this.options.maxLimit;\r\n        return newValue;\r\n      },\r\n\r\n      applyMinMaxRange: function(newValue) {\r\n        var oppositeValue = this.tracking === 'lowValue' ? this.highValue : this.lowValue,\r\n          difference = Math.abs(newValue - oppositeValue);\r\n        if (this.options.minRange != null) {\r\n          if (difference < this.options.minRange) {\r\n            if (this.tracking === 'lowValue')\r\n              return this.highValue - this.options.minRange;\r\n            else\r\n              return this.lowValue + this.options.minRange;\r\n          }\r\n        }\r\n        if (this.options.maxRange != null) {\r\n          if (difference > this.options.maxRange) {\r\n            if (this.tracking === 'lowValue')\r\n              return this.highValue - this.options.maxRange;\r\n            else\r\n              return this.lowValue + this.options.maxRange;\r\n          }\r\n        }\r\n        return newValue;\r\n      },\r\n\r\n      /**\r\n       * Apply the model values using scope.$apply.\r\n       * We wrap it with the internalChange flag to avoid the watchers to be called\r\n       */\r\n      applyModel: function() {\r\n        this.internalChange = true;\r\n        this.scope.$apply();\r\n        this.callOnChange();\r\n        this.internalChange = false;\r\n      },\r\n\r\n      /**\r\n       * Call the onStart callback if defined\r\n       * The callback call is wrapped in a $evalAsync to ensure that its result will be applied to the scope.\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      callOnStart: function() {\r\n        if (this.options.onStart) {\r\n          var self = this,\r\n            pointerType = this.tracking === 'lowValue' ? 'min' : 'max';\r\n          this.scope.$evalAsync(function() {\r\n            self.options.onStart(self.options.id, self.scope.rzSliderModel, self.scope.rzSliderHigh, pointerType);\r\n          });\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Call the onChange callback if defined\r\n       * The callback call is wrapped in a $evalAsync to ensure that its result will be applied to the scope.\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      callOnChange: function() {\r\n        if (this.options.onChange) {\r\n          var self = this,\r\n            pointerType = this.tracking === 'lowValue' ? 'min' : 'max';\r\n          this.scope.$evalAsync(function() {\r\n            self.options.onChange(self.options.id, self.scope.rzSliderModel, self.scope.rzSliderHigh, pointerType);\r\n          });\r\n        }\r\n      },\r\n\r\n      /**\r\n       * Call the onEnd callback if defined\r\n       * The callback call is wrapped in a $evalAsync to ensure that its result will be applied to the scope.\r\n       *\r\n       * @returns {undefined}\r\n       */\r\n      callOnEnd: function() {\r\n        if (this.options.onEnd) {\r\n          var self = this,\r\n            pointerType = this.tracking === 'lowValue' ? 'min' : 'max';\r\n          this.scope.$evalAsync(function() {\r\n            self.options.onEnd(self.options.id, self.scope.rzSliderModel, self.scope.rzSliderHigh, pointerType);\r\n          });\r\n        }\r\n        this.scope.$emit('slideEnded');\r\n      }\r\n    };\r\n\r\n    return Slider;\r\n  }])\r\n\r\n  .directive('rzslider', ['RzSlider', function(RzSlider) {\r\n    'use strict';\r\n\r\n    return {\r\n      restrict: 'AE',\r\n      replace: true,\r\n      scope: {\r\n        rzSliderModel: '=?',\r\n        rzSliderHigh: '=?',\r\n        rzSliderOptions: '&?',\r\n        rzSliderTplUrl: '@'\r\n      },\r\n\r\n      /**\r\n       * Return template URL\r\n       *\r\n       * @param {jqLite} elem\r\n       * @param {Object} attrs\r\n       * @return {string}\r\n       */\r\n      templateUrl: function(elem, attrs) {\r\n        //noinspection JSUnresolvedVariable\r\n        return attrs.rzSliderTplUrl || 'rzSliderTpl.html';\r\n      },\r\n\r\n      link: function(scope, elem) {\r\n        scope.slider = new RzSlider(scope, elem); //attach on scope so we can test it\r\n      }\r\n    };\r\n  }]);\r\n\r\n  // IDE assist\r\n\r\n  /**\r\n   * @name ngScope\r\n   *\r\n   * @property {number} rzSliderModel\r\n   * @property {number} rzSliderHigh\r\n   * @property {Object} rzSliderOptions\r\n   */\r\n\r\n  /**\r\n   * @name jqLite\r\n   *\r\n   * @property {number|undefined} rzsp rzslider label position offset\r\n   * @property {number|undefined} rzsd rzslider element dimension\r\n   * @property {string|undefined} rzsv rzslider label value/text\r\n   * @property {Function} css\r\n   * @property {Function} text\r\n   */\r\n\r\n  /**\r\n   * @name Event\r\n   * @property {Array} touches\r\n   * @property {Event} originalEvent\r\n   */\r\n\r\n  /**\r\n   * @name ThrottleOptions\r\n   *\r\n   * @property {boolean} leading\r\n   * @property {boolean} trailing\r\n   */\r\n\r\n  module.run(['$templateCache', function($templateCache) {\r\n  'use strict';\r\n\r\n  $templateCache.put('rzSliderTpl.html',\r\n    \"<div class=rzslider><span class=rz-bar-wrapper><span class=rz-bar></span></span> <span class=rz-bar-wrapper><span class=\\\"rz-bar rz-selection\\\" ng-style=barStyle></span></span> <span class=\\\"rz-pointer rz-pointer-min\\\" ng-style=minPointerStyle></span> <span class=\\\"rz-pointer rz-pointer-max\\\" ng-style=maxPointerStyle></span> <span class=\\\"rz-bubble rz-limit rz-floor\\\"></span> <span class=\\\"rz-bubble rz-limit rz-ceil\\\"></span> <span class=rz-bubble></span> <span class=rz-bubble></span> <span class=rz-bubble></span><ul ng-show=showTicks class=rz-ticks><li ng-repeat=\\\"t in ticks track by $index\\\" class=rz-tick ng-class=\\\"{'rz-selected': t.selected}\\\" ng-style=t.style ng-attr-uib-tooltip=\\\"{{ t.tooltip }}\\\" ng-attr-tooltip-placement={{t.tooltipPlacement}} ng-attr-tooltip-append-to-body=\\\"{{ t.tooltip ? true : undefined}}\\\"><span ng-if=\\\"t.value != null\\\" class=rz-tick-value ng-attr-uib-tooltip=\\\"{{ t.valueTooltip }}\\\" ng-attr-tooltip-placement={{t.valueTooltipPlacement}}>{{ t.value }}</span> <span ng-if=\\\"t.legend != null\\\" class=rz-tick-legend>{{ t.legend }}</span></li></ul></div>\"\r\n  );\r\n\r\n}]);\r\n\r\n  return module\r\n}));\r\n"]}