(function($, undefined) { var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, support = kendo.support, proxy = $.proxy, pow = Math.pow, SLIDE = "slide", CHANGE = "change", ACTIVE_STATE = "km-state-active", MARGINLEFT = "margin-left", TRANSFORMSTYLE = support.transitions.css + "transform"; function round(value, precision) { var power = pow(10, precision || 0); return Math.round(value * power) / power; } function limitValue(value, minLimit, maxLimit) { return Math.max( minLimit, Math.min( maxLimit, value)); } var ColorSlider = Widget.extend({ init: function(element, options) { var that = this; Widget.fn.init.call(that, element, options); that._wrapper(); that._drag(); that._background(); that._handle(); that.value(that.point); that.bind([ CHANGE, SLIDE ], that.options); }, events: [ CHANGE, SLIDE ], options: { name: "ColorSlider", value: 0, max: 100, precision: 0, // number of floating point digits animateBackground: true }, value: function (value) { var that = this; if (isNaN(value)) { return that.point; } that._dimensions(); that.point = round(value, that.options.precision); that._position(value * that.snapPoint * that.precisionFactor); return that; }, _move: function(e) { var that = this, value; e.preventDefault(); value = that._position(limitValue((e.touch.x.client - that.targetOffsetX) - (that.handleWidth / 2), 0, that.constrain)); if (value != that.point) that.trigger(SLIDE, { value: value }); that.point = value; }, _position: function(position) { var that = this, precision = that.options.precision; that.position = position; that.handle.css(TRANSFORMSTYLE, "translatex(" + position + "px)"); if (that.options.animateBackground) { that.background.css(MARGINLEFT, that.origin + position); } return round(that.position / (that.snapPoint * that.precisionFactor), precision); }, _start: function(e) { var that = this; that.targetOffsetX = e.touch.target.offset().left; that.drag.capture(); that.handle.addClass(ACTIVE_STATE); }, _stop: function(e) { var that = this; that.point = that._position(limitValue((e.touch.x.client - e.touch.target.offset().left) - (that.handleWidth / 2), 0, that.constrain)); that.handle.removeClass(ACTIVE_STATE); that.trigger(CHANGE, { value: that.point }); }, _background: function() { var that = this, background = that.wrapper.children(".km-slider-wrapper").children(".km-slider-background"); if (!background[0]) { background = $("") .appendTo(that.wrapper) .children(".km-slider-background"); } that.origin = parseInt(background.css(MARGINLEFT), 10); background.data("origin", that.origin); that.background = background; }, _dimensions: function() { var that = this; that.point = that.options.value; that.constrain = that.wrapper.width(); that.handleWidth = that.handle.outerWidth(true); that.precisionFactor = pow(10, that.options.precision); that.snapPoint = that.constrain / (that.options.max * that.precisionFactor); }, _handle: function() { var that = this, handle = that.wrapper.children(".km-slider-container").children(".km-slider-handle"); if (!handle[0]) { handle = $("") .appendTo(that.wrapper) .children(".km-slider-handle"); } that.handle = handle; }, _wrapper: function() { var that = this, element = that.element, wrapper = element.parent("span.km-slider"); if (!wrapper[0]) { wrapper = element.wrap('').parent(); element.hide(); } that.wrapper = wrapper; }, _drag: function() { var that = this; if (!that.drag) { that.drag = new kendo.UserEvents(that.wrapper, { global: true, tap: function(e) { var touch = e.touch; that.point = that._position(limitValue((touch.x.client - touch.target.offset().left) - (that.handleWidth / 2), 0, that.constrain)); that.trigger(CHANGE, { value: that.point }); }, start: proxy(that._start, that), move: proxy(that._move, that), end: proxy(that._stop, that) }); } } }); ui.plugin(ColorSlider); })(jQuery);