jqtools-rails 0.1.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.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +37 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +34 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/jqtools-rails.gemspec +81 -0
- data/lib/jqtools-rails.rb +5 -0
- data/spec/jqtools-rails_spec.rb +7 -0
- data/spec/spec_helper.rb +12 -0
- data/vendor/assets/javascripts/dateinput/dateinput.js +791 -0
- data/vendor/assets/javascripts/jquery.tools.min.js +39 -0
- data/vendor/assets/javascripts/overlay/overlay.apple.js +155 -0
- data/vendor/assets/javascripts/overlay/overlay.js +293 -0
- data/vendor/assets/javascripts/rangeinput/rangeinput.js +471 -0
- data/vendor/assets/javascripts/scrollable/scrollable.autoscroll.js +96 -0
- data/vendor/assets/javascripts/scrollable/scrollable.js +368 -0
- data/vendor/assets/javascripts/scrollable/scrollable.navigator.js +134 -0
- data/vendor/assets/javascripts/tabs/tabs.js +319 -0
- data/vendor/assets/javascripts/tabs/tabs.slideshow.js +191 -0
- data/vendor/assets/javascripts/toolbox/toolbox.expose.js +224 -0
- data/vendor/assets/javascripts/toolbox/toolbox.flashembed.js +301 -0
- data/vendor/assets/javascripts/toolbox/toolbox.history.js +108 -0
- data/vendor/assets/javascripts/toolbox/toolbox.mousewheel.js +65 -0
- data/vendor/assets/javascripts/tooltip/tooltip.dynamic.js +154 -0
- data/vendor/assets/javascripts/tooltip/tooltip.js +358 -0
- data/vendor/assets/javascripts/tooltip/tooltip.slide.js +78 -0
- data/vendor/assets/javascripts/validator/validator.js +598 -0
- metadata +135 -0
@@ -0,0 +1,471 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* jQuery Tools @VERSION Rangeinput - HTML5 <input type="range" /> for humans
|
4
|
+
*
|
5
|
+
* NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
|
6
|
+
*
|
7
|
+
* http://flowplayer.org/tools/rangeinput/
|
8
|
+
*
|
9
|
+
* Since: Mar 2010
|
10
|
+
* Date: @DATE
|
11
|
+
*/
|
12
|
+
(function($) {
|
13
|
+
|
14
|
+
$.tools = $.tools || {version: '@VERSION'};
|
15
|
+
|
16
|
+
var tool;
|
17
|
+
|
18
|
+
tool = $.tools.rangeinput = {
|
19
|
+
|
20
|
+
conf: {
|
21
|
+
min: 0,
|
22
|
+
max: 100, // as defined in the standard
|
23
|
+
step: 'any', // granularity of the value. a non-zero float or int (or "any")
|
24
|
+
steps: 0,
|
25
|
+
value: 0,
|
26
|
+
precision: undefined,
|
27
|
+
vertical: 0,
|
28
|
+
keyboard: true,
|
29
|
+
progress: false,
|
30
|
+
speed: 100,
|
31
|
+
|
32
|
+
// set to null if not needed
|
33
|
+
css: {
|
34
|
+
input: 'range',
|
35
|
+
slider: 'slider',
|
36
|
+
progress: 'progress',
|
37
|
+
handle: 'handle'
|
38
|
+
}
|
39
|
+
|
40
|
+
}
|
41
|
+
};
|
42
|
+
|
43
|
+
//{{{ fn.drag
|
44
|
+
|
45
|
+
/*
|
46
|
+
FULL featured drag and drop. 0.7 kb minified, 0.3 gzipped. done.
|
47
|
+
Who told d'n'd is rocket science? Usage:
|
48
|
+
|
49
|
+
$(".myelement").drag({y: false}).bind("drag", function(event, x, y) {
|
50
|
+
// do your custom thing
|
51
|
+
});
|
52
|
+
|
53
|
+
Configuration:
|
54
|
+
x: true, // enable horizontal drag
|
55
|
+
y: true, // enable vertical drag
|
56
|
+
drag: true // true = perform drag, false = only fire events
|
57
|
+
|
58
|
+
Events: dragStart, drag, dragEnd.
|
59
|
+
*/
|
60
|
+
var doc, draggable;
|
61
|
+
|
62
|
+
$.fn.drag = function(conf) {
|
63
|
+
|
64
|
+
// disable IE specialities
|
65
|
+
document.ondragstart = function () { return false; };
|
66
|
+
|
67
|
+
conf = $.extend({x: true, y: true, drag: true}, conf);
|
68
|
+
|
69
|
+
doc = doc || $(document).bind("mousedown mouseup", function(e) {
|
70
|
+
|
71
|
+
var el = $(e.target);
|
72
|
+
|
73
|
+
// start
|
74
|
+
if (e.type == "mousedown" && el.data("drag")) {
|
75
|
+
|
76
|
+
var offset = el.position(),
|
77
|
+
x0 = e.pageX - offset.left,
|
78
|
+
y0 = e.pageY - offset.top,
|
79
|
+
start = true;
|
80
|
+
|
81
|
+
doc.bind("mousemove.drag", function(e) {
|
82
|
+
var x = e.pageX -x0,
|
83
|
+
y = e.pageY -y0,
|
84
|
+
props = {};
|
85
|
+
|
86
|
+
if (conf.x) { props.left = x; }
|
87
|
+
if (conf.y) { props.top = y; }
|
88
|
+
|
89
|
+
if (start) {
|
90
|
+
el.trigger("dragStart");
|
91
|
+
start = false;
|
92
|
+
}
|
93
|
+
if (conf.drag) { el.css(props); }
|
94
|
+
el.trigger("drag", [y, x]);
|
95
|
+
draggable = el;
|
96
|
+
});
|
97
|
+
|
98
|
+
e.preventDefault();
|
99
|
+
|
100
|
+
} else {
|
101
|
+
|
102
|
+
try {
|
103
|
+
if (draggable) {
|
104
|
+
draggable.trigger("dragEnd");
|
105
|
+
}
|
106
|
+
} finally {
|
107
|
+
doc.unbind("mousemove.drag");
|
108
|
+
draggable = null;
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
});
|
113
|
+
|
114
|
+
return this.data("drag", true);
|
115
|
+
};
|
116
|
+
|
117
|
+
//}}}
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
function round(value, precision) {
|
122
|
+
var n = Math.pow(10, precision);
|
123
|
+
return Math.round(value * n) / n;
|
124
|
+
}
|
125
|
+
|
126
|
+
// get hidden element's width or height even though it's hidden
|
127
|
+
function dim(el, key) {
|
128
|
+
var v = parseInt(el.css(key), 10);
|
129
|
+
if (v) { return v; }
|
130
|
+
var s = el[0].currentStyle;
|
131
|
+
return s && s.width && parseInt(s.width, 10);
|
132
|
+
}
|
133
|
+
|
134
|
+
function hasEvent(el) {
|
135
|
+
var e = el.data("events");
|
136
|
+
return e && e.onSlide;
|
137
|
+
}
|
138
|
+
|
139
|
+
function RangeInput(input, conf) {
|
140
|
+
|
141
|
+
// private variables
|
142
|
+
var self = this,
|
143
|
+
css = conf.css,
|
144
|
+
root = $("<div><div/><a href='#'/></div>").data("rangeinput", self),
|
145
|
+
vertical,
|
146
|
+
value, // current value
|
147
|
+
origo, // handle's start point
|
148
|
+
len, // length of the range
|
149
|
+
pos; // current position of the handle
|
150
|
+
|
151
|
+
// create range
|
152
|
+
input.before(root);
|
153
|
+
|
154
|
+
var handle = root.addClass(css.slider).find("a").addClass(css.handle),
|
155
|
+
progress = root.find("div").addClass(css.progress);
|
156
|
+
|
157
|
+
// get (HTML5) attributes into configuration
|
158
|
+
$.each("min,max,step,value".split(","), function(i, key) {
|
159
|
+
var val = input.attr(key);
|
160
|
+
if (parseFloat(val)) {
|
161
|
+
conf[key] = parseFloat(val, 10);
|
162
|
+
}
|
163
|
+
});
|
164
|
+
|
165
|
+
var range = conf.max - conf.min,
|
166
|
+
step = conf.step == 'any' ? 0 : conf.step,
|
167
|
+
precision = conf.precision;
|
168
|
+
|
169
|
+
if (precision === undefined) {
|
170
|
+
try {
|
171
|
+
precision = step.toString().split(".")[1].length;
|
172
|
+
} catch (err) {
|
173
|
+
precision = 0;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
|
177
|
+
// Replace built-in range input (type attribute cannot be changed)
|
178
|
+
if (input.attr("type") == 'range') {
|
179
|
+
var def = input.clone().wrap("<div/>").parent().html(),
|
180
|
+
clone = $(def.replace(/type/i, "type=text data-orig-type"));
|
181
|
+
|
182
|
+
clone.val(conf.value);
|
183
|
+
input.replaceWith(clone);
|
184
|
+
input = clone;
|
185
|
+
}
|
186
|
+
|
187
|
+
input.addClass(css.input);
|
188
|
+
|
189
|
+
var fire = $(self).add(input), fireOnSlide = true;
|
190
|
+
|
191
|
+
|
192
|
+
/**
|
193
|
+
The flesh and bone of this tool. All sliding is routed trough this.
|
194
|
+
|
195
|
+
@param evt types include: click, keydown, blur and api (setValue call)
|
196
|
+
@param isSetValue when called trough setValue() call (keydown, blur, api)
|
197
|
+
|
198
|
+
vertical configuration gives additional complexity.
|
199
|
+
*/
|
200
|
+
function slide(evt, x, val, isSetValue) {
|
201
|
+
|
202
|
+
// calculate value based on slide position
|
203
|
+
if (val === undefined) {
|
204
|
+
val = x / len * range;
|
205
|
+
|
206
|
+
// x is calculated based on val. we need to strip off min during calculation
|
207
|
+
} else if (isSetValue) {
|
208
|
+
val -= conf.min;
|
209
|
+
}
|
210
|
+
|
211
|
+
// increment in steps
|
212
|
+
if (step) {
|
213
|
+
val = Math.round(val / step) * step;
|
214
|
+
}
|
215
|
+
|
216
|
+
// count x based on value or tweak x if stepping is done
|
217
|
+
if (x === undefined || step) {
|
218
|
+
x = val * len / range;
|
219
|
+
}
|
220
|
+
|
221
|
+
// crazy value?
|
222
|
+
if (isNaN(val)) { return self; }
|
223
|
+
|
224
|
+
// stay within range
|
225
|
+
x = Math.max(0, Math.min(x, len));
|
226
|
+
val = x / len * range;
|
227
|
+
|
228
|
+
if (isSetValue || !vertical) {
|
229
|
+
val += conf.min;
|
230
|
+
}
|
231
|
+
|
232
|
+
// in vertical ranges value rises upwards
|
233
|
+
if (vertical) {
|
234
|
+
if (isSetValue) {
|
235
|
+
x = len -x;
|
236
|
+
} else {
|
237
|
+
val = conf.max - val;
|
238
|
+
}
|
239
|
+
}
|
240
|
+
|
241
|
+
// precision
|
242
|
+
val = round(val, precision);
|
243
|
+
|
244
|
+
// onSlide
|
245
|
+
var isClick = evt.type == "click";
|
246
|
+
if (fireOnSlide && value !== undefined && !isClick) {
|
247
|
+
evt.type = "onSlide";
|
248
|
+
fire.trigger(evt, [val, x]);
|
249
|
+
if (evt.isDefaultPrevented()) { return self; }
|
250
|
+
}
|
251
|
+
|
252
|
+
// speed & callback
|
253
|
+
var speed = isClick ? conf.speed : 0,
|
254
|
+
callback = isClick ? function() {
|
255
|
+
evt.type = "change";
|
256
|
+
fire.trigger(evt, [val]);
|
257
|
+
} : null;
|
258
|
+
|
259
|
+
if (vertical) {
|
260
|
+
handle.animate({top: x}, speed, callback);
|
261
|
+
if (conf.progress) {
|
262
|
+
progress.animate({height: len - x + handle.height() / 2}, speed);
|
263
|
+
}
|
264
|
+
|
265
|
+
} else {
|
266
|
+
handle.animate({left: x}, speed, callback);
|
267
|
+
if (conf.progress) {
|
268
|
+
progress.animate({width: x + handle.width() / 2}, speed);
|
269
|
+
}
|
270
|
+
}
|
271
|
+
|
272
|
+
// store current value
|
273
|
+
value = val;
|
274
|
+
pos = x;
|
275
|
+
|
276
|
+
// se input field's value
|
277
|
+
input.val(val);
|
278
|
+
|
279
|
+
return self;
|
280
|
+
}
|
281
|
+
|
282
|
+
|
283
|
+
$.extend(self, {
|
284
|
+
|
285
|
+
getValue: function() {
|
286
|
+
return value;
|
287
|
+
},
|
288
|
+
|
289
|
+
setValue: function(val, e) {
|
290
|
+
init();
|
291
|
+
return slide(e || $.Event("api"), undefined, val, true);
|
292
|
+
},
|
293
|
+
|
294
|
+
getConf: function() {
|
295
|
+
return conf;
|
296
|
+
},
|
297
|
+
|
298
|
+
getProgress: function() {
|
299
|
+
return progress;
|
300
|
+
},
|
301
|
+
|
302
|
+
getHandle: function() {
|
303
|
+
return handle;
|
304
|
+
},
|
305
|
+
|
306
|
+
getInput: function() {
|
307
|
+
return input;
|
308
|
+
},
|
309
|
+
|
310
|
+
step: function(am, e) {
|
311
|
+
e = e || $.Event();
|
312
|
+
var step = conf.step == 'any' ? 1 : conf.step;
|
313
|
+
self.setValue(value + step * (am || 1), e);
|
314
|
+
},
|
315
|
+
|
316
|
+
// HTML5 compatible name
|
317
|
+
stepUp: function(am) {
|
318
|
+
return self.step(am || 1);
|
319
|
+
},
|
320
|
+
|
321
|
+
// HTML5 compatible name
|
322
|
+
stepDown: function(am) {
|
323
|
+
return self.step(-am || -1);
|
324
|
+
}
|
325
|
+
|
326
|
+
});
|
327
|
+
|
328
|
+
// callbacks
|
329
|
+
$.each("onSlide,change".split(","), function(i, name) {
|
330
|
+
|
331
|
+
// from configuration
|
332
|
+
if ($.isFunction(conf[name])) {
|
333
|
+
$(self).bind(name, conf[name]);
|
334
|
+
}
|
335
|
+
|
336
|
+
// API methods
|
337
|
+
self[name] = function(fn) {
|
338
|
+
if (fn) { $(self).bind(name, fn); }
|
339
|
+
return self;
|
340
|
+
};
|
341
|
+
});
|
342
|
+
|
343
|
+
|
344
|
+
// dragging
|
345
|
+
handle.drag({drag: false}).bind("dragStart", function() {
|
346
|
+
|
347
|
+
/* do some pre- calculations for seek() function. improves performance */
|
348
|
+
init();
|
349
|
+
|
350
|
+
// avoid redundant event triggering (= heavy stuff)
|
351
|
+
fireOnSlide = hasEvent($(self)) || hasEvent(input);
|
352
|
+
|
353
|
+
|
354
|
+
}).bind("drag", function(e, y, x) {
|
355
|
+
|
356
|
+
if (input.is(":disabled")) { return false; }
|
357
|
+
slide(e, vertical ? y : x);
|
358
|
+
|
359
|
+
}).bind("dragEnd", function(e) {
|
360
|
+
if (!e.isDefaultPrevented()) {
|
361
|
+
e.type = "change";
|
362
|
+
fire.trigger(e, [value]);
|
363
|
+
}
|
364
|
+
|
365
|
+
}).click(function(e) {
|
366
|
+
return e.preventDefault();
|
367
|
+
});
|
368
|
+
|
369
|
+
// clicking
|
370
|
+
root.click(function(e) {
|
371
|
+
if (input.is(":disabled") || e.target == handle[0]) {
|
372
|
+
return e.preventDefault();
|
373
|
+
}
|
374
|
+
init();
|
375
|
+
var fix = vertical ? handle.height() / 2 : handle.width() / 2;
|
376
|
+
slide(e, vertical ? len-origo-fix + e.pageY : e.pageX -origo -fix);
|
377
|
+
});
|
378
|
+
|
379
|
+
if (conf.keyboard) {
|
380
|
+
|
381
|
+
input.keydown(function(e) {
|
382
|
+
|
383
|
+
if (input.attr("readonly")) { return; }
|
384
|
+
|
385
|
+
var key = e.keyCode,
|
386
|
+
up = $([75, 76, 38, 33, 39]).index(key) != -1,
|
387
|
+
down = $([74, 72, 40, 34, 37]).index(key) != -1;
|
388
|
+
|
389
|
+
if ((up || down) && !(e.shiftKey || e.altKey || e.ctrlKey)) {
|
390
|
+
|
391
|
+
// UP: k=75, l=76, up=38, pageup=33, right=39
|
392
|
+
if (up) {
|
393
|
+
self.step(key == 33 ? 10 : 1, e);
|
394
|
+
|
395
|
+
// DOWN: j=74, h=72, down=40, pagedown=34, left=37
|
396
|
+
} else if (down) {
|
397
|
+
self.step(key == 34 ? -10 : -1, e);
|
398
|
+
}
|
399
|
+
return e.preventDefault();
|
400
|
+
}
|
401
|
+
});
|
402
|
+
}
|
403
|
+
|
404
|
+
|
405
|
+
input.blur(function(e) {
|
406
|
+
var val = $(this).val();
|
407
|
+
if (val !== value) {
|
408
|
+
self.setValue(val, e);
|
409
|
+
}
|
410
|
+
});
|
411
|
+
|
412
|
+
|
413
|
+
// HTML5 DOM methods
|
414
|
+
$.extend(input[0], { stepUp: self.stepUp, stepDown: self.stepDown});
|
415
|
+
|
416
|
+
|
417
|
+
// calculate all dimension related stuff
|
418
|
+
function init() {
|
419
|
+
vertical = conf.vertical || dim(root, "height") > dim(root, "width");
|
420
|
+
|
421
|
+
if (vertical) {
|
422
|
+
len = dim(root, "height") - dim(handle, "height");
|
423
|
+
origo = root.offset().top + len;
|
424
|
+
|
425
|
+
} else {
|
426
|
+
len = dim(root, "width") - dim(handle, "width");
|
427
|
+
origo = root.offset().left;
|
428
|
+
}
|
429
|
+
}
|
430
|
+
|
431
|
+
function begin() {
|
432
|
+
init();
|
433
|
+
self.setValue(conf.value !== undefined ? conf.value : conf.min);
|
434
|
+
}
|
435
|
+
begin();
|
436
|
+
|
437
|
+
// some browsers cannot get dimensions upon initialization
|
438
|
+
if (!len) {
|
439
|
+
$(window).load(begin);
|
440
|
+
}
|
441
|
+
}
|
442
|
+
|
443
|
+
$.expr[':'].range = function(el) {
|
444
|
+
var type = el.getAttribute("type");
|
445
|
+
return type && type == 'range' || !!$(el).filter("input").data("rangeinput");
|
446
|
+
};
|
447
|
+
|
448
|
+
|
449
|
+
// jQuery plugin implementation
|
450
|
+
$.fn.rangeinput = function(conf) {
|
451
|
+
|
452
|
+
// already installed
|
453
|
+
if (this.data("rangeinput")) { return this; }
|
454
|
+
|
455
|
+
// extend configuration with globals
|
456
|
+
conf = $.extend(true, {}, tool.conf, conf);
|
457
|
+
|
458
|
+
var els;
|
459
|
+
|
460
|
+
this.each(function() {
|
461
|
+
var el = new RangeInput($(this), $.extend(true, {}, conf));
|
462
|
+
var input = el.getInput().data("rangeinput", el);
|
463
|
+
els = els ? els.add(input) : input;
|
464
|
+
});
|
465
|
+
|
466
|
+
return els ? els : this;
|
467
|
+
};
|
468
|
+
|
469
|
+
|
470
|
+
}) (jQuery);
|
471
|
+
|