html5forms-rails 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +5 -0
- data/Gemfile +11 -0
- data/README.md +208 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/demos/html5-form-demo.html +79 -0
- data/html5forms-rails.gemspec +142 -0
- data/lib/html5forms.rb +6 -0
- data/vendor/assets/images/colorpicker/blank.gif +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_background.png +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_hex.png +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_hsb_b.png +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_hsb_h.png +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_hsb_s.png +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_indic.gif +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_overlay.png +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_rgb_b.png +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_rgb_g.png +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_rgb_r.png +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_select.gif +0 -0
- data/vendor/assets/images/colorpicker/colorpicker_submit.png +0 -0
- data/vendor/assets/images/colorpicker/custom_background.png +0 -0
- data/vendor/assets/images/colorpicker/custom_hex.png +0 -0
- data/vendor/assets/images/colorpicker/custom_hsb_b.png +0 -0
- data/vendor/assets/images/colorpicker/custom_hsb_h.png +0 -0
- data/vendor/assets/images/colorpicker/custom_hsb_s.png +0 -0
- data/vendor/assets/images/colorpicker/custom_indic.gif +0 -0
- data/vendor/assets/images/colorpicker/custom_rgb_b.png +0 -0
- data/vendor/assets/images/colorpicker/custom_rgb_g.png +0 -0
- data/vendor/assets/images/colorpicker/custom_rgb_r.png +0 -0
- data/vendor/assets/images/colorpicker/custom_submit.png +0 -0
- data/vendor/assets/images/colorpicker/select.png +0 -0
- data/vendor/assets/images/colorpicker/select2.png +0 -0
- data/vendor/assets/images/colorpicker/slider.png +0 -0
- data/vendor/assets/images/h5f/form_validation.png +0 -0
- data/vendor/assets/images/html5form-shim/asterisk.png +0 -0
- data/vendor/assets/images/html5form-shim/down.png +0 -0
- data/vendor/assets/images/html5form-shim/fail.png +0 -0
- data/vendor/assets/images/html5form-shim/ok.png +0 -0
- data/vendor/assets/images/html5forms/jscolor/arrow.gif +0 -0
- data/vendor/assets/images/html5forms/jscolor/cross.gif +0 -0
- data/vendor/assets/images/html5forms/jscolor/hs.png +0 -0
- data/vendor/assets/images/html5forms/jscolor/hv.png +0 -0
- data/vendor/assets/images/html5forms/slider/slider-1.png +0 -0
- data/vendor/assets/images/html5forms/slider/slider-disabled-1.png +0 -0
- data/vendor/assets/images/html5forms/slider/slider-disabled.png +0 -0
- data/vendor/assets/images/html5forms/slider/slider.png +0 -0
- data/vendor/assets/javascripts/colorpicker.js +484 -0
- data/vendor/assets/javascripts/colorpicker.min.js +9 -0
- data/vendor/assets/javascripts/h5f.js +328 -0
- data/vendor/assets/javascripts/h5f.min.js +4 -0
- data/vendor/assets/javascripts/html5forms/EventHelpers.min.js +15 -0
- data/vendor/assets/javascripts/html5forms/autocomplete.min.js +1 -0
- data/vendor/assets/javascripts/html5forms/cssQuery-p.min.js +6 -0
- data/vendor/assets/javascripts/html5forms/dev/EventHelpers.js +486 -0
- data/vendor/assets/javascripts/html5forms/dev/autocomplete.js +387 -0
- data/vendor/assets/javascripts/html5forms/dev/cssQuery-p.js +6 -0
- data/vendor/assets/javascripts/html5forms/dev/html5.js +121 -0
- data/vendor/assets/javascripts/html5forms/dev/html5Forms.js +892 -0
- data/vendor/assets/javascripts/html5forms/dev/html5Widgets.js +1417 -0
- data/vendor/assets/javascripts/html5forms/dev/jscolor.js +840 -0
- data/vendor/assets/javascripts/html5forms/dev/slider.js +797 -0
- data/vendor/assets/javascripts/html5forms/dev/timer.js +137 -0
- data/vendor/assets/javascripts/html5forms/dev/visibleIf.js +1100 -0
- data/vendor/assets/javascripts/html5forms/html5.min.js +2 -0
- data/vendor/assets/javascripts/html5forms/html5Forms.min.js +1 -0
- data/vendor/assets/javascripts/html5forms/html5Widgets.min.js +20 -0
- data/vendor/assets/javascripts/html5forms/jscolor.min.js +10 -0
- data/vendor/assets/javascripts/html5forms/slider.min.js +25 -0
- data/vendor/assets/javascripts/html5forms/timer.min.js +1 -0
- data/vendor/assets/javascripts/html5forms/visibleIf.min.js +19 -0
- data/vendor/assets/javascripts/html5forms.fallback.js +115 -0
- data/vendor/assets/javascripts/html5forms.fallback.min.js +11 -0
- data/vendor/assets/javascripts/jquery.html5form-shim.js +402 -0
- data/vendor/assets/javascripts/jquery.html5form.min.js +4 -0
- data/vendor/assets/javascripts/jquery.placehold.min.js +7 -0
- data/vendor/assets/javascripts/ui.spinner.js +649 -0
- data/vendor/assets/javascripts/ui.spinner.min.js +7 -0
- data/vendor/assets/javascripts/webforms2/webforms2-msie.js +1 -0
- data/vendor/assets/javascripts/webforms2/webforms2-p.js +14 -0
- data/vendor/assets/javascripts/webforms2/webforms2.js +14 -0
- data/vendor/assets/javascripts/webforms2/webforms2_src.js +3195 -0
- data/vendor/assets/stylesheets/colorpicker.css +161 -0
- data/vendor/assets/stylesheets/h5f.css +86 -0
- data/vendor/assets/stylesheets/html5form-shim.css +109 -0
- data/vendor/assets/stylesheets/html5forms/number.css +35 -0
- data/vendor/assets/stylesheets/html5forms/slider.css +169 -0
- data/vendor/assets/stylesheets/html5forms/slider_ie.css +41 -0
- data/vendor/assets/stylesheets/html5forms/visibleIf.css +23 -0
- data/vendor/assets/stylesheets/html5forms.layout.css +116 -0
- data/vendor/assets/stylesheets/ui.spinner.css +3 -0
- data/vendor/assets/stylesheets/webforms2.css +42 -0
- metadata +221 -0
@@ -0,0 +1,797 @@
|
|
1
|
+
/*
|
2
|
+
Unobtrusive Slider Control by frequency decoder v2.6 (http://www.frequency-decoder.com/)
|
3
|
+
|
4
|
+
Released under a creative commons Attribution-Share Alike 3.0 Unported license (http://creativecommons.org/licenses/by-sa/3.0/)
|
5
|
+
|
6
|
+
You are free:
|
7
|
+
|
8
|
+
* to copy, distribute, display, and perform the work
|
9
|
+
* to make derivative works
|
10
|
+
* to make commercial use of the work
|
11
|
+
|
12
|
+
Under the following conditions:
|
13
|
+
|
14
|
+
by Attribution.
|
15
|
+
--------------
|
16
|
+
You must attribute the work in the manner specified by the author or licensor.
|
17
|
+
|
18
|
+
sa
|
19
|
+
--
|
20
|
+
Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one.
|
21
|
+
|
22
|
+
* For any reuse or distribution, you must make clear to others the license terms of this work.
|
23
|
+
* Any of these conditions can be waived if you get permission from the copyright holder.
|
24
|
+
*/
|
25
|
+
|
26
|
+
var fdSliderController = (function() {
|
27
|
+
var sliders = {},
|
28
|
+
uniqueid = 0,
|
29
|
+
mouseWheelEnabled = true;
|
30
|
+
|
31
|
+
var removeMouseWheelSupport = function() {
|
32
|
+
mouseWheelEnabled = false;
|
33
|
+
};
|
34
|
+
var addEvent = function(obj, type, fn) {
|
35
|
+
if( obj.attachEvent ) {
|
36
|
+
obj["e"+type+fn] = fn;
|
37
|
+
obj[type+fn] = function(){obj["e"+type+fn]( window.event );};
|
38
|
+
obj.attachEvent( "on"+type, obj[type+fn] );
|
39
|
+
} else { obj.addEventListener( type, fn, true ); }
|
40
|
+
};
|
41
|
+
var removeEvent = function(obj, type, fn) {
|
42
|
+
if( obj.detachEvent ) {
|
43
|
+
try {
|
44
|
+
obj.detachEvent( "on"+type, obj[type+fn] );
|
45
|
+
obj[type+fn] = null;
|
46
|
+
} catch(err) { };
|
47
|
+
} else { obj.removeEventListener( type, fn, true ); }
|
48
|
+
};
|
49
|
+
var stopEvent = function(e) {
|
50
|
+
if(e == null) e = document.parentWindow.event;
|
51
|
+
if(e.stopPropagation) {
|
52
|
+
e.stopPropagation();
|
53
|
+
e.preventDefault();
|
54
|
+
};
|
55
|
+
|
56
|
+
/*@cc_on@*/
|
57
|
+
/*@if(@_win32)
|
58
|
+
e.cancelBubble = true;
|
59
|
+
e.returnValue = false;
|
60
|
+
/*@end@*/
|
61
|
+
|
62
|
+
return false;
|
63
|
+
};
|
64
|
+
var joinNodeLists = function() {
|
65
|
+
if(!arguments.length) { return []; };
|
66
|
+
var nodeList = [];
|
67
|
+
for (var i = 0; i < arguments.length; i++) {
|
68
|
+
for (var j = 0, item; item = arguments[i][j]; j++) { nodeList[nodeList.length] = item; };
|
69
|
+
};
|
70
|
+
return nodeList;
|
71
|
+
};
|
72
|
+
|
73
|
+
// Function by Artem B. with a minor change by f.d.
|
74
|
+
var parseCallbacks = function(cbs) {
|
75
|
+
if(cbs == null) { return {}; };
|
76
|
+
var func,
|
77
|
+
type,
|
78
|
+
cbObj = {},
|
79
|
+
parts,
|
80
|
+
obj;
|
81
|
+
for(var i = 0, fn; fn = cbs[i]; i++) {
|
82
|
+
type = fn.match(/(fd_slider_cb_(update|create|destroy|redraw|move|focus|blur|enable|disable)_)([^\s|$]+)/i)[1];
|
83
|
+
fn = fn.replace(new RegExp("^"+type), "").replace(/-/g, ".");
|
84
|
+
type = type.replace(/^fd_slider_cb_/i, "").replace(/_$/, "");
|
85
|
+
|
86
|
+
try {
|
87
|
+
if(fn.indexOf(".") != -1) {
|
88
|
+
parts = fn.split('.');
|
89
|
+
obj = window;
|
90
|
+
for (var x = 0, part; part = obj[parts[x]]; x++) {
|
91
|
+
if(part instanceof Function) {
|
92
|
+
(function() {
|
93
|
+
var method = part;
|
94
|
+
func = function (data) { method.apply(obj, [data]) };
|
95
|
+
})();
|
96
|
+
} else {
|
97
|
+
obj = part;
|
98
|
+
};
|
99
|
+
};
|
100
|
+
} else {
|
101
|
+
func = window[fn];
|
102
|
+
};
|
103
|
+
|
104
|
+
if(!(func instanceof Function)) continue;
|
105
|
+
if(!(type in cbObj)) { cbObj[type] = []; };
|
106
|
+
cbObj[type][cbObj[type].length] = func;
|
107
|
+
} catch (err) {};
|
108
|
+
};
|
109
|
+
return cbObj;
|
110
|
+
};
|
111
|
+
|
112
|
+
var parseClassNames = function(cbs) {
|
113
|
+
if(cbs == null) { return ""; };
|
114
|
+
var cns = [];
|
115
|
+
for(var i = 0, cn; cn = cbs[i]; i++) {
|
116
|
+
cns[cns.length] = cn.replace(/^fd_slider_cn_/, "");
|
117
|
+
};
|
118
|
+
return cns.join(" ");
|
119
|
+
};
|
120
|
+
var createSlider = function(options) {
|
121
|
+
if(!options || !options.inp || !options.inp.id) { return false; };
|
122
|
+
destroySingleSlider(options.inp.id);
|
123
|
+
sliders[options.inp.id] = new fdSlider(options);
|
124
|
+
return true;
|
125
|
+
};
|
126
|
+
var init = function( elem ) {
|
127
|
+
var ranges = /fd_range_([-]{0,1}[0-9]+(d[0-9]+){0,1}){1}_([-]{0,1}[0-9]+(d[0-9]+){0,1}){1}/i,
|
128
|
+
increment = /fd_inc_([-]{0,1}[0-9]+(d[0-9]+){0,1}){1}/,
|
129
|
+
kIncrement = /fd_maxinc_([-]{0,1}[0-9]+(d[0-9]+){0,1}){1}/,
|
130
|
+
callbacks = /((fd_slider_cb_(update|create|destroy|redraw|move|focus|blur|enable|disable)_)([^\s|$]+))/ig,
|
131
|
+
classnames = /(fd_slider_cn_([a-zA-Z0-9_\-]+))/ig,
|
132
|
+
inputs = elem && elem.tagName && elem.tagName.search(/input|select/i) != -1 ? [elem] : joinNodeLists(document.getElementsByTagName('input'), document.getElementsByTagName('select')),
|
133
|
+
range,
|
134
|
+
tmp,
|
135
|
+
options;
|
136
|
+
|
137
|
+
for(var i = 0, inp; inp = inputs[i]; i++) {
|
138
|
+
if((inp.tagName.toLowerCase() == "input" && inp.type == "text" && (inp.className.search(ranges) != -1 || inp.className.search(/fd_slider/) != -1)) || (inp.tagName.toLowerCase() == "select" && inp.className.search(/fd_slider/) != -1)) {
|
139
|
+
// If we haven't been passed a specific id and the slider exists then continue
|
140
|
+
if(!elem && inp.id && document.getElementById("fd-slider-"+inp.id)) { continue; };
|
141
|
+
|
142
|
+
// Create an id if necessary
|
143
|
+
if(!inp.id) { inp.id == "sldr" + uniqueid++; };
|
144
|
+
|
145
|
+
options = {
|
146
|
+
inp: inp,
|
147
|
+
inc: inp.className.search(increment) != -1 ? inp.className.match(increment)[0].replace("fd_inc_", "").replace("d",".") : "1",
|
148
|
+
maxInc: inp.className.search(kIncrement) != -1 ? inp.className.match(kIncrement)[0].replace("fd_maxinc_", "").replace("d",".") : false,
|
149
|
+
range: [0,100],
|
150
|
+
callbacks: parseCallbacks(inp.className.match(callbacks)),
|
151
|
+
classNames: parseClassNames(inp.className.match(classnames)),
|
152
|
+
tween: inp.className.search(/fd_tween/i) != -1,
|
153
|
+
vertical: inp.className.search(/fd_vertical/i) != -1,
|
154
|
+
hideInput: inp.className.search(/fd_hide_input/i) != -1,
|
155
|
+
clickJump: inp.className.search(/fd_jump/i) != -1,
|
156
|
+
fullARIA: inp.className.search(/fd_full_aria/i) != -1,
|
157
|
+
noMouseWheel: inp.className.search(/fd_disable_mousewheel/i) != -1
|
158
|
+
};
|
159
|
+
|
160
|
+
if(inp.tagName.toLowerCase() == "select") {
|
161
|
+
options.range = [0, inp.options.length - 1];
|
162
|
+
} else if(inp.className.search(ranges) != -1) {
|
163
|
+
range = inp.className.match(ranges)[0].replace("fd_range_", "").replace(/d/g,".").split("_");
|
164
|
+
options.range = [range[0], range[1]];
|
165
|
+
};
|
166
|
+
|
167
|
+
createSlider(options);
|
168
|
+
};
|
169
|
+
};
|
170
|
+
|
171
|
+
return true;
|
172
|
+
};
|
173
|
+
var destroySingleSlider = function(id) {
|
174
|
+
if(id in sliders) {
|
175
|
+
sliders[id].destroy();
|
176
|
+
delete sliders[id];
|
177
|
+
return true;
|
178
|
+
};
|
179
|
+
return false;
|
180
|
+
};
|
181
|
+
var destroyAllsliders = function(e) {
|
182
|
+
for(slider in sliders) { sliders[slider].destroy(); };
|
183
|
+
};
|
184
|
+
var unload = function(e) {
|
185
|
+
destroyAllsliders();
|
186
|
+
sliders = null;
|
187
|
+
removeEvent(window, "unload", unload);
|
188
|
+
removeEvent(window, "resize", resize);
|
189
|
+
removeOnloadEvent();
|
190
|
+
};
|
191
|
+
var resize = function(e) {
|
192
|
+
for(slider in sliders) { sliders[slider].onResize(); };
|
193
|
+
};
|
194
|
+
var removeOnloadEvent = function() {
|
195
|
+
removeEvent(window, "load", init);
|
196
|
+
/*@cc_on@*/
|
197
|
+
/*@if(@_win32)
|
198
|
+
removeEvent(window, "load", function() { setTimeout(onload, 200) });
|
199
|
+
/*@end@*/
|
200
|
+
};
|
201
|
+
function fdSlider(options) {
|
202
|
+
|
203
|
+
var inp = options.inp,
|
204
|
+
disabled = false,
|
205
|
+
tagName = inp.tagName.toLowerCase(),
|
206
|
+
min = +options.range[0],
|
207
|
+
max = +options.range[1],
|
208
|
+
range = Math.abs(max - min),
|
209
|
+
inc = tagName == "select" ? 1 : +options.inc||1,
|
210
|
+
maxInc = options.maxInc && options.maxInc != 'undefined' ? options.maxInc : inc * 2;
|
211
|
+
// alert(options.maxInc + "," + maxInc)
|
212
|
+
|
213
|
+
var precision = options.inc.search(".") != -1 ? options.inc.substr(options.inc.indexOf(".")+1, options.inc.length - 1).length : 0,
|
214
|
+
steps = Math.ceil(range / inc),
|
215
|
+
useTween = !!options.tween,
|
216
|
+
fullARIA = !!options.fullARIA,
|
217
|
+
hideInput = !!options.hideInput,
|
218
|
+
clickJump = useTween ? false : !!options.clickJump,
|
219
|
+
vertical = !!options.vertical,
|
220
|
+
callbacks = options.callbacks,
|
221
|
+
classNames = options.classNames,
|
222
|
+
noMWheel = !!options.noMouseWheel,
|
223
|
+
timer = null,
|
224
|
+
kbEnabled = true,
|
225
|
+
sliderH = 0,
|
226
|
+
sliderW = 0,
|
227
|
+
tweenX = 0,
|
228
|
+
tweenB = 0,
|
229
|
+
tweenC = 0,
|
230
|
+
tweenD = 0,
|
231
|
+
frame = 0,
|
232
|
+
x = 0,
|
233
|
+
y = 0,
|
234
|
+
maxPx = 0,
|
235
|
+
handlePos = 0,
|
236
|
+
destPos = 0,
|
237
|
+
mousePos = 0,
|
238
|
+
deltaPx = 0,
|
239
|
+
stepPx = 0,
|
240
|
+
self = this,
|
241
|
+
changeList = {},
|
242
|
+
initVal = null,
|
243
|
+
outerWrapper,
|
244
|
+
wrapper,
|
245
|
+
handle,
|
246
|
+
bar;
|
247
|
+
|
248
|
+
if(max < min) {
|
249
|
+
inc = -inc;
|
250
|
+
maxInc = -maxInc;
|
251
|
+
};
|
252
|
+
|
253
|
+
function disableSlider(noCallback) {
|
254
|
+
if(disabled && !noCallback) { return; };
|
255
|
+
|
256
|
+
try {
|
257
|
+
removeEvent(outerWrapper, "mouseover", onMouseOver);
|
258
|
+
removeEvent(outerWrapper, "mouseout", onMouseOut);
|
259
|
+
removeEvent(outerWrapper, "mousedown", onMouseDown);
|
260
|
+
removeEvent(handle, "focus", onFocus);
|
261
|
+
removeEvent(handle, "blur", onBlur);
|
262
|
+
if(!window.opera) {
|
263
|
+
removeEvent(handle, "keydown", onKeyDown);
|
264
|
+
removeEvent(handle, "keypress", onKeyPress);
|
265
|
+
} else {
|
266
|
+
removeEvent(handle, "keypress", onKeyDown);
|
267
|
+
};
|
268
|
+
removeEvent(handle, "mousedown", onHandleMouseDown);
|
269
|
+
removeEvent(handle, "mouseup", onHandleMouseUp);
|
270
|
+
|
271
|
+
if(mouseWheelEnabled && !noMWheel) {
|
272
|
+
if (window.addEventListener && !window.devicePixelRatio) window.removeEventListener('DOMMouseScroll', trackMouseWheel, false);
|
273
|
+
else {
|
274
|
+
removeEvent(document, "mousewheel", trackMouseWheel);
|
275
|
+
removeEvent(window, "mousewheel", trackMouseWheel);
|
276
|
+
};
|
277
|
+
};
|
278
|
+
} catch(err) {};
|
279
|
+
|
280
|
+
clearTimeout(timer);
|
281
|
+
outerWrapper.className = outerWrapper.className.replace("slider-disabled", "") + " slider-disabled";
|
282
|
+
outerWrapper.setAttribute("aria-disabled", true);
|
283
|
+
inp.disabled = disabled = true;
|
284
|
+
|
285
|
+
if(!noCallback) {
|
286
|
+
callback("disable");
|
287
|
+
};
|
288
|
+
};
|
289
|
+
|
290
|
+
function enableSlider(noCallback) {
|
291
|
+
if(!disabled && !noCallback) return;
|
292
|
+
addEvent(outerWrapper, "mouseover", onMouseOver);
|
293
|
+
addEvent(outerWrapper, "mouseout", onMouseOut);
|
294
|
+
addEvent(outerWrapper, "mousedown", onMouseDown);
|
295
|
+
if(!window.opera) {
|
296
|
+
addEvent(handle, "keydown", onKeyDown);
|
297
|
+
addEvent(handle, "keypress", onKeyPress);
|
298
|
+
} else {
|
299
|
+
addEvent(handle, "keypress", onKeyDown);
|
300
|
+
};
|
301
|
+
addEvent(handle, "focus", onFocus);
|
302
|
+
addEvent(handle, "blur", onBlur);
|
303
|
+
addEvent(handle, "mousedown", onHandleMouseDown);
|
304
|
+
addEvent(handle, "mouseup", onHandleMouseUp);
|
305
|
+
|
306
|
+
outerWrapper.className = outerWrapper.className.replace("slider-disabled", "");
|
307
|
+
outerWrapper.setAttribute("aria-disabled", false);
|
308
|
+
inp.disabled = disabled = false;
|
309
|
+
|
310
|
+
if(!noCallback) {
|
311
|
+
callback("enable");
|
312
|
+
};
|
313
|
+
};
|
314
|
+
|
315
|
+
function destroySlider() {
|
316
|
+
try {
|
317
|
+
disableSlider();
|
318
|
+
outerWrapper.parentNode.removeChild(outerWrapper);
|
319
|
+
} catch(err) {};
|
320
|
+
|
321
|
+
wrapper = bar = handle = outerWrapper = timer = null;
|
322
|
+
callback("destroy");
|
323
|
+
callbacks = null;
|
324
|
+
};
|
325
|
+
|
326
|
+
function redraw() {
|
327
|
+
locate();
|
328
|
+
// Internet Explorer requires the try catch
|
329
|
+
try {
|
330
|
+
var sW = outerWrapper.offsetWidth,
|
331
|
+
sH = outerWrapper.offsetHeight,
|
332
|
+
hW = handle.offsetWidth,
|
333
|
+
hH = handle.offsetHeight,
|
334
|
+
bH = bar.offsetHeight,
|
335
|
+
bW = bar.offsetWidth;
|
336
|
+
|
337
|
+
maxPx = vertical ? sH - hH : sW - hW;
|
338
|
+
stepPx = maxPx / steps;
|
339
|
+
deltaPx = maxPx / Math.ceil(range / maxInc);
|
340
|
+
|
341
|
+
|
342
|
+
sliderW = sW;
|
343
|
+
sliderH = sH;
|
344
|
+
|
345
|
+
valueToPixels();
|
346
|
+
} catch(err) { };
|
347
|
+
callback("redraw");
|
348
|
+
};
|
349
|
+
|
350
|
+
function callback(type) {
|
351
|
+
var cbObj = {"elem":inp, "value":tagName == "select" ? inp.options[inp.selectedIndex].value : inp.value};
|
352
|
+
if(type in callbacks) {
|
353
|
+
for(var i = 0, func; func = callbacks[type][i]; i++) {
|
354
|
+
func(cbObj);
|
355
|
+
};
|
356
|
+
};
|
357
|
+
};
|
358
|
+
|
359
|
+
function onFocus(e) {
|
360
|
+
outerWrapper.className = outerWrapper.className.replace('focused','') + ' focused';
|
361
|
+
if(mouseWheelEnabled && !noMWheel) {
|
362
|
+
addEvent(window, 'DOMMouseScroll', trackMouseWheel);
|
363
|
+
addEvent(document, 'mousewheel', trackMouseWheel);
|
364
|
+
if(!window.opera) addEvent(window, 'mousewheel', trackMouseWheel);
|
365
|
+
};
|
366
|
+
callback("focus");
|
367
|
+
};
|
368
|
+
|
369
|
+
function onBlur(e) {
|
370
|
+
outerWrapper.className = outerWrapper.className.replace(/focused|fd-fc-slider-hover|fd-slider-hover/g,'');
|
371
|
+
if(mouseWheelEnabled && !noMWheel) {
|
372
|
+
removeEvent(document, 'mousewheel', trackMouseWheel);
|
373
|
+
removeEvent(window, 'DOMMouseScroll', trackMouseWheel);
|
374
|
+
if(!window.opera) removeEvent(window, 'mousewheel', trackMouseWheel);
|
375
|
+
};
|
376
|
+
callback("blur");
|
377
|
+
};
|
378
|
+
|
379
|
+
function trackMouseWheel(e) {
|
380
|
+
if(!kbEnabled) return;
|
381
|
+
e = e || window.event;
|
382
|
+
var delta = 0;
|
383
|
+
|
384
|
+
if (e.wheelDelta) {
|
385
|
+
delta = e.wheelDelta/120;
|
386
|
+
if (window.opera && window.opera.version() < 9.2) delta = -delta;
|
387
|
+
} else if(e.detail) {
|
388
|
+
delta = -e.detail/3;
|
389
|
+
};
|
390
|
+
|
391
|
+
if(vertical) { delta = -delta; };
|
392
|
+
|
393
|
+
if(delta) {
|
394
|
+
var xtmp = vertical ? handle.offsetTop : handle.offsetLeft;
|
395
|
+
xtmp = (delta < 0) ? Math.ceil(xtmp + deltaPx) : Math.floor(xtmp - deltaPx);
|
396
|
+
pixelsToValue(Math.min(Math.max(xtmp, 0), maxPx));
|
397
|
+
}
|
398
|
+
return stopEvent(e);
|
399
|
+
};
|
400
|
+
|
401
|
+
function onKeyPress(e) {
|
402
|
+
e = e || document.parentWindow.event;
|
403
|
+
if ((e.keyCode >= 33 && e.keyCode <= 40) || !kbEnabled || e.keyCode == 45 || e.keyCode == 46) {
|
404
|
+
return stopEvent(e);
|
405
|
+
};
|
406
|
+
return true;
|
407
|
+
};
|
408
|
+
|
409
|
+
function onKeyDown(e) {
|
410
|
+
if(!kbEnabled) return true;
|
411
|
+
|
412
|
+
e = e || document.parentWindow.event;
|
413
|
+
var kc = e.keyCode != null ? e.keyCode : e.charCode;
|
414
|
+
|
415
|
+
if ( kc < 33 || (kc > 40 && (kc != 45 && kc != 46))) return true;
|
416
|
+
|
417
|
+
var value = tagName == "input" ? parseFloat(inp.value) : inp.selectedIndex;
|
418
|
+
if(isNaN(value) || value < Math.min(min,max)) value = Math.min(min,max);
|
419
|
+
|
420
|
+
if( kc == 37 || kc == 40 || kc == 46 || kc == 34) {
|
421
|
+
// left, down, ins, page down
|
422
|
+
value -= (e.ctrlKey || kc == 34 ? maxInc : inc)
|
423
|
+
} else if( kc == 39 || kc == 38 || kc == 45 || kc == 33) {
|
424
|
+
// right, up, del, page up
|
425
|
+
value += (e.ctrlKey || kc == 33 ? maxInc : inc)
|
426
|
+
} else if( kc == 35 ) {
|
427
|
+
// max
|
428
|
+
value = max;
|
429
|
+
} else if( kc == 36 ) {
|
430
|
+
// min
|
431
|
+
value = min;
|
432
|
+
};
|
433
|
+
|
434
|
+
valueToPixels(value);
|
435
|
+
callback("update");
|
436
|
+
|
437
|
+
// Opera doesn't let us cancel key events so the up/down arrows and home/end buttons will scroll the screen - which sucks
|
438
|
+
return stopEvent(e);
|
439
|
+
};
|
440
|
+
|
441
|
+
function onMouseOver( e ) {
|
442
|
+
/*@cc_on@*/
|
443
|
+
/*@if(@_jscript_version <= 5.6)
|
444
|
+
if(this.className.search(/focused/) != -1) {
|
445
|
+
this.className = this.className.replace("fd-fc-slider-hover", "") +' fd-fc-slider-hover';
|
446
|
+
return;
|
447
|
+
}
|
448
|
+
/*@end@*/
|
449
|
+
this.className = this.className.replace(/fd\-slider\-hover/g,"") +' fd-slider-hover';
|
450
|
+
};
|
451
|
+
|
452
|
+
function onMouseOut( e ) {
|
453
|
+
/*@cc_on@*/
|
454
|
+
/*@if(@_jscript_version <= 5.6)
|
455
|
+
if(this.className.search(/focused/) != -1) {
|
456
|
+
this.className = this.className.replace("fd-fc-slider-hover", "");
|
457
|
+
return;
|
458
|
+
}
|
459
|
+
/*@end@*/
|
460
|
+
this.className = this.className.replace(/fd\-slider\-hover/g,"");
|
461
|
+
};
|
462
|
+
|
463
|
+
function onHandleMouseUp(e) {
|
464
|
+
e = e || window.event;
|
465
|
+
removeEvent(document, 'mousemove', trackMouse);
|
466
|
+
removeEvent(document, 'mouseup', onHandleMouseUp);
|
467
|
+
|
468
|
+
kbEnabled = true;
|
469
|
+
|
470
|
+
// Opera fires the blur event when the mouseup event occurs on a button, so we attept to force a focus
|
471
|
+
if(window.opera) try { setTimeout(function() { onfocus(); }, 0); } catch(err) {};
|
472
|
+
document.body.className = document.body.className.replace(/slider-drag-vertical|slider-drag-horizontal/g, "");
|
473
|
+
|
474
|
+
return stopEvent(e);
|
475
|
+
};
|
476
|
+
|
477
|
+
function onHandleMouseDown(e) {
|
478
|
+
e = e || window.event;
|
479
|
+
mousePos = vertical ? e.clientY : e.clientX;
|
480
|
+
handlePos = parseInt(vertical ? handle.offsetTop : handle.offsetLeft)||0;
|
481
|
+
kbEnabled = false;
|
482
|
+
|
483
|
+
clearTimeout(timer);
|
484
|
+
timer = null;
|
485
|
+
|
486
|
+
addEvent(document, 'mousemove', trackMouse);
|
487
|
+
addEvent(document, 'mouseup', onHandleMouseUp);
|
488
|
+
|
489
|
+
// Force a "focus" on the button on mouse events
|
490
|
+
if(window.devicePixelRatio || (document.all && !window.opera)) try { setTimeout(function() { handle.focus(); }, 0); } catch(err) {};
|
491
|
+
|
492
|
+
document.body.className += " slider-drag-" + (vertical ? "vertical" : "horizontal");
|
493
|
+
};
|
494
|
+
|
495
|
+
function onMouseUp( e ) {
|
496
|
+
e = e || window.event;
|
497
|
+
removeEvent(document, 'mouseup', onMouseUp);
|
498
|
+
if(!useTween) {
|
499
|
+
clearTimeout(timer);
|
500
|
+
timer = null;
|
501
|
+
kbEnabled = true;
|
502
|
+
};
|
503
|
+
return stopEvent(e);
|
504
|
+
};
|
505
|
+
|
506
|
+
function trackMouse( e ) {
|
507
|
+
e = e || window.event;
|
508
|
+
pixelsToValue(snapToNearestValue(handlePos + (vertical ? e.clientY - mousePos : e.clientX - mousePos)));
|
509
|
+
};
|
510
|
+
|
511
|
+
function onMouseDown( e ) {
|
512
|
+
e = e || window.event;
|
513
|
+
var targ;
|
514
|
+
if (e.target) targ = e.target;
|
515
|
+
else if (e.srcElement) targ = e.srcElement;
|
516
|
+
if (targ.nodeType == 3) targ = targ.parentNode;
|
517
|
+
|
518
|
+
if(targ.className.search("fd-slider-handle") != -1) { return true; };
|
519
|
+
|
520
|
+
try { setTimeout(function() { handle.focus(); }, 0); } catch(err) { };
|
521
|
+
|
522
|
+
clearTimeout(timer);
|
523
|
+
locate();
|
524
|
+
|
525
|
+
timer = null;
|
526
|
+
kbEnabled = false;
|
527
|
+
|
528
|
+
var posx = 0,
|
529
|
+
sLft = 0,
|
530
|
+
sTop = 0;
|
531
|
+
|
532
|
+
// Internet Explorer doctype woes
|
533
|
+
if (document.documentElement && document.documentElement.scrollTop) {
|
534
|
+
sTop = document.documentElement.scrollTop;
|
535
|
+
sLft = document.documentElement.scrollLeft;
|
536
|
+
} else if (document.body) {
|
537
|
+
sTop = document.body.scrollTop;
|
538
|
+
sLft = document.body.scrollLeft;
|
539
|
+
};
|
540
|
+
|
541
|
+
if (e.pageX) posx = vertical ? e.pageY : e.pageX;
|
542
|
+
else if (e.clientX) posx = vertical ? e.clientY + sTop : e.clientX + sLft;
|
543
|
+
posx -= vertical ? y + Math.round(handle.offsetHeight / 2) : x + Math.round(handle.offsetWidth / 2);
|
544
|
+
posx = snapToNearestValue(posx);
|
545
|
+
|
546
|
+
if(useTween) {
|
547
|
+
tweenTo(posx);
|
548
|
+
} else if(clickJump) {
|
549
|
+
pixelsToValue(posx);
|
550
|
+
} else {
|
551
|
+
addEvent(document, 'mouseup', onMouseUp);
|
552
|
+
destPos = posx;
|
553
|
+
onTimer();
|
554
|
+
};
|
555
|
+
};
|
556
|
+
|
557
|
+
function incrementHandle(numOfSteps) {
|
558
|
+
var value = tagName == "input" ? parseFloat(inp.value) : inp.selectedIndex;
|
559
|
+
if(isNaN(value) || value < Math.min(min,max)) value = Math.min(min,max);
|
560
|
+
value += inc * numOfSteps;
|
561
|
+
valueToPixels(value);
|
562
|
+
};
|
563
|
+
|
564
|
+
function snapToNearestValue(px) {
|
565
|
+
var rem = px % stepPx;
|
566
|
+
if(rem && rem >= (stepPx / 2)) { px += (stepPx - rem); }
|
567
|
+
else { px -= rem; };
|
568
|
+
return Math.min(Math.max(parseInt(px, 10), 0), maxPx);
|
569
|
+
};
|
570
|
+
|
571
|
+
function locate(){
|
572
|
+
var curleft = 0,
|
573
|
+
curtop = 0,
|
574
|
+
obj = outerWrapper;
|
575
|
+
|
576
|
+
// Try catch for IE's benefit
|
577
|
+
try {
|
578
|
+
while (obj.offsetParent) {
|
579
|
+
curleft += obj.offsetLeft;
|
580
|
+
curtop += obj.offsetTop;
|
581
|
+
obj = obj.offsetParent;
|
582
|
+
};
|
583
|
+
} catch(err) {};
|
584
|
+
x = curleft;
|
585
|
+
y = curtop;
|
586
|
+
};
|
587
|
+
|
588
|
+
function onTimer() {
|
589
|
+
var xtmp = vertical ? handle.offsetTop : handle.offsetLeft;
|
590
|
+
xtmp = Math.round((destPos < xtmp) ? Math.max(destPos, Math.floor(xtmp - deltaPx)) : Math.min(destPos, Math.ceil(xtmp + deltaPx)));
|
591
|
+
pixelsToValue(xtmp);
|
592
|
+
if(xtmp != destPos) timer = setTimeout(onTimer, steps > 20 ? 50 : 100);
|
593
|
+
else kbEnabled = true;
|
594
|
+
};
|
595
|
+
|
596
|
+
var tween = function(){
|
597
|
+
frame++;
|
598
|
+
var c = tweenC,
|
599
|
+
d = 20,
|
600
|
+
t = frame,
|
601
|
+
b = tweenB,
|
602
|
+
x = Math.ceil((t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b);
|
603
|
+
|
604
|
+
pixelsToValue(t == d ? tweenX : x);
|
605
|
+
callback("move");
|
606
|
+
if(t!=d) timer = setTimeout(tween, 20);
|
607
|
+
else {
|
608
|
+
clearTimeout(timer);
|
609
|
+
timer = null;
|
610
|
+
kbEnabled = true;
|
611
|
+
};
|
612
|
+
};
|
613
|
+
|
614
|
+
function tweenTo(tx){
|
615
|
+
kbEnabled = false;
|
616
|
+
tweenX = parseInt(tx, 10);
|
617
|
+
tweenB = parseInt(vertical ? handle.style.top : handle.style.left, 10);
|
618
|
+
tweenC = tweenX - tweenB;
|
619
|
+
tweenD = 20;
|
620
|
+
frame = 0;
|
621
|
+
if(!timer) timer = setTimeout(tween, 20);
|
622
|
+
};
|
623
|
+
|
624
|
+
function pixelsToValue(px) {
|
625
|
+
//jslog.debug(DebugHelpers.getStackTrace())
|
626
|
+
handle.style[vertical ? "top" : "left"] = px + "px";
|
627
|
+
var val = min + (Math.round(px / stepPx) * inc);
|
628
|
+
setInputValue((tagName == "select" || inc == 1) ? Math.round(val) : val);
|
629
|
+
};
|
630
|
+
|
631
|
+
function valueToPixels(val) {
|
632
|
+
var value = isNaN(val) ? tagName == "input" ? parseFloat(inp.value) : inp.selectedIndex : val;
|
633
|
+
if(isNaN(value) || value < Math.min(min,max)) value = Math.min(min,max);
|
634
|
+
else if(value > Math.max(min,max)) value = Math.max(min,max);
|
635
|
+
setInputValue(value);
|
636
|
+
handle.style[vertical ? "top" : "left"] = Math.round(((value - min) / inc) * stepPx) + "px";
|
637
|
+
};
|
638
|
+
|
639
|
+
function setInputValue(val) {
|
640
|
+
val = isNaN(val) ? min : val;
|
641
|
+
if(tagName == "select") {
|
642
|
+
try {
|
643
|
+
val = parseInt(val, 10);
|
644
|
+
if(inp.selectedIndex == val) return;
|
645
|
+
inp.options[val].selected = true;
|
646
|
+
} catch (err) {};
|
647
|
+
} else {
|
648
|
+
val = (min + (Math.round((val - min) / inc) * inc)).toFixed(precision);
|
649
|
+
if(inp.value == val) return;
|
650
|
+
inp.value = val;
|
651
|
+
};
|
652
|
+
updateAriaValues();
|
653
|
+
callback("update");
|
654
|
+
};
|
655
|
+
|
656
|
+
function findLabel() {
|
657
|
+
var label;
|
658
|
+
if(inp.parentNode && inp.parentNode.tagName.toLowerCase() == "label") label = inp.parentNode;
|
659
|
+
else {
|
660
|
+
var labelList = document.getElementsByTagName('label');
|
661
|
+
// loop through label array attempting to match each 'for' attribute to the id of the current element
|
662
|
+
for(var i = 0, lbl; lbl = labelList[i]; i++) {
|
663
|
+
// Internet Explorer requires the htmlFor test
|
664
|
+
if((lbl['htmlFor'] && lbl['htmlFor'] == inp.id) || (lbl.getAttribute('for') == inp.id)) {
|
665
|
+
label = lbl;
|
666
|
+
break;
|
667
|
+
};
|
668
|
+
};
|
669
|
+
};
|
670
|
+
if(label && !label.id) { label.id = inp.id + "_label"; };
|
671
|
+
return label;
|
672
|
+
};
|
673
|
+
|
674
|
+
function updateAriaValues() {
|
675
|
+
handle.setAttribute("aria-valuenow", tagName == "select" ? inp.options[inp.selectedIndex].value : inp.value);
|
676
|
+
handle.setAttribute("aria-valuetext", tagName == "select" ? inp.options[inp.selectedIndex].text : inp.value);
|
677
|
+
};
|
678
|
+
|
679
|
+
function onChange( e ) {
|
680
|
+
valueToPixels();
|
681
|
+
callback("update");
|
682
|
+
return true;
|
683
|
+
};
|
684
|
+
|
685
|
+
(function() {
|
686
|
+
if(hideInput) { inp.className += " fd_hide_slider_input"; }
|
687
|
+
else { addEvent(inp, 'change', onChange); };
|
688
|
+
|
689
|
+
outerWrapper = document.createElement('div');
|
690
|
+
outerWrapper.className = "fd-slider" + (vertical ? "-vertical " : " ") + classNames;
|
691
|
+
outerWrapper.id = "fd-slider-" + inp.id;
|
692
|
+
|
693
|
+
wrapper = document.createElement('span');
|
694
|
+
wrapper.className = "fd-slider-inner";
|
695
|
+
|
696
|
+
bar = document.createElement('span');
|
697
|
+
bar.className = "fd-slider-bar";
|
698
|
+
|
699
|
+
if(fullARIA) {
|
700
|
+
handle = document.createElement('span');
|
701
|
+
handle.setAttribute(!/*@cc_on!@*/false ? "tabIndex" : "tabindex", "0");
|
702
|
+
} else {
|
703
|
+
handle = document.createElement('button');
|
704
|
+
handle.setAttribute("type", "button");
|
705
|
+
};
|
706
|
+
|
707
|
+
handle.className = "fd-slider-handle";
|
708
|
+
handle.appendChild(document.createTextNode(String.fromCharCode(160)));
|
709
|
+
|
710
|
+
outerWrapper.appendChild(wrapper);
|
711
|
+
outerWrapper.appendChild(bar);
|
712
|
+
outerWrapper.appendChild(handle);
|
713
|
+
|
714
|
+
inp.parentNode.insertBefore(outerWrapper, inp);
|
715
|
+
|
716
|
+
/*@cc_on@*/
|
717
|
+
/*@if(@_win32)
|
718
|
+
handle.unselectable = "on";
|
719
|
+
bar.unselectable = "on";
|
720
|
+
wrapper.unselectable = "on";
|
721
|
+
outerWrapper.unselectable = "on";
|
722
|
+
/*@end@*/
|
723
|
+
|
724
|
+
// Add ARIA accessibility info programmatically
|
725
|
+
handle.setAttribute("role", "slider");
|
726
|
+
handle.setAttribute("aria-valuemin", min);
|
727
|
+
handle.setAttribute("aria-valuemax", max);
|
728
|
+
|
729
|
+
var lbl = findLabel();
|
730
|
+
if(lbl) {
|
731
|
+
handle.setAttribute("aria-labelledby", lbl.id);
|
732
|
+
handle.id = "fd-slider-handle-" + inp.id;
|
733
|
+
/*@cc_on
|
734
|
+
/*@if(@_win32)
|
735
|
+
lbl.setAttribute("htmlFor", handle.id);
|
736
|
+
@else @*/
|
737
|
+
lbl.setAttribute("for", handle.id);
|
738
|
+
/*@end
|
739
|
+
@*/
|
740
|
+
};
|
741
|
+
|
742
|
+
// Are there page instructions - the creation of the instructions has been left up to you fine reader...
|
743
|
+
if(document.getElementById("fd_slider_describedby")) {
|
744
|
+
handle.setAttribute("aria-describedby", "fd_slider_describedby"); // aaa:describedby
|
745
|
+
};
|
746
|
+
|
747
|
+
if(inp.getAttribute("disabled") == true) {
|
748
|
+
disableSlider(true);
|
749
|
+
} else {
|
750
|
+
enableSlider(true);
|
751
|
+
};
|
752
|
+
|
753
|
+
updateAriaValues();
|
754
|
+
callback("create");
|
755
|
+
redraw();
|
756
|
+
})();
|
757
|
+
|
758
|
+
return {
|
759
|
+
onResize: function(e) { if(outerWrapper.offsetHeight != sliderH || outerWrapper.offsetWidth != sliderW) { redraw(); }; },
|
760
|
+
destroy: function() { destroySlider(); },
|
761
|
+
reset: function() { valueToPixels(); },
|
762
|
+
increment: function(n) { incrementHandle(n); },
|
763
|
+
disable: function() { disableSlider(); },
|
764
|
+
enable: function() { enableSlider(); }
|
765
|
+
};
|
766
|
+
};
|
767
|
+
|
768
|
+
addEvent(window, "load", init);
|
769
|
+
addEvent(window, "unload", unload);
|
770
|
+
addEvent(window, "resize", resize);
|
771
|
+
/*@cc_on@*/
|
772
|
+
/*@if(@_win32)
|
773
|
+
var onload = function(e) {
|
774
|
+
for(slider in sliders) { sliders[slider].reset(); }
|
775
|
+
};
|
776
|
+
addEvent(window, "load", function() { setTimeout(onload, 200) });
|
777
|
+
/*@end@*/
|
778
|
+
|
779
|
+
return {
|
780
|
+
create: function(elem) { init(elem) },
|
781
|
+
createSlider: function(opts) { createSlider(opts); },
|
782
|
+
destroyAll: function() { destroyAllsliders(); },
|
783
|
+
destroySlider: function(id) { return destroySingleSlider(id); },
|
784
|
+
redrawAll: function() { resize(); },
|
785
|
+
increment: function(id, numSteps) { if(!(id in sliders)) { return false; }; sliders[id].increment(numSteps); },
|
786
|
+
addEvent: addEvent,
|
787
|
+
removeEvent: removeEvent,
|
788
|
+
stopEvent: stopEvent,
|
789
|
+
updateSlider: function(id) { if(!(id in sliders)) { return false; }; sliders[id].reset(); },
|
790
|
+
disableMouseWheel: function() { removeMouseWheelSupport(); },
|
791
|
+
removeOnLoadEvent: function() { removeOnloadEvent(); },
|
792
|
+
disableSlider: function(id) { if(!(id in sliders)) { return false; }; sliders[id].disable(); },
|
793
|
+
enableSlider: function(id) { if(!(id in sliders)) { return false; }; sliders[id].enable(); }
|
794
|
+
}
|
795
|
+
})();
|
796
|
+
|
797
|
+
|