123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- ;(function ($, window, document, undefined) {
- 'use strict';
- Foundation.libs.slider = {
- name : 'slider',
- version : '5.2.2',
- settings: {
- start: 0,
- end: 100,
- step: 1,
- initial: null,
- display_selector: '',
- on_change: function(){}
- },
- cache : {},
- init : function (scope, method, options) {
- Foundation.inherit(this,'throttle');
- this.bindings(method, options);
- this.reflow();
- },
- events : function() {
- var self = this;
- $(this.scope)
- .off('.slider')
- .on('mousedown.fndtn.slider touchstart.fndtn.slider pointerdown.fndtn.slider',
- '[' + self.attr_name() + '] .range-slider-handle', function(e) {
- if (!self.cache.active) {
- e.preventDefault();
- self.set_active_slider($(e.target));
- }
- })
- .on('mousemove.fndtn.slider touchmove.fndtn.slider pointermove.fndtn.slider', function(e) {
- if (!!self.cache.active) {
- e.preventDefault();
- self.calculate_position(self.cache.active, e.pageX || e.originalEvent.clientX || e.originalEvent.touches[0].clientX || e.currentPoint.x);
- }
- })
- .on('mouseup.fndtn.slider touchend.fndtn.slider pointerup.fndtn.slider', function(e) {
- self.remove_active_slider();
- })
- .on('change.fndtn.slider', function(e) {
- self.settings.on_change();
- });
- self.S(window)
- .on('resize.fndtn.slider', self.throttle(function(e) {
- self.reflow();
- }, 300));
- },
- set_active_slider : function($handle) {
- this.cache.active = $handle;
- },
- remove_active_slider : function() {
- this.cache.active = null;
- },
- calculate_position : function($handle, cursor_x) {
- var self = this,
- settings = $.extend({}, self.settings, self.data_options($handle.parent())),
- handle_w = $.data($handle[0], 'handle_w'),
- handle_o = $.data($handle[0], 'handle_o'),
- bar_w = $.data($handle[0], 'bar_w'),
- bar_o = $.data($handle[0], 'bar_o');
- requestAnimationFrame(function(){
- var pct;
- if (Foundation.rtl) {
- pct = self.limit_to(((bar_o+bar_w-cursor_x)/bar_w),0,1);
- } else {
- pct = self.limit_to(((cursor_x-bar_o)/bar_w),0,1);
- }
- var norm = self.normalized_value(pct, settings.start, settings.end, settings.step);
- self.set_ui($handle, norm);
- });
- },
- set_ui : function($handle, value) {
- var settings = $.extend({}, this.settings, this.data_options($handle.parent())),
- handle_w = $.data($handle[0], 'handle_w'),
- bar_w = $.data($handle[0], 'bar_w'),
- norm_pct = this.normalized_percentage(value, settings.start, settings.end),
- handle_offset = norm_pct*(bar_w-handle_w)-1,
- progress_bar_width = norm_pct*100;
- if (Foundation.rtl) {
- handle_offset = -handle_offset;
- }
- this.set_translate($handle, handle_offset);
- $handle.siblings('.range-slider-active-segment').css('width', progress_bar_width+'%');
- $handle.parent().attr(this.attr_name(), value);
- $handle.parent().trigger('change');
- $handle.parent().children('input[type=hidden]').val(value);
- if (settings.input_id != '') {
- $(settings.display_selector).each(function(){
- if (this.hasOwnProperty('value')) {
- $(this).val(value);
- } else {
- $(this).text(value);
- }
- });
- }
- },
- normalized_percentage : function(val, start, end) {
- return (val - start)/(end - start);
- },
- normalized_value : function(val, start, end, step) {
- var range = end - start,
- step = step,
- point = val*range,
- mod = (point-(point%step)) / step,
- rem = point % step,
- round = ( rem >= step*0.5 ? step : 0);
- return (mod*step + round) + start;
- },
- set_translate : function(ele, offset, vertical) {
- if (vertical) {
- $(ele)
- .css('-webkit-transform', 'translateY('+offset+'px)')
- .css('-moz-transform', 'translateY('+offset+'px)')
- .css('-ms-transform', 'translateY('+offset+'px)')
- .css('-o-transform', 'translateY('+offset+'px)')
- .css('transform', 'translateY('+offset+'px)');
- } else {
- $(ele)
- .css('-webkit-transform', 'translateX('+offset+'px)')
- .css('-moz-transform', 'translateX('+offset+'px)')
- .css('-ms-transform', 'translateX('+offset+'px)')
- .css('-o-transform', 'translateX('+offset+'px)')
- .css('transform', 'translateX('+offset+'px)');
- }
- },
- limit_to : function(val, min, max) {
- return Math.min(Math.max(val, min), max);
- },
- initialize_settings : function(handle) {
- $.data(handle, 'bar', $(handle).parent());
- $.data(handle, 'bar_o', $(handle).parent().offset().left);
- $.data(handle, 'bar_w', $(handle).parent().outerWidth());
- $.data(handle, 'handle_o', $(handle).offset().left);
- $.data(handle, 'handle_w', $(handle).outerWidth());
- $.data(handle, 'settings', $.extend({}, this.settings, this.data_options($(handle).parent())));
- },
- set_initial_position : function($ele) {
- var settings = $.data($ele.children('.range-slider-handle')[0], 'settings'),
- initial = (!!settings.initial ? settings.initial : Math.floor((settings.end-settings.start)*0.5/settings.step)*settings.step+settings.start),
- $handle = $ele.children('.range-slider-handle');
- this.set_ui($handle, initial);
- },
- set_value : function(value) {
- var self = this;
- $('[' + self.attr_name() + ']', this.scope).each(function(){
- $(this).attr(self.attr_name(), value);
- });
- if (!!$(this.scope).attr(self.attr_name())) {
- $(this.scope).attr(self.attr_name(), value);
- }
- self.reflow();
- },
- reflow : function() {
- var self = this;
- self.S('[' + this.attr_name() + ']').each(function() {
- var handle = $(this).children('.range-slider-handle')[0],
- val = $(this).attr(self.attr_name());
- self.initialize_settings(handle);
- if (val) {
- self.set_ui($(handle), parseFloat(val));
- } else {
- self.set_initial_position($(this));
- }
- });
- }
- };
- }(jQuery, this, this.document));
|