/*global define*/ define( [ 'jquery', 'knockout', './bindingHandler', './utils', 'jquery-ui/slider' ], function ($, ko, BindingHandler, utils) { 'use strict'; var domDataKey, Slider; domDataKey = '__kojqui_options'; Slider = function () { /// Constructor. BindingHandler.call(this, 'slider'); this.widgetEventPrefix = 'slide'; this.options = ['animate', 'disabled', 'max', 'min', 'orientation', 'range', 'step', 'value', 'values']; this.events = ['create', 'start', 'slide', 'change', 'stop']; }; Slider.prototype = utils.createObject(BindingHandler.prototype); Slider.prototype.constructor = Slider; Slider.prototype.init = function (element, valueAccessor) { /// Keeps the value and the values binding property in sync with the /// slider widget's values. /// /// var result, value, changeEvent; result = BindingHandler.prototype.init.apply(this, arguments); value = valueAccessor(); changeEvent = value.realtime ? 'slide' : 'change'; if (ko.isWriteableObservable(value.value)) { /*jslint unparam:true*/ this.on(element, changeEvent, function (ev, ui) { var index = $(element).find('.ui-slider-handle').index(ui.handle); if (index === 0) { // The slider widget, in its _slide() method, raises the // slide/slidechange events, then immediately updates its value // property. If any of the event handlers hooked onto the // slide/slidechange event sets the widget's value property, it // will ruin the sliding animation. // To prevent that, we trick the update() method defined in // BindingHandler to think that the value option is already // updated. ko.utils.domData.get(element, domDataKey).value = ui.value; value.value(ui.value); } }); /*jslint unparam:false*/ } if (ko.isWriteableObservable(value.values)) { /*jslint unparam:true*/ this.on(element, changeEvent, function (ev, ui) { // see the explanation above ko.utils.domData.get(element, domDataKey).value = ui.values; value.values(ui.values); }); /*jslint unparam:false*/ } return result; }; utils.register(Slider); return Slider; } );