@componyx/ui 0.0.0-stage → 1.0.4

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 (169) hide show
  1. package/AppSkin/AppSkin.css +1268 -0
  2. package/AppSkin/AppSkin.js +2748 -0
  3. package/AppSkin/Themes/Default.css +241 -0
  4. package/Base/Base.js +3407 -0
  5. package/Base/ComponentIcons.css +66 -0
  6. package/Base/Font/ComponentIcons.woff +0 -0
  7. package/Base/Font/UI.woff +0 -0
  8. package/Base/Library.js +8432 -0
  9. package/Base/NavigationManager.js +462 -0
  10. package/Base/ResponsiveTemplates.js +371 -0
  11. package/Base/Sanitizer.js +288 -0
  12. package/Base/Themes/Default.css +255 -0
  13. package/Base/UI.css +618 -0
  14. package/Base/UIResourcePath.js +6 -0
  15. package/Bindary/Bindary.js +2011 -0
  16. package/Bindary/Modules/Connection.js +216 -0
  17. package/Bindary/Modules/Core.js +854 -0
  18. package/Bindary/Modules/DataUpdater.js +351 -0
  19. package/Bindary/Modules/ExpressionEngine.js +347 -0
  20. package/Bindary/Modules/ProxyManager.js +482 -0
  21. package/Bindary/Modules/Renderer.js +605 -0
  22. package/Bindary/Modules/Router.js +291 -0
  23. package/Bindary/Modules/Scroller.js +89 -0
  24. package/Bindary/Modules/Template.js +1273 -0
  25. package/BookmarkSpy/BookmarkSpy.js +430 -0
  26. package/Box/Box.css +36 -0
  27. package/Box/Box.js +1685 -0
  28. package/Button/Button.css +470 -0
  29. package/Button/Button.js +1398 -0
  30. package/Button/Themes/Default.css +200 -0
  31. package/Carousel/Carousel.css +273 -0
  32. package/Carousel/Carousel.js +607 -0
  33. package/ColorButton/ColorButton.css +39 -0
  34. package/ColorButton/ColorButton.js +336 -0
  35. package/ColorPicker/ColorPicker.css +359 -0
  36. package/ColorPicker/ColorPicker.js +972 -0
  37. package/ComboBox/ComboBox.css +357 -0
  38. package/ComboBox/ComboBox.js +2342 -0
  39. package/ComboBox/Themes/Default.css +23 -0
  40. package/DataPager/DataPager.css +72 -0
  41. package/DataPager/DataPager.js +674 -0
  42. package/DatePicker/DatePicker.css +227 -0
  43. package/DatePicker/DatePicker.js +1531 -0
  44. package/DatePicker/Themes/Default.css +26 -0
  45. package/Dialog/Dialog.css +106 -0
  46. package/Dialog/Dialog.js +572 -0
  47. package/Dialog/Themes/Default.css +10 -0
  48. package/Editor/Data/Emoji.json +8285 -0
  49. package/Editor/Data/Special.json +1042 -0
  50. package/Editor/Editor.css +1562 -0
  51. package/Editor/Editor.js +4058 -0
  52. package/Editor/Font/Editor.woff +0 -0
  53. package/Editor/Modules/ComponentFactory.js +565 -0
  54. package/Editor/Modules/ContentManager.js +748 -0
  55. package/Editor/Modules/DialogManager.js +1234 -0
  56. package/Editor/Modules/EventManager.js +458 -0
  57. package/Editor/Modules/Format.js +950 -0
  58. package/Editor/Modules/History.js +191 -0
  59. package/Editor/Modules/LayoutState.js +379 -0
  60. package/Editor/Modules/ListManager.js +296 -0
  61. package/Editor/Modules/MenuManager.js +388 -0
  62. package/Editor/Modules/NodeManager.js +681 -0
  63. package/Editor/Modules/ParagraphButtons.js +122 -0
  64. package/Editor/Modules/Resizer.js +176 -0
  65. package/Editor/Modules/SelectionRange.js +564 -0
  66. package/Editor/Modules/SourceViewBuilder.js +212 -0
  67. package/Editor/Modules/SymbolPicker.js +208 -0
  68. package/Editor/Modules/Table.js +2327 -0
  69. package/Editor/Modules/TableDialog.js +757 -0
  70. package/Editor/Modules/Toolbar.js +375 -0
  71. package/Editor/Modules/TooltipMenu.js +125 -0
  72. package/Editor/Modules/Utility.js +131 -0
  73. package/Editor/Themes/Default.css +204 -0
  74. package/FileUpload/FileUpload.css +156 -0
  75. package/FileUpload/FileUpload.js +898 -0
  76. package/FileUpload/Themes/Default.css +17 -0
  77. package/Form/Form.css +1934 -0
  78. package/Form/Form.js +4943 -0
  79. package/Form/Modules/ActionManager.js +368 -0
  80. package/Form/Modules/BuildPanelManager.js +319 -0
  81. package/Form/Modules/ComponentFactory.js +468 -0
  82. package/Form/Modules/ComponentPanel.js +265 -0
  83. package/Form/Modules/ConfigPanelManager.js +685 -0
  84. package/Form/Modules/DataBinder.js +602 -0
  85. package/Form/Modules/DataObserver.js +717 -0
  86. package/Form/Modules/Draggable.js +756 -0
  87. package/Form/Modules/OptionsPanel.js +342 -0
  88. package/Form/Modules/Renderer.js +1889 -0
  89. package/Form/Modules/RuleEngine.js +585 -0
  90. package/Form/Modules/RulesPanel.js +1158 -0
  91. package/Form/Modules/Types.js +1709 -0
  92. package/Form/Modules/ValidationManager.js +194 -0
  93. package/Form/Themes/Default.css +216 -0
  94. package/FormField/FormField.css +468 -0
  95. package/FormField/FormField.js +576 -0
  96. package/FormField/Themes/Default.css +99 -0
  97. package/Grid/Grid.css +544 -0
  98. package/Grid/Grid.js +3761 -0
  99. package/Grid/Themes/Default.css +43 -0
  100. package/LICENSE +126 -0
  101. package/MaskedTextBox/MaskedTextBox.css +28 -0
  102. package/MaskedTextBox/MaskedTextBox.js +642 -0
  103. package/MaskedTextBox/Themes/Default.css +6 -0
  104. package/Menu/Menu.css +328 -0
  105. package/Menu/Menu.js +2386 -0
  106. package/Menu/Themes/Default.css +24 -0
  107. package/NumericBox/NumericBox.css +120 -0
  108. package/NumericBox/NumericBox.js +984 -0
  109. package/PanelBar/PanelBar.css +123 -0
  110. package/PanelBar/PanelBar.js +505 -0
  111. package/PanelBar/Themes/Default.css +51 -0
  112. package/PieChart/PieChart.css +95 -0
  113. package/PieChart/PieChart.js +820 -0
  114. package/PieChart/Themes/Default.css +9 -0
  115. package/README.md +178 -3
  116. package/Slider/Slider.css +348 -0
  117. package/Slider/Slider.js +1306 -0
  118. package/Slider/Themes/Default.css +44 -0
  119. package/TabStrip/TabStrip.css +52 -0
  120. package/TabStrip/TabStrip.js +362 -0
  121. package/TabStrip/Themes/Default.css +35 -0
  122. package/TimePicker/Themes/Default.css +30 -0
  123. package/TimePicker/TimePicker.css +253 -0
  124. package/TimePicker/TimePicker.js +1485 -0
  125. package/TooltipManager/Themes/Default.css +21 -0
  126. package/TooltipManager/TooltipManager.css +227 -0
  127. package/TooltipManager/TooltipManager.js +791 -0
  128. package/Validator/Validator.css +54 -0
  129. package/Validator/Validator.js +2508 -0
  130. package/componyx.html-data.json +619 -0
  131. package/index.js +27 -0
  132. package/package.json +43 -4
  133. package/types/AppSkin.d.ts +842 -0
  134. package/types/Base.d.ts +1034 -0
  135. package/types/Bindary.d.ts +1196 -0
  136. package/types/BookmarkSpy.d.ts +112 -0
  137. package/types/Box.d.ts +374 -0
  138. package/types/Button.d.ts +455 -0
  139. package/types/Carousel.d.ts +136 -0
  140. package/types/ColorButton.d.ts +120 -0
  141. package/types/ColorPicker.d.ts +225 -0
  142. package/types/ComboBox.d.ts +507 -0
  143. package/types/DataPager.d.ts +152 -0
  144. package/types/DatePicker.d.ts +354 -0
  145. package/types/Dialog.d.ts +160 -0
  146. package/types/Editor.d.ts +1289 -0
  147. package/types/FileUpload.d.ts +206 -0
  148. package/types/Form.d.ts +3078 -0
  149. package/types/FormField.d.ts +204 -0
  150. package/types/Grid.d.ts +911 -0
  151. package/types/Library.d.ts +1899 -0
  152. package/types/MaskedTextBox.d.ts +91 -0
  153. package/types/Menu.d.ts +577 -0
  154. package/types/NumericBox.d.ts +310 -0
  155. package/types/PanelBar.d.ts +223 -0
  156. package/types/PieChart.d.ts +224 -0
  157. package/types/ResponsiveTemplates.d.ts +108 -0
  158. package/types/Slider.d.ts +227 -0
  159. package/types/TabStrip.d.ts +185 -0
  160. package/types/TimePicker.d.ts +265 -0
  161. package/types/TooltipManager.d.ts +178 -0
  162. package/types/UI.d.ts +29 -0
  163. package/types/Validator.d.ts +653 -0
  164. package/types/index.d.ts +59 -0
  165. package/ui.css +11783 -0
  166. package/ui.js +79477 -0
  167. package/ui.min.css +138 -0
  168. package/ui.min.js +264 -0
  169. package/ui.min.js.map +1 -0
@@ -0,0 +1,1306 @@
1
+ /*! Componyx.UI | (c) E.H. Daanen / Componyx | BUSL-1.1 | componyx.com/license */
2
+ import '../Base/Base.js';
3
+ import '../Base/Library.js';
4
+
5
+ (function (window)
6
+ {
7
+ /**
8
+ * Slider class.
9
+ * @class
10
+ * @memberof componyx.UI
11
+ * @augments componyx.UI.base.Component
12
+ * @mixes componyx.UI.base.methods
13
+ * @param {String} id The id of the component.
14
+ * @param {Object|HTMLElement} properties The properties used to initialize the component or the container element.
15
+ * @returns {Object} An instance of the component.
16
+ */
17
+ componyx.UI.Slider = function Slider(id, properties)
18
+ {
19
+ // define private properties
20
+ var _instance = this,
21
+ _content, _track, _range, _decreaseButton, _increaseButton, _tooltipManager, _value, _startValue, _draggableHandle, _draggableStartHandle,
22
+ _handlerId = [], _holdTimerId, _tooltipTimerId, _select, _cancelSelect, _selectedTicks = [], _animation, _dragging, _event,
23
+ _tickMarkSideOption = componyx.UI.Slider.TickMarkSideOption, _hidden, _hiddenStart, _hiddenRange;
24
+ $base.static.ThemeOption;
25
+ var _classOption =
26
+ {
27
+ ANIMATION: 'animation',
28
+ VERTICAL: 'vertical',
29
+ REVERSED: 'reversed',
30
+ DISABLED: 'disabled',
31
+ CONTENT: 'content',
32
+ TICK_SIDE_BEFORE: 'tick-side-before',
33
+ TICK_SIDE_AFTER: 'tick-side-after',
34
+ TICKS: 'ticks',
35
+ TICK_MARK: 'tick',
36
+ MINOR: 'minor',
37
+ MAJOR: 'major',
38
+ TRACK: 'track',
39
+ FIXED_TRACK_SIZE: 'fixed-track-size',
40
+ RANGE: 'range',
41
+ HANDLE: 'handle',
42
+ START_HANDLE: 'handle start',
43
+ SELECTED: 'selected',
44
+ SELECTED_START: 'selected-start',
45
+ DECREASE_BUTTON: 'button decrease',
46
+ INCREASE_BUTTON: 'button increase',
47
+ EXPAND_ICON: 'expand-icon'
48
+ };
49
+
50
+ // define public properties
51
+ /**
52
+ * Gets or sets a value indicating if the slider is rendered vertically.
53
+ * @type {Boolean}
54
+ */
55
+ this.vertical = false;
56
+
57
+ /**
58
+ * Gets or sets a value indicating if the slider has a start- and end-handle to set a range.
59
+ * @type {Boolean}
60
+ */
61
+ this.range = false;
62
+
63
+ /**
64
+ * Gets or sets a value indicating if the increase and decrease buttons are displayed.
65
+ * @type {Boolean}
66
+ */
67
+ this.showButtons = true;
68
+
69
+ /**
70
+ * Gets or sets a value indicating if tooltips are displayed when there are value changes.
71
+ * @type {Boolean}
72
+ */
73
+ this.showTooltips = true;
74
+
75
+ /**
76
+ * Gets or sets a value indicating if the slider is rendered in reverse direction.
77
+ * @type {Boolean}
78
+ */
79
+ this.reversed = false;
80
+
81
+ /**
82
+ * Gets or sets a value indicating if the css animation is activated when the track is selected.
83
+ * @type {Boolean}
84
+ */
85
+ this.animation = true;
86
+
87
+ /**
88
+ * Gets or sets a value indicating if the slider is disabled.
89
+ * @type {Boolean}
90
+ */
91
+ this.disabled = false;
92
+
93
+ /**
94
+ * Gets or sets a value indicating where the tickmark side is rendered.
95
+ * @type {componyx.UI.Slider.TickMarkSideOption}
96
+ */
97
+ this.tickMarkSide = _tickMarkSideOption.NONE;
98
+
99
+ /**
100
+ * Gets or sets a value indicating where the tickmark values are rendered.
101
+ * @type {componyx.UI.Slider.TickMarkSideOption}
102
+ */
103
+ this.tickMarkValueSide = _tickMarkSideOption.NONE;
104
+
105
+ /**
106
+ * Gets or sets the track size. If a track size is defined the CSS class 'fixed-track-size' is appended to the root element. You can also control the slider’s dimensions via CSS, either on the track or the root element.
107
+ * @type {String|Number}
108
+ */
109
+ this.trackSize = '';
110
+
111
+ /**
112
+ * Gets or sets the decimal separator used when displaying tickmark values.
113
+ * @type {String}
114
+ */
115
+ this.decimalSeparator = '.';
116
+
117
+ /**
118
+ * Gets or sets the decimal places used when displaying tickmark values.
119
+ * @type {Number}
120
+ */
121
+ this.decimalPlaces = 0;
122
+
123
+ /**
124
+ * Gets or sets the minimum value.
125
+ * @type {Number}
126
+ */
127
+ this.minValue = 0;
128
+
129
+ /**
130
+ * Gets or sets the maximum value.
131
+ * @type {Number}
132
+ */
133
+ this.maxValue = 100;
134
+
135
+ /**
136
+ * Gets or sets the minimum change in value.
137
+ * @type {Number}
138
+ */
139
+ this.minChange = 1;
140
+
141
+ /**
142
+ * Gets or sets the maximum change in value. If a maximum value is not set the handle can move to any clicked position in the track.
143
+ * @type {Number}
144
+ */
145
+ this.maxChange = 0;
146
+
147
+ /**
148
+ * Gets or sets the start value of the range slider.
149
+ * @type {Number}
150
+ */
151
+ this.startValue = 0;
152
+
153
+ /**
154
+ * Gets or sets the value (end value in range) of the slider. If range is set to true and this value is not set it will take the maxValue by default, otherwise it defaults to the minValue or 0.
155
+ * @type {Number|null}
156
+ */
157
+ this.value = null;
158
+
159
+ /**
160
+ * Gets or sets the amount of rendered tickmarks.
161
+ * @type {Number}
162
+ */
163
+ this.tickMarks = 10;
164
+
165
+ /**
166
+ * Gets or sets the tickmark step on which a value is rendered. 0 means never, 1 means every item, 2 means every 2nd item.
167
+ * @type {Number}
168
+ */
169
+ this.tickMarkValueStep = 1;
170
+
171
+ /**
172
+ * Gets or sets the tickmark step on which a minor tick is rendered. 0 means never, 1 means every item, 2 means every 2nd item and so on.
173
+ * @type {Number}
174
+ */
175
+ this.minorTickMarkStep = 0;
176
+
177
+ /**
178
+ * Gets or sets the tickmark step on which a major tick is rendered. 0 means never, 1 means every item, 2 means every 2nd item and so on.
179
+ * @type {Number}
180
+ */
181
+ this.majorTickMarkStep = 0;
182
+
183
+ /**
184
+ * Gets or sets the tickmark labels when text instead of a numeric value is desired.
185
+ * @type {Object.<number, string>}
186
+ */
187
+ this.tickMarkLabels = {};
188
+
189
+ /**
190
+ * Gets or sets the id of the decrease button from which the settings are cloned.
191
+ * @type {String|null}
192
+ */
193
+ this.decreaseButtonId = null;
194
+
195
+ /**
196
+ * Gets or sets the id of the increase button from which the settings are cloned.
197
+ * @type {String|null}
198
+ */
199
+ this.increaseButtonId = null;
200
+
201
+ /**
202
+ * Gets or sets the id of the tooltip manager from which the settings are cloned.
203
+ * @type {String|null}
204
+ */
205
+ this.tooltipManagerId = null;
206
+
207
+ /**
208
+ * Gets or sets the id of the hidden input from which the attributes and properties are cloned. The hidden input contains the selected value.
209
+ * @type {String|null}
210
+ */
211
+ this.hiddenInputId = null;
212
+
213
+ /**
214
+ * Gets or sets the id of the range-start hidden input from which the attributes and properties are cloned. The hidden input contains the selected range start value.
215
+ * @type {String|null}
216
+ */
217
+ this.startHiddenInputId = null;
218
+
219
+ /**
220
+ * Gets or sets the id of the range hidden input from which the attributes and properties are cloned. The hidden input contains both the selected range start and end value.
221
+ * @type {String|null}
222
+ */
223
+ this.rangeHiddenInputId = null;
224
+
225
+
226
+ /**
227
+ * @class
228
+ * @augments componyx.UI.base.Events
229
+ * @memberof componyx.UI.Slider
230
+ * @property {componyx.UI.base.Event} onFocus - Event which fires when the component is focused.
231
+ * @property {componyx.UI.base.Event} onBlur - Event which fires when the component is blurred.
232
+ * @property {componyx.UI.base.Event} onChange - Event which fires when the value or start value is changed. @see {@link componyx.UI.Slider.ChangeEventArgs}
233
+ * @see {@link componyx.UI.base.Events}
234
+ */
235
+ function SliderEvents(events)
236
+ {
237
+ Object.assign(this, events);
238
+ this.onFocus = $base.static.createEvent('onFocus');
239
+ this.onBlur = $base.static.createEvent('onBlur');
240
+ this.onChange = $base.static.createEvent('onChange');
241
+ }
242
+
243
+ /**
244
+ * Slider events
245
+ * @type {componyx.UI.Slider.SliderEvents}
246
+ */
247
+ this.events = new SliderEvents(this.events);
248
+
249
+ /**
250
+ * Slider change event arguments.
251
+ * @typedef {Object} ChangeEventArgs
252
+ * @memberof componyx.UI.Slider
253
+ * @property {Boolean} isStart - A value indicating if the range start value changed instead of the (end) value.
254
+ * @property {Number|null} value - The new value.
255
+ */
256
+
257
+ // inherit base instance members
258
+ $base.Component.apply(this, [id, properties]);
259
+
260
+ /**
261
+ * Sets the value template. The template supports the below listed interpolations.
262
+ * - {value} This value will be replaced with the selected value or label text.
263
+ * @param {HTMLElement|HTMLElement[]|DocumentFragment|String} content The HTML template.
264
+ */
265
+ this.setValueTemplate = function (content)
266
+ {
267
+ _instance.addTemplate('Value', content, false);
268
+ };
269
+
270
+ /**
271
+ * Sets the start value template. The template supports the below listed interpolations.
272
+ * - {value} This value will be replaced with the selected value or label text.
273
+ * @param {HTMLElement|HTMLElement[]|DocumentFragment|String} content The HTML template.
274
+ */
275
+ this.setStartValueTemplate = function (content)
276
+ {
277
+ _instance.addTemplate('StartValue', content, false);
278
+ };
279
+
280
+ /**
281
+ * Gets the selected slider value(s).
282
+ * @returns {Number|Number[]} The value for a slider or the range start and end values for a range slider.
283
+ */
284
+ this.getValue = function ()
285
+ {
286
+ if (_instance.range)
287
+ return [_startValue, _value];
288
+ else
289
+ return _value;
290
+ };
291
+
292
+ /**
293
+ * Sets the (end) value.
294
+ * @param {Number} value The value to set.
295
+ */
296
+ this.setValue = function (value)
297
+ {
298
+ setValue(value);
299
+ };
300
+
301
+ /**
302
+ * Sets the start value in a range slider.
303
+ * @param {Number} value The start value to set.
304
+ */
305
+ this.setStartValue = function (value)
306
+ {
307
+ setStartValue(value);
308
+ };
309
+
310
+ /**
311
+ * Renders the component
312
+ */
313
+ this.render = function ()
314
+ {
315
+ if (_instance.renderState != $base.static.RenderState.RENDERING)
316
+ {
317
+ // call base render and return
318
+ $base.methods.render.call(_instance, preRender, 'slider');
319
+ return;
320
+ }
321
+
322
+ // create default templates
323
+ if (!_instance.hasTemplate('Value'))
324
+ _instance.addTemplate('Value', '{value}', true);
325
+
326
+ if (!_instance.hasTemplate('StartValue'))
327
+ _instance.addTemplate('StartValue', '{value}', true);
328
+
329
+ // render logic after loading resources
330
+ if ($lib.isEmpty(_instance.value))
331
+ {
332
+ if (_instance.range)
333
+ _instance.value = _instance.maxValue || 0;
334
+ else
335
+ _instance.value = _instance.minValue || 0;
336
+ }
337
+
338
+ draw();
339
+ };
340
+
341
+ /**
342
+ * Handles the post render procedure.
343
+ */
344
+ this.postRender = function ()
345
+ {
346
+ if (_instance.renderState != $base.static.RenderState.RENDERING) // extra safety to never execute a postRender when the component state is incorrect
347
+ return;
348
+
349
+ if (!$base.methods.postRender.call(_instance)) // component got destroyed on postrender event
350
+ return;
351
+
352
+ setValue(_instance.value);
353
+
354
+ if (_instance.range)
355
+ setStartValue(_instance.startValue);
356
+ else
357
+ updateHandleSettings();
358
+ };
359
+
360
+ /**
361
+ * Destroys the component.
362
+ * @see {@link componyx.UI.base.methods#destroy}
363
+ */
364
+ this.destroy = function (...args)
365
+ {
366
+ dispose();
367
+ $base.methods.destroy.call(this, ...args);
368
+ };
369
+
370
+ function preRender()
371
+ {
372
+ return ['Slider'];
373
+ }
374
+
375
+ function draw()
376
+ {
377
+ var tickMarkValueSide = _instance.tickMarkValueSide,
378
+ range = _instance.range,
379
+ reversed = _instance.reversed;
380
+
381
+ _hidden = _instance.createSyncedInput(_instance.hiddenInputId, function ()
382
+ {
383
+ var value = this.value;
384
+ setValue(($lib.isEmpty(value)) ? null : parseFloat(value));
385
+ });
386
+
387
+ if (range)
388
+ {
389
+ _hiddenStart = _instance.createSyncedInput(_instance.startHiddenInputId, function ()
390
+ {
391
+ var value = this.value;
392
+ setStartValue(($lib.isEmpty(value)) ? null : parseFloat(value));
393
+ });
394
+
395
+ _hiddenRange = _instance.createSyncedInput(_instance.rangeHiddenInputId, function ()
396
+ {
397
+ var value = this.value;
398
+
399
+ if ($lib.isEmpty(value))
400
+ {
401
+ setValue(null);
402
+ setStartValue(null);
403
+ }
404
+ else
405
+ {
406
+ var values = value.split(',').map(v => v.trim()),
407
+ start = values[0] !== undefined && !isNaN(values[0]) ? parseFloat(values[0]) : null,
408
+ end = values[1] !== undefined && !isNaN(values[1]) ? parseFloat(values[1]) : null;
409
+
410
+ setStartValue(start);
411
+ setValue(end);
412
+ }
413
+ });
414
+
415
+ if ($lib.isEmpty(_instance.startValue) && !$lib.isEmpty(_hiddenStart.value) && !isNaN(_hiddenStart.value))
416
+ _instance.startValue = parseFloat(_hiddenStart.value);
417
+ }
418
+
419
+ if (_instance.vertical)
420
+ $lib.addClass(_instance.element, _classOption.VERTICAL);
421
+
422
+ if (reversed)
423
+ $lib.addClass(_instance.element, _classOption.REVERSED);
424
+
425
+ if (range)
426
+ $lib.addClass(_instance.element, _classOption.RANGE);
427
+
428
+ if (_instance.disabled)
429
+ $lib.addClass(_instance.element, _classOption.DISABLED);
430
+
431
+ if (_instance.tickMarkSide === _tickMarkSideOption.BEFORE)
432
+ $lib.addClass(_instance.element, _classOption.TICK_SIDE_BEFORE);
433
+ else if (_instance.tickMarkSide === _tickMarkSideOption.AFTER)
434
+ $lib.addClass(_instance.element, _classOption.TICK_SIDE_AFTER);
435
+
436
+ if (_instance.showButtons)
437
+ {
438
+ if (reversed)
439
+ createIncreaseButton(_instance.element);
440
+ else
441
+ createDecreaseButton(_instance.element);
442
+ }
443
+
444
+ _content = $lib.element(_instance.element, null, '', null, { "class": _classOption.CONTENT });
445
+
446
+ if (_instance.majorTickMarkStep)
447
+ $lib.addClass(_instance.element, _classOption.MAJOR);
448
+
449
+ if (_instance.minorTickMarkStep)
450
+ $lib.addClass(_instance.element, _classOption.MINOR);
451
+
452
+ createTicks(tickMarkValueSide === _tickMarkSideOption.BOTH || tickMarkValueSide === _tickMarkSideOption.BEFORE, '');
453
+
454
+ createTrack();
455
+ createRange();
456
+
457
+ if (range)
458
+ _draggableStartHandle = createDraggableHandle(_classOption.START_HANDLE, dragStartHandle);
459
+
460
+ _draggableHandle = createDraggableHandle(_classOption.HANDLE, dragHandle);
461
+
462
+ if (range && reversed)
463
+ switchHandles(true);
464
+
465
+ createTicks(tickMarkValueSide === _tickMarkSideOption.BOTH || tickMarkValueSide === _tickMarkSideOption.AFTER, ' after');
466
+
467
+ if (_instance.showButtons)
468
+ {
469
+ if (reversed)
470
+ createDecreaseButton(_instance.element);
471
+ else
472
+ createIncreaseButton(_instance.element);
473
+ }
474
+
475
+ if (_instance.showTooltips)
476
+ createTooltipManager();
477
+
478
+ if ($lib.isEmpty(_instance.value) && !$lib.isEmpty(_hidden.value) && !isNaN(_hidden.value))
479
+ _instance.value = parseFloat(_hidden.value);
480
+
481
+ bindEvents();
482
+ _instance.renderChildren();
483
+ }
484
+
485
+ function createTicks(withValues, cssAfter)
486
+ {
487
+ if (!_instance.tickMarks || _instance.tickMarkSide === _tickMarkSideOption.NONE)
488
+ return;
489
+
490
+ var ul = $lib.element(_content, null, 'ul', null, { "class": _classOption.TICKS + cssAfter }),
491
+ reversed = _instance.reversed,
492
+ ticks = _instance.tickMarks,
493
+ minorStep = _instance.minorTickMarkStep,
494
+ majorStep = _instance.majorTickMarkStep,
495
+ value = null, index = 0;
496
+
497
+ if ((cssAfter && _instance.tickMarkSide === _tickMarkSideOption.BEFORE) || (!cssAfter && _instance.tickMarkSide === _tickMarkSideOption.AFTER))
498
+ return;
499
+
500
+ if (reversed)
501
+ index = ticks;
502
+
503
+ for (index; (reversed) ? index >= 0 : index <= ticks; (reversed) ? --index : ++index)
504
+ {
505
+ if (withValues)
506
+ {
507
+ value = (reversed) ? _instance.maxValue - ((getValueDelta() / (ticks)) * (ticks - index)) : _instance.minValue + ((getValueDelta() / (ticks)) * index);
508
+ value = $.formatNumber(value, false, true, _instance.decimalPlaces, false, _instance.decimalSeparator);
509
+ }
510
+
511
+ createTickMark(ul, (withValues && index % _instance.tickMarkValueStep == 0) ? value : null, (minorStep && (index % minorStep == 0)), (majorStep && (index % majorStep == 0)));
512
+ }
513
+ }
514
+
515
+ function createTickMark(container, value, minorStep, majorStep)
516
+ {
517
+ var cssClass = '';
518
+
519
+ if (value != null)
520
+ value = ((_instance.tickMarkLabels) ? _instance.tickMarkLabels[value] || value : value).toString();
521
+
522
+ if (majorStep)
523
+ cssClass = ' ' + _classOption.MAJOR;
524
+ else if (minorStep)
525
+ cssClass = ' ' + _classOption.MINOR;
526
+
527
+ $lib.element(container, null, 'li', (value != null) ? $lib.element(null, null, 'b', value) : null, { "class": _classOption.TICK_MARK + cssClass });
528
+ }
529
+
530
+ function createTrack()
531
+ {
532
+ _track = $lib.element(_content, null, '', null, { "class": _classOption.TRACK });
533
+
534
+ if (_instance.trackSize)
535
+ {
536
+ _instance.element.classList.add(_classOption.FIXED_TRACK_SIZE);
537
+
538
+ if (_instance.vertical)
539
+ _content.style.height = $lib.unit(_instance.trackSize);
540
+ else
541
+ _content.style.width = $lib.unit(_instance.trackSize);
542
+ }
543
+ }
544
+
545
+ function createRange()
546
+ {
547
+ _range = $lib.element(_track, null, '', null, { "class": _classOption.RANGE });
548
+ }
549
+
550
+ function createDraggableHandle(cssClass, drag)
551
+ {
552
+ var handle = $lib.element(_content, null, 'span', null, { "class": cssClass, "tabindex": (_instance.disabled) ? '' : '0' }),
553
+ vertical = _instance.vertical, settings = {
554
+ boundaryZone: _track,
555
+ onDrag: function ()
556
+ {
557
+ if (!_instance.disabled)
558
+ $lib.defer(drag);
559
+ },
560
+ onDragEnd: function ()
561
+ {
562
+ handle.focus();
563
+ },
564
+ dragX: !_instance.disabled && !vertical,
565
+ dragY: !_instance.disabled && vertical,
566
+ ignoreBoundaryBorders: true
567
+ };
568
+
569
+ if ($lib.styleValue(handle, 'box-sizing', true) != 'border-box')
570
+ handle.style.boxSizing = 'border-box';
571
+
572
+ if (!_instance.disabled)
573
+ bindHandleEvents(handle);
574
+
575
+ return $lib.draggable(handle, settings);
576
+ }
577
+
578
+ function createDecreaseButton(container)
579
+ {
580
+ var direction = (_instance.vertical) ? ' up' : ' left';
581
+
582
+ if (_instance.reversed)
583
+ direction = (_instance.vertical) ? ' down' : ' right';
584
+
585
+ _decreaseButton = createButton(container, _instance.id + '_decrease', _classOption.DECREASE_BUTTON + direction);
586
+ _decreaseButton.events.onCommandClick.priorityAdd(function ()
587
+ {
588
+ if ($lib.event.type == 'keydown')
589
+ {
590
+ decrease();
591
+ stop();
592
+ }
593
+ });
594
+
595
+ _decreaseButton.events.onPointerDown.priorityAdd(function () { decrease(); });
596
+ _decreaseButton.events.onPointerUp.priorityAdd(stop);
597
+ }
598
+
599
+ function createIncreaseButton(container)
600
+ {
601
+ var direction = (_instance.vertical) ? ' down' : ' right';
602
+
603
+ if (_instance.reversed)
604
+ direction = (_instance.vertical) ? ' up' : ' left';
605
+
606
+ _increaseButton = createButton(container, _instance.id + '_increase', _classOption.INCREASE_BUTTON + direction);
607
+ _increaseButton.events.onCommandClick.priorityAdd(function ()
608
+ {
609
+ if ($lib.event.type == 'keydown')
610
+ {
611
+ increase();
612
+ stop();
613
+ }
614
+ });
615
+
616
+ _increaseButton.events.onPointerDown.priorityAdd(function () { increase(); });
617
+ _increaseButton.events.onPointerUp.priorityAdd(stop);
618
+ }
619
+
620
+ function createButton(container, id, cssClass)
621
+ {
622
+ var button = $UI.createComponent(componyx.UI.Button, { id: id, containerElement: container });
623
+
624
+ button.transparent = button.transparentBorder = button.hasIcon = true;
625
+ button.cssClassIcon = _classOption.EXPAND_ICON;
626
+ button.primary = false;
627
+ button.cssClass = cssClass;
628
+ button.clone($UI.store[_instance.buttonId], _instance);
629
+ button.disabled = _instance.disabled;
630
+ button.events.onPostRender.priorityAdd(function () { _instance.isReady.apply(_instance); }, null);
631
+ button.delegateFocusEvents(_instance);
632
+ button.showing = true;
633
+
634
+ return button;
635
+ }
636
+
637
+ function createTooltipManager()
638
+ {
639
+ var id = _instance.id + '_TooltipManager';
640
+
641
+ _tooltipManager = $UI.createComponent(componyx.UI.TooltipManager, { id: id, containerElement: _instance.element });
642
+ _tooltipManager.singleBoxInstance = false; // use separate box for range start and end tooltips
643
+ _tooltipManager.clone($UI.store[_instance.tooltipManagerId], _instance, true, true, { triggers: '' });
644
+
645
+ if (!_tooltipManager.boxId)
646
+ {
647
+ var box = $UI.createComponent(componyx.UI.Box, { id: id + '_Box', containerElement: _instance.element });
648
+ box.autoPosition = componyx.UI.Box.AutoPositionOption.EXPAND;
649
+
650
+ if (_instance.vertical)
651
+ {
652
+ box.alignY = componyx.UI.Box.AlignXOption.CENTER;
653
+ box.expandDirection = componyx.UI.Box.ExpandDirectionOption.LEFT;
654
+ }
655
+ else
656
+ {
657
+ box.alignX = componyx.UI.Box.AlignXOption.CENTER;
658
+ box.expandDirection = componyx.UI.Box.ExpandDirectionOption.UP;
659
+ }
660
+
661
+
662
+ box.autoInvertFit = true;
663
+ _tooltipManager.boxId = box.id;
664
+ }
665
+
666
+ _tooltipManager.showing = true;
667
+ _tooltipManager.events.onPostRender.priorityAdd(function () { _instance.isReady.apply(_instance); }, null);
668
+ }
669
+
670
+ function bindEvents()
671
+ {
672
+ if (_instance.showTooltips)
673
+ {
674
+ _instance.events.onFocus.priorityAdd(function ()
675
+ {
676
+ _tooltipManager.allowHide(false);
677
+ clearTimeout(_tooltipTimerId);
678
+
679
+ _tooltipTimerId = setTimeout(function ()
680
+ {
681
+ _tooltipManager.showTooltip(_draggableHandle.element);
682
+
683
+ if (_instance.range)
684
+ _tooltipManager.showTooltip(_draggableStartHandle.element);
685
+ }, 0);
686
+ });
687
+
688
+ _instance.events.onBlur.priorityAdd(function ()
689
+ {
690
+ clearTimeout(_tooltipTimerId);
691
+
692
+ _tooltipTimerId = setTimeout(function ()
693
+ {
694
+ if (_select)
695
+ return;
696
+
697
+ _tooltipManager.allowHide(true);
698
+ _tooltipManager.hideTooltip(_draggableHandle.element);
699
+
700
+ if (_instance.range)
701
+ _tooltipManager.hideTooltip(_draggableStartHandle.element);
702
+ }, 0);
703
+ });
704
+ }
705
+
706
+ _handlerId.push([window, 'resize', $lib.on(window, 'resize', function ()
707
+ {
708
+ var currentValue = _value;
709
+ _value = null; // force change
710
+ setValue(currentValue);
711
+
712
+ if (_draggableStartHandle)
713
+ {
714
+ currentValue = _startValue;
715
+ _startValue = null;
716
+ setStartValue(_startValue);
717
+ }
718
+ })]);
719
+
720
+ if (!_instance.disabled)
721
+ {
722
+ var eventType = 'mouseup';
723
+ $lib.on(document, eventType, cancelSelectState, false);
724
+ $lib.on(document, eventType, stop);
725
+ _handlerId.push([document, 'mouseup', $lib.on(document, 'mouseup', function ()
726
+ {
727
+ if (_select)
728
+ _select.focus();
729
+
730
+ _select = null;
731
+ })]);
732
+
733
+ $lib.on(_content, 'mousedown', function (e) { $lib.defer(select.bind(_instance, e)); });
734
+ }
735
+ }
736
+
737
+ function bindHandleEvents(handle)
738
+ {
739
+ $lib.on(handle, 'focus', _instance.onFocus, _instance, _instance);
740
+ $lib.on(handle, 'blur', _instance.onBlur, _instance, _instance);
741
+ $lib.on(handle, 'keydown', key);
742
+ $lib.on(handle, 'keyup', stop);
743
+ $lib.on(handle, 'mousedown', cancelSelectState, true);
744
+ $lib.on(handle, 'mousedown', animationState, false);
745
+ }
746
+
747
+ function showTooltip(el, value, templateId)
748
+ {
749
+ if (!_instance.showTooltips)
750
+ return;
751
+
752
+ var id = _instance.id + '_' + templateId,
753
+ div = $lib.element();
754
+
755
+ if (_instance.tickMarkLabels && _instance.tickMarkLabels[value])
756
+ value = _instance.tickMarkLabels[value];
757
+
758
+ _instance.applyTemplate(div, templateId, { value: value });
759
+ _tooltipManager.addTooltip(id, div.innerHTML); // add or update
760
+
761
+ if (!_tooltipManager.triggers.get(el))
762
+ _tooltipManager.addTrigger(el, id);
763
+
764
+ if (_instance.__focus || _select)
765
+ _tooltipManager.showTooltip(el);
766
+ }
767
+
768
+ function animationState(state)
769
+ {
770
+ if (!_instance.animation)
771
+ return;
772
+
773
+ _animation = state;
774
+
775
+ if (state)
776
+ $lib.addClass(_instance.element, _classOption.ANIMATION);
777
+ else
778
+ $lib.removeClass(_instance.element, _classOption.ANIMATION);
779
+ }
780
+
781
+ function cancelSelectState(state)
782
+ {
783
+ _cancelSelect = state;
784
+ }
785
+
786
+ function key(e)
787
+ {
788
+ var keyCode = e.key,
789
+ vertical = _instance.vertical,
790
+ reversed = _instance.reversed,
791
+ draggable = (this === _draggableHandle.element) ? _draggableHandle : _draggableStartHandle,
792
+ up = (keyCode == 'ArrowUp'), down = (keyCode == 'ArrowDown'),
793
+ left = (keyCode == 'ArrowLeft'), right = (keyCode == 'ArrowRight');
794
+
795
+ if (!(up || down || left || right))
796
+ return;
797
+
798
+ if ((!reversed && !vertical && (right || up)) ||
799
+ (!reversed && vertical && (right || down)) ||
800
+ (reversed && !vertical && (left || down)) ||
801
+ (reversed && vertical && (left || up)))
802
+ increase(draggable);
803
+ else
804
+ decrease(draggable);
805
+
806
+ if (up || down)
807
+ e.preventDefault(); // stop default page scroll
808
+ }
809
+
810
+ function select(e)
811
+ {
812
+ if (e.button > 0 || _cancelSelect)
813
+ return;
814
+
815
+ var vertical = _instance.vertical,
816
+ reversed = _instance.reversed,
817
+ maxChange = _instance.maxChange,
818
+ scroll = $lib.getScrollPosition(),
819
+ cursorPos = (vertical) ? $lib.clientY(e) + scroll.scrollTop : $lib.clientX(e) + scroll.scrollLeft,
820
+ contentPos = $lib.getPos(_content),
821
+ handlePos = getHandlePosition(_draggableHandle),
822
+ startHandlePos = (_draggableStartHandle) ? getHandlePosition(_draggableStartHandle) : null,
823
+ pos = cursorPos, diff, startDiff, value;
824
+
825
+ pos -= (vertical) ? contentPos.top : contentPos.left;
826
+ diff = Math.abs(pos - handlePos);
827
+
828
+ if (_draggableStartHandle)
829
+ startDiff = Math.abs(pos - startHandlePos);
830
+
831
+ value = positionToValue(pos);
832
+ animationState(true);
833
+ _dragging = false;
834
+ _event = e;
835
+
836
+ if (_draggableStartHandle && (startDiff < diff || (startDiff === diff && pos < startHandlePos && !reversed))) // start-handle is closer to clicked position or handles are at same position and click position was before handle
837
+ {
838
+ if (maxChange && Math.abs(_startValue - value) > maxChange)
839
+ value += (pos > startHandlePos && !reversed) ? maxChange : maxChange * -1; // move back or forwards
840
+
841
+ _select = _draggableStartHandle.element;
842
+ setStartValue(value);
843
+ }
844
+ else
845
+ {
846
+ if (maxChange && Math.abs(_value - value) > maxChange)
847
+ value += (pos > handlePos && !reversed) ? maxChange : maxChange * -1; // move back or forwards
848
+
849
+ _select = _draggableHandle.element;
850
+ setValue(value);
851
+ }
852
+ }
853
+
854
+ function dragStartHandle()
855
+ {
856
+ setDragHandle(_draggableStartHandle, setStartValue);
857
+ }
858
+
859
+ function dragHandle()
860
+ {
861
+ setDragHandle(_draggableHandle, setValue);
862
+ }
863
+
864
+ function setDragHandle(draggable, setValue)
865
+ {
866
+ let el = draggable.element,
867
+ elPos = $lib.getPos(el),
868
+ transform = el.style.transform,
869
+ left = el.style.left,
870
+ top = el.style.top;
871
+
872
+ el.style.transform = "";
873
+ el.style.left = el.style.top = '';
874
+ $.setPos(el, { left: elPos.left, top: elPos.top }); // force element at position
875
+ setValue(positionToValue(getHandlePosition(draggable)));
876
+ el.style.transform = transform;
877
+ el.style.left = left;
878
+ el.style.top = top;
879
+ }
880
+
881
+ function switchHandles(reverse)
882
+ {
883
+ var startHandle = _draggableStartHandle.element,
884
+ handle = _draggableHandle.element;
885
+
886
+ if (reverse)
887
+ _content.insertBefore(startHandle, handle);
888
+ else
889
+ _content.insertBefore(handle, startHandle);
890
+ }
891
+
892
+ function getHandlePosition(draggable)
893
+ {
894
+ var style = draggable.element.style,
895
+ pos = (_instance.vertical) ? style.top : style.left;
896
+
897
+ return Math.round(getNumericValue(pos));
898
+ }
899
+
900
+ function setStartValue(value)
901
+ {
902
+ value = validateValue(value);
903
+
904
+ if (_value != null && value > _value)
905
+ value = _value;
906
+
907
+ var pos = valueToPosition(value),
908
+ el = _draggableStartHandle.element,
909
+ nextEl = el.nextElementSibling,
910
+ change = (value != _startValue);
911
+
912
+ if (!change)
913
+ return;
914
+
915
+ _startValue = value;
916
+ setPosition(el, pos);
917
+
918
+ if (_value == _instance.maxValue && _startValue == _value && nextEl === _draggableHandle.element) // put start-handle above end-handle to allow backwards movement
919
+ {
920
+ switchHandles();
921
+ el.focus();
922
+ }
923
+ else if (_value == _instance.maxValue && _startValue != _value && nextEl !== _draggableHandle.element)
924
+ {
925
+ switchHandles(true);
926
+ el.focus();
927
+ }
928
+
929
+ if (_animation)
930
+ {
931
+ $lib.on(_range, 'transitionend animationend', valueChanged, [true, el, value, _select, _event]);
932
+ showTooltip(el, value, 'StartValue');
933
+ setRangeStart(pos);
934
+ }
935
+ else
936
+ {
937
+ setRangeStart(pos);
938
+ valueChanged(true, el, value, _select, _event);
939
+ }
940
+ }
941
+
942
+ function setValue(value)
943
+ {
944
+ value = validateValue(value);
945
+
946
+ if (_startValue != null && value < _startValue)
947
+ value = _startValue;
948
+
949
+ var pos = valueToPosition(value),
950
+ el = _draggableHandle.element;
951
+ el.nextElementSibling;
952
+ var change = (value != _value);
953
+
954
+ if (!change)
955
+ return;
956
+
957
+ _value = value;
958
+ setPosition(el, pos);
959
+
960
+ if (_animation)
961
+ {
962
+ $lib.on(_range, 'transitionend animationend', valueChanged, [false, el, value, _select, _event]);
963
+ showTooltip(el, value, 'Value');
964
+ setRange(pos);
965
+ }
966
+ else
967
+ {
968
+ setRange(pos);
969
+ valueChanged(false, el, value, _select, _event);
970
+ }
971
+ }
972
+
973
+ function valueChanged(start, el, value, select, event)
974
+ {
975
+ $lib.off(_range, 'transitionend animationend', valueChanged);
976
+ selectTickMark(value, start);
977
+ showTooltip(el, value, (start) ? 'StartValue' : 'Value');
978
+ animationState(false);
979
+
980
+ if (start)
981
+ updateHandleSettings();
982
+ else
983
+ updateStartHandleSettings();
984
+
985
+ if (start)
986
+ _hiddenStart.__setValue(value);
987
+ else
988
+ _hidden.__setValue(value);
989
+
990
+ if (_instance.range)
991
+ {
992
+ let startValue = _hiddenStart.value,
993
+ endValue = _hidden.value,
994
+ rangeValue = `${startValue || ''},${endValue || ''}`;
995
+
996
+ _hiddenRange.__setValue(rangeValue);
997
+ }
998
+
999
+ _instance.events.onChange.fire(_instance, { isStart: start, value: value });
1000
+
1001
+ if (select && select === _select && !_dragging)
1002
+ {
1003
+ _dragging = true;
1004
+
1005
+ if (start)
1006
+ _draggableStartHandle.startDrag(event);
1007
+ else
1008
+ _draggableHandle.startDrag(event);
1009
+ }
1010
+ }
1011
+
1012
+ function setPosition(handle, pos)
1013
+ {
1014
+ pos = $lib.unit(pos);
1015
+
1016
+ if (_instance.vertical && handle.style.top != pos)
1017
+ handle.style.top = pos;
1018
+ else if (!_instance.vertical && handle.style.left != pos)
1019
+ handle.style.left = $lib.unit(pos);
1020
+ }
1021
+
1022
+ function setRangeStart(pos)
1023
+ {
1024
+ var vertical = _instance.vertical,
1025
+ reversed = _instance.reversed,
1026
+ trackSize = (_instance.vertical) ? _track.offsetHeight : _track.offsetWidth,
1027
+ sizeProp = (vertical) ? 'height' : 'width',
1028
+ marginProp = (vertical) ? 'marginTop' : 'marginLeft',
1029
+ size = getNumericValue(_range.style[sizeProp]),
1030
+ margin;
1031
+
1032
+ if (reversed)
1033
+ {
1034
+ marginProp = (vertical) ? 'marginBottom' : 'marginRight';
1035
+ pos = trackSize - pos;
1036
+ }
1037
+
1038
+ margin = getNumericValue(_range.style[marginProp]);
1039
+ _range.style[marginProp] = $lib.unit(pos);
1040
+
1041
+ if (pos == margin)
1042
+ return;
1043
+
1044
+ if (pos > margin)
1045
+ _range.style[sizeProp] = $lib.unit(size - (pos - margin));
1046
+ else
1047
+ _range.style[sizeProp] = $lib.unit(size + (margin - pos));
1048
+ }
1049
+
1050
+ function setRange(pos)
1051
+ {
1052
+ var vertical = _instance.vertical,
1053
+ reversed = _instance.reversed,
1054
+ trackSize = (_instance.vertical) ? _track.offsetHeight : _track.offsetWidth,
1055
+ marginProp = (vertical) ? 'marginTop' : 'marginLeft',
1056
+ margin;
1057
+
1058
+ if (reversed)
1059
+ marginProp = (vertical) ? 'marginBottom' : 'marginRight';
1060
+
1061
+ if (_instance.reversed)
1062
+ pos = trackSize - pos;
1063
+
1064
+ margin = getNumericValue(_range.style[marginProp]);
1065
+ pos = pos - margin;
1066
+ pos = $lib.unit((pos < 0) ? 0 : pos);
1067
+
1068
+ if (_instance.vertical)
1069
+ _range.style.height = pos;
1070
+ else
1071
+ _range.style.width = pos;
1072
+ }
1073
+
1074
+ function selectTickMark(value, start)
1075
+ {
1076
+ if (!_instance.tickMarks || _instance.tickMarkSide === _tickMarkSideOption.NONE)
1077
+ return;
1078
+
1079
+ var cssClass = (start) ? _classOption.SELECTED_START : _classOption.SELECTED;
1080
+ _instance.tickMarkSide;
1081
+ var ticks = _instance.tickMarks,
1082
+ tickStep = getValueDelta() / ticks,
1083
+ step = value / tickStep;
1084
+
1085
+ if (_selectedTicks)
1086
+ {
1087
+ var index = _selectedTicks.length, li;
1088
+
1089
+ while (--index >= 0)
1090
+ {
1091
+ li = _selectedTicks[index];
1092
+
1093
+ if ($lib.hasClass(li, cssClass))
1094
+ $lib.removeClass(li, cssClass);
1095
+
1096
+ if (!$lib.hasClass(li, _classOption.SELECTED_START) && !$lib.hasClass(li, _classOption.SELECTED))
1097
+ _selectedTicks.splice(index, 0); // remove from selected
1098
+ }
1099
+ }
1100
+
1101
+ if (value % tickStep > 0) // value not on tickmark
1102
+ step = Math.floor(value / tickStep); // select ticks before current position
1103
+
1104
+ var uls = $lib(null, _content, 'ul');
1105
+
1106
+ $lib.each(uls, function (ul)
1107
+ {
1108
+ if (ul.childNodes.length > 0)
1109
+ {
1110
+ var li = (_instance.reversed) ? ul.childNodes[(ul.childNodes.length - 1) - step] : ul.childNodes[step];
1111
+ $lib.addClass(li, cssClass);
1112
+
1113
+ if ($lib.indexOf(_selectedTicks, li) == -1)
1114
+ _selectedTicks.push(li);
1115
+ }
1116
+ });
1117
+ }
1118
+
1119
+ function getNumericValue(text)
1120
+ {
1121
+ return parseFloat(text.replace(/[^0-9\.\-]/g, '')) || 0;
1122
+ }
1123
+
1124
+ function decrease(draggable, hold)
1125
+ {
1126
+ if (!draggable)
1127
+ draggable = (_instance.range) ? _draggableStartHandle : _draggableHandle;
1128
+
1129
+ change(draggable);
1130
+ _holdTimerId = setTimeout(decrease.bind(this, draggable, true), (hold) ? 40 : 500);
1131
+ }
1132
+
1133
+ function increase(draggable, hold)
1134
+ {
1135
+ draggable = draggable || _draggableHandle;
1136
+
1137
+ change(draggable, true);
1138
+ _holdTimerId = setTimeout(increase.bind(this, draggable, true), (hold) ? 40 : 500);
1139
+ }
1140
+
1141
+ function change(draggable, increase)
1142
+ {
1143
+ var pos = getHandlePosition(draggable),
1144
+ value = positionToValue(pos),
1145
+ minChange = _instance.minChange;
1146
+
1147
+ stop();
1148
+
1149
+ if (increase)
1150
+ value += minChange;
1151
+ else
1152
+ value -= minChange;
1153
+
1154
+ if (draggable === _draggableStartHandle)
1155
+ setStartValue(value);
1156
+ else
1157
+ setValue(value);
1158
+ }
1159
+
1160
+ function stop()
1161
+ {
1162
+ clearTimeout(_holdTimerId);
1163
+ }
1164
+
1165
+ function positionToValue(pos)
1166
+ {
1167
+ var reversed = _instance.reversed,
1168
+ trackSize = (_instance.vertical) ? _track.offsetHeight : _track.offsetWidth,
1169
+ value = (_instance.minValue + (getValueDelta() * (pos / trackSize))),
1170
+ minChange = _instance.minChange;
1171
+
1172
+ if (reversed)
1173
+ value = (_instance.maxValue - (getValueDelta() * (pos / trackSize)));
1174
+
1175
+ if (value % minChange > 0)
1176
+ value = Math.round(value / minChange) * minChange; // fix value if it is not a multiplication of the minimum change value
1177
+
1178
+ return validateValue(value);
1179
+ }
1180
+
1181
+ function validateValue(value)
1182
+ {
1183
+ if (value == null)
1184
+ return value;
1185
+
1186
+ if (value < _instance.minValue)
1187
+ return _instance.minValue
1188
+ else if (value > _instance.maxValue)
1189
+ return _instance.maxValue
1190
+ else
1191
+ return value;
1192
+ }
1193
+
1194
+ function valueToPosition(value)
1195
+ {
1196
+ var reversed = _instance.reversed,
1197
+ trackSize = (_instance.vertical) ? _track.offsetHeight : _track.offsetWidth,
1198
+ minValue = _instance.minValue;
1199
+
1200
+ if (reversed)
1201
+ return trackSize - (((value - minValue) / getValueDelta()) * trackSize);
1202
+ else
1203
+ return ((value - minValue) / getValueDelta()) * trackSize;
1204
+ }
1205
+
1206
+ function getValueDelta()
1207
+ {
1208
+ return _instance.maxValue - _instance.minValue;
1209
+ }
1210
+
1211
+ function updateHandleSettings()
1212
+ {
1213
+ var settings = _draggableHandle.settings,
1214
+ reversed = _instance.reversed,
1215
+ trackSize = (_instance.vertical) ? _track.offsetHeight : _track.offsetWidth,
1216
+ tickValue = (_instance.minChange / getValueDelta()) * trackSize,
1217
+ overshoot = getOvershoot(_draggableHandle.element),
1218
+ prop = 'boundaryOvershoot';
1219
+
1220
+ if (tickValue > 1)
1221
+ settings.tickY = settings.tickX = tickValue;
1222
+
1223
+ settings[prop + 'Top'] = settings[prop + 'Bottom'] = settings[prop + 'Left'] = settings[prop + 'Right'] = overshoot;
1224
+
1225
+ if (_instance.range && _startValue != null) // limit end-handle position at the start-handle position
1226
+ {
1227
+ var pos = valueToPosition(_startValue);
1228
+
1229
+ if (reversed)
1230
+ settings[prop + 'Bottom'] = settings[prop + 'Right'] = ((trackSize - pos) - overshoot) * -1;
1231
+ else
1232
+ settings[prop + 'Top'] = settings[prop + 'Left'] = (pos - overshoot) * -1;
1233
+ }
1234
+ }
1235
+
1236
+ function updateStartHandleSettings()
1237
+ {
1238
+ if (!_instance.range)
1239
+ return;
1240
+
1241
+ var settings = _draggableStartHandle.settings,
1242
+ reversed = _instance.reversed,
1243
+ trackSize = (_instance.vertical) ? _track.offsetHeight : _track.offsetWidth,
1244
+ tickValue = (_instance.minChange / getValueDelta()) * trackSize,
1245
+ prop = 'boundaryOvershoot',
1246
+ overshoot = getOvershoot(_draggableStartHandle.element),
1247
+ pos = valueToPosition(_value);
1248
+
1249
+ if (tickValue > 1)
1250
+ settings.tickY = settings.tickX = tickValue;
1251
+
1252
+ settings[prop + 'Top'] = settings[prop + 'Bottom'] = settings[prop + 'Left'] = settings[prop + 'Right'] = overshoot;
1253
+
1254
+ // limit start-handle position at the end-handle position
1255
+ if (reversed)
1256
+ settings[prop + 'Top'] = settings[prop + 'Left'] = (pos - overshoot) * -1;
1257
+ else
1258
+ settings[prop + 'Bottom'] = settings[prop + 'Right'] = ((trackSize - pos) - overshoot) * -1;
1259
+ }
1260
+
1261
+ function getOvershoot(handle)
1262
+ {
1263
+ return (_instance.vertical) ? Math.round(handle.offsetHeight / 2) : Math.round(handle.offsetWidth / 2);
1264
+ }
1265
+
1266
+ function dispose()
1267
+ {
1268
+ $lib.each(_handlerId, function (item)
1269
+ {
1270
+ $lib.off(item[0], item[1], item[2]);
1271
+ });
1272
+
1273
+ $lib.off(document, 'mouseup', cancelSelectState);
1274
+ $lib.off(document, 'mouseup', stop);
1275
+
1276
+ _startValue = _value = _select = null;
1277
+ _handlerId = [];
1278
+ _selectedTicks = [];
1279
+ _draggableHandle = _draggableStartHandle = null;
1280
+ }
1281
+ };
1282
+
1283
+ /**
1284
+ * @see {@link componyx.UI.base.methods}
1285
+ */
1286
+ componyx.UI.Slider.prototype = Object.create($base.methods);
1287
+ componyx.UI.Slider.prototype.constructor = componyx.UI.Slider;
1288
+
1289
+
1290
+ /**
1291
+ * TickMarkSideOption
1292
+ * @readonly
1293
+ * @enum {number}
1294
+ */
1295
+ componyx.UI.Slider.TickMarkSideOption =
1296
+ {
1297
+ NONE: 0,
1298
+ BEFORE: 1,
1299
+ AFTER: 2,
1300
+ BOTH: 3
1301
+ };
1302
+ })(window);
1303
+
1304
+ const Slider = componyx.UI.Slider;
1305
+
1306
+ export { Slider };