redux-slider.js (6925B)
1 /*global redux_change, redux, jQuery*/ 2 3 (function( $ ) { 4 'use strict'; 5 6 redux.field_objects = redux.field_objects || {}; 7 redux.field_objects.slider = redux.field_objects.slider || {}; 8 9 redux.field_objects.slider.init = function( selector ) { 10 selector = $.redux.getSelector( selector, 'slider' ); 11 12 $( selector ).each( 13 function() { 14 var el = $( this ); 15 var parent = el; 16 17 if ( ! el.hasClass( 'redux-field-container' ) ) { 18 parent = el.parents( '.redux-field-container:first' ); 19 } 20 21 if ( parent.is( ':hidden' ) ) { 22 return; 23 } 24 25 if ( parent.hasClass( 'redux-field-init' ) ) { 26 parent.removeClass( 'redux-field-init' ); 27 } else { 28 return; 29 } 30 31 el.find( 'div.redux-slider-container' ).each( 32 function() { 33 var start; 34 var toClass; 35 var defClassOne; 36 var defClassTwo; 37 var connectVal; 38 var range; 39 var startOne; 40 var startTwo; 41 var inputOne; 42 var inputTwo; 43 var classOne; 44 var classTwo; 45 var x; 46 var y; 47 var slider; 48 var inpSliderVal; 49 50 var DISPLAY_NONE = 0; 51 var DISPLAY_LABEL = 1; 52 var DISPLAY_TEXT = 2; 53 var DISPLAY_SELECT = 3; 54 55 var mainID = $( this ).data( 'id' ); 56 var minVal = $( this ).data( 'min' ); 57 var maxVal = $( this ).data( 'max' ); 58 var stepVal = $( this ).data( 'step' ); 59 var handles = $( this ).data( 'handles' ); 60 var defValOne = $( this ).data( 'default-one' ); 61 var defValTwo = $( this ).data( 'default-two' ); 62 var resVal = $( this ).data( 'resolution' ); 63 var displayValue = parseInt( ( $( this ).data( 'display' ) ) ); 64 var rtlVal = Boolean( $( this ).data( 'rtl' ) ); 65 var floatMark = ( $( this ).data( 'float-mark' ) ); 66 67 var rtl; 68 if ( true === rtlVal ) { 69 rtl = 'rtl'; 70 } else { 71 rtl = 'ltr'; 72 } 73 74 // Range array. 75 range = [minVal, maxVal]; 76 77 // Set default values for dual slides. 78 startTwo = [defValOne, defValTwo]; 79 80 // Set default value for single slide. 81 startOne = [defValOne]; 82 83 if ( displayValue === DISPLAY_TEXT ) { 84 defClassOne = el.find( '.redux-slider-input-one-' + mainID ); 85 defClassTwo = el.find( '.redux-slider-input-two-' + mainID ); 86 87 inputOne = defClassOne; 88 inputTwo = defClassTwo; 89 } else if ( displayValue === DISPLAY_SELECT ) { 90 defClassOne = el.find( '.redux-slider-select-one-' + mainID ); 91 defClassTwo = el.find( '.redux-slider-select-two-' + mainID ); 92 93 redux.field_objects.slider.loadSelect( defClassOne, minVal, maxVal, resVal, stepVal ); 94 95 if ( 2 === handles ) { 96 redux.field_objects.slider.loadSelect( defClassTwo, minVal, maxVal, resVal, stepVal ); 97 } 98 99 } else if ( displayValue === DISPLAY_LABEL ) { 100 defClassOne = el.find( '#redux-slider-label-one-' + mainID ); 101 defClassTwo = el.find( '#redux-slider-label-two-' + mainID ); 102 } else if ( displayValue === DISPLAY_NONE ) { 103 defClassOne = el.find( '.redux-slider-value-one-' + mainID ); 104 defClassTwo = el.find( '.redux-slider-value-two-' + mainID ); 105 } 106 107 if ( displayValue === DISPLAY_LABEL ) { 108 x = [defClassOne, 'html']; 109 y = [defClassTwo, 'html']; 110 111 classOne = [x]; 112 classTwo = [x, y]; 113 } else { 114 classOne = [defClassOne]; 115 classTwo = [defClassOne, defClassTwo]; 116 } 117 118 if ( 2 === handles ) { 119 start = startTwo; 120 toClass = classTwo; 121 connectVal = true; 122 } else { 123 start = startOne; 124 toClass = classOne; 125 connectVal = 'lower'; 126 } 127 128 slider = $( this ).reduxNoUiSlider( 129 { 130 range: range, 131 start: start, 132 handles: handles, 133 step: stepVal, 134 connect: connectVal, 135 behaviour: 'tap-drag', 136 direction: rtl, 137 serialization: { 138 resolution: resVal, 139 to: toClass, 140 mark: floatMark 141 }, 142 slide: function() { 143 if ( displayValue === DISPLAY_LABEL ) { 144 if ( 2 === handles ) { 145 inpSliderVal = slider.val(); 146 el.find( 'input.redux-slider-value-one-' + mainID ).attr( 'value', inpSliderVal[0] ); 147 el.find( 'input.redux-slider-value-two-' + mainID ).attr( 'value', inpSliderVal[1] ); 148 } else { 149 el.find( 'input.redux-slider-value-one-' + mainID ).attr( 'value', slider.val() ); 150 } 151 } 152 153 if ( displayValue === DISPLAY_SELECT ) { 154 if ( 2 === handles ) { 155 el.find( '.redux-slider-select-one' ).val( slider.val()[0] ).trigger( 'change' ); 156 el.find( '.redux-slider-select-two' ).val( slider.val()[1] ).trigger( 'change' ); 157 } else { 158 el.find( '.redux-slider-select-one' ).val( slider.val() ); 159 } 160 } 161 162 redux_change( $( this ) ); 163 } 164 } 165 ); 166 167 if ( displayValue === DISPLAY_TEXT ) { 168 inputOne.on( 169 'keydown', 170 function( e ) { 171 var sliderOne = slider.val(); 172 var value = parseInt( sliderOne[0] ); 173 174 switch ( e.which ) { 175 case 38: 176 slider.val( [value + 1, null] ); 177 break; 178 case 40: 179 slider.val( [value - 1, null] ); 180 break; 181 case 13: 182 e.preventDefault(); 183 break; 184 } 185 } 186 ); 187 188 if ( 2 === handles ) { 189 inputTwo.on( 190 'keydown', 191 function( e ) { 192 var sliderTwo = slider.val(); 193 var value = parseInt( sliderTwo[1] ); 194 195 switch ( e.which ) { 196 case 38: 197 slider.val( [null, value + 1] ); 198 break; 199 case 40: 200 slider.val( [null, value - 1] ); 201 break; 202 case 13: 203 e.preventDefault(); 204 break; 205 } 206 } 207 ); 208 } 209 } 210 } 211 ); 212 213 el.find( 'select.redux-slider-select-one, select.redux-slider-select-two' ).select2(); 214 } 215 ); 216 }; 217 218 // Return true for float value, false otherwise. 219 redux.field_objects.slider.isFloat = function( mixed_var ) { 220 return + mixed_var === mixed_var && ( ! ( isFinite( mixed_var ) ) ) || Boolean( ( mixed_var % 1 ) ); 221 }; 222 223 // Return number of integers after the decimal point. 224 redux.field_objects.slider.decimalCount = function( res ) { 225 var q = res.toString().split( '.' ); 226 return q[1].length; 227 }; 228 229 redux.field_objects.slider.loadSelect = function( myClass, min, max, res ) { 230 var decCount; 231 var i; 232 var n; 233 234 for ( i = min; i <= max; i = i + res ) { 235 n = i; 236 237 if ( redux.field_objects.slider.isFloat( res ) ) { 238 decCount = redux.field_objects.slider.decimalCount( res ); 239 n = i.toFixed( decCount ); 240 } 241 242 $( myClass ).append( '<option value="' + n + '">' + n + '</option>' ); 243 } 244 }; 245 })( jQuery );