| // Generated by CoffeeScript 1.6.2 |
| (function() { |
| var MODULE_NAME, SLIDER_TAG, angularize, bindHtml, gap, halfWidth, hide, inputEvents, module, offset, offsetLeft, pixelize, qualifiedDirectiveDefinition, roundStep, show, sliderDirective, width; |
| |
| MODULE_NAME = 'uiSlider'; |
| |
| SLIDER_TAG = 'slider'; |
| |
| angularize = function(element) { |
| return angular.element(element); |
| }; |
| |
| pixelize = function(position) { |
| return "" + position + "px"; |
| }; |
| |
| hide = function(element) { |
| return element.css({ |
| opacity: 0 |
| }); |
| }; |
| |
| show = function(element) { |
| return element.css({ |
| opacity: 1 |
| }); |
| }; |
| |
| offset = function(element, position) { |
| return element.css({ |
| left: position |
| }); |
| }; |
| |
| halfWidth = function(element) { |
| return element[0].offsetWidth / 2; |
| }; |
| |
| offsetLeft = function(element) { |
| return element[0].offsetLeft; |
| }; |
| |
| width = function(element) { |
| return element[0].offsetWidth; |
| }; |
| |
| gap = function(element1, element2) { |
| return offsetLeft(element2) - offsetLeft(element1) - width(element1); |
| }; |
| |
| bindHtml = function(element, html) { |
| return element.attr('ng-bind-html-unsafe', html); |
| }; |
| |
| roundStep = function(value, precision, step, floor) { |
| var decimals, remainder, roundedValue, steppedValue; |
| |
| if (floor == null) { |
| floor = 0; |
| } |
| if (step == null) { |
| step = 1 / Math.pow(10, precision); |
| } |
| remainder = (value - floor) % step; |
| steppedValue = remainder > (step / 2) ? value + step - remainder : value - remainder; |
| decimals = Math.pow(10, precision); |
| roundedValue = steppedValue * decimals / decimals; |
| return roundedValue.toFixed(precision); |
| }; |
| |
| inputEvents = { |
| mouse: { |
| start: 'mousedown', |
| move: 'mousemove', |
| end: 'mouseup' |
| }, |
| touch: { |
| start: 'touchstart', |
| move: 'touchmove', |
| end: 'touchend' |
| } |
| }; |
| |
| sliderDirective = function($timeout) { |
| return { |
| restrict: 'EA', |
| scope: { |
| floor: '@', |
| ceiling: '@', |
| step: '@', |
| precision: '@', |
| ngModel: '=?', |
| ngModelLow: '=?', |
| ngModelHigh: '=?', |
| translate: '&' |
| }, |
| template: '<span class="bar"></span><span class="bar selection"></span><span class="pointer"></span><span class="pointer"></span><span class="bubble selection"></span><span ng-bind-html-unsafe="translate({value: floor})" class="bubble limit"></span><span ng-bind-html-unsafe="translate({value: ceiling})" class="bubble limit"></span><span class="bubble"></span><span class="bubble"></span><span class="bubble"></span>', |
| compile: function(element, attributes) { |
| var ceilBub, cmbBub, e, flrBub, fullBar, highBub, lowBub, maxPtr, minPtr, range, refHigh, refLow, selBar, selBub, watchables, _i, _len, _ref, _ref1; |
| |
| if (attributes.translate) { |
| attributes.$set('translate', "" + attributes.translate + "(value)"); |
| } |
| range = (attributes.ngModel == null) && ((attributes.ngModelLow != null) && (attributes.ngModelHigh != null)); |
| _ref = (function() { |
| var _i, _len, _ref, _results; |
| |
| _ref = element.children(); |
| _results = []; |
| for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
| e = _ref[_i]; |
| _results.push(angularize(e)); |
| } |
| return _results; |
| })(), fullBar = _ref[0], selBar = _ref[1], minPtr = _ref[2], maxPtr = _ref[3], selBub = _ref[4], flrBub = _ref[5], ceilBub = _ref[6], lowBub = _ref[7], highBub = _ref[8], cmbBub = _ref[9]; |
| refLow = range ? 'ngModelLow' : 'ngModel'; |
| refHigh = 'ngModelHigh'; |
| bindHtml(selBub, "'Range: ' + translate({value: diff})"); |
| bindHtml(lowBub, "translate({value: " + refLow + "})"); |
| bindHtml(highBub, "translate({value: " + refHigh + "})"); |
| bindHtml(cmbBub, "translate({value: " + refLow + "}) + ' - ' + translate({value: " + refHigh + "})"); |
| if (!range) { |
| _ref1 = [selBar, maxPtr, selBub, highBub, cmbBub]; |
| for (_i = 0, _len = _ref1.length; _i < _len; _i++) { |
| element = _ref1[_i]; |
| element.remove(); |
| } |
| } |
| watchables = [refLow, 'floor', 'ceiling']; |
| if (range) { |
| watchables.push(refHigh); |
| } |
| return { |
| post: function(scope, element, attributes) { |
| var barWidth, boundToInputs, dimensions, maxOffset, maxValue, minOffset, minValue, ngDocument, offsetRange, pointerHalfWidth, updateDOM, valueRange, w, _j, _len1; |
| |
| boundToInputs = false; |
| ngDocument = angularize(document); |
| if (!attributes.translate) { |
| scope.translate = function(value) { |
| return value.value; |
| }; |
| } |
| pointerHalfWidth = barWidth = minOffset = maxOffset = minValue = maxValue = valueRange = offsetRange = void 0; |
| dimensions = function() { |
| var value, _j, _len1, _ref2, _ref3; |
| |
| if ((_ref2 = scope.precision) == null) { |
| scope.precision = 0; |
| } |
| if ((_ref3 = scope.step) == null) { |
| scope.step = 1; |
| } |
| for (_j = 0, _len1 = watchables.length; _j < _len1; _j++) { |
| value = watchables[_j]; |
| scope[value] = roundStep(parseFloat(scope[value]), parseInt(scope.precision), parseFloat(scope.step), parseFloat(scope.floor)); |
| } |
| scope.diff = roundStep(scope[refHigh] - scope[refLow], parseInt(scope.precision), parseFloat(scope.step), parseFloat(scope.floor)); |
| pointerHalfWidth = halfWidth(minPtr); |
| barWidth = width(fullBar); |
| minOffset = 0; |
| maxOffset = barWidth - width(minPtr); |
| minValue = parseFloat(attributes.floor); |
| maxValue = parseFloat(attributes.ceiling); |
| valueRange = maxValue - minValue; |
| return offsetRange = maxOffset - minOffset; |
| }; |
| updateDOM = function() { |
| var adjustBubbles, bindToInputEvents, fitToBar, percentOffset, percentToOffset, percentValue, setBindings, setPointers; |
| |
| dimensions(); |
| percentOffset = function(offset) { |
| return ((offset - minOffset) / offsetRange) * 100; |
| }; |
| percentValue = function(value) { |
| return ((value - minValue) / valueRange) * 100; |
| }; |
| percentToOffset = function(percent) { |
| return pixelize(percent * offsetRange / 100); |
| }; |
| fitToBar = function(element) { |
| return offset(element, pixelize(Math.min(Math.max(0, offsetLeft(element)), barWidth - width(element)))); |
| }; |
| setPointers = function() { |
| var newHighValue, newLowValue; |
| |
| offset(ceilBub, pixelize(barWidth - width(ceilBub))); |
| newLowValue = percentValue(scope[refLow]); |
| offset(minPtr, percentToOffset(newLowValue)); |
| offset(lowBub, pixelize(offsetLeft(minPtr) - (halfWidth(lowBub)) + pointerHalfWidth)); |
| if (range) { |
| newHighValue = percentValue(scope[refHigh]); |
| offset(maxPtr, percentToOffset(newHighValue)); |
| offset(highBub, pixelize(offsetLeft(maxPtr) - (halfWidth(highBub)) + pointerHalfWidth)); |
| offset(selBar, pixelize(offsetLeft(minPtr) + pointerHalfWidth)); |
| selBar.css({ |
| width: percentToOffset(newHighValue - newLowValue) |
| }); |
| offset(selBub, pixelize(offsetLeft(selBar) + halfWidth(selBar) - halfWidth(selBub))); |
| return offset(cmbBub, pixelize(offsetLeft(selBar) + halfWidth(selBar) - halfWidth(cmbBub))); |
| } |
| }; |
| adjustBubbles = function() { |
| var bubToAdjust; |
| |
| fitToBar(lowBub); |
| bubToAdjust = highBub; |
| if (range) { |
| fitToBar(highBub); |
| fitToBar(selBub); |
| if (gap(lowBub, highBub) < 10) { |
| hide(lowBub); |
| hide(highBub); |
| fitToBar(cmbBub); |
| show(cmbBub); |
| bubToAdjust = cmbBub; |
| } else { |
| show(lowBub); |
| show(highBub); |
| hide(cmbBub); |
| bubToAdjust = highBub; |
| } |
| } |
| if (gap(flrBub, lowBub) < 5) { |
| hide(flrBub); |
| } else { |
| if (range) { |
| if (gap(flrBub, bubToAdjust) < 5) { |
| hide(flrBub); |
| } else { |
| show(flrBub); |
| } |
| } else { |
| show(flrBub); |
| } |
| } |
| if (gap(lowBub, ceilBub) < 5) { |
| return hide(ceilBub); |
| } else { |
| if (range) { |
| if (gap(bubToAdjust, ceilBub) < 5) { |
| return hide(ceilBub); |
| } else { |
| return show(ceilBub); |
| } |
| } else { |
| return show(ceilBub); |
| } |
| } |
| }; |
| bindToInputEvents = function(pointer, ref, events) { |
| var onEnd, onMove, onStart; |
| |
| onEnd = function() { |
| pointer.removeClass('active'); |
| ngDocument.unbind(events.move); |
| return ngDocument.unbind(events.end); |
| }; |
| onMove = function(event) { |
| var eventX, newOffset, newPercent, newValue; |
| |
| eventX = event.clientX || event.touches[0].clientX; |
| newOffset = eventX - element[0].getBoundingClientRect().left - pointerHalfWidth; |
| newOffset = Math.max(Math.min(newOffset, maxOffset), minOffset); |
| newPercent = percentOffset(newOffset); |
| newValue = minValue + (valueRange * newPercent / 100.0); |
| if (range) { |
| if (ref === refLow) { |
| if (newValue > scope[refHigh]) { |
| ref = refHigh; |
| minPtr.removeClass('active'); |
| maxPtr.addClass('active'); |
| } |
| } else { |
| if (newValue < scope[refLow]) { |
| ref = refLow; |
| maxPtr.removeClass('active'); |
| minPtr.addClass('active'); |
| } |
| } |
| } |
| newValue = roundStep(newValue, parseInt(scope.precision), parseFloat(scope.step), parseFloat(scope.floor)); |
| scope[ref] = newValue; |
| return scope.$apply(); |
| }; |
| onStart = function(event) { |
| pointer.addClass('active'); |
| dimensions(); |
| event.stopPropagation(); |
| event.preventDefault(); |
| ngDocument.bind(events.move, onMove); |
| return ngDocument.bind(events.end, onEnd); |
| }; |
| return pointer.bind(events.start, onStart); |
| }; |
| setBindings = function() { |
| var bind, inputMethod, _j, _len1, _ref2, _results; |
| |
| boundToInputs = true; |
| bind = function(method) { |
| bindToInputEvents(minPtr, refLow, inputEvents[method]); |
| return bindToInputEvents(maxPtr, refHigh, inputEvents[method]); |
| }; |
| _ref2 = ['touch', 'mouse']; |
| _results = []; |
| for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { |
| inputMethod = _ref2[_j]; |
| _results.push(bind(inputMethod)); |
| } |
| return _results; |
| }; |
| setPointers(); |
| adjustBubbles(); |
| if (!boundToInputs) { |
| return setBindings(); |
| } |
| }; |
| $timeout(updateDOM); |
| for (_j = 0, _len1 = watchables.length; _j < _len1; _j++) { |
| w = watchables[_j]; |
| scope.$watch(w, updateDOM); |
| } |
| return window.addEventListener("resize", updateDOM); |
| } |
| }; |
| } |
| }; |
| }; |
| |
| qualifiedDirectiveDefinition = ['$timeout', sliderDirective]; |
| |
| module = function(window, angular) { |
| return angular.module(MODULE_NAME, []).directive(SLIDER_TAG, qualifiedDirectiveDefinition); |
| }; |
| |
| module(window, window.angular); |
| |
| }).call(this); |