From 1d2354e5dd907c2a166b8c8c460a3932316650f0 Mon Sep 17 00:00:00 2001 From: Valentin Hervieu Date: Sat, 5 Dec 2015 19:01:07 +0100 Subject: [PATCH 01/11] Start to implement the keyboard support --- dist/rzslider.js | 62 ++++++++++++++++++++++++++++++++++++++----- dist/rzslider.min.css | 2 +- dist/rzslider.min.js | 4 +-- src/rzslider.js | 62 ++++++++++++++++++++++++++++++++++++++----- 4 files changed, 113 insertions(+), 17 deletions(-) diff --git a/dist/rzslider.js b/dist/rzslider.js index 6db5532..78b963f 100644 --- a/dist/rzslider.js +++ b/dist/rzslider.js @@ -1014,16 +1014,16 @@ * @returns {number} */ valueToOffset: function(val) { - return (this.sanitizeOffsetValue(val) - this.minValue) * this.maxPos / this.valueRange || 0; + return (this.sanitizeValue(val) - this.minValue) * this.maxPos / this.valueRange || 0; }, /** - * Ensure that the position rendered is within the slider bounds, even if the value is not + * Returns a value that is within slider range * * @param {number} val * @returns {number} */ - sanitizeOffsetValue: function(val) { + sanitizeValue: function(val) { return Math.min(Math.max(val, this.minValue), this.maxValue); }, @@ -1126,6 +1126,11 @@ this.selBar.on('touchstart', angular.bind(this, barMove, this.selBar)); this.ticks.on('touchstart', angular.bind(this, this.onStart, null, null)); this.ticks.on('touchstart', angular.bind(this, this.onMove, this.ticks)); + + this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')) + if (this.range) { + this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh')); + } }, /** @@ -1156,10 +1161,6 @@ event.stopPropagation(); event.preventDefault(); - if (this.tracking !== '') { - return; - } - // We have to do this in case the HTML where the sliders are on // have been animated into view. this.calcViewDimensions(); @@ -1210,6 +1211,49 @@ this.positionTrackingHandle(newValue, newOffset); }, + onPointerFocus: function(pointer, ref, event) { + this.tracking = ref; + pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer)); + pointer.on('keydown', angular.bind(this, this.onKeyboardEvent)); + pointer.addClass('rz-active'); + }, + + onPointerBlur: function(pointer, event) { + this.tracking = ''; + pointer.off('keydown'); + pointer.removeClass('rz-active'); + }, + + onKeyboardEvent: function(event) { + var keyCode = event.keyCode || event.which, + keys = { + 38: 'UP', + 40: 'DOWN', + 37: 'LEFT', + 39: 'RIGHT' + }, + actions = { + UP: 5, + DOWN: -5, + LEFT: -1, + RIGHT: 1 + }, + key = keys[keyCode], + action = actions[key]; + + if (!key || !this.tracking) return; + event.preventDefault(); + + var value = this.scope[this.tracking], + newValue = this.roundStep(this.sanitizeValue(value + action)), + newOffset = this.valueToOffset(newValue); + var switched = this.positionTrackingHandle(newValue, newOffset); + if (switched) { + var pointer = this.tracking === 'rzSliderModel' ? this.minH : this.maxH; + pointer[0].focus(); //to focus the correct pointer + } + }, + /** * onDragStart event handler * @@ -1302,10 +1346,12 @@ */ positionTrackingHandle: function(newValue, newOffset) { var valueChanged = false; + var switched = false; if (this.range) { /* This is to check if we need to switch the min and max handles*/ if (this.tracking === 'rzSliderModel' && newValue >= this.scope.rzSliderHigh) { + switched = true; this.scope[this.tracking] = this.scope.rzSliderHigh; this.updateHandles(this.tracking, this.maxH.rzsp); this.tracking = 'rzSliderHigh'; @@ -1313,6 +1359,7 @@ this.maxH.addClass('rz-active'); valueChanged = true; } else if (this.tracking === 'rzSliderHigh' && newValue <= this.scope.rzSliderModel) { + switched = true; this.scope[this.tracking] = this.scope.rzSliderModel; this.updateHandles(this.tracking, this.minH.rzsp); this.tracking = 'rzSliderModel'; @@ -1332,6 +1379,7 @@ this.scope.$apply(); this.callOnChange(); } + return switched; }, /** diff --git a/dist/rzslider.min.css b/dist/rzslider.min.css index 58f5ad1..3ade46b 100644 --- a/dist/rzslider.min.css +++ b/dist/rzslider.min.css @@ -1,2 +1,2 @@ -/*! angularjs-slider - v2.2.0 - (c) Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu , https://github.com/rzajac/angularjs-slider.git - 2015-12-17 */ +/*! angularjs-slider - v2.2.0 - (c) Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu , https://github.com/rzajac/angularjs-slider.git - 2015-12-18 */ rzslider{position:relative;display:inline-block;width:100%;height:4px;margin:35px 0 15px 0;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}rzslider[disabled]{cursor:not-allowed}rzslider[disabled] .rz-pointer{cursor:not-allowed;background-color:#d8e0f3}rzslider span{position:absolute;display:inline-block;white-space:nowrap}rzslider .rz-base{width:100%;height:100%;padding:0}rzslider .rz-bar-wrapper{left:0;z-index:1;width:100%;height:32px;padding-top:16px;margin-top:-16px;box-sizing:border-box}rzslider .rz-bar-wrapper.rz-draggable{cursor:move}rzslider .rz-bar{left:0;z-index:1;width:100%;height:4px;background:#d8e0f3;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}rzslider .rz-bar.rz-selection{z-index:2;background:#0db9f0;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}rzslider .rz-pointer{top:-14px;z-index:3;width:32px;height:32px;cursor:pointer;background-color:#0db9f0;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}rzslider .rz-pointer:after{position:absolute;top:12px;left:12px;width:8px;height:8px;background:#fff;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;content:''}rzslider .rz-pointer:hover:after{background-color:#fff}rzslider .rz-pointer.rz-active:after{background-color:#451aff}rzslider .rz-bubble{bottom:16px;padding:1px 3px;color:#55637d;cursor:default}rzslider .rz-bubble.rz-selection{top:16px}rzslider .rz-bubble.rz-limit{color:#55637d}rzslider .rz-ticks{position:absolute;top:-3px;left:0;z-index:1;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;padding:0 11px;margin:0;list-style:none;box-sizing:border-box;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}rzslider .rz-ticks .tick{width:10px;height:10px;text-align:center;cursor:pointer;background:#d8e0f3;border-radius:50%}rzslider .rz-ticks .tick.selected{background:#0db9f0}rzslider .rz-ticks .tick .tick-value{position:absolute;top:-30px;transform:translate(-50%,0)}rzslider.vertical{position:relative;width:4px;height:100%;padding:0;margin:0 20px;vertical-align:baseline}rzslider.vertical .rz-base{width:100%;height:100%;padding:0}rzslider.vertical .rz-bar-wrapper{top:auto;left:0;width:32px;height:100%;padding:0 0 0 16px;margin:0 0 0 -16px}rzslider.vertical .rz-bar{bottom:0;left:auto;width:4px;height:100%}rzslider.vertical .rz-pointer{top:auto;bottom:0;left:-14px!important}rzslider.vertical .rz-bubble{bottom:0;left:16px!important;margin-left:3px}rzslider.vertical .rz-bubble.rz-selection{top:auto;left:16px!important}rzslider.vertical .rz-ticks{top:0;left:-3px;z-index:1;width:auto;height:100%;padding:11px 0;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}rzslider.vertical .rz-ticks .tick{vertical-align:middle}rzslider.vertical .rz-ticks .tick .tick-value{top:auto;right:-30px;transform:translate(0,-28%)} \ No newline at end of file diff --git a/dist/rzslider.min.js b/dist/rzslider.min.js index c80b0e0..3895891 100644 --- a/dist/rzslider.min.js +++ b/dist/rzslider.min.js @@ -1,2 +1,2 @@ -/*! angularjs-slider - v2.2.0 - (c) Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu , https://github.com/rzajac/angularjs-slider.git - 2015-12-17 */ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.bindEvents()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.sliderElem.attr("role","slider")},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeOffsetValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeOffsetValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1;this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),c=!0),c&&(this.scope.$apply(),this.callOnChange())},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;this.minH.removeClass("rz-active"),this.maxH.removeClass("rz-active"),c.off(d,a),this.scope.$emit("slideEnded"),this.tracking="",this.dragging.active=!1,this.callOnEnd()},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file +/*! angularjs-slider - v2.2.0 - (c) Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu , https://github.com/rzajac/angularjs-slider.git - 2015-12-18 */ +!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.bindEvents()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.sliderElem.attr("role","slider")},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onPointerFocus:function(b,c,d){this.tracking=c,b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a,b){this.tracking="",a.off("keydown"),a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=a.keyCode||a.which,c={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT"},d={UP:5,DOWN:-5,LEFT:-1,RIGHT:1},e=c[b],f=d[e];if(e&&this.tracking){a.preventDefault();var g=this.scope[this.tracking],h=this.roundStep(this.sanitizeValue(g+f)),i=this.valueToOffset(h),j=this.positionTrackingHandle(h,i);if(j){var k="rzSliderModel"===this.tracking?this.minH:this.maxH;k[0].focus()}}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;this.minH.removeClass("rz-active"),this.maxH.removeClass("rz-active"),c.off(d,a),this.scope.$emit("slideEnded"),this.tracking="",this.dragging.active=!1,this.callOnEnd()},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file diff --git a/src/rzslider.js b/src/rzslider.js index 73e5536..578e520 100644 --- a/src/rzslider.js +++ b/src/rzslider.js @@ -1014,16 +1014,16 @@ * @returns {number} */ valueToOffset: function(val) { - return (this.sanitizeOffsetValue(val) - this.minValue) * this.maxPos / this.valueRange || 0; + return (this.sanitizeValue(val) - this.minValue) * this.maxPos / this.valueRange || 0; }, /** - * Ensure that the position rendered is within the slider bounds, even if the value is not + * Returns a value that is within slider range * * @param {number} val * @returns {number} */ - sanitizeOffsetValue: function(val) { + sanitizeValue: function(val) { return Math.min(Math.max(val, this.minValue), this.maxValue); }, @@ -1126,6 +1126,11 @@ this.selBar.on('touchstart', angular.bind(this, barMove, this.selBar)); this.ticks.on('touchstart', angular.bind(this, this.onStart, null, null)); this.ticks.on('touchstart', angular.bind(this, this.onMove, this.ticks)); + + this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')) + if (this.range) { + this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh')); + } }, /** @@ -1156,10 +1161,6 @@ event.stopPropagation(); event.preventDefault(); - if (this.tracking !== '') { - return; - } - // We have to do this in case the HTML where the sliders are on // have been animated into view. this.calcViewDimensions(); @@ -1210,6 +1211,49 @@ this.positionTrackingHandle(newValue, newOffset); }, + onPointerFocus: function(pointer, ref, event) { + this.tracking = ref; + pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer)); + pointer.on('keydown', angular.bind(this, this.onKeyboardEvent)); + pointer.addClass('rz-active'); + }, + + onPointerBlur: function(pointer, event) { + this.tracking = ''; + pointer.off('keydown'); + pointer.removeClass('rz-active'); + }, + + onKeyboardEvent: function(event) { + var keyCode = event.keyCode || event.which, + keys = { + 38: 'UP', + 40: 'DOWN', + 37: 'LEFT', + 39: 'RIGHT' + }, + actions = { + UP: 5, + DOWN: -5, + LEFT: -1, + RIGHT: 1 + }, + key = keys[keyCode], + action = actions[key]; + + if (!key || !this.tracking) return; + event.preventDefault(); + + var value = this.scope[this.tracking], + newValue = this.roundStep(this.sanitizeValue(value + action)), + newOffset = this.valueToOffset(newValue); + var switched = this.positionTrackingHandle(newValue, newOffset); + if (switched) { + var pointer = this.tracking === 'rzSliderModel' ? this.minH : this.maxH; + pointer[0].focus(); //to focus the correct pointer + } + }, + /** * onDragStart event handler * @@ -1302,10 +1346,12 @@ */ positionTrackingHandle: function(newValue, newOffset) { var valueChanged = false; + var switched = false; if (this.range) { /* This is to check if we need to switch the min and max handles*/ if (this.tracking === 'rzSliderModel' && newValue >= this.scope.rzSliderHigh) { + switched = true; this.scope[this.tracking] = this.scope.rzSliderHigh; this.updateHandles(this.tracking, this.maxH.rzsp); this.tracking = 'rzSliderHigh'; @@ -1313,6 +1359,7 @@ this.maxH.addClass('rz-active'); valueChanged = true; } else if (this.tracking === 'rzSliderHigh' && newValue <= this.scope.rzSliderModel) { + switched = true; this.scope[this.tracking] = this.scope.rzSliderModel; this.updateHandles(this.tracking, this.minH.rzsp); this.tracking = 'rzSliderModel'; @@ -1332,6 +1379,7 @@ this.scope.$apply(); this.callOnChange(); } + return switched; }, /** From a6ae35bacb43beca2f79e23c02763aca21fdece4 Mon Sep 17 00:00:00 2001 From: Valentin Hervieu Date: Sun, 6 Dec 2015 11:16:48 +0100 Subject: [PATCH 02/11] Add more keys and improve switched between keyboard and mouse --- dist/rzslider.js | 77 +++++++++++++++++++++++++------------------- dist/rzslider.min.js | 2 +- src/rzslider.js | 77 +++++++++++++++++++++++++------------------- 3 files changed, 89 insertions(+), 67 deletions(-) diff --git a/dist/rzslider.js b/dist/rzslider.js index 78b963f..4759339 100644 --- a/dist/rzslider.js +++ b/dist/rzslider.js @@ -1173,6 +1173,7 @@ } pointer.addClass('rz-active'); + pointer[0].focus(); ehMove = angular.bind(this, this.dragging.active ? this.onDragMove : this.onMove, pointer); ehEnd = angular.bind(this, this.onEnd, ehMove); @@ -1211,41 +1212,73 @@ this.positionTrackingHandle(newValue, newOffset); }, + /** + * onEnd event handler + * + * @param {Event} event The event + * @param {Function} ehMove The the bound move event handler + * @returns {undefined} + */ + onEnd: function(ehMove, event) { + var moveEventName = this.getEventNames(event).moveEvent; + + //this.minH.removeClass('rz-active'); + //this.maxH.removeClass('rz-active'); + + $document.off(moveEventName, ehMove); + + this.scope.$emit('slideEnded'); + //this.tracking = ''; + + this.dragging.active = false; + this.callOnEnd(); + }, + onPointerFocus: function(pointer, ref, event) { + //if (this.tracking === ref) return; this.tracking = ref; + console.info('focused', ref); pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer)); pointer.on('keydown', angular.bind(this, this.onKeyboardEvent)); pointer.addClass('rz-active'); }, onPointerBlur: function(pointer, event) { - this.tracking = ''; + console.info('focused', this.tracking); pointer.off('keydown'); + this.tracking = ''; pointer.removeClass('rz-active'); }, onKeyboardEvent: function(event) { - var keyCode = event.keyCode || event.which, + var currentValue = this.scope[this.tracking], + keyCode = event.keyCode || event.which, keys = { 38: 'UP', 40: 'DOWN', 37: 'LEFT', - 39: 'RIGHT' + 39: 'RIGHT', + 33: 'PAGEUP', + 34: 'PAGEDOWN', + 36: 'HOME', + 35: 'END' }, actions = { - UP: 5, - DOWN: -5, - LEFT: -1, - RIGHT: 1 + UP: currentValue + this.step, + DOWN: currentValue - this.step, + LEFT: currentValue - this.step, + RIGHT: currentValue + this.step, + PAGEUP: currentValue + this.valueRange / 10, + PAGEDOWN: currentValue - this.valueRange / 10, + HOME: this.minValue, + END: this.maxValue }, key = keys[keyCode], action = actions[key]; - - if (!key || !this.tracking) return; + if (action == null || this.tracking === '') return; event.preventDefault(); - var value = this.scope[this.tracking], - newValue = this.roundStep(this.sanitizeValue(value + action)), + var newValue = this.roundStep(this.sanitizeValue(action)), newOffset = this.valueToOffset(newValue); var switched = this.positionTrackingHandle(newValue, newOffset); if (switched) { @@ -1382,28 +1415,6 @@ return switched; }, - /** - * onEnd event handler - * - * @param {Event} event The event - * @param {Function} ehMove The the bound move event handler - * @returns {undefined} - */ - onEnd: function(ehMove, event) { - var moveEventName = this.getEventNames(event).moveEvent; - - this.minH.removeClass('rz-active'); - this.maxH.removeClass('rz-active'); - - $document.off(moveEventName, ehMove); - - this.scope.$emit('slideEnded'); - this.tracking = ''; - - this.dragging.active = false; - this.callOnEnd(); - }, - /** * Get event names for move and event end * diff --git a/dist/rzslider.min.js b/dist/rzslider.min.js index 3895891..cd450ff 100644 --- a/dist/rzslider.min.js +++ b/dist/rzslider.min.js @@ -1,2 +1,2 @@ /*! angularjs-slider - v2.2.0 - (c) Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu , https://github.com/rzajac/angularjs-slider.git - 2015-12-18 */ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.bindEvents()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.sliderElem.attr("role","slider")},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onPointerFocus:function(b,c,d){this.tracking=c,b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a,b){this.tracking="",a.off("keydown"),a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=a.keyCode||a.which,c={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT"},d={UP:5,DOWN:-5,LEFT:-1,RIGHT:1},e=c[b],f=d[e];if(e&&this.tracking){a.preventDefault();var g=this.scope[this.tracking],h=this.roundStep(this.sanitizeValue(g+f)),i=this.valueToOffset(h),j=this.positionTrackingHandle(h,i);if(j){var k="rzSliderModel"===this.tracking?this.minH:this.maxH;k[0].focus()}}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;this.minH.removeClass("rz-active"),this.maxH.removeClass("rz-active"),c.off(d,a),this.scope.$emit("slideEnded"),this.tracking="",this.dragging.active=!1,this.callOnEnd()},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file +!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.bindEvents()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.sliderElem.attr("role","slider")},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;c.off(d,a),this.scope.$emit("slideEnded"),this.dragging.active=!1,this.callOnEnd()},onPointerFocus:function(b,c,d){this.tracking=c,console.info("focused",c),b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a,b){console.info("focused",this.tracking),a.off("keydown"),this.tracking="",a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=this.scope[this.tracking],c=a.keyCode||a.which,d={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"},e={UP:b+this.step,DOWN:b-this.step,LEFT:b-this.step,RIGHT:b+this.step,PAGEUP:b+this.valueRange/10,PAGEDOWN:b-this.valueRange/10,HOME:this.minValue,END:this.maxValue},f=d[c],g=e[f];if(null!=g&&""!==this.tracking){a.preventDefault();var h=this.roundStep(this.sanitizeValue(g)),i=this.valueToOffset(h),j=this.positionTrackingHandle(h,i);if(j){var k="rzSliderModel"===this.tracking?this.minH:this.maxH;k[0].focus()}}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file diff --git a/src/rzslider.js b/src/rzslider.js index 578e520..49319c6 100644 --- a/src/rzslider.js +++ b/src/rzslider.js @@ -1173,6 +1173,7 @@ } pointer.addClass('rz-active'); + pointer[0].focus(); ehMove = angular.bind(this, this.dragging.active ? this.onDragMove : this.onMove, pointer); ehEnd = angular.bind(this, this.onEnd, ehMove); @@ -1211,41 +1212,73 @@ this.positionTrackingHandle(newValue, newOffset); }, + /** + * onEnd event handler + * + * @param {Event} event The event + * @param {Function} ehMove The the bound move event handler + * @returns {undefined} + */ + onEnd: function(ehMove, event) { + var moveEventName = this.getEventNames(event).moveEvent; + + //this.minH.removeClass('rz-active'); + //this.maxH.removeClass('rz-active'); + + $document.off(moveEventName, ehMove); + + this.scope.$emit('slideEnded'); + //this.tracking = ''; + + this.dragging.active = false; + this.callOnEnd(); + }, + onPointerFocus: function(pointer, ref, event) { + //if (this.tracking === ref) return; this.tracking = ref; + console.info('focused', ref); pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer)); pointer.on('keydown', angular.bind(this, this.onKeyboardEvent)); pointer.addClass('rz-active'); }, onPointerBlur: function(pointer, event) { - this.tracking = ''; + console.info('focused', this.tracking); pointer.off('keydown'); + this.tracking = ''; pointer.removeClass('rz-active'); }, onKeyboardEvent: function(event) { - var keyCode = event.keyCode || event.which, + var currentValue = this.scope[this.tracking], + keyCode = event.keyCode || event.which, keys = { 38: 'UP', 40: 'DOWN', 37: 'LEFT', - 39: 'RIGHT' + 39: 'RIGHT', + 33: 'PAGEUP', + 34: 'PAGEDOWN', + 36: 'HOME', + 35: 'END' }, actions = { - UP: 5, - DOWN: -5, - LEFT: -1, - RIGHT: 1 + UP: currentValue + this.step, + DOWN: currentValue - this.step, + LEFT: currentValue - this.step, + RIGHT: currentValue + this.step, + PAGEUP: currentValue + this.valueRange / 10, + PAGEDOWN: currentValue - this.valueRange / 10, + HOME: this.minValue, + END: this.maxValue }, key = keys[keyCode], action = actions[key]; - - if (!key || !this.tracking) return; + if (action == null || this.tracking === '') return; event.preventDefault(); - var value = this.scope[this.tracking], - newValue = this.roundStep(this.sanitizeValue(value + action)), + var newValue = this.roundStep(this.sanitizeValue(action)), newOffset = this.valueToOffset(newValue); var switched = this.positionTrackingHandle(newValue, newOffset); if (switched) { @@ -1382,28 +1415,6 @@ return switched; }, - /** - * onEnd event handler - * - * @param {Event} event The event - * @param {Function} ehMove The the bound move event handler - * @returns {undefined} - */ - onEnd: function(ehMove, event) { - var moveEventName = this.getEventNames(event).moveEvent; - - this.minH.removeClass('rz-active'); - this.maxH.removeClass('rz-active'); - - $document.off(moveEventName, ehMove); - - this.scope.$emit('slideEnded'); - this.tracking = ''; - - this.dragging.active = false; - this.callOnEnd(); - }, - /** * Get event names for move and event end * From c812f4dd6f7a1c79f8125c89a805d1b457440a7e Mon Sep 17 00:00:00 2001 From: Valentin Hervieu Date: Sun, 6 Dec 2015 11:28:05 +0100 Subject: [PATCH 03/11] Prevent events from being bound twice. --- dist/rzslider.js | 5 ++--- dist/rzslider.min.js | 2 +- src/rzslider.js | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/dist/rzslider.js b/dist/rzslider.js index 4759339..d41192d 100644 --- a/dist/rzslider.js +++ b/dist/rzslider.js @@ -281,7 +281,6 @@ this.initElemHandles(); this.manageElementsStyle(); this.addAccessibility(); - this.manageEventsBindings(); this.setDisabledState(); this.calcViewDimensions(); this.setMinAndMax(); @@ -290,7 +289,7 @@ self.updateCeilLab(); self.updateFloorLab(); self.initHandles(); - self.bindEvents(); + self.manageEventsBindings(); }); // Recalculate slider view dimensions @@ -1244,7 +1243,7 @@ }, onPointerBlur: function(pointer, event) { - console.info('focused', this.tracking); + console.info('blured', this.tracking); pointer.off('keydown'); this.tracking = ''; pointer.removeClass('rz-active'); diff --git a/dist/rzslider.min.js b/dist/rzslider.min.js index cd450ff..6aca4a4 100644 --- a/dist/rzslider.min.js +++ b/dist/rzslider.min.js @@ -1,2 +1,2 @@ /*! angularjs-slider - v2.2.0 - (c) Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu , https://github.com/rzajac/angularjs-slider.git - 2015-12-18 */ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.bindEvents()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.sliderElem.attr("role","slider")},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;c.off(d,a),this.scope.$emit("slideEnded"),this.dragging.active=!1,this.callOnEnd()},onPointerFocus:function(b,c,d){this.tracking=c,console.info("focused",c),b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a,b){console.info("focused",this.tracking),a.off("keydown"),this.tracking="",a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=this.scope[this.tracking],c=a.keyCode||a.which,d={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"},e={UP:b+this.step,DOWN:b-this.step,LEFT:b-this.step,RIGHT:b+this.step,PAGEUP:b+this.valueRange/10,PAGEDOWN:b-this.valueRange/10,HOME:this.minValue,END:this.maxValue},f=d[c],g=e[f];if(null!=g&&""!==this.tracking){a.preventDefault();var h=this.roundStep(this.sanitizeValue(g)),i=this.valueToOffset(h),j=this.positionTrackingHandle(h,i);if(j){var k="rzSliderModel"===this.tracking?this.minH:this.maxH;k[0].focus()}}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file +!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.manageEventsBindings()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.sliderElem.attr("role","slider")},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;c.off(d,a),this.scope.$emit("slideEnded"),this.dragging.active=!1,this.callOnEnd()},onPointerFocus:function(b,c,d){this.tracking=c,console.info("focused",c),b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a,b){console.info("blured",this.tracking),a.off("keydown"),this.tracking="",a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=this.scope[this.tracking],c=a.keyCode||a.which,d={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"},e={UP:b+this.step,DOWN:b-this.step,LEFT:b-this.step,RIGHT:b+this.step,PAGEUP:b+this.valueRange/10,PAGEDOWN:b-this.valueRange/10,HOME:this.minValue,END:this.maxValue},f=d[c],g=e[f];if(null!=g&&""!==this.tracking){a.preventDefault();var h=this.roundStep(this.sanitizeValue(g)),i=this.valueToOffset(h),j=this.positionTrackingHandle(h,i);if(j){var k="rzSliderModel"===this.tracking?this.minH:this.maxH;k[0].focus()}}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file diff --git a/src/rzslider.js b/src/rzslider.js index 49319c6..111e947 100644 --- a/src/rzslider.js +++ b/src/rzslider.js @@ -281,7 +281,6 @@ this.initElemHandles(); this.manageElementsStyle(); this.addAccessibility(); - this.manageEventsBindings(); this.setDisabledState(); this.calcViewDimensions(); this.setMinAndMax(); @@ -290,7 +289,7 @@ self.updateCeilLab(); self.updateFloorLab(); self.initHandles(); - self.bindEvents(); + self.manageEventsBindings(); }); // Recalculate slider view dimensions @@ -1244,7 +1243,7 @@ }, onPointerBlur: function(pointer, event) { - console.info('focused', this.tracking); + console.info('blured', this.tracking); pointer.off('keydown'); this.tracking = ''; pointer.removeClass('rz-active'); From 7a3b398bf18050c4ff71b7212cdcac6e617ba216 Mon Sep 17 00:00:00 2001 From: Valentin Hervieu Date: Sun, 6 Dec 2015 15:40:45 +0100 Subject: [PATCH 04/11] Add aria role and aria-value attributes --- dist/rzslider.js | 66 ++++++++++++++++++++++++++++++++++---------- dist/rzslider.min.js | 2 +- src/rzslider.js | 66 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 103 insertions(+), 31 deletions(-) diff --git a/dist/rzslider.js b/dist/rzslider.js index d41192d..00fd24b 100644 --- a/dist/rzslider.js +++ b/dist/rzslider.js @@ -51,6 +51,7 @@ ticksValuesTooltip: null, vertical: false, selectionBarColor: null, + keyboardSupport: true, scale: 1, onStart: null, onChange: null, @@ -310,6 +311,7 @@ self.updateLowHandle(self.valueToOffset(self.scope.rzSliderModel)); self.updateSelectionBar(); self.updateTicksScale(); + self.updateAriaAttributes(); if (self.range) { self.updateCmbLabel(); @@ -323,6 +325,7 @@ self.updateSelectionBar(); self.updateTicksScale(); self.updateCmbLabel(); + self.updateAriaAttributes(); }, self.options.interval); this.scope.$on('rzSliderForceRender', function() { @@ -614,14 +617,43 @@ }, /** - * Adds accessibility atributes + * Adds accessibility attributes * * Run only once during initialization * * @returns {undefined} */ addAccessibility: function() { - this.sliderElem.attr("role", "slider"); + this.minH.attr('role', 'slider'); + this.updateAriaAttributes(); + if (this.options.keyboardSupport) + this.minH.attr('tabindex', '0'); + if (this.options.vertical) + this.minH.attr('aria-orientation', 'vertical'); + + if (this.range) { + this.maxH.attr('role', 'slider'); + if (this.options.keyboardSupport) + this.maxH.attr('tabindex', '0'); + if (this.options.vertical) + this.maxH.attr('aria-orientation', 'vertical'); + } + }, + + /** + * Updates aria attributes according to current values + */ + updateAriaAttributes: function() { + this.minH.attr('aria-valuenow', this.scope.rzSliderModel); + this.minH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderModel)); + this.minH.attr('aria-valuemin', this.minValue); + this.minH.attr('aria-valuemax', this.maxValue); + if (this.range) { + this.maxH.attr('aria-valuenow', this.scope.rzSliderHigh); + this.maxH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderHigh)); + this.maxH.attr('aria-valuemin', this.minValue); + this.maxH.attr('aria-valuemax', this.maxValue); + } }, /** @@ -1126,9 +1158,11 @@ this.ticks.on('touchstart', angular.bind(this, this.onStart, null, null)); this.ticks.on('touchstart', angular.bind(this, this.onMove, this.ticks)); - this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')) - if (this.range) { - this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh')); + if (this.options.keyboardSupport) { + this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')) + if (this.range) { + this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh')); + } } }, @@ -1172,7 +1206,9 @@ } pointer.addClass('rz-active'); - pointer[0].focus(); + + if (this.options.keyboardSupport) + pointer[0].focus(); ehMove = angular.bind(this, this.dragging.active ? this.onDragMove : this.onMove, pointer); ehEnd = angular.bind(this, this.onEnd, ehMove); @@ -1221,29 +1257,26 @@ onEnd: function(ehMove, event) { var moveEventName = this.getEventNames(event).moveEvent; - //this.minH.removeClass('rz-active'); - //this.maxH.removeClass('rz-active'); + if (!this.options.keyboardSupport) { + this.minH.removeClass('rz-active'); + this.maxH.removeClass('rz-active'); + this.tracking = ''; + } + this.dragging.active = false; $document.off(moveEventName, ehMove); - this.scope.$emit('slideEnded'); - //this.tracking = ''; - - this.dragging.active = false; this.callOnEnd(); }, onPointerFocus: function(pointer, ref, event) { - //if (this.tracking === ref) return; this.tracking = ref; - console.info('focused', ref); pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer)); pointer.on('keydown', angular.bind(this, this.onKeyboardEvent)); pointer.addClass('rz-active'); }, onPointerBlur: function(pointer, event) { - console.info('blured', this.tracking); pointer.off('keydown'); this.tracking = ''; pointer.removeClass('rz-active'); @@ -1386,6 +1419,7 @@ switched = true; this.scope[this.tracking] = this.scope.rzSliderHigh; this.updateHandles(this.tracking, this.maxH.rzsp); + this.updateAriaAttributes(); this.tracking = 'rzSliderHigh'; this.minH.removeClass('rz-active'); this.maxH.addClass('rz-active'); @@ -1394,6 +1428,7 @@ switched = true; this.scope[this.tracking] = this.scope.rzSliderModel; this.updateHandles(this.tracking, this.minH.rzsp); + this.updateAriaAttributes(); this.tracking = 'rzSliderModel'; this.maxH.removeClass('rz-active'); this.minH.addClass('rz-active'); @@ -1404,6 +1439,7 @@ if (this.scope[this.tracking] !== newValue) { this.scope[this.tracking] = newValue; this.updateHandles(this.tracking, newOffset); + this.updateAriaAttributes(); valueChanged = true; } diff --git a/dist/rzslider.min.js b/dist/rzslider.min.js index 6aca4a4..b7f2864 100644 --- a/dist/rzslider.min.js +++ b/dist/rzslider.min.js @@ -1,2 +1,2 @@ /*! angularjs-slider - v2.2.0 - (c) Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu , https://github.com/rzajac/angularjs-slider.git - 2015-12-18 */ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.manageEventsBindings()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.sliderElem.attr("role","slider")},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;c.off(d,a),this.scope.$emit("slideEnded"),this.dragging.active=!1,this.callOnEnd()},onPointerFocus:function(b,c,d){this.tracking=c,console.info("focused",c),b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a,b){console.info("blured",this.tracking),a.off("keydown"),this.tracking="",a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=this.scope[this.tracking],c=a.keyCode||a.which,d={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"},e={UP:b+this.step,DOWN:b-this.step,LEFT:b-this.step,RIGHT:b+this.step,PAGEUP:b+this.valueRange/10,PAGEDOWN:b-this.valueRange/10,HOME:this.minValue,END:this.maxValue},f=d[c],g=e[f];if(null!=g&&""!==this.tracking){a.preventDefault();var h=this.roundStep(this.sanitizeValue(g)),i=this.valueToOffset(h),j=this.positionTrackingHandle(h,i);if(j){var k="rzSliderModel"===this.tracking?this.minH:this.maxH;k[0].focus()}}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file +!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,keyboardSupport:!0,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.manageEventsBindings()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.updateAriaAttributes(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel(),h.updateAriaAttributes()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.minH.attr("role","slider"),this.updateAriaAttributes(),this.options.keyboardSupport&&this.minH.attr("tabindex","0"),this.options.vertical&&this.minH.attr("aria-orientation","vertical"),this.range&&(this.maxH.attr("role","slider"),this.options.keyboardSupport&&this.maxH.attr("tabindex","0"),this.options.vertical&&this.maxH.attr("aria-orientation","vertical"))},updateAriaAttributes:function(){this.minH.attr("aria-valuenow",this.scope.rzSliderModel),this.minH.attr("aria-valuetext",this.customTrFn(this.scope.rzSliderModel)),this.minH.attr("aria-valuemin",this.minValue),this.minH.attr("aria-valuemax",this.maxValue),this.range&&(this.maxH.attr("aria-valuenow",this.scope.rzSliderHigh),this.maxH.attr("aria-valuetext",this.customTrFn(this.scope.rzSliderHigh)),this.maxH.attr("aria-valuemin",this.minValue),this.maxH.attr("aria-valuemax",this.maxValue))},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;this.options.keyboardSupport||(this.minH.removeClass("rz-active"),this.maxH.removeClass("rz-active"),this.tracking=""),this.dragging.active=!1,c.off(d,a),this.scope.$emit("slideEnded"),this.callOnEnd()},onPointerFocus:function(b,c,d){this.tracking=c,b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a,b){a.off("keydown"),this.tracking="",a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=this.scope[this.tracking],c=a.keyCode||a.which,d={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"},e={UP:b+this.step,DOWN:b-this.step,LEFT:b-this.step,RIGHT:b+this.step,PAGEUP:b+this.valueRange/10,PAGEDOWN:b-this.valueRange/10,HOME:this.minValue,END:this.maxValue},f=d[c],g=e[f];if(null!=g&&""!==this.tracking){a.preventDefault();var h=this.roundStep(this.sanitizeValue(g)),i=this.valueToOffset(h),j=this.positionTrackingHandle(h,i);if(j){var k="rzSliderModel"===this.tracking?this.minH:this.maxH;k[0].focus()}}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),this.updateAriaAttributes(),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file diff --git a/src/rzslider.js b/src/rzslider.js index 111e947..f6a6f80 100644 --- a/src/rzslider.js +++ b/src/rzslider.js @@ -51,6 +51,7 @@ ticksValuesTooltip: null, vertical: false, selectionBarColor: null, + keyboardSupport: true, scale: 1, onStart: null, onChange: null, @@ -310,6 +311,7 @@ self.updateLowHandle(self.valueToOffset(self.scope.rzSliderModel)); self.updateSelectionBar(); self.updateTicksScale(); + self.updateAriaAttributes(); if (self.range) { self.updateCmbLabel(); @@ -323,6 +325,7 @@ self.updateSelectionBar(); self.updateTicksScale(); self.updateCmbLabel(); + self.updateAriaAttributes(); }, self.options.interval); this.scope.$on('rzSliderForceRender', function() { @@ -614,14 +617,43 @@ }, /** - * Adds accessibility atributes + * Adds accessibility attributes * * Run only once during initialization * * @returns {undefined} */ addAccessibility: function() { - this.sliderElem.attr("role", "slider"); + this.minH.attr('role', 'slider'); + this.updateAriaAttributes(); + if (this.options.keyboardSupport) + this.minH.attr('tabindex', '0'); + if (this.options.vertical) + this.minH.attr('aria-orientation', 'vertical'); + + if (this.range) { + this.maxH.attr('role', 'slider'); + if (this.options.keyboardSupport) + this.maxH.attr('tabindex', '0'); + if (this.options.vertical) + this.maxH.attr('aria-orientation', 'vertical'); + } + }, + + /** + * Updates aria attributes according to current values + */ + updateAriaAttributes: function() { + this.minH.attr('aria-valuenow', this.scope.rzSliderModel); + this.minH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderModel)); + this.minH.attr('aria-valuemin', this.minValue); + this.minH.attr('aria-valuemax', this.maxValue); + if (this.range) { + this.maxH.attr('aria-valuenow', this.scope.rzSliderHigh); + this.maxH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderHigh)); + this.maxH.attr('aria-valuemin', this.minValue); + this.maxH.attr('aria-valuemax', this.maxValue); + } }, /** @@ -1126,9 +1158,11 @@ this.ticks.on('touchstart', angular.bind(this, this.onStart, null, null)); this.ticks.on('touchstart', angular.bind(this, this.onMove, this.ticks)); - this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')) - if (this.range) { - this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh')); + if (this.options.keyboardSupport) { + this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')) + if (this.range) { + this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh')); + } } }, @@ -1172,7 +1206,9 @@ } pointer.addClass('rz-active'); - pointer[0].focus(); + + if (this.options.keyboardSupport) + pointer[0].focus(); ehMove = angular.bind(this, this.dragging.active ? this.onDragMove : this.onMove, pointer); ehEnd = angular.bind(this, this.onEnd, ehMove); @@ -1221,29 +1257,26 @@ onEnd: function(ehMove, event) { var moveEventName = this.getEventNames(event).moveEvent; - //this.minH.removeClass('rz-active'); - //this.maxH.removeClass('rz-active'); + if (!this.options.keyboardSupport) { + this.minH.removeClass('rz-active'); + this.maxH.removeClass('rz-active'); + this.tracking = ''; + } + this.dragging.active = false; $document.off(moveEventName, ehMove); - this.scope.$emit('slideEnded'); - //this.tracking = ''; - - this.dragging.active = false; this.callOnEnd(); }, onPointerFocus: function(pointer, ref, event) { - //if (this.tracking === ref) return; this.tracking = ref; - console.info('focused', ref); pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer)); pointer.on('keydown', angular.bind(this, this.onKeyboardEvent)); pointer.addClass('rz-active'); }, onPointerBlur: function(pointer, event) { - console.info('blured', this.tracking); pointer.off('keydown'); this.tracking = ''; pointer.removeClass('rz-active'); @@ -1386,6 +1419,7 @@ switched = true; this.scope[this.tracking] = this.scope.rzSliderHigh; this.updateHandles(this.tracking, this.maxH.rzsp); + this.updateAriaAttributes(); this.tracking = 'rzSliderHigh'; this.minH.removeClass('rz-active'); this.maxH.addClass('rz-active'); @@ -1394,6 +1428,7 @@ switched = true; this.scope[this.tracking] = this.scope.rzSliderModel; this.updateHandles(this.tracking, this.minH.rzsp); + this.updateAriaAttributes(); this.tracking = 'rzSliderModel'; this.maxH.removeClass('rz-active'); this.minH.addClass('rz-active'); @@ -1404,6 +1439,7 @@ if (this.scope[this.tracking] !== newValue) { this.scope[this.tracking] = newValue; this.updateHandles(this.tracking, newOffset); + this.updateAriaAttributes(); valueChanged = true; } From 4ebb630c0aee2c0865f6e485c0eff3694dfc0032 Mon Sep 17 00:00:00 2001 From: Valentin Hervieu Date: Thu, 17 Dec 2015 10:45:59 +0100 Subject: [PATCH 05/11] Handle switching min/max with mouse when keyboardSupport is on. --- dist/rzslider.js | 16 ++++++++-------- dist/rzslider.min.js | 2 +- src/rzslider.js | 16 ++++++++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/dist/rzslider.js b/dist/rzslider.js index 00fd24b..48af913 100644 --- a/dist/rzslider.js +++ b/dist/rzslider.js @@ -1159,7 +1159,7 @@ this.ticks.on('touchstart', angular.bind(this, this.onMove, this.ticks)); if (this.options.keyboardSupport) { - this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')) + this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')); if (this.range) { this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh')); } @@ -1269,14 +1269,14 @@ this.callOnEnd(); }, - onPointerFocus: function(pointer, ref, event) { + onPointerFocus: function(pointer, ref) { this.tracking = ref; pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer)); pointer.on('keydown', angular.bind(this, this.onKeyboardEvent)); pointer.addClass('rz-active'); }, - onPointerBlur: function(pointer, event) { + onPointerBlur: function(pointer) { pointer.off('keydown'); this.tracking = ''; pointer.removeClass('rz-active'); @@ -1312,11 +1312,7 @@ var newValue = this.roundStep(this.sanitizeValue(action)), newOffset = this.valueToOffset(newValue); - var switched = this.positionTrackingHandle(newValue, newOffset); - if (switched) { - var pointer = this.tracking === 'rzSliderModel' ? this.minH : this.maxH; - pointer[0].focus(); //to focus the correct pointer - } + this.positionTrackingHandle(newValue, newOffset); }, /** @@ -1423,6 +1419,8 @@ this.tracking = 'rzSliderHigh'; this.minH.removeClass('rz-active'); this.maxH.addClass('rz-active'); + if (this.options.keyboardSupport) + this.maxH[0].focus(); valueChanged = true; } else if (this.tracking === 'rzSliderHigh' && newValue <= this.scope.rzSliderModel) { switched = true; @@ -1432,6 +1430,8 @@ this.tracking = 'rzSliderModel'; this.maxH.removeClass('rz-active'); this.minH.addClass('rz-active'); + if (this.options.keyboardSupport) + this.minH[0].focus(); valueChanged = true; } } diff --git a/dist/rzslider.min.js b/dist/rzslider.min.js index b7f2864..a598098 100644 --- a/dist/rzslider.min.js +++ b/dist/rzslider.min.js @@ -1,2 +1,2 @@ /*! angularjs-slider - v2.2.0 - (c) Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu , https://github.com/rzajac/angularjs-slider.git - 2015-12-18 */ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,keyboardSupport:!0,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.manageEventsBindings()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.updateAriaAttributes(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel(),h.updateAriaAttributes()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.minH.attr("role","slider"),this.updateAriaAttributes(),this.options.keyboardSupport&&this.minH.attr("tabindex","0"),this.options.vertical&&this.minH.attr("aria-orientation","vertical"),this.range&&(this.maxH.attr("role","slider"),this.options.keyboardSupport&&this.maxH.attr("tabindex","0"),this.options.vertical&&this.maxH.attr("aria-orientation","vertical"))},updateAriaAttributes:function(){this.minH.attr("aria-valuenow",this.scope.rzSliderModel),this.minH.attr("aria-valuetext",this.customTrFn(this.scope.rzSliderModel)),this.minH.attr("aria-valuemin",this.minValue),this.minH.attr("aria-valuemax",this.maxValue),this.range&&(this.maxH.attr("aria-valuenow",this.scope.rzSliderHigh),this.maxH.attr("aria-valuetext",this.customTrFn(this.scope.rzSliderHigh)),this.maxH.attr("aria-valuemin",this.minValue),this.maxH.attr("aria-valuemax",this.maxValue))},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;this.options.keyboardSupport||(this.minH.removeClass("rz-active"),this.maxH.removeClass("rz-active"),this.tracking=""),this.dragging.active=!1,c.off(d,a),this.scope.$emit("slideEnded"),this.callOnEnd()},onPointerFocus:function(b,c,d){this.tracking=c,b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a,b){a.off("keydown"),this.tracking="",a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=this.scope[this.tracking],c=a.keyCode||a.which,d={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"},e={UP:b+this.step,DOWN:b-this.step,LEFT:b-this.step,RIGHT:b+this.step,PAGEUP:b+this.valueRange/10,PAGEDOWN:b-this.valueRange/10,HOME:this.minValue,END:this.maxValue},f=d[c],g=e[f];if(null!=g&&""!==this.tracking){a.preventDefault();var h=this.roundStep(this.sanitizeValue(g)),i=this.valueToOffset(h),j=this.positionTrackingHandle(h,i);if(j){var k="rzSliderModel"===this.tracking?this.minH:this.maxH;k[0].focus()}}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),this.updateAriaAttributes(),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file +!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,keyboardSupport:!0,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.manageEventsBindings()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.updateAriaAttributes(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel(),h.updateAriaAttributes()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.minH.attr("role","slider"),this.updateAriaAttributes(),this.options.keyboardSupport&&this.minH.attr("tabindex","0"),this.options.vertical&&this.minH.attr("aria-orientation","vertical"),this.range&&(this.maxH.attr("role","slider"),this.options.keyboardSupport&&this.maxH.attr("tabindex","0"),this.options.vertical&&this.maxH.attr("aria-orientation","vertical"))},updateAriaAttributes:function(){this.minH.attr("aria-valuenow",this.scope.rzSliderModel),this.minH.attr("aria-valuetext",this.customTrFn(this.scope.rzSliderModel)),this.minH.attr("aria-valuemin",this.minValue),this.minH.attr("aria-valuemax",this.maxValue),this.range&&(this.maxH.attr("aria-valuenow",this.scope.rzSliderHigh),this.maxH.attr("aria-valuetext",this.customTrFn(this.scope.rzSliderHigh)),this.maxH.attr("aria-valuemin",this.minValue),this.maxH.attr("aria-valuemax",this.maxValue))},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;this.options.keyboardSupport||(this.minH.removeClass("rz-active"),this.maxH.removeClass("rz-active"),this.tracking=""),this.dragging.active=!1,c.off(d,a),this.scope.$emit("slideEnded"),this.callOnEnd()},onPointerFocus:function(b,c){this.tracking=c,b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a){a.off("keydown"),this.tracking="",a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=this.scope[this.tracking],c=a.keyCode||a.which,d={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"},e={UP:b+this.step,DOWN:b-this.step,LEFT:b-this.step,RIGHT:b+this.step,PAGEUP:b+this.valueRange/10,PAGEDOWN:b-this.valueRange/10,HOME:this.minValue,END:this.maxValue},f=d[c],g=e[f];if(null!=g&&""!==this.tracking){a.preventDefault();var h=this.roundStep(this.sanitizeValue(g)),i=this.valueToOffset(h);this.positionTrackingHandle(h,i)}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),this.options.keyboardSupport&&this.maxH[0].focus(),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),this.options.keyboardSupport&&this.minH[0].focus(),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),this.updateAriaAttributes(),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file diff --git a/src/rzslider.js b/src/rzslider.js index f6a6f80..b02963a 100644 --- a/src/rzslider.js +++ b/src/rzslider.js @@ -1159,7 +1159,7 @@ this.ticks.on('touchstart', angular.bind(this, this.onMove, this.ticks)); if (this.options.keyboardSupport) { - this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')) + this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel')); if (this.range) { this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh')); } @@ -1269,14 +1269,14 @@ this.callOnEnd(); }, - onPointerFocus: function(pointer, ref, event) { + onPointerFocus: function(pointer, ref) { this.tracking = ref; pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer)); pointer.on('keydown', angular.bind(this, this.onKeyboardEvent)); pointer.addClass('rz-active'); }, - onPointerBlur: function(pointer, event) { + onPointerBlur: function(pointer) { pointer.off('keydown'); this.tracking = ''; pointer.removeClass('rz-active'); @@ -1312,11 +1312,7 @@ var newValue = this.roundStep(this.sanitizeValue(action)), newOffset = this.valueToOffset(newValue); - var switched = this.positionTrackingHandle(newValue, newOffset); - if (switched) { - var pointer = this.tracking === 'rzSliderModel' ? this.minH : this.maxH; - pointer[0].focus(); //to focus the correct pointer - } + this.positionTrackingHandle(newValue, newOffset); }, /** @@ -1423,6 +1419,8 @@ this.tracking = 'rzSliderHigh'; this.minH.removeClass('rz-active'); this.maxH.addClass('rz-active'); + if (this.options.keyboardSupport) + this.maxH[0].focus(); valueChanged = true; } else if (this.tracking === 'rzSliderHigh' && newValue <= this.scope.rzSliderModel) { switched = true; @@ -1432,6 +1430,8 @@ this.tracking = 'rzSliderModel'; this.maxH.removeClass('rz-active'); this.minH.addClass('rz-active'); + if (this.options.keyboardSupport) + this.minH[0].focus(); valueChanged = true; } } From f465d231997325097e09ad4ce8ad76ed675a8adb Mon Sep 17 00:00:00 2001 From: George Batalinski Date: Tue, 15 Dec 2015 16:13:44 -0500 Subject: [PATCH 06/11] setup tests --- Gruntfile.js | 19 ++++++--- karma.conf.js | 61 ++++++++++++++++++++++++++++ package.json | 15 ++++++- tests/spec/rz-slider-service-test.js | 30 ++++++++++++++ 4 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 karma.conf.js create mode 100644 tests/spec/rz-slider-service-test.js diff --git a/Gruntfile.js b/Gruntfile.js index fd6d2d3..c9aef86 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,12 +1,12 @@ -module.exports = function(grunt) { +module.exports = function (grunt) { // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), minBanner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + - '(c) <%= pkg.author %>, <%= pkg.repository.url %> - ' + - '<%= grunt.template.today("yyyy-mm-dd") %> */\n', + '(c) <%= pkg.author %>, <%= pkg.repository.url %> - ' + + '<%= grunt.template.today("yyyy-mm-dd") %> */\n', recess: { options: { @@ -58,10 +58,10 @@ module.exports = function(grunt) { removeStyleLinkTypeAttributes: true }, module: 'rzModule', - url: function(url) { + url: function (url) { return url.replace('src/', ''); }, - bootstrap: function(module, script) { + bootstrap: function (module, script) { return 'module.run(function($templateCache) {\n' + script + '\n});'; } } @@ -118,8 +118,13 @@ module.exports = function(grunt) { options: { port: 9000 } + }, + karma: { + unit: { + configFile: 'karma.conf.js', + singleRun: true + } } - }); grunt.loadNpmTasks('grunt-contrib-uglify'); @@ -129,8 +134,10 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-ng-annotate'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-serve'); + grunt.loadNpmTasks('grunt-karma'); grunt.registerTask('default', ['css', 'js']); + grunt.registerTask('test', ['karma']); grunt.registerTask('css', ['recess']); grunt.registerTask('js', ['ngtemplates', 'replace', 'ngAnnotate', 'uglify']); diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..35f26c8 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,61 @@ +'use strict'; + +module.exports = function (config) { + config.set({ + // base path, that will be used to resolve files and exclude + basePath: '', + + // testing framework to use (jasmine/mocha/qunit/...) + frameworks: ['mocha', 'chai', 'chai-things', 'chai-as-promised'], + + // list of files / patterns to load in the browser + files: [ + 'bower_components/angular/angular.js', + 'node_modules/angular-mocks/angular-mocks.js', + 'src/*.js', + 'tests/spec/*.js', + 'src/*.html' + ], + + // list of files / patterns to exclude + exclude: [], + + // preprocess matching files before serving them to the browser + preprocessors: { + "src/*Tpl.html": 'ng-html2js' + }, + + ngHtml2JsPreprocessor: { + stripPrefix: 'src/', + moduleName: 'appTemplates' + }, + + // web server port + port: 9998, + + // level of logging + // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: false, + + + // Start these browsers, currently available: + // - Chrome + // - ChromeCanary + // - Firefox + // - Opera + // - Safari (only Mac) + // - PhantomJS + // - IE (only Windows) + browsers: ['PhantomJS'], + + // Continuous Integration mode + // if true, it capture browsers, run tests and exit + singleRun: false + }) + ; +} +; diff --git a/package.json b/package.json index e53c3e2..c12cbd5 100644 --- a/package.json +++ b/package.json @@ -12,15 +12,28 @@ "slider" ], "devDependencies": { + "angular-mocks": "^1.4.8", + "chai": "^3.4.1", + "chai-as-promised": "^5.1.0", + "chai-things": "^0.2.0", "grunt": "~0.4.2", "grunt-angular-templates": "^0.5.7", "grunt-contrib-mincss": "~0.3.2", "grunt-contrib-uglify": "~0.2.2", + "grunt-contrib-watch": "^0.6.1", + "grunt-karma": "^0.12.1", "grunt-ng-annotate": "^1.0.1", "grunt-recess": "~0.4.0", "grunt-replace": "^0.11.0", - "grunt-contrib-watch": "^0.6.1", "grunt-serve": "^0.1.6", + "karma": "^0.13.15", + "karma-chai-plugins": "^0.6.1", + "karma-chrome-launcher": "^0.2.2", + "karma-mocha": "^0.2.1", + "karma-ng-html2js-preprocessor": "^0.2.0", + "karma-phantomjs-launcher": "^0.2.1", + "mocha": "^2.3.4", + "phantomjs": "^1.9.19", "recess": "~1.1.9" }, "author": "Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu ", diff --git a/tests/spec/rz-slider-service-test.js b/tests/spec/rz-slider-service-test.js new file mode 100644 index 0000000..d511545 --- /dev/null +++ b/tests/spec/rz-slider-service-test.js @@ -0,0 +1,30 @@ +'use strict'; + +describe('rzslider api', function () { + var RzSlider; + var $rootScope; + var scope; + var $compile; + var element; + var $httpBackend; + beforeEach(module('rzModule')); + beforeEach(module('appTemplates')); + + beforeEach(inject(function (_RzSlider_, _$rootScope_, _$compile_, _$httpBackend_) { + RzSlider = _RzSlider_; + $rootScope = _$rootScope_; + $compile = _$compile_; + $httpBackend = _$httpBackend_; + })); + + it('should exist compiled', function () { + scope = $rootScope.$new(); + scope.minSlider = { + value: 10 + }; + element = $compile("")($rootScope); + $rootScope.$digest(); + expect(element.find('span')).to.have.length(11); + }); + +}); From c386eccb1b6cd9e016850ea59bce09656dcf5ec4 Mon Sep 17 00:00:00 2001 From: George Batalinski Date: Wed, 16 Dec 2015 16:47:07 -0500 Subject: [PATCH 07/11] add coverage and first test --- bower.json | 8 +- karma.conf.js | 9 + package.json | 1 + .../base.css | 212 + .../index.html | 93 + .../prettify.css | 1 + .../prettify.js | 1 + .../sort-arrow-sprite.png | Bin 0 -> 209 bytes .../sorter.js | 158 + .../src/index.html | 93 + .../src/rzslider.js.html | 4661 +++++++++++++++++ tests/spec/rz-slider-service-test.js | 31 +- 12 files changed, 5262 insertions(+), 6 deletions(-) create mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/base.css create mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/index.html create mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.css create mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.js create mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/sort-arrow-sprite.png create mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/sorter.js create mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/index.html create mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/rzslider.js.html diff --git a/bower.json b/bower.json index 7712d4d..c7b8ad5 100644 --- a/bower.json +++ b/bower.json @@ -8,7 +8,10 @@ "Jussi Saarivirta " ], "description": "AngularJS slider directive with no external dependencies. Mobile friendly!", - "main": ["dist/rzslider.js", "dist/rzslider.css"], + "main": [ + "dist/rzslider.js", + "dist/rzslider.css" + ], "keywords": [ "angularjs", "slider" @@ -22,6 +25,7 @@ "tests" ], "devDependencies": { - "angular": "~1.4.0" + "angular": "~1.4.0", + "jquery": "~2.1.4" } } diff --git a/karma.conf.js b/karma.conf.js index 35f26c8..3c7c583 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -8,9 +8,12 @@ module.exports = function (config) { // testing framework to use (jasmine/mocha/qunit/...) frameworks: ['mocha', 'chai', 'chai-things', 'chai-as-promised'], + reporters: ['progress', 'coverage'], + // list of files / patterns to load in the browser files: [ 'bower_components/angular/angular.js', + 'bower_components/jquery/dist/jquery.js', 'node_modules/angular-mocks/angular-mocks.js', 'src/*.js', 'tests/spec/*.js', @@ -22,6 +25,7 @@ module.exports = function (config) { // preprocess matching files before serving them to the browser preprocessors: { + "src/*.js": ['coverage'], "src/*Tpl.html": 'ng-html2js' }, @@ -41,6 +45,11 @@ module.exports = function (config) { // enable / disable watching file and executing tests whenever any file changes autoWatch: false, + coverageReporter: { + type: 'html', + dir: 'tests/coverage' + }, + // Start these browsers, currently available: // - Chrome diff --git a/package.json b/package.json index c12cbd5..8afce6d 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "karma": "^0.13.15", "karma-chai-plugins": "^0.6.1", "karma-chrome-launcher": "^0.2.2", + "karma-coverage": "^0.5.3", "karma-mocha": "^0.2.1", "karma-ng-html2js-preprocessor": "^0.2.0", "karma-phantomjs-launcher": "^0.2.1", diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/base.css b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/base.css new file mode 100644 index 0000000..0c0571d --- /dev/null +++ b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/base.css @@ -0,0 +1,212 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px;; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } + + +.medium .chart { border:1px solid #666; } +.medium .cover-fill { background: #666; } + +.cbranch-no { background: yellow !important; color: #111; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } +.medium { background: #eaeaea; } + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/index.html b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/index.html new file mode 100644 index 0000000..67f0e5b --- /dev/null +++ b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/index.html @@ -0,0 +1,93 @@ + + + + Code coverage report for All files + + + + + + + +
+
+

+ / +

+
+
+ 44.54% + Statements + 261/586 +
+
+ 32.62% + Branches + 91/279 +
+
+ 54.88% + Functions + 45/82 +
+
+ 44.67% + Lines + 260/582 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src/
44.54%261/58632.62%91/27954.88%45/8244.67%260/582
+
+
+ + + + + + + diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.css b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.js b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.js new file mode 100644 index 0000000..ef51e03 --- /dev/null +++ b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/sort-arrow-sprite.png b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/index.html b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/index.html new file mode 100644 index 0000000..4beeb46 --- /dev/null +++ b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/index.html @@ -0,0 +1,93 @@ + + + + Code coverage report for src\ + + + + + + + +
+
+

+ all files src/ +

+
+
+ 44.54% + Statements + 261/586 +
+
+ 32.62% + Branches + 91/279 +
+
+ 54.88% + Functions + 45/82 +
+
+ 44.67% + Lines + 260/582 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
rzslider.js
44.54%261/58632.62%91/27954.88%45/8244.67%260/582
+
+
+ + + + + + + diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/rzslider.js.html b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/rzslider.js.html new file mode 100644 index 0000000..1818535 --- /dev/null +++ b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/rzslider.js.html @@ -0,0 +1,4661 @@ + + + + Code coverage report for src\rzslider.js + + + + + + + +
+
+

+ all files / src/ rzslider.js +

+
+
+ 44.54% + Statements + 261/586 +
+
+ 32.62% + Branches + 91/279 +
+
+ 54.88% + Functions + 45/82 +
+
+ 44.67% + Lines + 260/582 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533  +  +  +  +  +  +  +  +  +  +  +  +  +1× +  +1× +  +  +1× +  +  +  +  +  +  +  +1× +  +  +  +  +1× +  +  +2× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2× +  +2× +  +  +  +  +  +  +  +  +  +2× +  +  +  +2× +4× +  +  +2× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8× +  +  +8× +8× +8× +8× +8× +  +  +  +  +  +8× +1× +1× +  +  +1× +1× +1× +1× +1× +1× +1× +1× +1× +  +  +  +1× +  +  +  +  +  +  +  +  +  +  +  +  +  +2× +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +  +  +  +  +  +  +4× +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +  +  +  +  +  +4× +  +  +  +  +  +  +4× +  +  +4× +4× +4× +4× +4× +4× +4× +4× +4× +4× +  +  +4× +  +  +  +2× +  +  +  +  +  +  +  +4× +  +  +  +4× +4× +4× +4× +4× +4× +4× +  +4× +  +  +  +  +  +  +  +4× +  +  +4× +  +4× +  +  +4× +  +  +  +4× +1× +1× +1× +1× +1× +  +1× +  +  +  +  +  +4× +  +  +  +  +  +  +  +  +4× +  +  +  +  +  +  +  +  +  +4× +4× +3× +1× +  +  +4× +4× +4× +  +  +  +  +  +  +  +  +4× +4× +4× +  +  +  +  +4× +  +  +  +  +  +  +  +  +  +4× +  +4× +  +4× +4× +4× +  +4× +  +  +  +  +  +  +4× +  +  +4× +8× +  +  +4× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4× +40× +  +40× +  +4× +4× +  +4× +4× +  +4× +4× +  +4× +4× +  +4× +4× +  +4× +4× +  +4× +4× +  +4× +4× +  +4× +4× +  +4× +4× +  +  +  +  +  +4× +4× +4× +4× +4× +4× +4× +4× +  +  +  +  +  +  +  +4× +4× +  +  +  +4× +4× +4× +4× +4× +4× +  +4× +4× +  +4× +  +  +4× +  +  +  +24× +24× +12× +  +12× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4× +  +  +4× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2× +  +2× +  +  +2× +2× +2× +  +  +2× +  +  +2× +2× +  +  +  +  +  +  +  +  +  +  +5× +5× +  +5× +5× +  +  +5× +  +5× +1× +  +4× +  +5× +  +  +  +  +  +  +  +  +  +  +4× +4× +4× +4× +4× +  +  +4× +  +  +  +  +  +  +  +  +  +  +  +  +6× +6× +6× +6× +6× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4× +  +4× +4× +  +4× +  +4× +4× +  +4× +  +  +  +  +  +  +  +  +  +  +  +  +2× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1× +1× +1× +1× +  +1× +  +  +1× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2× +2× +2× +2× +  +2× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2× +  +  +2× +  +  +  +2× +2× +  +  +2× +  +  +  +2× +2× +  +  +2× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2× +2× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +12× +  +  +  +12× +12× +  +  +  +  +  +  +  +  +  +12× +  +  +  +  +  +  +  +  +  +  +  +16× +  +  +  +16× +  +  +  +  +  +  +  +  +  +  +  +  +6× +6× +6× +6× +6× +  +  +  +  +  +  +  +  +  +14× +14× +  +  +14× +14× +  +  +  +  +  +  +  +  +  +  +2× +2× +2× +2× +2× +  +  +  +  +  +  +  +  +  +2× +  +  +  +  +  +  +  +  +  +3× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1× +1× +1× +1× +  +  +  +  +  +  +  +  +  +1× +1× +1× +  +  +  +  +  +  +  +  +  +  +1× +  +  +  +  +  +  +  +  +  +1× +1× +1× +1× +  +1× +  +1× +1× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1× +1× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1× +1× +1× +1× +1× +1× +  +1× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2× +  +  +  +  +  +2× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3× +  +  +  +3× +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1× +  + 
/**
+ * Angular JS slider directive
+ *
+ * (c) Rafal Zajac <rzajac@gmail.com>
+ * http://github.com/rzajac/angularjs-slider
+ *
+ * Version: v2.1.0
+ *
+ * Licensed under the MIT license
+ */
+ 
+/*jslint unparam: true */
+/*global angular: false, console: false, define, module */
+(function (root, factory) {
+  'use strict';
+  Iif (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module.
+    define(['angular'], factory);
+  } else Iif (typeof module === 'object' && module.exports) {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    // to support bundler like browserify
+    module.exports = factory(require('angular'));
+  } else {
+    // Browser globals (root is window)
+    factory(root.angular);
+  }
+ 
+}(this, function (angular) {
+  'use strict';
+  var module = angular.module('rzModule', [])
+ 
+    .factory('RzSliderOptions', function () {
+      var defaultOptions = {
+        floor: 0,
+        ceil: null, //defaults to rz-slider-model
+        step: 1,
+        precision: 0,
+        id: null,
+        translate: null,
+        stepsArray: null,
+        draggableRange: false,
+        showSelectionBar: false,
+        hideLimitLabels: false,
+        readOnly: false,
+        disabled: false,
+        interval: 350,
+        showTicks: false,
+        showTicksValues: false,
+        ticksValuesTooltip: null,
+        vertical: false,
+        keyboardSupport: true,
+        scale: 1,
+        onStart: null,
+        onChange: null,
+        onEnd: null
+      };
+      var globalOptions = {};
+ 
+      var factory = {};
+      /**
+       * `options({})` allows global configuration of all sliders in the
+       * application.
+       *
+       *   var app = angular.module( 'App', ['rzModule'], function( RzSliderOptions ) {
+     *     // show ticks for all sliders
+     *     RzSliderOptions.options( { showTicks: true } );
+     *   });
+       */
+      factory.options = function (value) {
+        angular.extend(globalOptions, value);
+      };
+ 
+      factory.getOptions = function (options) {
+        return angular.extend({}, defaultOptions, globalOptions, options);
+      };
+ 
+      return factory;
+    })
+ 
+    .value('rzThrottle',
+    /**
+     * rzThrottle
+     *
+     * Taken from underscore project
+     *
+     * @param {Function} func
+     * @param {number} wait
+     * @param {ThrottleOptions} options
+     * @returns {Function}
+     */
+    function throttle(func, wait, options) {
+      'use strict';
+      var getTime = (Date.now || function () {
+        return new Date().getTime();
+      });
+      var context, args, result;
+      var timeout = null;
+      var previous = 0;
+      options = options || {};
+      var later = function () {
+        previous = options.leading === false ? 0 : getTime();
+        timeout = null;
+        result = func.apply(context, args);
+        context = args = null;
+      };
+      return function () {
+        var now = getTime();
+        Iif (!previous && options.leading === false) {
+          previous = now;
+        }
+        var remaining = wait - (now - previous);
+        context = this;
+        args = arguments;
+        Eif (remaining <= 0) {
+          clearTimeout(timeout);
+          timeout = null;
+          previous = now;
+          result = func.apply(context, args);
+          context = args = null;
+        } else if (!timeout && options.trailing !== false) {
+          timeout = setTimeout(later, remaining);
+        }
+        return result;
+      };
+    })
+ 
+    .factory('RzSlider', function ($timeout, $document, $window, $compile, RzSliderOptions, rzThrottle) {
+      'use strict';
+ 
+      /**
+       * Slider
+       *
+       * @param {ngScope} scope            The AngularJS scope
+       * @param {Element} sliderElem The slider directive element wrapped in jqLite
+       * @constructor
+       */
+      var Slider = function (scope, sliderElem) {
+        /**
+         * The slider's scope
+         *
+         * @type {ngScope}
+         */
+        this.scope = scope;
+ 
+        /**
+         * Slider element wrapped in jqLite
+         *
+         * @type {jqLite}
+         */
+        this.sliderElem = sliderElem;
+ 
+        /**
+         * Slider type
+         *
+         * @type {boolean} Set to true for range slider
+         */
+        this.range = this.scope.rzSliderModel !== undefined && this.scope.rzSliderHigh !== undefined;
+ 
+        /**
+         * Values recorded when first dragging the bar
+         *
+         * @type {Object}
+         */
+        this.dragging = {
+          active: false,
+          value: 0,
+          difference: 0,
+          offset: 0,
+          lowDist: 0,
+          highDist: 0
+        };
+ 
+        /**
+         * property that handle position (defaults to left for horizontal)
+         * @type {string}
+         */
+        this.positionProperty = 'left';
+ 
+        /**
+         * property that handle dimension (defaults to width for horizontal)
+         * @type {string}
+         */
+        this.dimensionProperty = 'width';
+ 
+        /**
+         * Half of the width or height of the slider handles
+         *
+         * @type {number}
+         */
+        this.handleHalfDim = 0;
+ 
+        /**
+         * Maximum position the slider handle can have
+         *
+         * @type {number}
+         */
+        this.maxPos = 0;
+ 
+        /**
+         * Precision
+         *
+         * @type {number}
+         */
+        this.precision = 0;
+ 
+        /**
+         * Step
+         *
+         * @type {number}
+         */
+        this.step = 0;
+ 
+        /**
+         * The name of the handle we are currently tracking
+         *
+         * @type {string}
+         */
+        this.tracking = '';
+ 
+        /**
+         * Minimum value (floor) of the model
+         *
+         * @type {number}
+         */
+        this.minValue = 0;
+ 
+        /**
+         * Maximum value (ceiling) of the model
+         *
+         * @type {number}
+         */
+        this.maxValue = 0;
+ 
+ 
+        /**
+         * The delta between min and max value
+         *
+         * @type {number}
+         */
+        this.valueRange = 0;
+ 
+        /**
+         * Set to true if init method already executed
+         *
+         * @type {boolean}
+         */
+        this.initHasRun = false;
+ 
+        // Slider DOM elements wrapped in jqLite
+        this.fullBar = null; // The whole slider bar
+        this.selBar = null; // Highlight between two handles
+        this.minH = null; // Left slider handle
+        this.maxH = null; // Right slider handle
+        this.flrLab = null; // Floor label
+        this.ceilLab = null; // Ceiling label
+        this.minLab = null; // Label above the low value
+        this.maxLab = null; // Label above the high value
+        this.cmbLab = null; // Combined label
+        this.ticks = null; // The ticks
+ 
+        // Initialize slider
+        this.init();
+      };
+ 
+      // Add instance methods
+      Slider.prototype = {
+ 
+        /**
+         * Initialize slider
+         *
+         * @returns {undefined}
+         */
+        init: function () {
+          var thrLow, thrHigh,
+            calcDimFn = angular.bind(this, this.calcViewDimensions),
+            self = this;
+ 
+          this.applyOptions();
+          this.initElemHandles();
+          this.manageElementsStyle();
+          this.addAccessibility();
+          this.setDisabledState();
+          this.calcViewDimensions();
+          this.setMinAndMax();
+ 
+          $timeout(function () {
+            self.updateCeilLab();
+            self.updateFloorLab();
+            self.initHandles();
+            self.manageEventsBindings();
+          });
+ 
+          // Recalculate slider view dimensions
+          this.scope.$on('reCalcViewDimensions', calcDimFn);
+ 
+          // Recalculate stuff if view port dimensions have changed
+          angular.element($window).on('resize', calcDimFn);
+ 
+          Iif (this.options.vertical)
+            this.sliderElem.addClass('vertical');
+ 
+          this.initHasRun = true;
+ 
+          // Watch for changes to the model
+ 
+          thrLow = rzThrottle(function () {
+            self.setMinAndMax();
+            self.updateLowHandle(self.valueToOffset(self.scope.rzSliderModel));
+            self.updateSelectionBar();
+            self.updateTicksScale();
+            self.updateAriaAttributes();
+ 
+            Iif (self.range) {
+              self.updateCmbLabel();
+            }
+ 
+          }, self.options.interval);
+ 
+          thrHigh = rzThrottle(function () {
+            self.setMinAndMax();
+            self.updateHighHandle(self.valueToOffset(self.scope.rzSliderHigh));
+            self.updateSelectionBar();
+            self.updateTicksScale();
+            self.updateCmbLabel();
+            self.updateAriaAttributes();
+          }, self.options.interval);
+ 
+          this.scope.$on('rzSliderForceRender', function () {
+            self.resetLabelsValue();
+            thrLow();
+            if (self.range) {
+              thrHigh();
+            }
+            self.resetSlider();
+          });
+ 
+          // Watchers
+          this.scope.$watch('rzSliderModel', function (newValue, oldValue) {
+            if (newValue === oldValue)
+              return;
+            thrLow();
+          });
+ 
+          this.scope.$watch('rzSliderHigh', function (newValue, oldValue) {
+            Eif (newValue === oldValue)
+              return;
+            if (newValue != null)
+              thrHigh();
+            if (self.range && newValue == null || !self.range && newValue != null) {
+              self.applyOptions();
+              self.resetSlider();
+            }
+          });
+ 
+          this.scope.$watch('rzSliderOptions', function (newValue, oldValue) {
+            Eif (newValue === oldValue)
+              return;
+            self.applyOptions();
+            self.resetSlider();
+          }, true);
+ 
+          this.scope.$on('$destroy', function () {
+            self.unbindEvents();
+            angular.element($window).off('resize', calcDimFn);
+          });
+        },
+ 
+        /**
+         * Read the user options and apply them to the slider model
+         */
+        applyOptions: function () {
+          this.options = RzSliderOptions.getOptions(this.scope.rzSliderOptions);
+ 
+          Iif (this.options.step <= 0)
+            this.options.step = 1;
+          this.range = this.scope.rzSliderModel !== undefined && this.scope.rzSliderHigh !== undefined;
+          this.options.draggableRange = this.range && this.options.draggableRange;
+          this.options.showTicks = this.options.showTicks || this.options.showTicksValues;
+ 
+          Iif (this.options.stepsArray) {
+            this.options.floor = 0;
+            this.options.ceil = this.options.stepsArray.length - 1;
+            this.options.step = 1;
+            this.customTrFn = function (value) {
+              return this.options.stepsArray[value];
+            };
+          } else Iif (this.options.translate)
+            this.customTrFn = this.options.translate;
+          else
+            this.customTrFn = function (value) {
+              return String(value);
+            };
+ 
+          Iif (this.options.vertical) {
+            this.positionProperty = 'bottom';
+            this.dimensionProperty = 'height';
+          }
+        },
+ 
+        /**
+         * Resets slider
+         *
+         * @returns {undefined}
+         */
+        resetSlider: function () {
+          this.manageElementsStyle();
+          this.setMinAndMax();
+          this.updateCeilLab();
+          this.updateFloorLab();
+          this.unbindEvents();
+          this.manageEventsBindings();
+          this.setDisabledState();
+          this.calcViewDimensions();
+        },
+ 
+        /**
+         * Set the slider children to variables for easy access
+         *
+         * Run only once during initialization
+         *
+         * @returns {undefined}
+         */
+        initElemHandles: function () {
+          // Assign all slider elements to object properties for easy access
+          angular.forEach(this.sliderElem.children(), function (elem, index) {
+            var jElem = angular.element(elem);
+ 
+            switch (index) {
+              case 0:
+                this.fullBar = jElem;
+                break;
+              case 1:
+                this.selBar = jElem;
+                break;
+              case 2:
+                this.minH = jElem;
+                break;
+              case 3:
+                this.maxH = jElem;
+                break;
+              case 4:
+                this.flrLab = jElem;
+                break;
+              case 5:
+                this.ceilLab = jElem;
+                break;
+              case 6:
+                this.minLab = jElem;
+                break;
+              case 7:
+                this.maxLab = jElem;
+                break;
+              case 8:
+                this.cmbLab = jElem;
+                break;
+              case 9:
+                this.ticks = jElem;
+                break;
+            }
+ 
+          }, this);
+ 
+          // Initialize offset cache properties
+          this.selBar.rzsp = 0;
+          this.minH.rzsp = 0;
+          this.maxH.rzsp = 0;
+          this.flrLab.rzsp = 0;
+          this.ceilLab.rzsp = 0;
+          this.minLab.rzsp = 0;
+          this.maxLab.rzsp = 0;
+          this.cmbLab.rzsp = 0;
+        },
+ 
+        /** Update each elements style based on options
+         *
+         */
+        manageElementsStyle: function () {
+ 
+          Eif (!this.range)
+            this.maxH.css('display', 'none');
+          else
+            this.maxH.css('display', null);
+ 
+          this.alwaysHide(this.flrLab, this.options.showTicksValues || this.options.hideLimitLabels);
+          this.alwaysHide(this.ceilLab, this.options.showTicksValues || this.options.hideLimitLabels);
+          this.alwaysHide(this.minLab, this.options.showTicksValues);
+          this.alwaysHide(this.maxLab, this.options.showTicksValues || !this.range);
+          this.alwaysHide(this.cmbLab, this.options.showTicksValues || !this.range);
+          this.alwaysHide(this.selBar, !this.range && !this.options.showSelectionBar);
+ 
+          Eif (!this.options.showTicks)
+            this.ticks.html('');
+ 
+          Iif (this.options.draggableRange)
+            this.selBar.addClass('rz-draggable');
+          else
+            this.selBar.removeClass('rz-draggable');
+        },
+ 
+        alwaysHide: function (el, hide) {
+          el.rzAlwaysHide = hide;
+          if (hide)
+            this.hideEl(el);
+          else
+            this.showEl(el)
+        },
+ 
+        /**
+         * Manage the events bindings based on readOnly and disabled options
+         *
+         * @returns {undefined}
+         */
+        manageEventsBindings: function () {
+          if (this.options.disabled || this.options.readOnly)
+            this.unbindEvents();
+          else if (!this.options.disabled || !this.options.readOnly)
+            this.bindEvents();
+        },
+ 
+        /**
+         * Set the disabled state based on rzSliderDisabled
+         *
+         * @returns {undefined}
+         */
+        setDisabledState: function () {
+          Iif (this.options.disabled) {
+            this.sliderElem.attr('disabled', 'disabled');
+          } else {
+            this.sliderElem.attr('disabled', null);
+          }
+        },
+ 
+        /**
+         * Reset label values
+         *
+         * @return {undefined}
+         */
+        resetLabelsValue: function () {
+          this.minLab.rzsv = undefined;
+          this.maxLab.rzsv = undefined;
+        },
+ 
+        /**
+         * Initialize slider handles positions and labels
+         *
+         * Run only once during initialization and every time view port changes size
+         *
+         * @returns {undefined}
+         */
+        initHandles: function () {
+          this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel));
+ 
+          /*
+           the order here is important since the selection bar should be
+           updated after the high handle but before the combined label
+           */
+          if (this.range)
+            this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh));
+          this.updateSelectionBar();
+          if (this.range)
+            this.updateCmbLabel();
+ 
+          this.updateTicksScale();
+        },
+ 
+        /**
+         * Translate value to human readable format
+         *
+         * @param {number|string} value
+         * @param {jqLite} label
+         * @param {boolean} [useCustomTr]
+         * @returns {undefined}
+         */
+        translateFn: function (value, label, useCustomTr) {
+          useCustomTr = useCustomTr === undefined ? true : useCustomTr;
+ 
+          var valStr = String((useCustomTr ? this.customTrFn(value, this.options.id) : value)),
+            getDimension = false;
+ 
+          Eif (label.rzsv === undefined || label.rzsv.length !== valStr.length || (label.rzsv.length > 0 && label.rzsd === 0)) {
+            getDimension = true;
+            label.rzsv = valStr;
+          }
+ 
+          label.text(valStr);
+ 
+          // Update width only when length of the label have changed
+          Eif (getDimension) {
+            this.getDimension(label);
+          }
+        },
+ 
+        /**
+         * Set maximum and minimum values for the slider and ensure the model and high
+         * value match these limits
+         * @returns {undefined}
+         */
+        setMinAndMax: function () {
+ 
+          this.step = +this.options.step;
+          this.precision = +this.options.precision;
+ 
+          this.scope.rzSliderModel = this.roundStep(this.scope.rzSliderModel);
+          Iif (this.range)
+            this.scope.rzSliderHigh = this.roundStep(this.scope.rzSliderHigh);
+ 
+          this.minValue = this.roundStep(+this.options.floor);
+ 
+          if (this.options.ceil != null)
+            this.maxValue = this.roundStep(+this.options.ceil);
+          else
+            this.maxValue = this.options.ceil = this.range ? this.scope.rzSliderHigh : this.scope.rzSliderModel;
+ 
+          this.valueRange = this.maxValue - this.minValue;
+        },
+ 
+        /**
+         * Adds accessibility attributes
+         *
+         * Run only once during initialization
+         *
+         * @returns {undefined}
+         */
+        addAccessibility: function () {
+          this.minH.attr('role', 'slider');
+          this.updateAriaAttributes();
+          Eif (this.options.keyboardSupport)
+            this.minH.attr('tabindex', '0');
+          Iif (this.options.vertical)
+            this.minH.attr('aria-orientation', 'vertical');
+ 
+          Iif (this.range) {
+            this.maxH.attr('role', 'slider');
+            if (this.options.keyboardSupport)
+              this.maxH.attr('tabindex', '0');
+            if (this.options.vertical)
+              this.maxH.attr('aria-orientation', 'vertical');
+          }
+        },
+ 
+        /**
+         * Updates aria attributes according to current values
+         */
+        updateAriaAttributes: function () {
+          this.minH.attr('aria-valuenow', this.scope.rzSliderModel);
+          this.minH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderModel));
+          this.minH.attr('aria-valuemin', this.minValue);
+          this.minH.attr('aria-valuemax', this.maxValue);
+          Iif (this.range) {
+            this.maxH.attr('aria-valuenow', this.scope.rzSliderHigh);
+            this.maxH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderHigh));
+            this.maxH.attr('aria-valuemin', this.minValue);
+            this.maxH.attr('aria-valuemax', this.maxValue);
+          }
+        },
+ 
+        /**
+         * Calculate dimensions that are dependent on view port size
+         *
+         * Run once during initialization and every time view port changes size.
+         *
+         * @returns {undefined}
+         */
+        calcViewDimensions: function () {
+          var handleWidth = this.getDimension(this.minH);
+ 
+          this.handleHalfDim = handleWidth / 2;
+          this.barDimension = this.getDimension(this.fullBar);
+ 
+          this.maxPos = this.barDimension - handleWidth;
+ 
+          this.getDimension(this.sliderElem);
+          this.sliderElem.rzsp = this.sliderElem[0].getBoundingClientRect()[this.positionProperty];
+ 
+          Iif (this.initHasRun) {
+            this.updateFloorLab();
+            this.updateCeilLab();
+            this.initHandles();
+          }
+        },
+ 
+        /**
+         * Update the ticks position
+         *
+         * @returns {undefined}
+         */
+        updateTicksScale: function () {
+          Eif (!this.options.showTicks) return;
+          if (!this.step) return; //if step is 0, the following loop will be endless.
+ 
+          var positions = '',
+            ticksCount = Math.round((this.maxValue - this.minValue) / this.step) + 1;
+          for (var i = 0; i < ticksCount; i++) {
+            var value = this.roundStep(this.minValue + i * this.step);
+            var selectedClass = this.isTickSelected(value) ? 'selected' : '';
+            positions += '<li class="tick ' + selectedClass + '">';
+            if (this.options.showTicksValues) {
+              var tooltip = '';
+              if (this.options.ticksValuesTooltip) {
+                tooltip = 'uib-tooltip="' + this.options.ticksValuesTooltip(value) + '"';
+                if (this.options.vertical)
+                  tooltip += ' tooltip-placement="right"'
+              }
+              positions += '<span ' + tooltip + ' class="tick-value">' + this.getDisplayValue(value) + '</span>';
+            }
+            positions += '</li>';
+          }
+          this.ticks.html(positions);
+          if (this.options.ticksValuesTooltip)
+            $compile(this.ticks.contents())(this.scope);
+        },
+ 
+        isTickSelected: function (value) {
+          if (!this.range && this.options.showSelectionBar && value <= this.scope.rzSliderModel)
+            return true;
+          if (this.range && value >= this.scope.rzSliderModel && value <= this.scope.rzSliderHigh)
+            return true;
+          return false;
+        },
+ 
+        /**
+         * Update position of the ceiling label
+         *
+         * @returns {undefined}
+         */
+        updateCeilLab: function () {
+          this.translateFn(this.maxValue, this.ceilLab);
+          this.setPosition(this.ceilLab, this.barDimension - this.ceilLab.rzsd);
+          this.getDimension(this.ceilLab);
+        },
+ 
+        /**
+         * Update position of the floor label
+         *
+         * @returns {undefined}
+         */
+        updateFloorLab: function () {
+          this.translateFn(this.minValue, this.flrLab);
+          this.getDimension(this.flrLab);
+        },
+ 
+        /**
+         * Call the onStart callback if defined
+         *
+         * @returns {undefined}
+         */
+        callOnStart: function () {
+          if (this.options.onStart) {
+            var self = this;
+            $timeout(function () {
+              self.options.onStart(self.options.id);
+            });
+          }
+        },
+ 
+        /**
+         * Call the onChange callback if defined
+         *
+         * @returns {undefined}
+         */
+        callOnChange: function () {
+          Iif (this.options.onChange) {
+            var self = this;
+            $timeout(function () {
+              self.options.onChange(self.options.id);
+            });
+          }
+        },
+ 
+        /**
+         * Call the onEnd callback if defined
+         *
+         * @returns {undefined}
+         */
+        callOnEnd: function () {
+          if (this.options.onEnd) {
+            var self = this;
+            $timeout(function () {
+              self.options.onEnd(self.options.id);
+            });
+          }
+        },
+ 
+        /**
+         * Update slider handles and label positions
+         *
+         * @param {string} which
+         * @param {number} newOffset
+         */
+        updateHandles: function (which, newOffset) {
+          Eif (which === 'rzSliderModel') {
+            this.updateLowHandle(newOffset);
+            this.updateSelectionBar();
+            this.updateTicksScale();
+ 
+            Iif (this.range) {
+              this.updateCmbLabel();
+            }
+            return;
+          }
+ 
+          if (which === 'rzSliderHigh') {
+            this.updateHighHandle(newOffset);
+            this.updateSelectionBar();
+            this.updateTicksScale();
+ 
+            if (this.range) {
+              this.updateCmbLabel();
+            }
+            return;
+          }
+ 
+          // Update both
+          this.updateLowHandle(newOffset);
+          this.updateHighHandle(newOffset);
+          this.updateSelectionBar();
+          this.updateTicksScale();
+          this.updateCmbLabel();
+        },
+ 
+        /**
+         * Update low slider handle position and label
+         *
+         * @param {number} newOffset
+         * @returns {undefined}
+         */
+        updateLowHandle: function (newOffset) {
+          this.setPosition(this.minH, newOffset);
+          this.translateFn(this.scope.rzSliderModel, this.minLab);
+          var pos = Math.min(Math.max(newOffset - this.minLab.rzsd / 2 + this.handleHalfDim, 0), this.barDimension - this.ceilLab.rzsd);
+          this.setPosition(this.minLab, pos);
+ 
+          this.shFloorCeil();
+        },
+ 
+        /**
+         * Update high slider handle position and label
+         *
+         * @param {number} newOffset
+         * @returns {undefined}
+         */
+        updateHighHandle: function (newOffset) {
+          this.setPosition(this.maxH, newOffset);
+          this.translateFn(this.scope.rzSliderHigh, this.maxLab);
+          var pos = Math.min((newOffset - this.maxLab.rzsd / 2 + this.handleHalfDim), (this.barDimension - this.ceilLab.rzsd));
+          this.setPosition(this.maxLab, pos);
+ 
+          this.shFloorCeil();
+        },
+ 
+        /**
+         * Show / hide floor / ceiling label
+         *
+         * @returns {undefined}
+         */
+        shFloorCeil: function () {
+          var flHidden = false,
+            clHidden = false;
+ 
+          Iif (this.minLab.rzsp <= this.flrLab.rzsp + this.flrLab.rzsd + 5) {
+            flHidden = true;
+            this.hideEl(this.flrLab);
+          } else {
+            flHidden = false;
+            this.showEl(this.flrLab);
+          }
+ 
+          Iif (this.minLab.rzsp + this.minLab.rzsd >= this.ceilLab.rzsp - this.handleHalfDim - 10) {
+            clHidden = true;
+            this.hideEl(this.ceilLab);
+          } else {
+            clHidden = false;
+            this.showEl(this.ceilLab);
+          }
+ 
+          Iif (this.range) {
+            if (this.maxLab.rzsp + this.maxLab.rzsd >= this.ceilLab.rzsp - 10) {
+              this.hideEl(this.ceilLab);
+            } else if (!clHidden) {
+              this.showEl(this.ceilLab);
+            }
+ 
+            // Hide or show floor label
+            if (this.maxLab.rzsp <= this.flrLab.rzsp + this.flrLab.rzsd + this.handleHalfDim) {
+              this.hideEl(this.flrLab);
+            } else if (!flHidden) {
+              this.showEl(this.flrLab);
+            }
+          }
+        },
+ 
+        /**
+         * Update slider selection bar, combined label and range label
+         *
+         * @returns {undefined}
+         */
+        updateSelectionBar: function () {
+          this.setDimension(this.selBar, Math.abs(this.maxH.rzsp - this.minH.rzsp) + this.handleHalfDim);
+          this.setPosition(this.selBar, this.range ? this.minH.rzsp + this.handleHalfDim : 0);
+        },
+ 
+        /**
+         * Update combined label position and value
+         *
+         * @returns {undefined}
+         */
+        updateCmbLabel: function () {
+          var lowTr, highTr;
+ 
+          if (this.minLab.rzsp + this.minLab.rzsd + 10 >= this.maxLab.rzsp) {
+            lowTr = this.getDisplayValue(this.scope.rzSliderModel);
+            highTr = this.getDisplayValue(this.scope.rzSliderHigh);
+ 
+            this.translateFn(lowTr + ' - ' + highTr, this.cmbLab, false);
+            var pos = Math.min(Math.max((this.selBar.rzsp + this.selBar.rzsd / 2 - this.cmbLab.rzsd / 2), 0), (this.barDimension - this.cmbLab.rzsd));
+            this.setPosition(this.cmbLab, pos);
+            this.hideEl(this.minLab);
+            this.hideEl(this.maxLab);
+            this.showEl(this.cmbLab);
+          } else {
+            this.showEl(this.maxLab);
+            this.showEl(this.minLab);
+            this.hideEl(this.cmbLab);
+          }
+        },
+ 
+        /**
+         * Return the translated value if a translate function is provided else the original value
+         * @param value
+         * @returns {*}
+         */
+        getDisplayValue: function (value) {
+          return this.customTrFn(value, this.options.id);
+        },
+ 
+        /**
+         * Round value to step and precision
+         *
+         * @param {number} value
+         * @returns {number}
+         */
+        roundStep: function (value) {
+          var step = this.step,
+            remainder = +((value - this.minValue) % step).toFixed(3),
+            steppedValue = remainder > (step / 2) ? value + step - remainder : value - remainder;
+ 
+          steppedValue = steppedValue.toFixed(this.precision);
+          return +steppedValue;
+        },
+ 
+        /**
+         * Hide element
+         *
+         * @param element
+         * @returns {jqLite} The jqLite wrapped DOM element
+         */
+        hideEl: function (element) {
+          return element.css({
+            opacity: 0
+          });
+        },
+ 
+        /**
+         * Show element
+         *
+         * @param element The jqLite wrapped DOM element
+         * @returns {jqLite} The jqLite
+         */
+        showEl: function (element) {
+          Iif (!!element.rzAlwaysHide) {
+            return element;
+          }
+ 
+          return element.css({
+            opacity: 1
+          });
+        },
+ 
+        /**
+         * Set element left/top offset depending on whether slider is horizontal or vertical
+         *
+         * @param {jqLite} elem The jqLite wrapped DOM element
+         * @param {number} pos
+         * @returns {number}
+         */
+        setPosition: function (elem, pos) {
+          elem.rzsp = pos;
+          var css = {};
+          css[this.positionProperty] = pos + 'px';
+          elem.css(css);
+          return pos;
+        },
+ 
+        /**
+         * Get element width/height depending on whether slider is horizontal or vertical
+         *
+         * @param {jqLite} elem The jqLite wrapped DOM element
+         * @returns {number}
+         */
+        getDimension: function (elem) {
+          var val = elem[0].getBoundingClientRect();
+          Iif (this.options.vertical)
+            elem.rzsd = (val.bottom - val.top) * this.options.scale;
+          else
+            elem.rzsd = (val.right - val.left) * this.options.scale;
+          return elem.rzsd;
+        },
+ 
+        /**
+         * Set element width/height depending on whether slider is horizontal or vertical
+         *
+         * @param {jqLite} elem  The jqLite wrapped DOM element
+         * @param {number} dim
+         * @returns {number}
+         */
+        setDimension: function (elem, dim) {
+          elem.rzsd = dim;
+          var css = {};
+          css[this.dimensionProperty] = dim + 'px';
+          elem.css(css);
+          return dim;
+        },
+ 
+        /**
+         * Translate value to pixel offset
+         *
+         * @param {number} val
+         * @returns {number}
+         */
+        valueToOffset: function (val) {
+          return (this.sanitizeValue(val) - this.minValue) * this.maxPos / this.valueRange || 0;
+        },
+ 
+        /**
+         * Returns a value that is within slider range
+         *
+         * @param {number} val
+         * @returns {number}
+         */
+        sanitizeValue: function (val) {
+          return Math.min(Math.max(val, this.minValue), this.maxValue);
+        },
+ 
+        /**
+         * Translate offset to model value
+         *
+         * @param {number} offset
+         * @returns {number}
+         */
+        offsetToValue: function (offset) {
+          return (offset / this.maxPos) * this.valueRange + this.minValue;
+        },
+ 
+        // Events
+ 
+        /**
+         * Get the X-coordinate or Y-coordinate of an event
+         *
+         * @param {Object} event  The event
+         * @returns {number}
+         */
+        getEventXY: function (event) {
+          /* http://stackoverflow.com/a/12336075/282882 */
+          //noinspection JSLint
+          var clientXY = this.options.vertical ? 'clientY' : 'clientX';
+          if (clientXY in event) {
+            return event[clientXY];
+          }
+ 
+          return event.originalEvent === undefined ?
+            event.touches[0][clientXY] : event.originalEvent.touches[0][clientXY];
+        },
+ 
+        /**
+         * Compute the event position depending on whether the slider is horizontal or vertical
+         * @param event
+         * @returns {number}
+         */
+        getEventPosition: function (event) {
+          var sliderPos = this.sliderElem.rzsp,
+            eventPos = 0;
+          if (this.options.vertical)
+            eventPos = -this.getEventXY(event) + sliderPos;
+          else
+            eventPos = this.getEventXY(event) - sliderPos;
+          return (eventPos - this.handleHalfDim) * this.options.scale;
+        },
+ 
+        /**
+         * Get the handle closest to an event.
+         *
+         * @param event {Event} The event
+         * @returns {jqLite} The handle closest to the event.
+         */
+        getNearestHandle: function (event) {
+          if (!this.range) {
+            return this.minH;
+          }
+          var offset = this.getEventPosition(event);
+          return Math.abs(offset - this.minH.rzsp) < Math.abs(offset - this.maxH.rzsp) ? this.minH : this.maxH;
+        },
+ 
+        /**
+         * Bind mouse and touch events to slider handles
+         *
+         * @returns {undefined}
+         */
+        bindEvents: function () {
+          if (this.options.readOnly || this.options.disabled) return;
+          var barTracking, barStart, barMove;
+ 
+          if (this.options.draggableRange) {
+            barTracking = 'rzSliderDrag';
+            barStart = this.onDragStart;
+            barMove = this.onDragMove;
+          } else {
+            barTracking = 'rzSliderModel';
+            barStart = this.onStart;
+            barMove = this.onMove;
+          }
+ 
+          this.minH.on('mousedown', angular.bind(this, this.onStart, this.minH, 'rzSliderModel'));
+          if (this.range) {
+            this.maxH.on('mousedown', angular.bind(this, this.onStart, this.maxH, 'rzSliderHigh'));
+          }
+          this.fullBar.on('mousedown', angular.bind(this, this.onStart, null, null));
+          this.fullBar.on('mousedown', angular.bind(this, this.onMove, this.fullBar));
+          this.selBar.on('mousedown', angular.bind(this, barStart, null, barTracking));
+          this.selBar.on('mousedown', angular.bind(this, barMove, this.selBar));
+          this.ticks.on('mousedown', angular.bind(this, this.onStart, null, null));
+          this.ticks.on('mousedown', angular.bind(this, this.onMove, this.ticks));
+ 
+          this.minH.on('touchstart', angular.bind(this, this.onStart, this.minH, 'rzSliderModel'));
+          if (this.range) {
+            this.maxH.on('touchstart', angular.bind(this, this.onStart, this.maxH, 'rzSliderHigh'));
+          }
+          this.fullBar.on('touchstart', angular.bind(this, this.onStart, null, null));
+          this.fullBar.on('touchstart', angular.bind(this, this.onMove, this.fullBar));
+          this.selBar.on('touchstart', angular.bind(this, barStart, null, barTracking));
+          this.selBar.on('touchstart', angular.bind(this, barMove, this.selBar));
+          this.ticks.on('touchstart', angular.bind(this, this.onStart, null, null));
+          this.ticks.on('touchstart', angular.bind(this, this.onMove, this.ticks));
+ 
+          if (this.options.keyboardSupport) {
+            this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel'))
+            if (this.range) {
+              this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh'));
+            }
+          }
+        },
+ 
+        /**
+         * Unbind mouse and touch events to slider handles
+         *
+         * @returns {undefined}
+         */
+        unbindEvents: function () {
+          this.minH.off();
+          this.maxH.off();
+          this.fullBar.off();
+          this.selBar.off();
+          this.ticks.off();
+        },
+ 
+        /**
+         * onStart event handler
+         *
+         * @param {?Object} pointer The jqLite wrapped DOM element; if null, the closest handle is used
+         * @param {?string} ref     The name of the handle being changed; if null, the closest handle's value is modified
+         * @param {Event}   event   The event
+         * @returns {undefined}
+         */
+        onStart: function (pointer, ref, event) {
+          var ehMove, ehEnd,
+            eventNames = this.getEventNames(event);
+ 
+          event.stopPropagation();
+          event.preventDefault();
+ 
+          // We have to do this in case the HTML where the sliders are on
+          // have been animated into view.
+          this.calcViewDimensions();
+ 
+          if (pointer) {
+            this.tracking = ref;
+          } else {
+            pointer = this.getNearestHandle(event);
+            this.tracking = pointer === this.minH ? 'rzSliderModel' : 'rzSliderHigh';
+          }
+ 
+          pointer.addClass('rz-active');
+ 
+          if (this.options.keyboardSupport)
+            pointer[0].focus();
+ 
+          ehMove = angular.bind(this, this.dragging.active ? this.onDragMove : this.onMove, pointer);
+          ehEnd = angular.bind(this, this.onEnd, ehMove);
+ 
+          $document.on(eventNames.moveEvent, ehMove);
+          $document.one(eventNames.endEvent, ehEnd);
+          this.callOnStart();
+        },
+ 
+        /**
+         * onMove event handler
+         *
+         * @param {jqLite} pointer
+         * @param {Event}  event The event
+         * @returns {undefined}
+         */
+        onMove: function (pointer, event) {
+          var newOffset = this.getEventPosition(event),
+            newValue;
+ 
+          if (newOffset <= 0) {
+            if (pointer.rzsp === 0)
+              return;
+            newValue = this.minValue;
+            newOffset = 0;
+          } else if (newOffset >= this.maxPos) {
+            if (pointer.rzsp === this.maxPos)
+              return;
+            newValue = this.maxValue;
+            newOffset = this.maxPos;
+          } else {
+            newValue = this.offsetToValue(newOffset);
+            newValue = this.roundStep(newValue);
+            newOffset = this.valueToOffset(newValue);
+          }
+          this.positionTrackingHandle(newValue, newOffset);
+        },
+ 
+        /**
+         * onEnd event handler
+         *
+         * @param {Event}    event    The event
+         * @param {Function} ehMove   The the bound move event handler
+         * @returns {undefined}
+         */
+        onEnd: function (ehMove, event) {
+          var moveEventName = this.getEventNames(event).moveEvent;
+ 
+          if (!this.options.keyboardSupport) {
+            this.minH.removeClass('rz-active');
+            this.maxH.removeClass('rz-active');
+            this.tracking = '';
+          }
+          this.dragging.active = false;
+ 
+          $document.off(moveEventName, ehMove);
+          this.scope.$emit('slideEnded');
+          this.callOnEnd();
+        },
+ 
+        onPointerFocus: function (pointer, ref, event) {
+          this.tracking = ref;
+          pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer));
+          pointer.on('keydown', angular.bind(this, this.onKeyboardEvent));
+          pointer.addClass('rz-active');
+        },
+ 
+        onPointerBlur: function (pointer, event) {
+          pointer.off('keydown');
+          this.tracking = '';
+          pointer.removeClass('rz-active');
+        },
+ 
+        onKeyboardEvent: function (event) {
+          var currentValue = this.scope[this.tracking];
+          var keyCode = event.keyCode || event.which;
+          var keys = {
+            38: 'UP',
+            40: 'DOWN',
+            37: 'LEFT',
+            39: 'RIGHT',
+            33: 'PAGEUP',
+            34: 'PAGEDOWN',
+            36: 'HOME',
+            35: 'END'
+          };
+ 
+          var actions = {
+            UP: currentValue + this.step,
+            DOWN: currentValue - this.step,
+            LEFT: currentValue - this.step,
+            RIGHT: currentValue + this.step,
+            PAGEUP: currentValue + this.valueRange / 10,
+            PAGEDOWN: currentValue - this.valueRange / 10,
+            HOME: this.minValue,
+            END: this.maxValue
+          };
+          var key = keys[keyCode];
+          var action = actions[key];
+          Iif (action == null || this.tracking === '') return;
+          event.preventDefault();
+ 
+          var newValue = this.roundStep(this.sanitizeValue(action)),
+            newOffset = this.valueToOffset(newValue);
+          var switched = this.positionTrackingHandle(newValue, newOffset);
+          Iif (switched) {
+            var pointer = this.tracking === 'rzSliderModel' ? this.minH : this.maxH;
+            pointer[0].focus(); //to focus the correct pointer
+          }
+        },
+ 
+        /**
+         * onDragStart event handler
+         *
+         * Handles dragging of the middle bar.
+         *
+         * @param {Object} pointer The jqLite wrapped DOM element
+         * @param {string} ref     One of the refLow, refHigh values
+         * @param {Event}  event   The event
+         * @returns {undefined}
+         */
+        onDragStart: function (pointer, ref, event) {
+          var offset = this.getEventPosition(event);
+          this.dragging = {
+            active: true,
+            value: this.offsetToValue(offset),
+            difference: this.scope.rzSliderHigh - this.scope.rzSliderModel,
+            offset: offset,
+            lowDist: offset - this.minH.rzsp,
+            highDist: this.maxH.rzsp - offset
+          };
+          this.minH.addClass('rz-active');
+          this.maxH.addClass('rz-active');
+ 
+          this.onStart(pointer, ref, event);
+        },
+ 
+        /**
+         * onDragMove event handler
+         *
+         * Handles dragging of the middle bar.
+         *
+         * @param {jqLite} pointer
+         * @param {Event}  event The event
+         * @returns {undefined}
+         */
+        onDragMove: function (pointer, event) {
+          var newOffset = this.getEventPosition(event),
+            newMinOffset, newMaxOffset,
+            newMinValue, newMaxValue;
+ 
+          if (newOffset <= this.dragging.lowDist) {
+            if (pointer.rzsp === this.dragging.lowDist) {
+              return;
+            }
+            newMinValue = this.minValue;
+            newMinOffset = 0;
+            newMaxValue = this.minValue + this.dragging.difference;
+            newMaxOffset = this.valueToOffset(newMaxValue);
+          } else if (newOffset >= this.maxPos - this.dragging.highDist) {
+            if (pointer.rzsp === this.dragging.highDist) {
+              return;
+            }
+            newMaxValue = this.maxValue;
+            newMaxOffset = this.maxPos;
+            newMinValue = this.maxValue - this.dragging.difference;
+            newMinOffset = this.valueToOffset(newMinValue);
+          } else {
+            newMinValue = this.offsetToValue(newOffset - this.dragging.lowDist);
+            newMinValue = this.roundStep(newMinValue);
+            newMinOffset = this.valueToOffset(newMinValue);
+            newMaxValue = newMinValue + this.dragging.difference;
+            newMaxOffset = this.valueToOffset(newMaxValue);
+          }
+ 
+          this.positionTrackingBar(newMinValue, newMaxValue, newMinOffset, newMaxOffset);
+        },
+ 
+        /**
+         * Set the new value and offset for the entire bar
+         *
+         * @param {number} newMinValue   the new minimum value
+         * @param {number} newMaxValue   the new maximum value
+         * @param {number} newMinOffset  the new minimum offset
+         * @param {number} newMaxOffset  the new maximum offset
+         */
+        positionTrackingBar: function (newMinValue, newMaxValue, newMinOffset, newMaxOffset) {
+          this.scope.rzSliderModel = newMinValue;
+          this.scope.rzSliderHigh = newMaxValue;
+          this.updateHandles('rzSliderModel', newMinOffset);
+          this.updateHandles('rzSliderHigh', newMaxOffset);
+          this.scope.$apply();
+          this.callOnChange();
+        },
+ 
+        /**
+         * Set the new value and offset to the current tracking handle
+         *
+         * @param {number} newValue new model value
+         * @param {number} newOffset new offset value
+         * @returns {Boolean} flag that indicates if min and max pointers have been switched.
+         */
+        positionTrackingHandle: function (newValue, newOffset) {
+          var switched = false;
+          Iif (this.range) {
+            /* This is to check if we need to switch the min and max handles*/
+            if (this.tracking === 'rzSliderModel' && newValue >= this.scope.rzSliderHigh) {
+              switched = true;
+              this.scope[this.tracking] = this.scope.rzSliderHigh;
+              this.updateHandles(this.tracking, this.maxH.rzsp);
+              this.updateAriaAttributes();
+              this.tracking = 'rzSliderHigh';
+              this.minH.removeClass('rz-active');
+              this.maxH.addClass('rz-active');
+              /* We need to apply here because we are not sure that we will enter the next block */
+              this.scope.$apply();
+              this.callOnChange();
+            } else if (this.tracking === 'rzSliderHigh' && newValue <= this.scope.rzSliderModel) {
+              switched = true;
+              this.scope[this.tracking] = this.scope.rzSliderModel;
+              this.updateHandles(this.tracking, this.minH.rzsp);
+              this.updateAriaAttributes();
+              this.tracking = 'rzSliderModel';
+              this.maxH.removeClass('rz-active');
+              this.minH.addClass('rz-active');
+              /* We need to apply here because we are not sure that we will enter the next block */
+              this.scope.$apply();
+              this.callOnChange();
+            }
+          }
+ 
+          Eif (this.scope[this.tracking] !== newValue) {
+            this.scope[this.tracking] = newValue;
+            this.updateHandles(this.tracking, newOffset);
+            this.updateAriaAttributes();
+            this.scope.$apply();
+            this.callOnChange();
+          }
+          return switched;
+        },
+ 
+        /**
+         * Get event names for move and event end
+         *
+         * @param {Event}    event    The event
+         *
+         * @return {{moveEvent: string, endEvent: string}}
+         */
+        getEventNames: function (event) {
+          var eventNames = {
+            moveEvent: '',
+            endEvent: ''
+          };
+ 
+          if (event.touches || (event.originalEvent !== undefined && event.originalEvent.touches)) {
+            eventNames.moveEvent = 'touchmove';
+            eventNames.endEvent = 'touchend';
+          } else {
+            eventNames.moveEvent = 'mousemove';
+            eventNames.endEvent = 'mouseup';
+          }
+ 
+          return eventNames;
+        }
+      };
+ 
+      return Slider;
+    })
+ 
+    .directive('rzslider', function (RzSlider) {
+      'use strict';
+ 
+      return {
+        restrict: 'E',
+        scope: {
+          rzSliderModel: '=?',
+          rzSliderHigh: '=?',
+          rzSliderOptions: '=?',
+          rzSliderTplUrl: '@'
+        },
+ 
+        /**
+         * Return template URL
+         *
+         * @param {jqLite} elem
+         * @param {Object} attrs
+         * @return {string}
+         */
+        templateUrl: function (elem, attrs) {
+          //noinspection JSUnresolvedVariable
+          return attrs.rzSliderTplUrl || 'rzSliderTpl.html';
+        },
+ 
+        link: function (scope, elem) {
+          return new RzSlider(scope, elem);
+        }
+      };
+    });
+ 
+  // IDE assist
+ 
+  /**
+   * @name ngScope
+   *
+   * @property {number} rzSliderModel
+   * @property {number} rzSliderHigh
+   * @property {Object} rzSliderOptions
+   */
+ 
+  /**
+   * @name jqLite
+   *
+   * @property {number|undefined} rzsp rzslider label position offset
+   * @property {number|undefined} rzsd rzslider element dimension
+   * @property {string|undefined} rzsv rzslider label value/text
+   * @property {Function} css
+   * @property {Function} text
+   */
+ 
+  /**
+   * @name Event
+   * @property {Array} touches
+   * @property {Event} originalEvent
+   */
+ 
+  /**
+   * @name ThrottleOptions
+   *
+   * @property {boolean} leading
+   * @property {boolean} trailing
+   */
+ 
+  /*templateReplacement*/
+ 
+  return module
+}));
+ 
+
+
+ + + + + + + diff --git a/tests/spec/rz-slider-service-test.js b/tests/spec/rz-slider-service-test.js index d511545..e7773a3 100644 --- a/tests/spec/rz-slider-service-test.js +++ b/tests/spec/rz-slider-service-test.js @@ -17,14 +17,37 @@ describe('rzslider api', function () { $httpBackend = _$httpBackend_; })); - it('should exist compiled', function () { + beforeEach(function () { scope = $rootScope.$new(); - scope.minSlider = { - value: 10 - }; + scope.minSlider = {value: 10}; + scope.rzSliderModel = scope.minSlider.value; + compileHtml(); + }); + + it('should exist compiled', function () { element = $compile("")($rootScope); $rootScope.$digest(); expect(element.find('span')).to.have.length(11); }); + it('should trigger a left arrow', function () { + var service = new RzSlider(scope, element); + var event = pressLeftArrow(); + service.onPointerFocus(element, 'rzSliderModel', event); + service.onKeyboardEvent(event); + expect(scope.rzSliderModel).to.equal(9); + }); + + function pressLeftArrow() { + var event = jQuery.Event("keydown"); + event.which = 37; + return event; + } + + function compileHtml() { + element = $compile("")(scope); + scope.$apply(); + } + + }); From 48d855dfb12fb7db6cfb9b0950a04a8fc6901783 Mon Sep 17 00:00:00 2001 From: George Batalinski Date: Thu, 17 Dec 2015 14:36:40 -0500 Subject: [PATCH 08/11] remove jquery # remove jquery --- bower.json | 3 +-- karma.conf.js | 1 - tests/spec/rz-slider-service-test.js | 22 ++++++++++++++-------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/bower.json b/bower.json index c7b8ad5..c24db0f 100644 --- a/bower.json +++ b/bower.json @@ -25,7 +25,6 @@ "tests" ], "devDependencies": { - "angular": "~1.4.0", - "jquery": "~2.1.4" + "angular": "~1.4.0" } } diff --git a/karma.conf.js b/karma.conf.js index 3c7c583..f3f918f 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -13,7 +13,6 @@ module.exports = function (config) { // list of files / patterns to load in the browser files: [ 'bower_components/angular/angular.js', - 'bower_components/jquery/dist/jquery.js', 'node_modules/angular-mocks/angular-mocks.js', 'src/*.js', 'tests/spec/*.js', diff --git a/tests/spec/rz-slider-service-test.js b/tests/spec/rz-slider-service-test.js index e7773a3..1cfdccd 100644 --- a/tests/spec/rz-slider-service-test.js +++ b/tests/spec/rz-slider-service-test.js @@ -21,31 +21,37 @@ describe('rzslider api', function () { scope = $rootScope.$new(); scope.minSlider = {value: 10}; scope.rzSliderModel = scope.minSlider.value; + scope.options = { + floor: 0, + ceil: 1000, //defaults to rz-slider-model + step: 100 + }; compileHtml(); }); it('should exist compiled', function () { - element = $compile("")($rootScope); - $rootScope.$digest(); expect(element.find('span')).to.have.length(11); }); - it('should trigger a left arrow', function () { + it('should trigger a left arrow respecting step values and not go below 0', function (done) { var service = new RzSlider(scope, element); + service.step = 100; var event = pressLeftArrow(); service.onPointerFocus(element, 'rzSliderModel', event); service.onKeyboardEvent(event); - expect(scope.rzSliderModel).to.equal(9); + expect(scope.rzSliderModel).to.equal(0); + done(); }); function pressLeftArrow() { - var event = jQuery.Event("keydown"); - event.which = 37; - return event; + var evt = document.createEvent('CustomEvent'); // MUST be 'CustomEvent' + evt.initCustomEvent('yourCustomEventName', false, false, null); + evt.which = 37; + return evt; } function compileHtml() { - element = $compile("")(scope); + element = $compile("")(scope); scope.$apply(); } From a65063e77ce110b3d816d9c9da2ef133f133770c Mon Sep 17 00:00:00 2001 From: George Batalinski Date: Fri, 18 Dec 2015 12:46:26 -0500 Subject: [PATCH 09/11] change keydown event in test --- tests/spec/rz-slider-service-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spec/rz-slider-service-test.js b/tests/spec/rz-slider-service-test.js index 1cfdccd..a30e882 100644 --- a/tests/spec/rz-slider-service-test.js +++ b/tests/spec/rz-slider-service-test.js @@ -45,7 +45,7 @@ describe('rzslider api', function () { function pressLeftArrow() { var evt = document.createEvent('CustomEvent'); // MUST be 'CustomEvent' - evt.initCustomEvent('yourCustomEventName', false, false, null); + evt.initCustomEvent('keydown', false, false, null); evt.which = 37; return evt; } From 8197e8202a201f7294ba1bccf3bb312d385977c1 Mon Sep 17 00:00:00 2001 From: Valentin Hervieu Date: Fri, 18 Dec 2015 21:30:05 +0100 Subject: [PATCH 10/11] Clean code for keyboardSupport and ignore test coverage files --- .gitignore | 3 ++- dist/rzslider.js | 36 +++++++++++++++++++++++++----------- dist/rzslider.min.js | 2 +- src/rzslider.js | 36 +++++++++++++++++++++++++----------- 4 files changed, 53 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 2091f95..8b13917 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules/ .idea/ bower_components/ -temp/ \ No newline at end of file +temp/ +tests/coverage/ diff --git a/dist/rzslider.js b/dist/rzslider.js index 48af913..2e54ddf 100644 --- a/dist/rzslider.js +++ b/dist/rzslider.js @@ -644,15 +644,19 @@ * Updates aria attributes according to current values */ updateAriaAttributes: function() { - this.minH.attr('aria-valuenow', this.scope.rzSliderModel); - this.minH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderModel)); - this.minH.attr('aria-valuemin', this.minValue); - this.minH.attr('aria-valuemax', this.maxValue); + this.minH.attr({ + 'aria-valuenow': this.scope.rzSliderModel, + 'aria-valuetext': this.customTrFn(this.scope.rzSliderModel), + 'aria-valuemin': this.minValue, + 'aria-valuemax': this.maxValue + }); if (this.range) { - this.maxH.attr('aria-valuenow', this.scope.rzSliderHigh); - this.maxH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderHigh)); - this.maxH.attr('aria-valuemin', this.minValue); - this.maxH.attr('aria-valuemax', this.maxValue); + this.maxH.attr({ + 'aria-valuenow': this.scope.rzSliderHigh, + 'aria-valuetext': this.customTrFn(this.scope.rzSliderHigh), + 'aria-valuemin': this.minValue, + 'aria-valuemax': this.maxValue + }); } }, @@ -1117,6 +1121,16 @@ return Math.abs(offset - this.minH.rzsp) < Math.abs(offset - this.maxH.rzsp) ? this.minH : this.maxH; }, + /** + * Wrapper function to focus an angular element + * + * @param el {AngularElement} the element to focus + */ + focusElement: function(el) { + var DOM_ELEMENT = 0; + el[DOM_ELEMENT].focus(); + }, + /** * Bind mouse and touch events to slider handles * @@ -1208,7 +1222,7 @@ pointer.addClass('rz-active'); if (this.options.keyboardSupport) - pointer[0].focus(); + this.focusElement(pointer); ehMove = angular.bind(this, this.dragging.active ? this.onDragMove : this.onMove, pointer); ehEnd = angular.bind(this, this.onEnd, ehMove); @@ -1420,7 +1434,7 @@ this.minH.removeClass('rz-active'); this.maxH.addClass('rz-active'); if (this.options.keyboardSupport) - this.maxH[0].focus(); + this.focusElement(this.maxH); valueChanged = true; } else if (this.tracking === 'rzSliderHigh' && newValue <= this.scope.rzSliderModel) { switched = true; @@ -1431,7 +1445,7 @@ this.maxH.removeClass('rz-active'); this.minH.addClass('rz-active'); if (this.options.keyboardSupport) - this.minH[0].focus(); + this.focusElement(this.minH); valueChanged = true; } } diff --git a/dist/rzslider.min.js b/dist/rzslider.min.js index a598098..2f675bd 100644 --- a/dist/rzslider.min.js +++ b/dist/rzslider.min.js @@ -1,2 +1,2 @@ /*! angularjs-slider - v2.2.0 - (c) Rafal Zajac , Valentin Hervieu , Jussi Saarivirta , Angelin Sirbu , https://github.com/rzajac/angularjs-slider.git - 2015-12-18 */ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,keyboardSupport:!0,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.manageEventsBindings()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.updateAriaAttributes(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel(),h.updateAriaAttributes()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.minH.attr("role","slider"),this.updateAriaAttributes(),this.options.keyboardSupport&&this.minH.attr("tabindex","0"),this.options.vertical&&this.minH.attr("aria-orientation","vertical"),this.range&&(this.maxH.attr("role","slider"),this.options.keyboardSupport&&this.maxH.attr("tabindex","0"),this.options.vertical&&this.maxH.attr("aria-orientation","vertical"))},updateAriaAttributes:function(){this.minH.attr("aria-valuenow",this.scope.rzSliderModel),this.minH.attr("aria-valuetext",this.customTrFn(this.scope.rzSliderModel)),this.minH.attr("aria-valuemin",this.minValue),this.minH.attr("aria-valuemax",this.maxValue),this.range&&(this.maxH.attr("aria-valuenow",this.scope.rzSliderHigh),this.maxH.attr("aria-valuetext",this.customTrFn(this.scope.rzSliderHigh)),this.maxH.attr("aria-valuemin",this.minValue),this.maxH.attr("aria-valuemax",this.maxValue))},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;this.options.keyboardSupport||(this.minH.removeClass("rz-active"),this.maxH.removeClass("rz-active"),this.tracking=""),this.dragging.active=!1,c.off(d,a),this.scope.$emit("slideEnded"),this.callOnEnd()},onPointerFocus:function(b,c){this.tracking=c,b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a){a.off("keydown"),this.tracking="",a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=this.scope[this.tracking],c=a.keyCode||a.which,d={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"},e={UP:b+this.step,DOWN:b-this.step,LEFT:b-this.step,RIGHT:b+this.step,PAGEUP:b+this.valueRange/10,PAGEDOWN:b-this.valueRange/10,HOME:this.minValue,END:this.maxValue},f=d[c],g=e[f];if(null!=g&&""!==this.tracking){a.preventDefault();var h=this.roundStep(this.sanitizeValue(g)),i=this.valueToOffset(h);this.positionTrackingHandle(h,i)}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),this.options.keyboardSupport&&this.maxH[0].focus(),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),this.options.keyboardSupport&&this.minH[0].focus(),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),this.updateAriaAttributes(),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file +!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a){"use strict";var b=a.module("rzModule",[]).factory("RzSliderOptions",function(){var b={floor:0,ceil:null,step:1,precision:0,id:null,translate:null,stepsArray:null,draggableRange:!1,showSelectionBar:!1,hideLimitLabels:!1,readOnly:!1,disabled:!1,interval:350,showTicks:!1,showTicksValues:!1,ticksValuesTooltip:null,vertical:!1,selectionBarColor:null,keyboardSupport:!0,scale:1,onStart:null,onChange:null,onEnd:null},c={},d={};return d.options=function(b){a.extend(c,b)},d.getOptions=function(d){return a.extend({},b,c,d)},d}).value("rzThrottle",function(a,b,c){var d,e,f,g=Date.now||function(){return(new Date).getTime()},h=null,i=0;c=c||{};var j=function(){i=c.leading===!1?0:g(),h=null,f=a.apply(d,e),d=e=null};return function(){var k=g();i||c.leading!==!1||(i=k);var l=b-(k-i);return d=this,e=arguments,0>=l?(clearTimeout(h),h=null,i=k,f=a.apply(d,e),d=e=null):h||c.trailing===!1||(h=setTimeout(j,l)),f}}).factory("RzSlider",["$timeout","$document","$window","$compile","RzSliderOptions","rzThrottle",function(b,c,d,e,f,g){var h=function(a,b){this.scope=a,this.sliderElem=b,this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.dragging={active:!1,value:0,difference:0,offset:0,lowDist:0,highDist:0},this.positionProperty="left",this.dimensionProperty="width",this.handleHalfDim=0,this.maxPos=0,this.precision=0,this.step=0,this.tracking="",this.minValue=0,this.maxValue=0,this.valueRange=0,this.initHasRun=!1,this.fullBar=null,this.selBar=null,this.minH=null,this.maxH=null,this.flrLab=null,this.ceilLab=null,this.minLab=null,this.maxLab=null,this.cmbLab=null,this.ticks=null,this.init()};return h.prototype={init:function(){var c,e,f=a.bind(this,this.calcViewDimensions),h=this;this.applyOptions(),this.initElemHandles(),this.manageElementsStyle(),this.addAccessibility(),this.setDisabledState(),this.calcViewDimensions(),this.setMinAndMax(),b(function(){h.updateCeilLab(),h.updateFloorLab(),h.initHandles(),h.manageEventsBindings()}),this.scope.$on("reCalcViewDimensions",f),a.element(d).on("resize",f),this.options.vertical&&this.sliderElem.addClass("vertical"),this.initHasRun=!0,c=g(function(){h.setMinAndMax(),h.updateLowHandle(h.valueToOffset(h.scope.rzSliderModel)),h.updateSelectionBar(),h.updateTicksScale(),h.updateAriaAttributes(),h.range&&h.updateCmbLabel()},h.options.interval),e=g(function(){h.setMinAndMax(),h.updateHighHandle(h.valueToOffset(h.scope.rzSliderHigh)),h.updateSelectionBar(),h.updateTicksScale(),h.updateCmbLabel(),h.updateAriaAttributes()},h.options.interval),this.scope.$on("rzSliderForceRender",function(){h.resetLabelsValue(),c(),h.range&&e(),h.resetSlider()}),this.scope.$watch("rzSliderModel",function(a,b){a!==b&&c()}),this.scope.$watch("rzSliderHigh",function(a,b){a!==b&&(null!=a&&e(),(h.range&&null==a||!h.range&&null!=a)&&(h.applyOptions(),h.resetSlider()))}),this.scope.$watch("rzSliderOptions",function(a,b){a!==b&&(h.applyOptions(),h.resetSlider())},!0),this.scope.$on("$destroy",function(){h.unbindEvents(),a.element(d).off("resize",f)})},applyOptions:function(){this.options=f.getOptions(this.scope.rzSliderOptions),this.options.step<=0&&(this.options.step=1),this.range=void 0!==this.scope.rzSliderModel&&void 0!==this.scope.rzSliderHigh,this.options.draggableRange=this.range&&this.options.draggableRange,this.options.showTicks=this.options.showTicks||this.options.showTicksValues,this.scope.showTicks=this.options.showTicks,this.options.stepsArray?(this.options.floor=0,this.options.ceil=this.options.stepsArray.length-1,this.options.step=1,this.customTrFn=function(a){return this.options.stepsArray[a]}):this.options.translate?this.customTrFn=this.options.translate:this.customTrFn=function(a){return String(a)},this.options.vertical&&(this.positionProperty="bottom",this.dimensionProperty="height")},resetSlider:function(){this.manageElementsStyle(),this.setMinAndMax(),this.updateCeilLab(),this.updateFloorLab(),this.unbindEvents(),this.manageEventsBindings(),this.setDisabledState(),this.calcViewDimensions()},initElemHandles:function(){a.forEach(this.sliderElem.children(),function(b,c){var d=a.element(b);switch(c){case 0:this.fullBar=d;break;case 1:this.selBar=d,this.selBarChild=this.selBar.children("rz-selection");break;case 2:this.minH=d;break;case 3:this.maxH=d;break;case 4:this.flrLab=d;break;case 5:this.ceilLab=d;break;case 6:this.minLab=d;break;case 7:this.maxLab=d;break;case 8:this.cmbLab=d;break;case 9:this.ticks=d}},this),this.selBar.rzsp=0,this.minH.rzsp=0,this.maxH.rzsp=0,this.flrLab.rzsp=0,this.ceilLab.rzsp=0,this.minLab.rzsp=0,this.maxLab.rzsp=0,this.cmbLab.rzsp=0},manageElementsStyle:function(){this.range?this.maxH.css("display",null):this.maxH.css("display","none"),this.alwaysHide(this.flrLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.ceilLab,this.options.showTicksValues||this.options.hideLimitLabels),this.alwaysHide(this.minLab,this.options.showTicksValues),this.alwaysHide(this.maxLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.cmbLab,this.options.showTicksValues||!this.range),this.alwaysHide(this.selBar,!this.range&&!this.options.showSelectionBar),this.options.draggableRange?this.selBar.addClass("rz-draggable"):this.selBar.removeClass("rz-draggable")},alwaysHide:function(a,b){a.rzAlwaysHide=b,b?this.hideEl(a):this.showEl(a)},manageEventsBindings:function(){this.options.disabled||this.options.readOnly?this.unbindEvents():this.options.disabled&&this.options.readOnly||this.bindEvents()},setDisabledState:function(){this.options.disabled?this.sliderElem.attr("disabled","disabled"):this.sliderElem.attr("disabled",null)},resetLabelsValue:function(){this.minLab.rzsv=void 0,this.maxLab.rzsv=void 0},initHandles:function(){this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel)),this.range&&this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh)),this.updateSelectionBar(),this.range&&this.updateCmbLabel(),this.updateTicksScale()},translateFn:function(a,b,c){c=void 0===c?!0:c;var d=String(c?this.customTrFn(a,this.options.id):a),e=!1;(void 0===b.rzsv||b.rzsv.length!==d.length||b.rzsv.length>0&&0===b.rzsd)&&(e=!0,b.rzsv=d),b.text(d),e&&this.getDimension(b)},setMinAndMax:function(){this.step=+this.options.step,this.precision=+this.options.precision,this.scope.rzSliderModel=this.roundStep(this.scope.rzSliderModel),this.range&&(this.scope.rzSliderHigh=this.roundStep(this.scope.rzSliderHigh)),this.minValue=this.roundStep(+this.options.floor),null!=this.options.ceil?this.maxValue=this.roundStep(+this.options.ceil):this.maxValue=this.options.ceil=this.range?this.scope.rzSliderHigh:this.scope.rzSliderModel,this.valueRange=this.maxValue-this.minValue},addAccessibility:function(){this.minH.attr("role","slider"),this.updateAriaAttributes(),this.options.keyboardSupport&&this.minH.attr("tabindex","0"),this.options.vertical&&this.minH.attr("aria-orientation","vertical"),this.range&&(this.maxH.attr("role","slider"),this.options.keyboardSupport&&this.maxH.attr("tabindex","0"),this.options.vertical&&this.maxH.attr("aria-orientation","vertical"))},updateAriaAttributes:function(){this.minH.attr({"aria-valuenow":this.scope.rzSliderModel,"aria-valuetext":this.customTrFn(this.scope.rzSliderModel),"aria-valuemin":this.minValue,"aria-valuemax":this.maxValue}),this.range&&this.maxH.attr({"aria-valuenow":this.scope.rzSliderHigh,"aria-valuetext":this.customTrFn(this.scope.rzSliderHigh),"aria-valuemin":this.minValue,"aria-valuemax":this.maxValue})},calcViewDimensions:function(){var a=this.getDimension(this.minH);this.handleHalfDim=a/2,this.barDimension=this.getDimension(this.fullBar),this.maxPos=this.barDimension-a,this.getDimension(this.sliderElem),this.sliderElem.rzsp=this.sliderElem[0].getBoundingClientRect()[this.positionProperty],this.initHasRun&&(this.updateFloorLab(),this.updateCeilLab(),this.initHandles())},updateTicksScale:function(){if(this.options.showTicks&&this.step){var a=Math.round((this.maxValue-this.minValue)/this.step)+1;this.scope.ticks=[];for(var b=0;a>b;b++){var c=this.roundStep(this.minValue+b*this.step),d={selected:this.isTickSelected(c)};d.selected&&this.options.getSelectionBarColor&&(d.style={"background-color":this.getSelectionBarColor()}),this.options.showTicksValues&&(d.value=this.getDisplayValue(c),this.options.ticksValuesTooltip&&(d.tooltip=this.options.ticksValuesTooltip(c),d.tooltipPlacement=this.options.vertical?"right":"top")),this.scope.ticks.push(d)}}},isTickSelected:function(a){return!this.range&&this.options.showSelectionBar&&a<=this.scope.rzSliderModel?!0:this.range&&a>=this.scope.rzSliderModel&&a<=this.scope.rzSliderHigh?!0:!1},updateCeilLab:function(){this.translateFn(this.maxValue,this.ceilLab),this.setPosition(this.ceilLab,this.barDimension-this.ceilLab.rzsd),this.getDimension(this.ceilLab)},updateFloorLab:function(){this.translateFn(this.minValue,this.flrLab),this.getDimension(this.flrLab)},callOnStart:function(){if(this.options.onStart){var a=this;b(function(){a.options.onStart(a.options.id)})}},callOnChange:function(){if(this.options.onChange){var a=this;b(function(){a.options.onChange(a.options.id)})}},callOnEnd:function(){if(this.options.onEnd){var a=this;b(function(){a.options.onEnd(a.options.id)})}},updateHandles:function(a,b){return"rzSliderModel"===a?(this.updateLowHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):"rzSliderHigh"===a?(this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void(this.range&&this.updateCmbLabel())):(this.updateLowHandle(b),this.updateHighHandle(b),this.updateSelectionBar(),this.updateTicksScale(),void this.updateCmbLabel())},updateLowHandle:function(a){this.setPosition(this.minH,a),this.translateFn(this.scope.rzSliderModel,this.minLab);var b=Math.min(Math.max(a-this.minLab.rzsd/2+this.handleHalfDim,0),this.barDimension-this.ceilLab.rzsd);this.setPosition(this.minLab,b),this.shFloorCeil()},updateHighHandle:function(a){this.setPosition(this.maxH,a),this.translateFn(this.scope.rzSliderHigh,this.maxLab);var b=Math.min(a-this.maxLab.rzsd/2+this.handleHalfDim,this.barDimension-this.ceilLab.rzsd);this.setPosition(this.maxLab,b),this.shFloorCeil()},shFloorCeil:function(){var a=!1,b=!1;this.minLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+5?(a=!0,this.hideEl(this.flrLab)):(a=!1,this.showEl(this.flrLab)),this.minLab.rzsp+this.minLab.rzsd>=this.ceilLab.rzsp-this.handleHalfDim-10?(b=!0,this.hideEl(this.ceilLab)):(b=!1,this.showEl(this.ceilLab)),this.range&&(this.maxLab.rzsp+this.maxLab.rzsd>=this.ceilLab.rzsp-10?this.hideEl(this.ceilLab):b||this.showEl(this.ceilLab),this.maxLab.rzsp<=this.flrLab.rzsp+this.flrLab.rzsd+this.handleHalfDim?this.hideEl(this.flrLab):a||this.showEl(this.flrLab))},updateSelectionBar:function(){if(this.setDimension(this.selBar,Math.abs(this.maxH.rzsp-this.minH.rzsp)+this.handleHalfDim),this.setPosition(this.selBar,this.range?this.minH.rzsp+this.handleHalfDim:0),this.options.getSelectionBarColor){var a=this.getSelectionBarColor();this.scope.barStyle={backgroundColor:a}}},getSelectionBarColor:function(){return this.range?this.options.getSelectionBarColor(this.scope.rzSliderModel,this.scope.rzSliderHigh):this.options.getSelectionBarColor(this.scope.rzSliderModel)},updateCmbLabel:function(){var a,b;if(this.minLab.rzsp+this.minLab.rzsd+10>=this.maxLab.rzsp){a=this.getDisplayValue(this.scope.rzSliderModel),b=this.getDisplayValue(this.scope.rzSliderHigh),this.translateFn(a+" - "+b,this.cmbLab,!1);var c=Math.min(Math.max(this.selBar.rzsp+this.selBar.rzsd/2-this.cmbLab.rzsd/2,0),this.barDimension-this.cmbLab.rzsd);this.setPosition(this.cmbLab,c),this.hideEl(this.minLab),this.hideEl(this.maxLab),this.showEl(this.cmbLab)}else this.showEl(this.maxLab),this.showEl(this.minLab),this.hideEl(this.cmbLab)},getDisplayValue:function(a){return this.customTrFn(a,this.options.id)},roundStep:function(a){var b=Math.round(a/this.step)*this.step;return b=b.toFixed(this.precision),+b},hideEl:function(a){return a.css({opacity:0})},showEl:function(a){return a.rzAlwaysHide?a:a.css({opacity:1})},setPosition:function(a,b){a.rzsp=b;var c={};return c[this.positionProperty]=b+"px",a.css(c),b},getDimension:function(a){var b=a[0].getBoundingClientRect();return this.options.vertical?a.rzsd=(b.bottom-b.top)*this.options.scale:a.rzsd=(b.right-b.left)*this.options.scale,a.rzsd},setDimension:function(a,b){a.rzsd=b;var c={};return c[this.dimensionProperty]=b+"px",a.css(c),b},valueToOffset:function(a){return(this.sanitizeValue(a)-this.minValue)*this.maxPos/this.valueRange||0},sanitizeValue:function(a){return Math.min(Math.max(a,this.minValue),this.maxValue)},offsetToValue:function(a){return a/this.maxPos*this.valueRange+this.minValue},getEventXY:function(a){var b=this.options.vertical?"clientY":"clientX";return b in a?a[b]:void 0===a.originalEvent?a.touches[0][b]:a.originalEvent.touches[0][b]},getEventPosition:function(a){var b=this.sliderElem.rzsp,c=0;return c=this.options.vertical?-this.getEventXY(a)+b:this.getEventXY(a)-b,(c-this.handleHalfDim)*this.options.scale},getNearestHandle:function(a){if(!this.range)return this.minH;var b=this.getEventPosition(a);return Math.abs(b-this.minH.rzsp)=d){if(0===a.rzsp)return;c=this.minValue,d=0}else if(d>=this.maxPos){if(a.rzsp===this.maxPos)return;c=this.maxValue,d=this.maxPos}else c=this.offsetToValue(d),c=this.roundStep(c),d=this.valueToOffset(c);this.positionTrackingHandle(c,d)},onEnd:function(a,b){var d=this.getEventNames(b).moveEvent;this.options.keyboardSupport||(this.minH.removeClass("rz-active"),this.maxH.removeClass("rz-active"),this.tracking=""),this.dragging.active=!1,c.off(d,a),this.scope.$emit("slideEnded"),this.callOnEnd()},onPointerFocus:function(b,c){this.tracking=c,b.one("blur",a.bind(this,this.onPointerBlur,b)),b.on("keydown",a.bind(this,this.onKeyboardEvent)),b.addClass("rz-active")},onPointerBlur:function(a){a.off("keydown"),this.tracking="",a.removeClass("rz-active")},onKeyboardEvent:function(a){var b=this.scope[this.tracking],c=a.keyCode||a.which,d={38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"},e={UP:b+this.step,DOWN:b-this.step,LEFT:b-this.step,RIGHT:b+this.step,PAGEUP:b+this.valueRange/10,PAGEDOWN:b-this.valueRange/10,HOME:this.minValue,END:this.maxValue},f=d[c],g=e[f];if(null!=g&&""!==this.tracking){a.preventDefault();var h=this.roundStep(this.sanitizeValue(g)),i=this.valueToOffset(h);this.positionTrackingHandle(h,i)}},onDragStart:function(a,b,c){var d=this.getEventPosition(c);this.dragging={active:!0,value:this.offsetToValue(d),difference:this.scope.rzSliderHigh-this.scope.rzSliderModel,offset:d,lowDist:d-this.minH.rzsp,highDist:this.maxH.rzsp-d},this.minH.addClass("rz-active"),this.maxH.addClass("rz-active"),this.onStart(a,b,c)},onDragMove:function(a,b){var c,d,e,f,g=this.getEventPosition(b);if(g<=this.dragging.lowDist){if(a.rzsp===this.dragging.lowDist)return;e=this.minValue,c=0,f=this.minValue+this.dragging.difference,d=this.valueToOffset(f)}else if(g>=this.maxPos-this.dragging.highDist){if(a.rzsp===this.dragging.highDist)return;f=this.maxValue,d=this.maxPos,e=this.maxValue-this.dragging.difference,c=this.valueToOffset(e)}else e=this.offsetToValue(g-this.dragging.lowDist),e=this.roundStep(e),c=this.valueToOffset(e),f=e+this.dragging.difference,d=this.valueToOffset(f);this.positionTrackingBar(e,f,c,d)},positionTrackingBar:function(a,b,c,d){this.scope.rzSliderModel=a,this.scope.rzSliderHigh=b,this.updateHandles("rzSliderModel",c),this.updateHandles("rzSliderHigh",d),this.scope.$apply(),this.callOnChange()},positionTrackingHandle:function(a,b){var c=!1,d=!1;return this.range&&("rzSliderModel"===this.tracking&&a>=this.scope.rzSliderHigh?(d=!0,this.scope[this.tracking]=this.scope.rzSliderHigh,this.updateHandles(this.tracking,this.maxH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderHigh",this.minH.removeClass("rz-active"),this.maxH.addClass("rz-active"),this.options.keyboardSupport&&this.focusElement(this.maxH),c=!0):"rzSliderHigh"===this.tracking&&a<=this.scope.rzSliderModel&&(d=!0,this.scope[this.tracking]=this.scope.rzSliderModel,this.updateHandles(this.tracking,this.minH.rzsp),this.updateAriaAttributes(),this.tracking="rzSliderModel",this.maxH.removeClass("rz-active"),this.minH.addClass("rz-active"),this.options.keyboardSupport&&this.focusElement(this.minH),c=!0)),this.scope[this.tracking]!==a&&(this.scope[this.tracking]=a,this.updateHandles(this.tracking,b),this.updateAriaAttributes(),c=!0),c&&(this.scope.$apply(),this.callOnChange()),d},getEventNames:function(a){var b={moveEvent:"",endEvent:""};return a.touches||void 0!==a.originalEvent&&a.originalEvent.touches?(b.moveEvent="touchmove",b.endEvent="touchend"):(b.moveEvent="mousemove",b.endEvent="mouseup"),b}},h}]).directive("rzslider",["RzSlider",function(a){return{restrict:"E",scope:{rzSliderModel:"=?",rzSliderHigh:"=?",rzSliderOptions:"=?",rzSliderTplUrl:"@"},templateUrl:function(a,b){return b.rzSliderTplUrl||"rzSliderTpl.html"},link:function(b,c){return new a(b,c)}}}]);return b.run(["$templateCache",function(a){a.put("rzSliderTpl.html",'
  • {{ t.value }} {{ t.value }}
')}]),b}); \ No newline at end of file diff --git a/src/rzslider.js b/src/rzslider.js index b02963a..f125a2b 100644 --- a/src/rzslider.js +++ b/src/rzslider.js @@ -644,15 +644,19 @@ * Updates aria attributes according to current values */ updateAriaAttributes: function() { - this.minH.attr('aria-valuenow', this.scope.rzSliderModel); - this.minH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderModel)); - this.minH.attr('aria-valuemin', this.minValue); - this.minH.attr('aria-valuemax', this.maxValue); + this.minH.attr({ + 'aria-valuenow': this.scope.rzSliderModel, + 'aria-valuetext': this.customTrFn(this.scope.rzSliderModel), + 'aria-valuemin': this.minValue, + 'aria-valuemax': this.maxValue + }); if (this.range) { - this.maxH.attr('aria-valuenow', this.scope.rzSliderHigh); - this.maxH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderHigh)); - this.maxH.attr('aria-valuemin', this.minValue); - this.maxH.attr('aria-valuemax', this.maxValue); + this.maxH.attr({ + 'aria-valuenow': this.scope.rzSliderHigh, + 'aria-valuetext': this.customTrFn(this.scope.rzSliderHigh), + 'aria-valuemin': this.minValue, + 'aria-valuemax': this.maxValue + }); } }, @@ -1117,6 +1121,16 @@ return Math.abs(offset - this.minH.rzsp) < Math.abs(offset - this.maxH.rzsp) ? this.minH : this.maxH; }, + /** + * Wrapper function to focus an angular element + * + * @param el {AngularElement} the element to focus + */ + focusElement: function(el) { + var DOM_ELEMENT = 0; + el[DOM_ELEMENT].focus(); + }, + /** * Bind mouse and touch events to slider handles * @@ -1208,7 +1222,7 @@ pointer.addClass('rz-active'); if (this.options.keyboardSupport) - pointer[0].focus(); + this.focusElement(pointer); ehMove = angular.bind(this, this.dragging.active ? this.onDragMove : this.onMove, pointer); ehEnd = angular.bind(this, this.onEnd, ehMove); @@ -1420,7 +1434,7 @@ this.minH.removeClass('rz-active'); this.maxH.addClass('rz-active'); if (this.options.keyboardSupport) - this.maxH[0].focus(); + this.focusElement(this.maxH); valueChanged = true; } else if (this.tracking === 'rzSliderHigh' && newValue <= this.scope.rzSliderModel) { switched = true; @@ -1431,7 +1445,7 @@ this.maxH.removeClass('rz-active'); this.minH.addClass('rz-active'); if (this.options.keyboardSupport) - this.minH[0].focus(); + this.focusElement(this.minH); valueChanged = true; } } From 99829daa0234c56cfc4ea2cddb4401de59a41fa3 Mon Sep 17 00:00:00 2001 From: Valentin Hervieu Date: Fri, 18 Dec 2015 21:46:30 +0100 Subject: [PATCH 11/11] remove coverage files --- .../base.css | 212 - .../index.html | 93 - .../prettify.css | 1 - .../prettify.js | 1 - .../sort-arrow-sprite.png | Bin 209 -> 0 bytes .../sorter.js | 158 - .../src/index.html | 93 - .../src/rzslider.js.html | 4661 ----------------- 8 files changed, 5219 deletions(-) delete mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/base.css delete mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/index.html delete mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.css delete mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.js delete mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/sort-arrow-sprite.png delete mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/sorter.js delete mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/index.html delete mode 100644 tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/rzslider.js.html diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/base.css b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/base.css deleted file mode 100644 index 0c0571d..0000000 --- a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/base.css +++ /dev/null @@ -1,212 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px;; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } - - -.medium .chart { border:1px solid #666; } -.medium .cover-fill { background: #666; } - -.cbranch-no { background: yellow !important; color: #111; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } -.medium { background: #eaeaea; } - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/index.html b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/index.html deleted file mode 100644 index 67f0e5b..0000000 --- a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/index.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - Code coverage report for All files - - - - - - - -
-
-

- / -

-
-
- 44.54% - Statements - 261/586 -
-
- 32.62% - Branches - 91/279 -
-
- 54.88% - Functions - 45/82 -
-
- 44.67% - Lines - 260/582 -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
src/
44.54%261/58632.62%91/27954.88%45/8244.67%260/582
-
-
- - - - - - - diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.css b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.css deleted file mode 100644 index b317a7c..0000000 --- a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.js b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.js deleted file mode 100644 index ef51e03..0000000 --- a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/prettify.js +++ /dev/null @@ -1 +0,0 @@ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/sort-arrow-sprite.png b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/sort-arrow-sprite.png deleted file mode 100644 index 03f704a609c6fd0dbfdac63466a7d7c958b5cbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function (a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function (a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function () { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i =0 ; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function () { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(cols); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/index.html b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/index.html deleted file mode 100644 index 4beeb46..0000000 --- a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/index.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - Code coverage report for src\ - - - - - - - -
-
-

- all files src/ -

-
-
- 44.54% - Statements - 261/586 -
-
- 32.62% - Branches - 91/279 -
-
- 54.88% - Functions - 45/82 -
-
- 44.67% - Lines - 260/582 -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
rzslider.js
44.54%261/58632.62%91/27954.88%45/8244.67%260/582
-
-
- - - - - - - diff --git a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/rzslider.js.html b/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/rzslider.js.html deleted file mode 100644 index 1818535..0000000 --- a/tests/coverage/PhantomJS 1.9.8 (Windows 8 0.0.0)/src/rzslider.js.html +++ /dev/null @@ -1,4661 +0,0 @@ - - - - Code coverage report for src\rzslider.js - - - - - - - -
-
-

- all files / src/ rzslider.js -

-
-
- 44.54% - Statements - 261/586 -
-
- 32.62% - Branches - 91/279 -
-
- 54.88% - Functions - 45/82 -
-
- 44.67% - Lines - 260/582 -
-
-
-
-

-
-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013 -1014 -1015 -1016 -1017 -1018 -1019 -1020 -1021 -1022 -1023 -1024 -1025 -1026 -1027 -1028 -1029 -1030 -1031 -1032 -1033 -1034 -1035 -1036 -1037 -1038 -1039 -1040 -1041 -1042 -1043 -1044 -1045 -1046 -1047 -1048 -1049 -1050 -1051 -1052 -1053 -1054 -1055 -1056 -1057 -1058 -1059 -1060 -1061 -1062 -1063 -1064 -1065 -1066 -1067 -1068 -1069 -1070 -1071 -1072 -1073 -1074 -1075 -1076 -1077 -1078 -1079 -1080 -1081 -1082 -1083 -1084 -1085 -1086 -1087 -1088 -1089 -1090 -1091 -1092 -1093 -1094 -1095 -1096 -1097 -1098 -1099 -1100 -1101 -1102 -1103 -1104 -1105 -1106 -1107 -1108 -1109 -1110 -1111 -1112 -1113 -1114 -1115 -1116 -1117 -1118 -1119 -1120 -1121 -1122 -1123 -1124 -1125 -1126 -1127 -1128 -1129 -1130 -1131 -1132 -1133 -1134 -1135 -1136 -1137 -1138 -1139 -1140 -1141 -1142 -1143 -1144 -1145 -1146 -1147 -1148 -1149 -1150 -1151 -1152 -1153 -1154 -1155 -1156 -1157 -1158 -1159 -1160 -1161 -1162 -1163 -1164 -1165 -1166 -1167 -1168 -1169 -1170 -1171 -1172 -1173 -1174 -1175 -1176 -1177 -1178 -1179 -1180 -1181 -1182 -1183 -1184 -1185 -1186 -1187 -1188 -1189 -1190 -1191 -1192 -1193 -1194 -1195 -1196 -1197 -1198 -1199 -1200 -1201 -1202 -1203 -1204 -1205 -1206 -1207 -1208 -1209 -1210 -1211 -1212 -1213 -1214 -1215 -1216 -1217 -1218 -1219 -1220 -1221 -1222 -1223 -1224 -1225 -1226 -1227 -1228 -1229 -1230 -1231 -1232 -1233 -1234 -1235 -1236 -1237 -1238 -1239 -1240 -1241 -1242 -1243 -1244 -1245 -1246 -1247 -1248 -1249 -1250 -1251 -1252 -1253 -1254 -1255 -1256 -1257 -1258 -1259 -1260 -1261 -1262 -1263 -1264 -1265 -1266 -1267 -1268 -1269 -1270 -1271 -1272 -1273 -1274 -1275 -1276 -1277 -1278 -1279 -1280 -1281 -1282 -1283 -1284 -1285 -1286 -1287 -1288 -1289 -1290 -1291 -1292 -1293 -1294 -1295 -1296 -1297 -1298 -1299 -1300 -1301 -1302 -1303 -1304 -1305 -1306 -1307 -1308 -1309 -1310 -1311 -1312 -1313 -1314 -1315 -1316 -1317 -1318 -1319 -1320 -1321 -1322 -1323 -1324 -1325 -1326 -1327 -1328 -1329 -1330 -1331 -1332 -1333 -1334 -1335 -1336 -1337 -1338 -1339 -1340 -1341 -1342 -1343 -1344 -1345 -1346 -1347 -1348 -1349 -1350 -1351 -1352 -1353 -1354 -1355 -1356 -1357 -1358 -1359 -1360 -1361 -1362 -1363 -1364 -1365 -1366 -1367 -1368 -1369 -1370 -1371 -1372 -1373 -1374 -1375 -1376 -1377 -1378 -1379 -1380 -1381 -1382 -1383 -1384 -1385 -1386 -1387 -1388 -1389 -1390 -1391 -1392 -1393 -1394 -1395 -1396 -1397 -1398 -1399 -1400 -1401 -1402 -1403 -1404 -1405 -1406 -1407 -1408 -1409 -1410 -1411 -1412 -1413 -1414 -1415 -1416 -1417 -1418 -1419 -1420 -1421 -1422 -1423 -1424 -1425 -1426 -1427 -1428 -1429 -1430 -1431 -1432 -1433 -1434 -1435 -1436 -1437 -1438 -1439 -1440 -1441 -1442 -1443 -1444 -1445 -1446 -1447 -1448 -1449 -1450 -1451 -1452 -1453 -1454 -1455 -1456 -1457 -1458 -1459 -1460 -1461 -1462 -1463 -1464 -1465 -1466 -1467 -1468 -1469 -1470 -1471 -1472 -1473 -1474 -1475 -1476 -1477 -1478 -1479 -1480 -1481 -1482 -1483 -1484 -1485 -1486 -1487 -1488 -1489 -1490 -1491 -1492 -1493 -1494 -1495 -1496 -1497 -1498 -1499 -1500 -1501 -1502 -1503 -1504 -1505 -1506 -1507 -1508 -1509 -1510 -1511 -1512 -1513 -1514 -1515 -1516 -1517 -1518 -1519 -1520 -1521 -1522 -1523 -1524 -1525 -1526 -1527 -1528 -1529 -1530 -1531 -1532 -1533  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -1× -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -  -1× -  -  -2× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2× -  -2× -  -  -  -  -  -  -  -  -  -2× -  -  -  -2× -4× -  -  -2× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -8× -  -  -8× -8× -8× -8× -8× -  -  -  -  -  -8× -1× -1× -  -  -1× -1× -1× -1× -1× -1× -1× -1× -1× -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -2× -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -  -  -  -  -  -  -4× -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -  -  -  -  -  -4× -  -  -  -  -  -  -4× -  -  -4× -4× -4× -4× -4× -4× -4× -4× -4× -4× -  -  -4× -  -  -  -2× -  -  -  -  -  -  -  -4× -  -  -  -4× -4× -4× -4× -4× -4× -4× -  -4× -  -  -  -  -  -  -  -4× -  -  -4× -  -4× -  -  -4× -  -  -  -4× -1× -1× -1× -1× -1× -  -1× -  -  -  -  -  -4× -  -  -  -  -  -  -  -  -4× -  -  -  -  -  -  -  -  -  -4× -4× -3× -1× -  -  -4× -4× -4× -  -  -  -  -  -  -  -  -4× -4× -4× -  -  -  -  -4× -  -  -  -  -  -  -  -  -  -4× -  -4× -  -4× -4× -4× -  -4× -  -  -  -  -  -  -4× -  -  -4× -8× -  -  -4× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4× -40× -  -40× -  -4× -4× -  -4× -4× -  -4× -4× -  -4× -4× -  -4× -4× -  -4× -4× -  -4× -4× -  -4× -4× -  -4× -4× -  -4× -4× -  -  -  -  -  -4× -4× -4× -4× -4× -4× -4× -4× -  -  -  -  -  -  -  -4× -4× -  -  -  -4× -4× -4× -4× -4× -4× -  -4× -4× -  -4× -  -  -4× -  -  -  -24× -24× -12× -  -12× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4× -  -  -4× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2× -  -2× -  -  -2× -2× -2× -  -  -2× -  -  -2× -2× -  -  -  -  -  -  -  -  -  -  -5× -5× -  -5× -5× -  -  -5× -  -5× -1× -  -4× -  -5× -  -  -  -  -  -  -  -  -  -  -4× -4× -4× -4× -4× -  -  -4× -  -  -  -  -  -  -  -  -  -  -  -  -6× -6× -6× -6× -6× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4× -  -4× -4× -  -4× -  -4× -4× -  -4× -  -  -  -  -  -  -  -  -  -  -  -  -2× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -1× -1× -  -1× -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2× -2× -2× -2× -  -2× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2× -  -  -2× -  -  -  -2× -2× -  -  -2× -  -  -  -2× -2× -  -  -2× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2× -2× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -12× -  -  -  -12× -12× -  -  -  -  -  -  -  -  -  -12× -  -  -  -  -  -  -  -  -  -  -  -16× -  -  -  -16× -  -  -  -  -  -  -  -  -  -  -  -  -6× -6× -6× -6× -6× -  -  -  -  -  -  -  -  -  -14× -14× -  -  -14× -14× -  -  -  -  -  -  -  -  -  -  -2× -2× -2× -2× -2× -  -  -  -  -  -  -  -  -  -2× -  -  -  -  -  -  -  -  -  -3× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -1× -1× -  -  -  -  -  -  -  -  -  -1× -1× -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -1× -1× -1× -1× -  -1× -  -1× -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -1× -1× -1× -1× -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2× -  -  -  -  -  -2× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -3× -  -  -  -3× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  - 
/**
- * Angular JS slider directive
- *
- * (c) Rafal Zajac <rzajac@gmail.com>
- * http://github.com/rzajac/angularjs-slider
- *
- * Version: v2.1.0
- *
- * Licensed under the MIT license
- */
- 
-/*jslint unparam: true */
-/*global angular: false, console: false, define, module */
-(function (root, factory) {
-  'use strict';
-  Iif (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module.
-    define(['angular'], factory);
-  } else Iif (typeof module === 'object' && module.exports) {
-    // Node. Does not work with strict CommonJS, but
-    // only CommonJS-like environments that support module.exports,
-    // like Node.
-    // to support bundler like browserify
-    module.exports = factory(require('angular'));
-  } else {
-    // Browser globals (root is window)
-    factory(root.angular);
-  }
- 
-}(this, function (angular) {
-  'use strict';
-  var module = angular.module('rzModule', [])
- 
-    .factory('RzSliderOptions', function () {
-      var defaultOptions = {
-        floor: 0,
-        ceil: null, //defaults to rz-slider-model
-        step: 1,
-        precision: 0,
-        id: null,
-        translate: null,
-        stepsArray: null,
-        draggableRange: false,
-        showSelectionBar: false,
-        hideLimitLabels: false,
-        readOnly: false,
-        disabled: false,
-        interval: 350,
-        showTicks: false,
-        showTicksValues: false,
-        ticksValuesTooltip: null,
-        vertical: false,
-        keyboardSupport: true,
-        scale: 1,
-        onStart: null,
-        onChange: null,
-        onEnd: null
-      };
-      var globalOptions = {};
- 
-      var factory = {};
-      /**
-       * `options({})` allows global configuration of all sliders in the
-       * application.
-       *
-       *   var app = angular.module( 'App', ['rzModule'], function( RzSliderOptions ) {
-     *     // show ticks for all sliders
-     *     RzSliderOptions.options( { showTicks: true } );
-     *   });
-       */
-      factory.options = function (value) {
-        angular.extend(globalOptions, value);
-      };
- 
-      factory.getOptions = function (options) {
-        return angular.extend({}, defaultOptions, globalOptions, options);
-      };
- 
-      return factory;
-    })
- 
-    .value('rzThrottle',
-    /**
-     * rzThrottle
-     *
-     * Taken from underscore project
-     *
-     * @param {Function} func
-     * @param {number} wait
-     * @param {ThrottleOptions} options
-     * @returns {Function}
-     */
-    function throttle(func, wait, options) {
-      'use strict';
-      var getTime = (Date.now || function () {
-        return new Date().getTime();
-      });
-      var context, args, result;
-      var timeout = null;
-      var previous = 0;
-      options = options || {};
-      var later = function () {
-        previous = options.leading === false ? 0 : getTime();
-        timeout = null;
-        result = func.apply(context, args);
-        context = args = null;
-      };
-      return function () {
-        var now = getTime();
-        Iif (!previous && options.leading === false) {
-          previous = now;
-        }
-        var remaining = wait - (now - previous);
-        context = this;
-        args = arguments;
-        Eif (remaining <= 0) {
-          clearTimeout(timeout);
-          timeout = null;
-          previous = now;
-          result = func.apply(context, args);
-          context = args = null;
-        } else if (!timeout && options.trailing !== false) {
-          timeout = setTimeout(later, remaining);
-        }
-        return result;
-      };
-    })
- 
-    .factory('RzSlider', function ($timeout, $document, $window, $compile, RzSliderOptions, rzThrottle) {
-      'use strict';
- 
-      /**
-       * Slider
-       *
-       * @param {ngScope} scope            The AngularJS scope
-       * @param {Element} sliderElem The slider directive element wrapped in jqLite
-       * @constructor
-       */
-      var Slider = function (scope, sliderElem) {
-        /**
-         * The slider's scope
-         *
-         * @type {ngScope}
-         */
-        this.scope = scope;
- 
-        /**
-         * Slider element wrapped in jqLite
-         *
-         * @type {jqLite}
-         */
-        this.sliderElem = sliderElem;
- 
-        /**
-         * Slider type
-         *
-         * @type {boolean} Set to true for range slider
-         */
-        this.range = this.scope.rzSliderModel !== undefined && this.scope.rzSliderHigh !== undefined;
- 
-        /**
-         * Values recorded when first dragging the bar
-         *
-         * @type {Object}
-         */
-        this.dragging = {
-          active: false,
-          value: 0,
-          difference: 0,
-          offset: 0,
-          lowDist: 0,
-          highDist: 0
-        };
- 
-        /**
-         * property that handle position (defaults to left for horizontal)
-         * @type {string}
-         */
-        this.positionProperty = 'left';
- 
-        /**
-         * property that handle dimension (defaults to width for horizontal)
-         * @type {string}
-         */
-        this.dimensionProperty = 'width';
- 
-        /**
-         * Half of the width or height of the slider handles
-         *
-         * @type {number}
-         */
-        this.handleHalfDim = 0;
- 
-        /**
-         * Maximum position the slider handle can have
-         *
-         * @type {number}
-         */
-        this.maxPos = 0;
- 
-        /**
-         * Precision
-         *
-         * @type {number}
-         */
-        this.precision = 0;
- 
-        /**
-         * Step
-         *
-         * @type {number}
-         */
-        this.step = 0;
- 
-        /**
-         * The name of the handle we are currently tracking
-         *
-         * @type {string}
-         */
-        this.tracking = '';
- 
-        /**
-         * Minimum value (floor) of the model
-         *
-         * @type {number}
-         */
-        this.minValue = 0;
- 
-        /**
-         * Maximum value (ceiling) of the model
-         *
-         * @type {number}
-         */
-        this.maxValue = 0;
- 
- 
-        /**
-         * The delta between min and max value
-         *
-         * @type {number}
-         */
-        this.valueRange = 0;
- 
-        /**
-         * Set to true if init method already executed
-         *
-         * @type {boolean}
-         */
-        this.initHasRun = false;
- 
-        // Slider DOM elements wrapped in jqLite
-        this.fullBar = null; // The whole slider bar
-        this.selBar = null; // Highlight between two handles
-        this.minH = null; // Left slider handle
-        this.maxH = null; // Right slider handle
-        this.flrLab = null; // Floor label
-        this.ceilLab = null; // Ceiling label
-        this.minLab = null; // Label above the low value
-        this.maxLab = null; // Label above the high value
-        this.cmbLab = null; // Combined label
-        this.ticks = null; // The ticks
- 
-        // Initialize slider
-        this.init();
-      };
- 
-      // Add instance methods
-      Slider.prototype = {
- 
-        /**
-         * Initialize slider
-         *
-         * @returns {undefined}
-         */
-        init: function () {
-          var thrLow, thrHigh,
-            calcDimFn = angular.bind(this, this.calcViewDimensions),
-            self = this;
- 
-          this.applyOptions();
-          this.initElemHandles();
-          this.manageElementsStyle();
-          this.addAccessibility();
-          this.setDisabledState();
-          this.calcViewDimensions();
-          this.setMinAndMax();
- 
-          $timeout(function () {
-            self.updateCeilLab();
-            self.updateFloorLab();
-            self.initHandles();
-            self.manageEventsBindings();
-          });
- 
-          // Recalculate slider view dimensions
-          this.scope.$on('reCalcViewDimensions', calcDimFn);
- 
-          // Recalculate stuff if view port dimensions have changed
-          angular.element($window).on('resize', calcDimFn);
- 
-          Iif (this.options.vertical)
-            this.sliderElem.addClass('vertical');
- 
-          this.initHasRun = true;
- 
-          // Watch for changes to the model
- 
-          thrLow = rzThrottle(function () {
-            self.setMinAndMax();
-            self.updateLowHandle(self.valueToOffset(self.scope.rzSliderModel));
-            self.updateSelectionBar();
-            self.updateTicksScale();
-            self.updateAriaAttributes();
- 
-            Iif (self.range) {
-              self.updateCmbLabel();
-            }
- 
-          }, self.options.interval);
- 
-          thrHigh = rzThrottle(function () {
-            self.setMinAndMax();
-            self.updateHighHandle(self.valueToOffset(self.scope.rzSliderHigh));
-            self.updateSelectionBar();
-            self.updateTicksScale();
-            self.updateCmbLabel();
-            self.updateAriaAttributes();
-          }, self.options.interval);
- 
-          this.scope.$on('rzSliderForceRender', function () {
-            self.resetLabelsValue();
-            thrLow();
-            if (self.range) {
-              thrHigh();
-            }
-            self.resetSlider();
-          });
- 
-          // Watchers
-          this.scope.$watch('rzSliderModel', function (newValue, oldValue) {
-            if (newValue === oldValue)
-              return;
-            thrLow();
-          });
- 
-          this.scope.$watch('rzSliderHigh', function (newValue, oldValue) {
-            Eif (newValue === oldValue)
-              return;
-            if (newValue != null)
-              thrHigh();
-            if (self.range && newValue == null || !self.range && newValue != null) {
-              self.applyOptions();
-              self.resetSlider();
-            }
-          });
- 
-          this.scope.$watch('rzSliderOptions', function (newValue, oldValue) {
-            Eif (newValue === oldValue)
-              return;
-            self.applyOptions();
-            self.resetSlider();
-          }, true);
- 
-          this.scope.$on('$destroy', function () {
-            self.unbindEvents();
-            angular.element($window).off('resize', calcDimFn);
-          });
-        },
- 
-        /**
-         * Read the user options and apply them to the slider model
-         */
-        applyOptions: function () {
-          this.options = RzSliderOptions.getOptions(this.scope.rzSliderOptions);
- 
-          Iif (this.options.step <= 0)
-            this.options.step = 1;
-          this.range = this.scope.rzSliderModel !== undefined && this.scope.rzSliderHigh !== undefined;
-          this.options.draggableRange = this.range && this.options.draggableRange;
-          this.options.showTicks = this.options.showTicks || this.options.showTicksValues;
- 
-          Iif (this.options.stepsArray) {
-            this.options.floor = 0;
-            this.options.ceil = this.options.stepsArray.length - 1;
-            this.options.step = 1;
-            this.customTrFn = function (value) {
-              return this.options.stepsArray[value];
-            };
-          } else Iif (this.options.translate)
-            this.customTrFn = this.options.translate;
-          else
-            this.customTrFn = function (value) {
-              return String(value);
-            };
- 
-          Iif (this.options.vertical) {
-            this.positionProperty = 'bottom';
-            this.dimensionProperty = 'height';
-          }
-        },
- 
-        /**
-         * Resets slider
-         *
-         * @returns {undefined}
-         */
-        resetSlider: function () {
-          this.manageElementsStyle();
-          this.setMinAndMax();
-          this.updateCeilLab();
-          this.updateFloorLab();
-          this.unbindEvents();
-          this.manageEventsBindings();
-          this.setDisabledState();
-          this.calcViewDimensions();
-        },
- 
-        /**
-         * Set the slider children to variables for easy access
-         *
-         * Run only once during initialization
-         *
-         * @returns {undefined}
-         */
-        initElemHandles: function () {
-          // Assign all slider elements to object properties for easy access
-          angular.forEach(this.sliderElem.children(), function (elem, index) {
-            var jElem = angular.element(elem);
- 
-            switch (index) {
-              case 0:
-                this.fullBar = jElem;
-                break;
-              case 1:
-                this.selBar = jElem;
-                break;
-              case 2:
-                this.minH = jElem;
-                break;
-              case 3:
-                this.maxH = jElem;
-                break;
-              case 4:
-                this.flrLab = jElem;
-                break;
-              case 5:
-                this.ceilLab = jElem;
-                break;
-              case 6:
-                this.minLab = jElem;
-                break;
-              case 7:
-                this.maxLab = jElem;
-                break;
-              case 8:
-                this.cmbLab = jElem;
-                break;
-              case 9:
-                this.ticks = jElem;
-                break;
-            }
- 
-          }, this);
- 
-          // Initialize offset cache properties
-          this.selBar.rzsp = 0;
-          this.minH.rzsp = 0;
-          this.maxH.rzsp = 0;
-          this.flrLab.rzsp = 0;
-          this.ceilLab.rzsp = 0;
-          this.minLab.rzsp = 0;
-          this.maxLab.rzsp = 0;
-          this.cmbLab.rzsp = 0;
-        },
- 
-        /** Update each elements style based on options
-         *
-         */
-        manageElementsStyle: function () {
- 
-          Eif (!this.range)
-            this.maxH.css('display', 'none');
-          else
-            this.maxH.css('display', null);
- 
-          this.alwaysHide(this.flrLab, this.options.showTicksValues || this.options.hideLimitLabels);
-          this.alwaysHide(this.ceilLab, this.options.showTicksValues || this.options.hideLimitLabels);
-          this.alwaysHide(this.minLab, this.options.showTicksValues);
-          this.alwaysHide(this.maxLab, this.options.showTicksValues || !this.range);
-          this.alwaysHide(this.cmbLab, this.options.showTicksValues || !this.range);
-          this.alwaysHide(this.selBar, !this.range && !this.options.showSelectionBar);
- 
-          Eif (!this.options.showTicks)
-            this.ticks.html('');
- 
-          Iif (this.options.draggableRange)
-            this.selBar.addClass('rz-draggable');
-          else
-            this.selBar.removeClass('rz-draggable');
-        },
- 
-        alwaysHide: function (el, hide) {
-          el.rzAlwaysHide = hide;
-          if (hide)
-            this.hideEl(el);
-          else
-            this.showEl(el)
-        },
- 
-        /**
-         * Manage the events bindings based on readOnly and disabled options
-         *
-         * @returns {undefined}
-         */
-        manageEventsBindings: function () {
-          if (this.options.disabled || this.options.readOnly)
-            this.unbindEvents();
-          else if (!this.options.disabled || !this.options.readOnly)
-            this.bindEvents();
-        },
- 
-        /**
-         * Set the disabled state based on rzSliderDisabled
-         *
-         * @returns {undefined}
-         */
-        setDisabledState: function () {
-          Iif (this.options.disabled) {
-            this.sliderElem.attr('disabled', 'disabled');
-          } else {
-            this.sliderElem.attr('disabled', null);
-          }
-        },
- 
-        /**
-         * Reset label values
-         *
-         * @return {undefined}
-         */
-        resetLabelsValue: function () {
-          this.minLab.rzsv = undefined;
-          this.maxLab.rzsv = undefined;
-        },
- 
-        /**
-         * Initialize slider handles positions and labels
-         *
-         * Run only once during initialization and every time view port changes size
-         *
-         * @returns {undefined}
-         */
-        initHandles: function () {
-          this.updateLowHandle(this.valueToOffset(this.scope.rzSliderModel));
- 
-          /*
-           the order here is important since the selection bar should be
-           updated after the high handle but before the combined label
-           */
-          if (this.range)
-            this.updateHighHandle(this.valueToOffset(this.scope.rzSliderHigh));
-          this.updateSelectionBar();
-          if (this.range)
-            this.updateCmbLabel();
- 
-          this.updateTicksScale();
-        },
- 
-        /**
-         * Translate value to human readable format
-         *
-         * @param {number|string} value
-         * @param {jqLite} label
-         * @param {boolean} [useCustomTr]
-         * @returns {undefined}
-         */
-        translateFn: function (value, label, useCustomTr) {
-          useCustomTr = useCustomTr === undefined ? true : useCustomTr;
- 
-          var valStr = String((useCustomTr ? this.customTrFn(value, this.options.id) : value)),
-            getDimension = false;
- 
-          Eif (label.rzsv === undefined || label.rzsv.length !== valStr.length || (label.rzsv.length > 0 && label.rzsd === 0)) {
-            getDimension = true;
-            label.rzsv = valStr;
-          }
- 
-          label.text(valStr);
- 
-          // Update width only when length of the label have changed
-          Eif (getDimension) {
-            this.getDimension(label);
-          }
-        },
- 
-        /**
-         * Set maximum and minimum values for the slider and ensure the model and high
-         * value match these limits
-         * @returns {undefined}
-         */
-        setMinAndMax: function () {
- 
-          this.step = +this.options.step;
-          this.precision = +this.options.precision;
- 
-          this.scope.rzSliderModel = this.roundStep(this.scope.rzSliderModel);
-          Iif (this.range)
-            this.scope.rzSliderHigh = this.roundStep(this.scope.rzSliderHigh);
- 
-          this.minValue = this.roundStep(+this.options.floor);
- 
-          if (this.options.ceil != null)
-            this.maxValue = this.roundStep(+this.options.ceil);
-          else
-            this.maxValue = this.options.ceil = this.range ? this.scope.rzSliderHigh : this.scope.rzSliderModel;
- 
-          this.valueRange = this.maxValue - this.minValue;
-        },
- 
-        /**
-         * Adds accessibility attributes
-         *
-         * Run only once during initialization
-         *
-         * @returns {undefined}
-         */
-        addAccessibility: function () {
-          this.minH.attr('role', 'slider');
-          this.updateAriaAttributes();
-          Eif (this.options.keyboardSupport)
-            this.minH.attr('tabindex', '0');
-          Iif (this.options.vertical)
-            this.minH.attr('aria-orientation', 'vertical');
- 
-          Iif (this.range) {
-            this.maxH.attr('role', 'slider');
-            if (this.options.keyboardSupport)
-              this.maxH.attr('tabindex', '0');
-            if (this.options.vertical)
-              this.maxH.attr('aria-orientation', 'vertical');
-          }
-        },
- 
-        /**
-         * Updates aria attributes according to current values
-         */
-        updateAriaAttributes: function () {
-          this.minH.attr('aria-valuenow', this.scope.rzSliderModel);
-          this.minH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderModel));
-          this.minH.attr('aria-valuemin', this.minValue);
-          this.minH.attr('aria-valuemax', this.maxValue);
-          Iif (this.range) {
-            this.maxH.attr('aria-valuenow', this.scope.rzSliderHigh);
-            this.maxH.attr('aria-valuetext', this.customTrFn(this.scope.rzSliderHigh));
-            this.maxH.attr('aria-valuemin', this.minValue);
-            this.maxH.attr('aria-valuemax', this.maxValue);
-          }
-        },
- 
-        /**
-         * Calculate dimensions that are dependent on view port size
-         *
-         * Run once during initialization and every time view port changes size.
-         *
-         * @returns {undefined}
-         */
-        calcViewDimensions: function () {
-          var handleWidth = this.getDimension(this.minH);
- 
-          this.handleHalfDim = handleWidth / 2;
-          this.barDimension = this.getDimension(this.fullBar);
- 
-          this.maxPos = this.barDimension - handleWidth;
- 
-          this.getDimension(this.sliderElem);
-          this.sliderElem.rzsp = this.sliderElem[0].getBoundingClientRect()[this.positionProperty];
- 
-          Iif (this.initHasRun) {
-            this.updateFloorLab();
-            this.updateCeilLab();
-            this.initHandles();
-          }
-        },
- 
-        /**
-         * Update the ticks position
-         *
-         * @returns {undefined}
-         */
-        updateTicksScale: function () {
-          Eif (!this.options.showTicks) return;
-          if (!this.step) return; //if step is 0, the following loop will be endless.
- 
-          var positions = '',
-            ticksCount = Math.round((this.maxValue - this.minValue) / this.step) + 1;
-          for (var i = 0; i < ticksCount; i++) {
-            var value = this.roundStep(this.minValue + i * this.step);
-            var selectedClass = this.isTickSelected(value) ? 'selected' : '';
-            positions += '<li class="tick ' + selectedClass + '">';
-            if (this.options.showTicksValues) {
-              var tooltip = '';
-              if (this.options.ticksValuesTooltip) {
-                tooltip = 'uib-tooltip="' + this.options.ticksValuesTooltip(value) + '"';
-                if (this.options.vertical)
-                  tooltip += ' tooltip-placement="right"'
-              }
-              positions += '<span ' + tooltip + ' class="tick-value">' + this.getDisplayValue(value) + '</span>';
-            }
-            positions += '</li>';
-          }
-          this.ticks.html(positions);
-          if (this.options.ticksValuesTooltip)
-            $compile(this.ticks.contents())(this.scope);
-        },
- 
-        isTickSelected: function (value) {
-          if (!this.range && this.options.showSelectionBar && value <= this.scope.rzSliderModel)
-            return true;
-          if (this.range && value >= this.scope.rzSliderModel && value <= this.scope.rzSliderHigh)
-            return true;
-          return false;
-        },
- 
-        /**
-         * Update position of the ceiling label
-         *
-         * @returns {undefined}
-         */
-        updateCeilLab: function () {
-          this.translateFn(this.maxValue, this.ceilLab);
-          this.setPosition(this.ceilLab, this.barDimension - this.ceilLab.rzsd);
-          this.getDimension(this.ceilLab);
-        },
- 
-        /**
-         * Update position of the floor label
-         *
-         * @returns {undefined}
-         */
-        updateFloorLab: function () {
-          this.translateFn(this.minValue, this.flrLab);
-          this.getDimension(this.flrLab);
-        },
- 
-        /**
-         * Call the onStart callback if defined
-         *
-         * @returns {undefined}
-         */
-        callOnStart: function () {
-          if (this.options.onStart) {
-            var self = this;
-            $timeout(function () {
-              self.options.onStart(self.options.id);
-            });
-          }
-        },
- 
-        /**
-         * Call the onChange callback if defined
-         *
-         * @returns {undefined}
-         */
-        callOnChange: function () {
-          Iif (this.options.onChange) {
-            var self = this;
-            $timeout(function () {
-              self.options.onChange(self.options.id);
-            });
-          }
-        },
- 
-        /**
-         * Call the onEnd callback if defined
-         *
-         * @returns {undefined}
-         */
-        callOnEnd: function () {
-          if (this.options.onEnd) {
-            var self = this;
-            $timeout(function () {
-              self.options.onEnd(self.options.id);
-            });
-          }
-        },
- 
-        /**
-         * Update slider handles and label positions
-         *
-         * @param {string} which
-         * @param {number} newOffset
-         */
-        updateHandles: function (which, newOffset) {
-          Eif (which === 'rzSliderModel') {
-            this.updateLowHandle(newOffset);
-            this.updateSelectionBar();
-            this.updateTicksScale();
- 
-            Iif (this.range) {
-              this.updateCmbLabel();
-            }
-            return;
-          }
- 
-          if (which === 'rzSliderHigh') {
-            this.updateHighHandle(newOffset);
-            this.updateSelectionBar();
-            this.updateTicksScale();
- 
-            if (this.range) {
-              this.updateCmbLabel();
-            }
-            return;
-          }
- 
-          // Update both
-          this.updateLowHandle(newOffset);
-          this.updateHighHandle(newOffset);
-          this.updateSelectionBar();
-          this.updateTicksScale();
-          this.updateCmbLabel();
-        },
- 
-        /**
-         * Update low slider handle position and label
-         *
-         * @param {number} newOffset
-         * @returns {undefined}
-         */
-        updateLowHandle: function (newOffset) {
-          this.setPosition(this.minH, newOffset);
-          this.translateFn(this.scope.rzSliderModel, this.minLab);
-          var pos = Math.min(Math.max(newOffset - this.minLab.rzsd / 2 + this.handleHalfDim, 0), this.barDimension - this.ceilLab.rzsd);
-          this.setPosition(this.minLab, pos);
- 
-          this.shFloorCeil();
-        },
- 
-        /**
-         * Update high slider handle position and label
-         *
-         * @param {number} newOffset
-         * @returns {undefined}
-         */
-        updateHighHandle: function (newOffset) {
-          this.setPosition(this.maxH, newOffset);
-          this.translateFn(this.scope.rzSliderHigh, this.maxLab);
-          var pos = Math.min((newOffset - this.maxLab.rzsd / 2 + this.handleHalfDim), (this.barDimension - this.ceilLab.rzsd));
-          this.setPosition(this.maxLab, pos);
- 
-          this.shFloorCeil();
-        },
- 
-        /**
-         * Show / hide floor / ceiling label
-         *
-         * @returns {undefined}
-         */
-        shFloorCeil: function () {
-          var flHidden = false,
-            clHidden = false;
- 
-          Iif (this.minLab.rzsp <= this.flrLab.rzsp + this.flrLab.rzsd + 5) {
-            flHidden = true;
-            this.hideEl(this.flrLab);
-          } else {
-            flHidden = false;
-            this.showEl(this.flrLab);
-          }
- 
-          Iif (this.minLab.rzsp + this.minLab.rzsd >= this.ceilLab.rzsp - this.handleHalfDim - 10) {
-            clHidden = true;
-            this.hideEl(this.ceilLab);
-          } else {
-            clHidden = false;
-            this.showEl(this.ceilLab);
-          }
- 
-          Iif (this.range) {
-            if (this.maxLab.rzsp + this.maxLab.rzsd >= this.ceilLab.rzsp - 10) {
-              this.hideEl(this.ceilLab);
-            } else if (!clHidden) {
-              this.showEl(this.ceilLab);
-            }
- 
-            // Hide or show floor label
-            if (this.maxLab.rzsp <= this.flrLab.rzsp + this.flrLab.rzsd + this.handleHalfDim) {
-              this.hideEl(this.flrLab);
-            } else if (!flHidden) {
-              this.showEl(this.flrLab);
-            }
-          }
-        },
- 
-        /**
-         * Update slider selection bar, combined label and range label
-         *
-         * @returns {undefined}
-         */
-        updateSelectionBar: function () {
-          this.setDimension(this.selBar, Math.abs(this.maxH.rzsp - this.minH.rzsp) + this.handleHalfDim);
-          this.setPosition(this.selBar, this.range ? this.minH.rzsp + this.handleHalfDim : 0);
-        },
- 
-        /**
-         * Update combined label position and value
-         *
-         * @returns {undefined}
-         */
-        updateCmbLabel: function () {
-          var lowTr, highTr;
- 
-          if (this.minLab.rzsp + this.minLab.rzsd + 10 >= this.maxLab.rzsp) {
-            lowTr = this.getDisplayValue(this.scope.rzSliderModel);
-            highTr = this.getDisplayValue(this.scope.rzSliderHigh);
- 
-            this.translateFn(lowTr + ' - ' + highTr, this.cmbLab, false);
-            var pos = Math.min(Math.max((this.selBar.rzsp + this.selBar.rzsd / 2 - this.cmbLab.rzsd / 2), 0), (this.barDimension - this.cmbLab.rzsd));
-            this.setPosition(this.cmbLab, pos);
-            this.hideEl(this.minLab);
-            this.hideEl(this.maxLab);
-            this.showEl(this.cmbLab);
-          } else {
-            this.showEl(this.maxLab);
-            this.showEl(this.minLab);
-            this.hideEl(this.cmbLab);
-          }
-        },
- 
-        /**
-         * Return the translated value if a translate function is provided else the original value
-         * @param value
-         * @returns {*}
-         */
-        getDisplayValue: function (value) {
-          return this.customTrFn(value, this.options.id);
-        },
- 
-        /**
-         * Round value to step and precision
-         *
-         * @param {number} value
-         * @returns {number}
-         */
-        roundStep: function (value) {
-          var step = this.step,
-            remainder = +((value - this.minValue) % step).toFixed(3),
-            steppedValue = remainder > (step / 2) ? value + step - remainder : value - remainder;
- 
-          steppedValue = steppedValue.toFixed(this.precision);
-          return +steppedValue;
-        },
- 
-        /**
-         * Hide element
-         *
-         * @param element
-         * @returns {jqLite} The jqLite wrapped DOM element
-         */
-        hideEl: function (element) {
-          return element.css({
-            opacity: 0
-          });
-        },
- 
-        /**
-         * Show element
-         *
-         * @param element The jqLite wrapped DOM element
-         * @returns {jqLite} The jqLite
-         */
-        showEl: function (element) {
-          Iif (!!element.rzAlwaysHide) {
-            return element;
-          }
- 
-          return element.css({
-            opacity: 1
-          });
-        },
- 
-        /**
-         * Set element left/top offset depending on whether slider is horizontal or vertical
-         *
-         * @param {jqLite} elem The jqLite wrapped DOM element
-         * @param {number} pos
-         * @returns {number}
-         */
-        setPosition: function (elem, pos) {
-          elem.rzsp = pos;
-          var css = {};
-          css[this.positionProperty] = pos + 'px';
-          elem.css(css);
-          return pos;
-        },
- 
-        /**
-         * Get element width/height depending on whether slider is horizontal or vertical
-         *
-         * @param {jqLite} elem The jqLite wrapped DOM element
-         * @returns {number}
-         */
-        getDimension: function (elem) {
-          var val = elem[0].getBoundingClientRect();
-          Iif (this.options.vertical)
-            elem.rzsd = (val.bottom - val.top) * this.options.scale;
-          else
-            elem.rzsd = (val.right - val.left) * this.options.scale;
-          return elem.rzsd;
-        },
- 
-        /**
-         * Set element width/height depending on whether slider is horizontal or vertical
-         *
-         * @param {jqLite} elem  The jqLite wrapped DOM element
-         * @param {number} dim
-         * @returns {number}
-         */
-        setDimension: function (elem, dim) {
-          elem.rzsd = dim;
-          var css = {};
-          css[this.dimensionProperty] = dim + 'px';
-          elem.css(css);
-          return dim;
-        },
- 
-        /**
-         * Translate value to pixel offset
-         *
-         * @param {number} val
-         * @returns {number}
-         */
-        valueToOffset: function (val) {
-          return (this.sanitizeValue(val) - this.minValue) * this.maxPos / this.valueRange || 0;
-        },
- 
-        /**
-         * Returns a value that is within slider range
-         *
-         * @param {number} val
-         * @returns {number}
-         */
-        sanitizeValue: function (val) {
-          return Math.min(Math.max(val, this.minValue), this.maxValue);
-        },
- 
-        /**
-         * Translate offset to model value
-         *
-         * @param {number} offset
-         * @returns {number}
-         */
-        offsetToValue: function (offset) {
-          return (offset / this.maxPos) * this.valueRange + this.minValue;
-        },
- 
-        // Events
- 
-        /**
-         * Get the X-coordinate or Y-coordinate of an event
-         *
-         * @param {Object} event  The event
-         * @returns {number}
-         */
-        getEventXY: function (event) {
-          /* http://stackoverflow.com/a/12336075/282882 */
-          //noinspection JSLint
-          var clientXY = this.options.vertical ? 'clientY' : 'clientX';
-          if (clientXY in event) {
-            return event[clientXY];
-          }
- 
-          return event.originalEvent === undefined ?
-            event.touches[0][clientXY] : event.originalEvent.touches[0][clientXY];
-        },
- 
-        /**
-         * Compute the event position depending on whether the slider is horizontal or vertical
-         * @param event
-         * @returns {number}
-         */
-        getEventPosition: function (event) {
-          var sliderPos = this.sliderElem.rzsp,
-            eventPos = 0;
-          if (this.options.vertical)
-            eventPos = -this.getEventXY(event) + sliderPos;
-          else
-            eventPos = this.getEventXY(event) - sliderPos;
-          return (eventPos - this.handleHalfDim) * this.options.scale;
-        },
- 
-        /**
-         * Get the handle closest to an event.
-         *
-         * @param event {Event} The event
-         * @returns {jqLite} The handle closest to the event.
-         */
-        getNearestHandle: function (event) {
-          if (!this.range) {
-            return this.minH;
-          }
-          var offset = this.getEventPosition(event);
-          return Math.abs(offset - this.minH.rzsp) < Math.abs(offset - this.maxH.rzsp) ? this.minH : this.maxH;
-        },
- 
-        /**
-         * Bind mouse and touch events to slider handles
-         *
-         * @returns {undefined}
-         */
-        bindEvents: function () {
-          if (this.options.readOnly || this.options.disabled) return;
-          var barTracking, barStart, barMove;
- 
-          if (this.options.draggableRange) {
-            barTracking = 'rzSliderDrag';
-            barStart = this.onDragStart;
-            barMove = this.onDragMove;
-          } else {
-            barTracking = 'rzSliderModel';
-            barStart = this.onStart;
-            barMove = this.onMove;
-          }
- 
-          this.minH.on('mousedown', angular.bind(this, this.onStart, this.minH, 'rzSliderModel'));
-          if (this.range) {
-            this.maxH.on('mousedown', angular.bind(this, this.onStart, this.maxH, 'rzSliderHigh'));
-          }
-          this.fullBar.on('mousedown', angular.bind(this, this.onStart, null, null));
-          this.fullBar.on('mousedown', angular.bind(this, this.onMove, this.fullBar));
-          this.selBar.on('mousedown', angular.bind(this, barStart, null, barTracking));
-          this.selBar.on('mousedown', angular.bind(this, barMove, this.selBar));
-          this.ticks.on('mousedown', angular.bind(this, this.onStart, null, null));
-          this.ticks.on('mousedown', angular.bind(this, this.onMove, this.ticks));
- 
-          this.minH.on('touchstart', angular.bind(this, this.onStart, this.minH, 'rzSliderModel'));
-          if (this.range) {
-            this.maxH.on('touchstart', angular.bind(this, this.onStart, this.maxH, 'rzSliderHigh'));
-          }
-          this.fullBar.on('touchstart', angular.bind(this, this.onStart, null, null));
-          this.fullBar.on('touchstart', angular.bind(this, this.onMove, this.fullBar));
-          this.selBar.on('touchstart', angular.bind(this, barStart, null, barTracking));
-          this.selBar.on('touchstart', angular.bind(this, barMove, this.selBar));
-          this.ticks.on('touchstart', angular.bind(this, this.onStart, null, null));
-          this.ticks.on('touchstart', angular.bind(this, this.onMove, this.ticks));
- 
-          if (this.options.keyboardSupport) {
-            this.minH.on('focus', angular.bind(this, this.onPointerFocus, this.minH, 'rzSliderModel'))
-            if (this.range) {
-              this.maxH.on('focus', angular.bind(this, this.onPointerFocus, this.maxH, 'rzSliderHigh'));
-            }
-          }
-        },
- 
-        /**
-         * Unbind mouse and touch events to slider handles
-         *
-         * @returns {undefined}
-         */
-        unbindEvents: function () {
-          this.minH.off();
-          this.maxH.off();
-          this.fullBar.off();
-          this.selBar.off();
-          this.ticks.off();
-        },
- 
-        /**
-         * onStart event handler
-         *
-         * @param {?Object} pointer The jqLite wrapped DOM element; if null, the closest handle is used
-         * @param {?string} ref     The name of the handle being changed; if null, the closest handle's value is modified
-         * @param {Event}   event   The event
-         * @returns {undefined}
-         */
-        onStart: function (pointer, ref, event) {
-          var ehMove, ehEnd,
-            eventNames = this.getEventNames(event);
- 
-          event.stopPropagation();
-          event.preventDefault();
- 
-          // We have to do this in case the HTML where the sliders are on
-          // have been animated into view.
-          this.calcViewDimensions();
- 
-          if (pointer) {
-            this.tracking = ref;
-          } else {
-            pointer = this.getNearestHandle(event);
-            this.tracking = pointer === this.minH ? 'rzSliderModel' : 'rzSliderHigh';
-          }
- 
-          pointer.addClass('rz-active');
- 
-          if (this.options.keyboardSupport)
-            pointer[0].focus();
- 
-          ehMove = angular.bind(this, this.dragging.active ? this.onDragMove : this.onMove, pointer);
-          ehEnd = angular.bind(this, this.onEnd, ehMove);
- 
-          $document.on(eventNames.moveEvent, ehMove);
-          $document.one(eventNames.endEvent, ehEnd);
-          this.callOnStart();
-        },
- 
-        /**
-         * onMove event handler
-         *
-         * @param {jqLite} pointer
-         * @param {Event}  event The event
-         * @returns {undefined}
-         */
-        onMove: function (pointer, event) {
-          var newOffset = this.getEventPosition(event),
-            newValue;
- 
-          if (newOffset <= 0) {
-            if (pointer.rzsp === 0)
-              return;
-            newValue = this.minValue;
-            newOffset = 0;
-          } else if (newOffset >= this.maxPos) {
-            if (pointer.rzsp === this.maxPos)
-              return;
-            newValue = this.maxValue;
-            newOffset = this.maxPos;
-          } else {
-            newValue = this.offsetToValue(newOffset);
-            newValue = this.roundStep(newValue);
-            newOffset = this.valueToOffset(newValue);
-          }
-          this.positionTrackingHandle(newValue, newOffset);
-        },
- 
-        /**
-         * onEnd event handler
-         *
-         * @param {Event}    event    The event
-         * @param {Function} ehMove   The the bound move event handler
-         * @returns {undefined}
-         */
-        onEnd: function (ehMove, event) {
-          var moveEventName = this.getEventNames(event).moveEvent;
- 
-          if (!this.options.keyboardSupport) {
-            this.minH.removeClass('rz-active');
-            this.maxH.removeClass('rz-active');
-            this.tracking = '';
-          }
-          this.dragging.active = false;
- 
-          $document.off(moveEventName, ehMove);
-          this.scope.$emit('slideEnded');
-          this.callOnEnd();
-        },
- 
-        onPointerFocus: function (pointer, ref, event) {
-          this.tracking = ref;
-          pointer.one('blur', angular.bind(this, this.onPointerBlur, pointer));
-          pointer.on('keydown', angular.bind(this, this.onKeyboardEvent));
-          pointer.addClass('rz-active');
-        },
- 
-        onPointerBlur: function (pointer, event) {
-          pointer.off('keydown');
-          this.tracking = '';
-          pointer.removeClass('rz-active');
-        },
- 
-        onKeyboardEvent: function (event) {
-          var currentValue = this.scope[this.tracking];
-          var keyCode = event.keyCode || event.which;
-          var keys = {
-            38: 'UP',
-            40: 'DOWN',
-            37: 'LEFT',
-            39: 'RIGHT',
-            33: 'PAGEUP',
-            34: 'PAGEDOWN',
-            36: 'HOME',
-            35: 'END'
-          };
- 
-          var actions = {
-            UP: currentValue + this.step,
-            DOWN: currentValue - this.step,
-            LEFT: currentValue - this.step,
-            RIGHT: currentValue + this.step,
-            PAGEUP: currentValue + this.valueRange / 10,
-            PAGEDOWN: currentValue - this.valueRange / 10,
-            HOME: this.minValue,
-            END: this.maxValue
-          };
-          var key = keys[keyCode];
-          var action = actions[key];
-          Iif (action == null || this.tracking === '') return;
-          event.preventDefault();
- 
-          var newValue = this.roundStep(this.sanitizeValue(action)),
-            newOffset = this.valueToOffset(newValue);
-          var switched = this.positionTrackingHandle(newValue, newOffset);
-          Iif (switched) {
-            var pointer = this.tracking === 'rzSliderModel' ? this.minH : this.maxH;
-            pointer[0].focus(); //to focus the correct pointer
-          }
-        },
- 
-        /**
-         * onDragStart event handler
-         *
-         * Handles dragging of the middle bar.
-         *
-         * @param {Object} pointer The jqLite wrapped DOM element
-         * @param {string} ref     One of the refLow, refHigh values
-         * @param {Event}  event   The event
-         * @returns {undefined}
-         */
-        onDragStart: function (pointer, ref, event) {
-          var offset = this.getEventPosition(event);
-          this.dragging = {
-            active: true,
-            value: this.offsetToValue(offset),
-            difference: this.scope.rzSliderHigh - this.scope.rzSliderModel,
-            offset: offset,
-            lowDist: offset - this.minH.rzsp,
-            highDist: this.maxH.rzsp - offset
-          };
-          this.minH.addClass('rz-active');
-          this.maxH.addClass('rz-active');
- 
-          this.onStart(pointer, ref, event);
-        },
- 
-        /**
-         * onDragMove event handler
-         *
-         * Handles dragging of the middle bar.
-         *
-         * @param {jqLite} pointer
-         * @param {Event}  event The event
-         * @returns {undefined}
-         */
-        onDragMove: function (pointer, event) {
-          var newOffset = this.getEventPosition(event),
-            newMinOffset, newMaxOffset,
-            newMinValue, newMaxValue;
- 
-          if (newOffset <= this.dragging.lowDist) {
-            if (pointer.rzsp === this.dragging.lowDist) {
-              return;
-            }
-            newMinValue = this.minValue;
-            newMinOffset = 0;
-            newMaxValue = this.minValue + this.dragging.difference;
-            newMaxOffset = this.valueToOffset(newMaxValue);
-          } else if (newOffset >= this.maxPos - this.dragging.highDist) {
-            if (pointer.rzsp === this.dragging.highDist) {
-              return;
-            }
-            newMaxValue = this.maxValue;
-            newMaxOffset = this.maxPos;
-            newMinValue = this.maxValue - this.dragging.difference;
-            newMinOffset = this.valueToOffset(newMinValue);
-          } else {
-            newMinValue = this.offsetToValue(newOffset - this.dragging.lowDist);
-            newMinValue = this.roundStep(newMinValue);
-            newMinOffset = this.valueToOffset(newMinValue);
-            newMaxValue = newMinValue + this.dragging.difference;
-            newMaxOffset = this.valueToOffset(newMaxValue);
-          }
- 
-          this.positionTrackingBar(newMinValue, newMaxValue, newMinOffset, newMaxOffset);
-        },
- 
-        /**
-         * Set the new value and offset for the entire bar
-         *
-         * @param {number} newMinValue   the new minimum value
-         * @param {number} newMaxValue   the new maximum value
-         * @param {number} newMinOffset  the new minimum offset
-         * @param {number} newMaxOffset  the new maximum offset
-         */
-        positionTrackingBar: function (newMinValue, newMaxValue, newMinOffset, newMaxOffset) {
-          this.scope.rzSliderModel = newMinValue;
-          this.scope.rzSliderHigh = newMaxValue;
-          this.updateHandles('rzSliderModel', newMinOffset);
-          this.updateHandles('rzSliderHigh', newMaxOffset);
-          this.scope.$apply();
-          this.callOnChange();
-        },
- 
-        /**
-         * Set the new value and offset to the current tracking handle
-         *
-         * @param {number} newValue new model value
-         * @param {number} newOffset new offset value
-         * @returns {Boolean} flag that indicates if min and max pointers have been switched.
-         */
-        positionTrackingHandle: function (newValue, newOffset) {
-          var switched = false;
-          Iif (this.range) {
-            /* This is to check if we need to switch the min and max handles*/
-            if (this.tracking === 'rzSliderModel' && newValue >= this.scope.rzSliderHigh) {
-              switched = true;
-              this.scope[this.tracking] = this.scope.rzSliderHigh;
-              this.updateHandles(this.tracking, this.maxH.rzsp);
-              this.updateAriaAttributes();
-              this.tracking = 'rzSliderHigh';
-              this.minH.removeClass('rz-active');
-              this.maxH.addClass('rz-active');
-              /* We need to apply here because we are not sure that we will enter the next block */
-              this.scope.$apply();
-              this.callOnChange();
-            } else if (this.tracking === 'rzSliderHigh' && newValue <= this.scope.rzSliderModel) {
-              switched = true;
-              this.scope[this.tracking] = this.scope.rzSliderModel;
-              this.updateHandles(this.tracking, this.minH.rzsp);
-              this.updateAriaAttributes();
-              this.tracking = 'rzSliderModel';
-              this.maxH.removeClass('rz-active');
-              this.minH.addClass('rz-active');
-              /* We need to apply here because we are not sure that we will enter the next block */
-              this.scope.$apply();
-              this.callOnChange();
-            }
-          }
- 
-          Eif (this.scope[this.tracking] !== newValue) {
-            this.scope[this.tracking] = newValue;
-            this.updateHandles(this.tracking, newOffset);
-            this.updateAriaAttributes();
-            this.scope.$apply();
-            this.callOnChange();
-          }
-          return switched;
-        },
- 
-        /**
-         * Get event names for move and event end
-         *
-         * @param {Event}    event    The event
-         *
-         * @return {{moveEvent: string, endEvent: string}}
-         */
-        getEventNames: function (event) {
-          var eventNames = {
-            moveEvent: '',
-            endEvent: ''
-          };
- 
-          if (event.touches || (event.originalEvent !== undefined && event.originalEvent.touches)) {
-            eventNames.moveEvent = 'touchmove';
-            eventNames.endEvent = 'touchend';
-          } else {
-            eventNames.moveEvent = 'mousemove';
-            eventNames.endEvent = 'mouseup';
-          }
- 
-          return eventNames;
-        }
-      };
- 
-      return Slider;
-    })
- 
-    .directive('rzslider', function (RzSlider) {
-      'use strict';
- 
-      return {
-        restrict: 'E',
-        scope: {
-          rzSliderModel: '=?',
-          rzSliderHigh: '=?',
-          rzSliderOptions: '=?',
-          rzSliderTplUrl: '@'
-        },
- 
-        /**
-         * Return template URL
-         *
-         * @param {jqLite} elem
-         * @param {Object} attrs
-         * @return {string}
-         */
-        templateUrl: function (elem, attrs) {
-          //noinspection JSUnresolvedVariable
-          return attrs.rzSliderTplUrl || 'rzSliderTpl.html';
-        },
- 
-        link: function (scope, elem) {
-          return new RzSlider(scope, elem);
-        }
-      };
-    });
- 
-  // IDE assist
- 
-  /**
-   * @name ngScope
-   *
-   * @property {number} rzSliderModel
-   * @property {number} rzSliderHigh
-   * @property {Object} rzSliderOptions
-   */
- 
-  /**
-   * @name jqLite
-   *
-   * @property {number|undefined} rzsp rzslider label position offset
-   * @property {number|undefined} rzsd rzslider element dimension
-   * @property {string|undefined} rzsv rzslider label value/text
-   * @property {Function} css
-   * @property {Function} text
-   */
- 
-  /**
-   * @name Event
-   * @property {Array} touches
-   * @property {Event} originalEvent
-   */
- 
-  /**
-   * @name ThrottleOptions
-   *
-   * @property {boolean} leading
-   * @property {boolean} trailing
-   */
- 
-  /*templateReplacement*/
- 
-  return module
-}));
- 
-
-
- - - - - - -