pips_slider_rails 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +16 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/javascripts/jquery-ui-slider-pips.js +812 -0
  6. data/app/assets/stylesheets/jquery-ui-slider-pips.css +326 -0
  7. data/lib/pips_slider/version.rb +3 -0
  8. data/lib/pips_slider_rails.rb +6 -0
  9. data/lib/tasks/pips_slider_rails_tasks.rake +4 -0
  10. data/test/dummy/README.rdoc +28 -0
  11. data/test/dummy/Rakefile +6 -0
  12. data/test/dummy/app/assets/javascripts/application.js +13 -0
  13. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  14. data/test/dummy/app/controllers/application_controller.rb +5 -0
  15. data/test/dummy/app/helpers/application_helper.rb +2 -0
  16. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  17. data/test/dummy/bin/bundle +3 -0
  18. data/test/dummy/bin/rails +4 -0
  19. data/test/dummy/bin/rake +4 -0
  20. data/test/dummy/bin/setup +29 -0
  21. data/test/dummy/config.ru +4 -0
  22. data/test/dummy/config/application.rb +26 -0
  23. data/test/dummy/config/boot.rb +5 -0
  24. data/test/dummy/config/database.yml +25 -0
  25. data/test/dummy/config/environment.rb +5 -0
  26. data/test/dummy/config/environments/development.rb +41 -0
  27. data/test/dummy/config/environments/production.rb +79 -0
  28. data/test/dummy/config/environments/test.rb +42 -0
  29. data/test/dummy/config/initializers/assets.rb +11 -0
  30. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  31. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  32. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  33. data/test/dummy/config/initializers/inflections.rb +16 -0
  34. data/test/dummy/config/initializers/mime_types.rb +4 -0
  35. data/test/dummy/config/initializers/session_store.rb +3 -0
  36. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  37. data/test/dummy/config/locales/en.yml +23 -0
  38. data/test/dummy/config/routes.rb +56 -0
  39. data/test/dummy/config/secrets.yml +22 -0
  40. data/test/dummy/public/404.html +67 -0
  41. data/test/dummy/public/422.html +67 -0
  42. data/test/dummy/public/500.html +66 -0
  43. data/test/dummy/public/favicon.ico +0 -0
  44. data/test/pips_slider_test.rb +7 -0
  45. data/test/test_helper.rb +20 -0
  46. metadata +124 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ab8cf1f5af113a9b939590839e13a211369d4c91
4
+ data.tar.gz: ffecaedc7c8d1ab3b6ceb64d7a22bac9b6f29d37
5
+ SHA512:
6
+ metadata.gz: 50378ab11a6930e8b6246f5d038ceaef22cbcab7f7b4028edbe2c761f083b7326969042856a8a166304c15a7389cd9ebb994d02b3cac0de468c1f87067e08e40
7
+ data.tar.gz: 8958049011562ebdea501cfd3b5c5bb89a06fd0d1d56e38d726db25ec344301f8ab8e6e40ee73e1b11656e53e78d1ca0820253ebd0b9caf2e539d7f3bdcff5aa
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2017 stanislav nosovskyi
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,16 @@
1
+ = PipsSliderRails
2
+
3
+ Gem created for easy installation pips-slider
4
+
5
+ http://simeydotme.github.io/jQuery-ui-Slider-Pips/
6
+
7
+
8
+ *Install - add to*
9
+
10
+ js assets
11
+ //= require jquery-ui-slider-pips
12
+
13
+ stylesheet assets
14
+ *= require jquery-ui-slider-pips
15
+
16
+
data/Rakefile ADDED
@@ -0,0 +1,34 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'PipsSlider'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+
34
+ task default: :test
@@ -0,0 +1,812 @@
1
+ /*! jQuery-ui-Slider-Pips - v1.11.4 - 2016-09-04
2
+ * Copyright (c) 2016 Simon Goellner <simey.me@gmail.com>; Licensed MIT */
3
+
4
+ (function($) {
5
+
6
+ "use strict";
7
+
8
+ var extensionMethods = {
9
+
10
+
11
+
12
+
13
+
14
+ // pips
15
+
16
+ pips: function( settings ) {
17
+
18
+ var slider = this,
19
+ i, j, p,
20
+ collection = "",
21
+ mousedownHandlers,
22
+ min = slider._valueMin(),
23
+ max = slider._valueMax(),
24
+ pips = ( max - min ) / slider.options.step,
25
+ $handles = slider.element.find(".ui-slider-handle"),
26
+ $pips;
27
+
28
+ var options = {
29
+
30
+ first: "label",
31
+ /* "label", "pip", false */
32
+
33
+ last: "label",
34
+ /* "label", "pip", false */
35
+
36
+ rest: "pip",
37
+ /* "label", "pip", false */
38
+
39
+ labels: false,
40
+ /* [array], { first: "string", rest: [array], last: "string" }, false */
41
+
42
+ prefix: "",
43
+ /* "", string */
44
+
45
+ suffix: "",
46
+ /* "", string */
47
+
48
+ step: ( pips > 100 ) ? Math.floor( pips * 0.05 ) : 1,
49
+ /* number */
50
+
51
+ formatLabel: function(value) {
52
+ return this.prefix + value + this.suffix;
53
+ }
54
+ /* function
55
+ must return a value to display in the pip labels */
56
+
57
+ };
58
+
59
+ if ( $.type( settings ) === "object" || $.type( settings ) === "undefined" ) {
60
+
61
+ $.extend( options, settings );
62
+ slider.element.data("pips-options", options );
63
+
64
+ } else {
65
+
66
+ if ( settings === "destroy" ) {
67
+
68
+ destroy();
69
+
70
+ } else if ( settings === "refresh" ) {
71
+
72
+ slider.element.slider( "pips", slider.element.data("pips-options") );
73
+
74
+ }
75
+
76
+ return;
77
+
78
+ }
79
+
80
+
81
+ // we don't want the step ever to be a floating point or negative
82
+ // (or 0 actually, so we'll set it to 1 in that case).
83
+ slider.options.pipStep = Math.abs( Math.round( options.step ) ) || 1;
84
+
85
+ // get rid of all pips that might already exist.
86
+ slider.element
87
+ .off( ".selectPip" )
88
+ .addClass("ui-slider-pips")
89
+ .find(".ui-slider-pip")
90
+ .remove();
91
+
92
+ // small object with functions for marking pips as selected.
93
+
94
+ var selectPip = {
95
+
96
+ single: function(value) {
97
+
98
+ this.resetClasses();
99
+
100
+ $pips
101
+ .filter(".ui-slider-pip-" + this.classLabel(value) )
102
+ .addClass("ui-slider-pip-selected");
103
+
104
+ if ( slider.options.range ) {
105
+
106
+ $pips.each(function(k, v) {
107
+
108
+ var pipVal = $(v).children(".ui-slider-label").data("value");
109
+
110
+ if (( slider.options.range === "min" && pipVal < value ) ||
111
+ ( slider.options.range === "max" && pipVal > value )) {
112
+
113
+ $(v).addClass("ui-slider-pip-inrange");
114
+
115
+ }
116
+
117
+ });
118
+
119
+ }
120
+
121
+ },
122
+
123
+ range: function(values) {
124
+
125
+ this.resetClasses();
126
+
127
+ for ( i = 0; i < values.length; i++ ) {
128
+
129
+ $pips
130
+ .filter(".ui-slider-pip-" + this.classLabel(values[i]) )
131
+ .addClass("ui-slider-pip-selected-" + ( i + 1 ) );
132
+
133
+ }
134
+
135
+ if ( slider.options.range ) {
136
+
137
+ $pips.each(function(k, v) {
138
+
139
+ var pipVal = $(v).children(".ui-slider-label").data("value");
140
+
141
+ if ( pipVal > values[0] && pipVal < values[1] ) {
142
+
143
+ $(v).addClass("ui-slider-pip-inrange");
144
+
145
+ }
146
+
147
+ });
148
+
149
+ }
150
+
151
+ },
152
+
153
+ classLabel: function(value) {
154
+
155
+ return value.toString().replace(".", "-");
156
+
157
+ },
158
+
159
+ resetClasses: function() {
160
+
161
+ var regex = /(^|\s*)(ui-slider-pip-selected|ui-slider-pip-inrange)(-{1,2}\d+|\s|$)/gi;
162
+
163
+ $pips.removeClass( function(index, css) {
164
+ return ( css.match(regex) || [] ).join(" ");
165
+ });
166
+
167
+ }
168
+
169
+ };
170
+
171
+ function getClosestHandle( val ) {
172
+
173
+ var h, k,
174
+ sliderVals,
175
+ comparedVals,
176
+ closestVal,
177
+ tempHandles = [],
178
+ closestHandle = 0;
179
+
180
+ if ( slider.values() && slider.values().length ) {
181
+
182
+ // get the current values of the slider handles
183
+ sliderVals = slider.values();
184
+
185
+ // find the offset value from the `val` for each
186
+ // handle, and store it in a new array
187
+ comparedVals = $.map( sliderVals, function(v) {
188
+ return Math.abs( v - val );
189
+ });
190
+
191
+ // figure out the closest handles to the value
192
+ closestVal = Math.min.apply( Math, comparedVals );
193
+
194
+ // if a comparedVal is the closestVal, then
195
+ // set the value accordingly, and set the closest handle.
196
+ for ( h = 0; h < comparedVals.length; h++ ) {
197
+ if ( comparedVals[h] === closestVal ) {
198
+ tempHandles.push(h);
199
+ }
200
+ }
201
+
202
+ // set the closest handle to the first handle in array,
203
+ // just incase we have no _lastChangedValue to compare to.
204
+ closestHandle = tempHandles[0];
205
+
206
+ // now we want to find out if any of the closest handles were
207
+ // the last changed handle, if so we specify that handle to change
208
+ for ( k = 0; k < tempHandles.length; k++ ) {
209
+ if ( slider._lastChangedValue === tempHandles[k] ) {
210
+ closestHandle = tempHandles[k];
211
+ }
212
+ }
213
+
214
+ if ( slider.options.range && tempHandles.length === 2 ) {
215
+
216
+ if ( val > sliderVals[1] ) {
217
+
218
+ closestHandle = tempHandles[1];
219
+
220
+ } else if ( val < sliderVals[0] ) {
221
+
222
+ closestHandle = tempHandles[0];
223
+
224
+ }
225
+
226
+ }
227
+
228
+ }
229
+
230
+ return closestHandle;
231
+
232
+ }
233
+
234
+ function destroy() {
235
+
236
+ slider.element
237
+ .off(".selectPip")
238
+ .on("mousedown.slider", slider.element.data("mousedown-original") )
239
+ .removeClass("ui-slider-pips")
240
+ .find(".ui-slider-pip")
241
+ .remove();
242
+
243
+ }
244
+
245
+ // when we click on a label, we want to make sure the
246
+ // slider's handle actually goes to that label!
247
+ // so we check all the handles and see which one is closest
248
+ // to the label we clicked. If 2 handles are equidistant then
249
+ // we move both of them. We also want to trigger focus on the
250
+ // handle.
251
+
252
+ // without this method the label is just treated like a part
253
+ // of the slider and there's no accuracy in the selected value
254
+
255
+ function labelClick( label, e ) {
256
+
257
+ if (slider.option("disabled")) {
258
+ return;
259
+ }
260
+
261
+ var val = $(label).data("value"),
262
+ indexToChange = getClosestHandle( val );
263
+
264
+ if ( slider.values() && slider.values().length ) {
265
+
266
+ slider.options.values[ indexToChange ] = slider._trimAlignValue( val );
267
+
268
+ } else {
269
+
270
+ slider.options.value = slider._trimAlignValue( val );
271
+
272
+ }
273
+
274
+ slider._refreshValue();
275
+ slider._change( e, indexToChange );
276
+
277
+ }
278
+
279
+ // method for creating a pip. We loop this for creating all
280
+ // the pips.
281
+
282
+ function createPip( which ) {
283
+
284
+ var label,
285
+ percent,
286
+ number = which,
287
+ classes = "ui-slider-pip",
288
+ css = "",
289
+ value = slider.value(),
290
+ values = slider.values(),
291
+ labelValue,
292
+ classLabel,
293
+ labelIndex;
294
+
295
+ if ( which === "first" ) {
296
+
297
+ number = 0;
298
+
299
+ } else if ( which === "last" ) {
300
+
301
+ number = pips;
302
+
303
+ }
304
+
305
+ // labelValue is the actual value of the pip based on the min/step
306
+ labelValue = min + ( slider.options.step * number );
307
+
308
+ // classLabel replaces any decimals with hyphens
309
+ classLabel = labelValue.toString().replace(".", "-");
310
+
311
+ // get the index needed for selecting labels out of the array
312
+ labelIndex = ( number + min ) - min;
313
+
314
+ // we need to set the human-readable label to either the
315
+ // corresponding element in the array, or the appropriate
316
+ // item in the object... or an empty string.
317
+
318
+ if ( $.type(options.labels) === "array" ) {
319
+
320
+ label = options.labels[ labelIndex ] || "";
321
+
322
+ } else if ( $.type( options.labels ) === "object" ) {
323
+
324
+ if ( which === "first" ) {
325
+
326
+ // set first label
327
+ label = options.labels.first || "";
328
+
329
+ } else if ( which === "last" ) {
330
+
331
+ // set last label
332
+ label = options.labels.last || "";
333
+
334
+ } else if ( $.type( options.labels.rest ) === "array" ) {
335
+
336
+ // set other labels, but our index should start at -1
337
+ // because of the first pip.
338
+ label = options.labels.rest[ labelIndex - 1 ] || "";
339
+
340
+ } else {
341
+
342
+ // urrggh, the options must be f**ked, just show nothing.
343
+ label = labelValue;
344
+
345
+ }
346
+
347
+ } else {
348
+
349
+ label = labelValue;
350
+
351
+ }
352
+
353
+
354
+
355
+
356
+ if ( which === "first" ) {
357
+
358
+ // first Pip on the Slider
359
+ percent = "0%";
360
+
361
+ classes += " ui-slider-pip-first";
362
+ classes += ( options.first === "label" ) ? " ui-slider-pip-label" : "";
363
+ classes += ( options.first === false ) ? " ui-slider-pip-hide" : "";
364
+
365
+ } else if ( which === "last" ) {
366
+
367
+ // last Pip on the Slider
368
+ percent = "100%";
369
+
370
+ classes += " ui-slider-pip-last";
371
+ classes += ( options.last === "label" ) ? " ui-slider-pip-label" : "";
372
+ classes += ( options.last === false ) ? " ui-slider-pip-hide" : "";
373
+
374
+ } else {
375
+
376
+ // all other Pips
377
+ percent = (( 100 / pips ) * which ).toFixed(4) + "%";
378
+
379
+ classes += ( options.rest === "label" ) ? " ui-slider-pip-label" : "";
380
+ classes += ( options.rest === false ) ? " ui-slider-pip-hide" : "";
381
+
382
+ }
383
+
384
+ classes += " ui-slider-pip-" + classLabel;
385
+
386
+
387
+ // add classes for the initial-selected values.
388
+ if ( values && values.length ) {
389
+
390
+ for ( i = 0; i < values.length; i++ ) {
391
+
392
+ if ( labelValue === values[i] ) {
393
+
394
+ classes += " ui-slider-pip-initial-" + ( i + 1 );
395
+ classes += " ui-slider-pip-selected-" + ( i + 1 );
396
+
397
+ }
398
+
399
+ }
400
+
401
+ if ( slider.options.range ) {
402
+
403
+ if ( labelValue > values[0] &&
404
+ labelValue < values[1] ) {
405
+
406
+ classes += " ui-slider-pip-inrange";
407
+
408
+ }
409
+
410
+ }
411
+
412
+ } else {
413
+
414
+ if ( labelValue === value ) {
415
+
416
+ classes += " ui-slider-pip-initial";
417
+ classes += " ui-slider-pip-selected";
418
+
419
+ }
420
+
421
+ if ( slider.options.range ) {
422
+
423
+ if (( slider.options.range === "min" && labelValue < value ) ||
424
+ ( slider.options.range === "max" && labelValue > value )) {
425
+
426
+ classes += " ui-slider-pip-inrange";
427
+
428
+ }
429
+
430
+ }
431
+
432
+ }
433
+
434
+
435
+
436
+ css = ( slider.options.orientation === "horizontal" ) ?
437
+ "left: " + percent :
438
+ "bottom: " + percent;
439
+
440
+
441
+ // add this current pip to the collection
442
+ return "<span class=\"" + classes + "\" style=\"" + css + "\">" +
443
+ "<span class=\"ui-slider-line\"></span>" +
444
+ "<span class=\"ui-slider-label\" data-value=\"" +
445
+ labelValue + "\">" + options.formatLabel(label) + "</span>" +
446
+ "</span>";
447
+
448
+ }
449
+
450
+ // create our first pip
451
+ collection += createPip("first");
452
+
453
+ // for every stop in the slider where we need a pip; create one.
454
+ for ( p = slider.options.pipStep; p < pips; p += slider.options.pipStep ) {
455
+ collection += createPip( p );
456
+ }
457
+
458
+ // create our last pip
459
+ collection += createPip("last");
460
+
461
+ // append the collection of pips.
462
+ slider.element.append( collection );
463
+
464
+ // store the pips for setting classes later.
465
+ $pips = slider.element.find(".ui-slider-pip");
466
+
467
+
468
+
469
+ // store the mousedown handlers for later, just in case we reset
470
+ // the slider, the handler would be lost!
471
+
472
+ if ( $._data( slider.element.get(0), "events").mousedown &&
473
+ $._data( slider.element.get(0), "events").mousedown.length ) {
474
+
475
+ mousedownHandlers = $._data( slider.element.get(0), "events").mousedown;
476
+
477
+ } else {
478
+
479
+ mousedownHandlers = slider.element.data("mousedown-handlers");
480
+
481
+ }
482
+
483
+ slider.element.data("mousedown-handlers", mousedownHandlers.slice() );
484
+
485
+ // loop through all the mousedown handlers on the slider,
486
+ // and store the original namespaced (.slider) event handler so
487
+ // we can trigger it later.
488
+ for ( j = 0; j < mousedownHandlers.length; j++ ) {
489
+ if ( mousedownHandlers[j].namespace === "slider" ) {
490
+ slider.element.data("mousedown-original", mousedownHandlers[j].handler );
491
+ }
492
+ }
493
+
494
+ // unbind the mousedown.slider event, because it interferes with
495
+ // the labelClick() method (stops smooth animation), and decide
496
+ // if we want to trigger the original event based on which element
497
+ // was clicked.
498
+ slider.element
499
+ .off("mousedown.slider")
500
+ .on("mousedown.selectPip", function(e) {
501
+
502
+ var $target = $(e.target),
503
+ closest = getClosestHandle( $target.data("value") ),
504
+ $handle = $handles.eq( closest );
505
+
506
+ $handle.addClass("ui-state-active");
507
+
508
+ if ( $target.is(".ui-slider-label") ) {
509
+
510
+ labelClick( $target, e );
511
+
512
+ slider.element
513
+ .one("mouseup.selectPip", function() {
514
+
515
+ $handle
516
+ .removeClass("ui-state-active")
517
+ .focus();
518
+
519
+ });
520
+
521
+ } else {
522
+
523
+ var originalMousedown = slider.element.data("mousedown-original");
524
+ originalMousedown(e);
525
+
526
+ }
527
+
528
+ });
529
+
530
+
531
+
532
+
533
+ slider.element.on( "slide.selectPip slidechange.selectPip", function(e, ui) {
534
+
535
+ var $slider = $(this),
536
+ value = $slider.slider("value"),
537
+ values = $slider.slider("values");
538
+
539
+ if ( ui ) {
540
+
541
+ value = ui.value;
542
+ values = ui.values;
543
+
544
+ }
545
+
546
+ if ( slider.values() && slider.values().length ) {
547
+
548
+ selectPip.range( values );
549
+
550
+ } else {
551
+
552
+ selectPip.single( value );
553
+
554
+ }
555
+
556
+ });
557
+
558
+
559
+
560
+
561
+ },
562
+
563
+
564
+
565
+
566
+
567
+
568
+
569
+
570
+ // floats
571
+
572
+ float: function( settings ) {
573
+
574
+ var i,
575
+ slider = this,
576
+ min = slider._valueMin(),
577
+ max = slider._valueMax(),
578
+ value = slider._value(),
579
+ values = slider._values(),
580
+ tipValues = [],
581
+ $handles = slider.element.find(".ui-slider-handle");
582
+
583
+ var options = {
584
+
585
+ handle: true,
586
+ /* false */
587
+
588
+ pips: false,
589
+ /* true */
590
+
591
+ labels: false,
592
+ /* [array], { first: "string", rest: [array], last: "string" }, false */
593
+
594
+ prefix: "",
595
+ /* "", string */
596
+
597
+ suffix: "",
598
+ /* "", string */
599
+
600
+ event: "slidechange slide",
601
+ /* "slidechange", "slide", "slidechange slide" */
602
+
603
+ formatLabel: function(value) {
604
+ return this.prefix + value + this.suffix;
605
+ }
606
+ /* function
607
+ must return a value to display in the floats */
608
+
609
+ };
610
+
611
+ if ( $.type( settings ) === "object" || $.type( settings ) === "undefined" ) {
612
+
613
+ $.extend( options, settings );
614
+ slider.element.data("float-options", options );
615
+
616
+ } else {
617
+
618
+ if ( settings === "destroy" ) {
619
+
620
+ destroy();
621
+
622
+ } else if ( settings === "refresh" ) {
623
+
624
+ slider.element.slider( "float", slider.element.data("float-options") );
625
+
626
+ }
627
+
628
+ return;
629
+
630
+ }
631
+
632
+
633
+
634
+
635
+ if ( value < min ) {
636
+ value = min;
637
+ }
638
+
639
+ if ( value > max ) {
640
+ value = max;
641
+ }
642
+
643
+ if ( values && values.length ) {
644
+
645
+ for ( i = 0; i < values.length; i++ ) {
646
+
647
+ if ( values[i] < min ) {
648
+ values[i] = min;
649
+ }
650
+
651
+ if ( values[i] > max ) {
652
+ values[i] = max;
653
+ }
654
+
655
+ }
656
+
657
+ }
658
+
659
+ // add a class for the CSS
660
+ slider.element
661
+ .addClass("ui-slider-float")
662
+ .find(".ui-slider-tip, .ui-slider-tip-label")
663
+ .remove();
664
+
665
+
666
+
667
+ function destroy() {
668
+
669
+ slider.element
670
+ .off(".sliderFloat")
671
+ .removeClass("ui-slider-float")
672
+ .find(".ui-slider-tip, .ui-slider-tip-label")
673
+ .remove();
674
+
675
+ }
676
+
677
+
678
+ function getPipLabels( values ) {
679
+
680
+ // when checking the array we need to divide
681
+ // by the step option, so we store those values here.
682
+
683
+ var vals = [],
684
+ steppedVals = $.map( values, function(v) {
685
+ return Math.ceil(( v - min ) / slider.options.step);
686
+ });
687
+
688
+ // now we just get the values we need to return
689
+ // by looping through the values array and assigning the
690
+ // label if it exists.
691
+
692
+ if ( $.type( options.labels ) === "array" ) {
693
+
694
+ for ( i = 0; i < values.length; i++ ) {
695
+
696
+ vals[i] = options.labels[ steppedVals[i] ] || values[i];
697
+
698
+ }
699
+
700
+ } else if ( $.type( options.labels ) === "object" ) {
701
+
702
+ for ( i = 0; i < values.length; i++ ) {
703
+
704
+ if ( values[i] === min ) {
705
+
706
+ vals[i] = options.labels.first || min;
707
+
708
+ } else if ( values[i] === max ) {
709
+
710
+ vals[i] = options.labels.last || max;
711
+
712
+ } else if ( $.type( options.labels.rest ) === "array" ) {
713
+
714
+ vals[i] = options.labels.rest[ steppedVals[i] - 1 ] || values[i];
715
+
716
+ } else {
717
+
718
+ vals[i] = values[i];
719
+
720
+ }
721
+
722
+ }
723
+
724
+ } else {
725
+
726
+ for ( i = 0; i < values.length; i++ ) {
727
+
728
+ vals[i] = values[i];
729
+
730
+ }
731
+
732
+ }
733
+
734
+ return vals;
735
+
736
+ }
737
+
738
+ // apply handle tip if settings allows.
739
+ if ( options.handle ) {
740
+
741
+ // we need to set the human-readable label to either the
742
+ // corresponding element in the array, or the appropriate
743
+ // item in the object... or an empty string.
744
+
745
+ tipValues = ( slider.values() && slider.values().length ) ?
746
+ getPipLabels( values ) :
747
+ getPipLabels( [ value ] );
748
+
749
+ for ( i = 0; i < tipValues.length; i++ ) {
750
+
751
+ $handles
752
+ .eq( i )
753
+ .append( $("<span class=\"ui-slider-tip\">"+ options.formatLabel(tipValues[i]) +"</span>") );
754
+
755
+ }
756
+
757
+ }
758
+
759
+ if ( options.pips ) {
760
+
761
+ // if this slider also has pip-labels, we make those into tips, too.
762
+ slider.element.find(".ui-slider-label").each(function(k, v) {
763
+
764
+ var $this = $(v),
765
+ val = [ $this.data("value") ],
766
+ label,
767
+ $tip;
768
+
769
+
770
+ label = options.formatLabel( getPipLabels( val )[0] );
771
+
772
+ // create a tip element
773
+ $tip =
774
+ $("<span class=\"ui-slider-tip-label\">" + label + "</span>")
775
+ .insertAfter( $this );
776
+
777
+ });
778
+
779
+ }
780
+
781
+ // check that the event option is actually valid against our
782
+ // own list of the slider's events.
783
+ if ( options.event !== "slide" &&
784
+ options.event !== "slidechange" &&
785
+ options.event !== "slide slidechange" &&
786
+ options.event !== "slidechange slide" ) {
787
+
788
+ options.event = "slidechange slide";
789
+
790
+ }
791
+
792
+ // when slider changes, update handle tip label.
793
+ slider.element
794
+ .off(".sliderFloat")
795
+ .on( options.event + ".sliderFloat", function( e, ui ) {
796
+
797
+ var uiValue = ( $.type( ui.value ) === "array" ) ? ui.value : [ ui.value ],
798
+ val = options.formatLabel( getPipLabels( uiValue )[0] );
799
+
800
+ $(ui.handle)
801
+ .find(".ui-slider-tip")
802
+ .html( val );
803
+
804
+ });
805
+
806
+ }
807
+
808
+ };
809
+
810
+ $.extend(true, $.ui.slider.prototype, extensionMethods);
811
+
812
+ })(jQuery);