right-rails 1.0.10 → 1.0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +4 -4
- data/Rakefile +4 -4
- data/lib/right_rails.rb +1 -1
- data/public/javascripts/right/autocompleter-src.js +115 -106
- data/public/javascripts/right/autocompleter.js +3 -14
- data/public/javascripts/right/billboard-src.js +58 -38
- data/public/javascripts/right/billboard.js +3 -13
- data/public/javascripts/right/calendar-src.js +136 -133
- data/public/javascripts/right/calendar.js +4 -33
- data/public/javascripts/right/colorpicker-src.js +128 -125
- data/public/javascripts/right/colorpicker.js +4 -23
- data/public/javascripts/right/dialog-src.js +67 -37
- data/public/javascripts/right/dialog.js +3 -17
- data/public/javascripts/right/dnd-src.js +44 -43
- data/public/javascripts/right/dnd.js +3 -16
- data/public/javascripts/right/effects-src.js +125 -98
- data/public/javascripts/right/effects.js +3 -13
- data/public/javascripts/right/in-edit-src.js +54 -38
- data/public/javascripts/right/in-edit.js +4 -10
- data/public/javascripts/right/jquerysh-src.js +344 -20
- data/public/javascripts/right/jquerysh.js +3 -3
- data/public/javascripts/right/json-src.js +22 -35
- data/public/javascripts/right/json.js +4 -7
- data/public/javascripts/right/keys-src.js +87 -0
- data/public/javascripts/right/keys.js +7 -0
- data/public/javascripts/right/lightbox-src.js +76 -58
- data/public/javascripts/right/lightbox.js +3 -20
- data/public/javascripts/right/rails-src.js +108 -107
- data/public/javascripts/right/rails.js +4 -11
- data/public/javascripts/right/rater-src.js +47 -31
- data/public/javascripts/right/rater.js +3 -9
- data/public/javascripts/right/resizable-src.js +60 -33
- data/public/javascripts/right/resizable.js +3 -11
- data/public/javascripts/right/selectable-src.js +87 -51
- data/public/javascripts/right/selectable.js +3 -18
- data/public/javascripts/right/sizzle-src.js +15 -10
- data/public/javascripts/right/sizzle.js +4 -27
- data/public/javascripts/right/slider-src.js +49 -33
- data/public/javascripts/right/slider.js +3 -10
- data/public/javascripts/right/sortable-src.js +46 -32
- data/public/javascripts/right/sortable.js +4 -13
- data/public/javascripts/right/table-src.js +19 -10
- data/public/javascripts/right/table.js +4 -6
- data/public/javascripts/right/tabs-src.js +69 -47
- data/public/javascripts/right/tabs.js +4 -26
- data/public/javascripts/right/tooltips-src.js +78 -56
- data/public/javascripts/right/tooltips.js +4 -9
- data/public/javascripts/right/uploader-src.js +50 -34
- data/public/javascripts/right/uploader.js +3 -9
- data/public/javascripts/right-olds-src.js +528 -355
- data/public/javascripts/right-olds.js +4 -13
- data/public/javascripts/right-safe-src.js +4 -99
- data/public/javascripts/right-safe.js +3 -4
- data/public/javascripts/right-src.js +1618 -1245
- data/public/javascripts/right.js +4 -91
- metadata +8 -6
@@ -1,26 +1,26 @@
|
|
1
1
|
/**
|
2
|
-
* RightJS
|
3
|
-
* Released under the MIT license
|
2
|
+
* RightJS v2.2.2 - http://rightjs.org
|
3
|
+
* Released under the terms of MIT license
|
4
4
|
*
|
5
|
-
* Copyright (C) 2008-
|
5
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
6
6
|
*/
|
7
7
|
/**
|
8
8
|
* The basic layout for RightJS builds
|
9
9
|
*
|
10
|
-
* Copyright (C)
|
10
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
11
11
|
*/
|
12
12
|
var RightJS = (function(window, document, Object, Array, String, Function, Number, Math) {
|
13
13
|
|
14
14
|
/**
|
15
15
|
* The framework description object
|
16
16
|
*
|
17
|
-
* Copyright (C) 2008-
|
17
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
18
18
|
*/
|
19
19
|
var RightJS = function(value) {
|
20
20
|
return value; // <- a dummy method to emulate the safe-mode
|
21
21
|
};
|
22
22
|
|
23
|
-
RightJS.version = "2.
|
23
|
+
RightJS.version = "2.2.2";
|
24
24
|
RightJS.modules =["core", "dom", "form", "events", "xhr", "fx", "cookie"];
|
25
25
|
|
26
26
|
|
@@ -33,18 +33,16 @@ RightJS.modules =["core", "dom", "form", "events", "xhr", "fx", "cookie"];
|
|
33
33
|
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
34
34
|
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
35
35
|
*
|
36
|
-
* Copyright (C) 2008-
|
36
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
37
37
|
*/
|
38
38
|
|
39
39
|
/**
|
40
40
|
* Some top-level variables to shortify the things
|
41
41
|
*/
|
42
|
-
var
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
HTML = document.documentElement, UID = 1, // !#server
|
47
|
-
Wrappers_Cache = [], UID_KEY = '_rjs_id',
|
42
|
+
var A_proto = Array.prototype,
|
43
|
+
to_s = Object.prototype.toString, slice = A_proto.slice,
|
44
|
+
HTML = document.documentElement, UID = 1, // !#server
|
45
|
+
Wrappers_Cache = [], UID_KEY = 'uniqueNumber', // DON'T change the UID_KEY!
|
48
46
|
|
49
47
|
/**
|
50
48
|
* extends the first object with the keys and values of the second one
|
@@ -78,7 +76,7 @@ $ext = RightJS.$ext = function(dest, source, dont_overwrite) {
|
|
78
76
|
$eval = RightJS.$eval = function(text) {
|
79
77
|
if (text) {
|
80
78
|
if ('execScript' in window) {
|
81
|
-
|
79
|
+
current_Document.win()._.execScript(text);
|
82
80
|
} else {
|
83
81
|
$E('script', {text: text}).insertTo(HTML);
|
84
82
|
}
|
@@ -92,7 +90,7 @@ $eval = RightJS.$eval = function(text) {
|
|
92
90
|
* @throws Break
|
93
91
|
*/
|
94
92
|
$break = RightJS.$break = function() {
|
95
|
-
throw new
|
93
|
+
throw new Break();
|
96
94
|
},
|
97
95
|
|
98
96
|
/**
|
@@ -189,7 +187,7 @@ isArray = RightJS.isArray = function(value) {
|
|
189
187
|
* @return boolean check result
|
190
188
|
*/
|
191
189
|
isElement = RightJS.isElement = function(value) {
|
192
|
-
return
|
190
|
+
return value != null && value.nodeType === 1;
|
193
191
|
},
|
194
192
|
|
195
193
|
/** !#server
|
@@ -199,7 +197,7 @@ isElement = RightJS.isElement = function(value) {
|
|
199
197
|
* @return boolean check result
|
200
198
|
*/
|
201
199
|
isNode = RightJS.isNode = function(value) {
|
202
|
-
return
|
200
|
+
return value != null && value.nodeType != null;
|
203
201
|
},
|
204
202
|
|
205
203
|
/** !#server
|
@@ -209,37 +207,24 @@ isNode = RightJS.isNode = function(value) {
|
|
209
207
|
* @return Element or null
|
210
208
|
*/
|
211
209
|
$ = RightJS.$ = function(object) {
|
212
|
-
if (
|
210
|
+
if (object instanceof Wrapper) {
|
211
|
+
return object;
|
212
|
+
} else if (typeof object === 'string') {
|
213
213
|
object = document.getElementById(object);
|
214
214
|
}
|
215
215
|
|
216
|
-
|
217
|
-
var wrapper = UID_KEY in object ? Wrappers_Cache[object[UID_KEY]] : undefined;
|
218
|
-
if (wrapper !== undefined) {
|
219
|
-
object = wrapper;
|
220
|
-
} else if (object.nodeType === 1) {
|
221
|
-
object = new Element(object);
|
222
|
-
} else if (isElement(object.target) || isElement(object.srcElement)) {
|
223
|
-
object = new Event(object);
|
224
|
-
} else if (object.nodeType === 9) {
|
225
|
-
object = new Document(object);
|
226
|
-
} else if (object.window == object) {
|
227
|
-
object = new Window(object);
|
228
|
-
}
|
229
|
-
}
|
230
|
-
|
231
|
-
return object;
|
216
|
+
return wrap(object);
|
232
217
|
},
|
233
218
|
|
234
219
|
/** !#server
|
235
220
|
* Finds all the elements in the document by the given css_rule
|
236
221
|
*
|
237
222
|
* @param String element
|
238
|
-
* @param
|
223
|
+
* @param Boolean raw search marker
|
239
224
|
* @return Array search result
|
240
225
|
*/
|
241
|
-
$$ = RightJS.$$ = function(css_rule,
|
242
|
-
return
|
226
|
+
$$ = RightJS.$$ = function(css_rule, raw) {
|
227
|
+
return current_Document.find(css_rule, raw);
|
243
228
|
},
|
244
229
|
|
245
230
|
/** !#server
|
@@ -263,23 +248,6 @@ $w = RightJS.$w = function(string) {
|
|
263
248
|
return string.trim().split(/\s+/);
|
264
249
|
},
|
265
250
|
|
266
|
-
/**
|
267
|
-
* converts any iterables into an array
|
268
|
-
*
|
269
|
-
* @param Object iterable
|
270
|
-
* @return Array list
|
271
|
-
*/
|
272
|
-
$A = RightJS.$A = function(it) {
|
273
|
-
try {
|
274
|
-
return slice.call(it);
|
275
|
-
} catch(e) {
|
276
|
-
for (var a=[], i=0, length = it.length; i < length; i++) {
|
277
|
-
a[i] = it[i];
|
278
|
-
}
|
279
|
-
return a;
|
280
|
-
}
|
281
|
-
},
|
282
|
-
|
283
251
|
/**
|
284
252
|
* generates an unique id for an object
|
285
253
|
*
|
@@ -288,16 +256,42 @@ $A = RightJS.$A = function(it) {
|
|
288
256
|
*/
|
289
257
|
$uid = RightJS.$uid = function(item) {
|
290
258
|
return UID_KEY in item ? item[UID_KEY] : (item[UID_KEY] = UID++);
|
259
|
+
},
|
260
|
+
|
261
|
+
/**
|
262
|
+
* converts any iterables into an array
|
263
|
+
*
|
264
|
+
* @param Object iterable
|
265
|
+
* @return Array list
|
266
|
+
*/
|
267
|
+
$A = RightJS.$A = function(it) {
|
268
|
+
return slice.call(it, 0);
|
291
269
|
};
|
292
270
|
|
271
|
+
/** !#server
|
272
|
+
* IE needs a patch for the $A function
|
273
|
+
* because it doesn't handle all the cases
|
274
|
+
*/
|
275
|
+
if (!A_proto.map) {
|
276
|
+
$A = RightJS.$A = function(it) {
|
277
|
+
try {
|
278
|
+
return slice.call(it, 0);
|
279
|
+
} catch(e) {
|
280
|
+
for (var a=[], i=0, length = it.length; i < length; i++) {
|
281
|
+
a[i] = it[i];
|
282
|
+
}
|
283
|
+
return a;
|
284
|
+
}
|
285
|
+
};
|
286
|
+
}
|
287
|
+
|
293
288
|
/** !#server
|
294
289
|
* Internet Explorer needs some additional mumbo-jumbo in here
|
295
290
|
*/
|
296
291
|
if (isHash(HTML)) {
|
297
292
|
isHash = RightJS.isHash = function(value) {
|
298
293
|
return to_s.call(value) === '[object Object]' &&
|
299
|
-
value
|
300
|
-
typeof(value.hasOwnProperty) !== 'undefined';
|
294
|
+
value != null && value.hasOwnProperty != null;
|
301
295
|
};
|
302
296
|
}
|
303
297
|
/**
|
@@ -307,7 +301,7 @@ var i=0, natives = 'Array Function Number String Date RegExp'.split(' '),
|
|
307
301
|
include_native = function() {
|
308
302
|
for (var i=0; i < arguments.length; i++) {
|
309
303
|
if (isHash(arguments[i])) {
|
310
|
-
$ext(this
|
304
|
+
$ext(this.prototype, arguments[i]);
|
311
305
|
$ext(this.Methods, arguments[i]);
|
312
306
|
}
|
313
307
|
}
|
@@ -324,19 +318,6 @@ for (; i < natives.length; i++) {
|
|
324
318
|
RightJS.Object = Object;
|
325
319
|
RightJS.Math = Math;
|
326
320
|
|
327
|
-
|
328
|
-
/** #!server
|
329
|
-
* A functions brutal hackery helper
|
330
|
-
*
|
331
|
-
* @param Function original function
|
332
|
-
* @param RegExp expression
|
333
|
-
* @param String replacement
|
334
|
-
* @return freshly hacked function
|
335
|
-
*/
|
336
|
-
function patch_function(func, re, replacement) {
|
337
|
-
return eval('['+ func.toString().replace(re, replacement) + ']')[0];
|
338
|
-
}
|
339
|
-
|
340
321
|
/**
|
341
322
|
* Checks if the data is an array and if not,
|
342
323
|
* then makes an array out of it
|
@@ -356,7 +337,7 @@ function ensure_array(data) {
|
|
356
337
|
* Some functionality is inspired by
|
357
338
|
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
358
339
|
*
|
359
|
-
* Copyright (C) 2008-
|
340
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
360
341
|
*/
|
361
342
|
$ext(Object, {
|
362
343
|
/**
|
@@ -485,10 +466,13 @@ $ext(Object, {
|
|
485
466
|
* @return Object merged object
|
486
467
|
*/
|
487
468
|
merge: function() {
|
488
|
-
var object = {}, i=0,
|
489
|
-
for (; i < length; i++) {
|
490
|
-
if (isHash(
|
491
|
-
|
469
|
+
var object = {}, i=0, args=arguments, key;
|
470
|
+
for (; i < args.length; i++) {
|
471
|
+
if (isHash(args[i])) {
|
472
|
+
for (key in args[i]) {
|
473
|
+
object[key] = isHash(args[i][key]) && !(args[i][key] instanceof Class) ?
|
474
|
+
Object.merge(key in object ? object[key] : {}, args[i][key]) : args[i][key];
|
475
|
+
}
|
492
476
|
}
|
493
477
|
}
|
494
478
|
return object;
|
@@ -557,34 +541,76 @@ Math.random = function(min, max) {
|
|
557
541
|
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
558
542
|
* - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto
|
559
543
|
*
|
560
|
-
* Copyright (C) 2008-2010 Nikolay
|
544
|
+
* Copyright (C) 2008-2010 Nikolay Nemshilov
|
561
545
|
*/
|
562
546
|
var original_sort = A_proto.sort,
|
563
547
|
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
548
|
+
// JavaScript 1.6 methods recatching up or faking
|
549
|
+
for_each = A_proto.forEach || function(callback, scope) {
|
550
|
+
for (var i=0; i < this.length; i++) {
|
551
|
+
callback.call(scope, this[i], i, this);
|
552
|
+
}
|
553
|
+
},
|
554
|
+
|
555
|
+
filter = A_proto.filter || function(callback, scope) {
|
556
|
+
for (var result=[], j=0, i=0; i < this.length; i++) {
|
557
|
+
if (callback.call(scope, this[i], i, this)) {
|
558
|
+
result[j++] = this[i];
|
559
|
+
}
|
560
|
+
}
|
561
|
+
return result;
|
562
|
+
},
|
563
|
+
|
564
|
+
reject = function(callback, scope) {
|
565
|
+
for (var result=[], j=0, i=0; i < this.length; i++) {
|
566
|
+
if (!callback.call(scope, this[i], i, this)) {
|
567
|
+
result[j++] = this[i];
|
568
|
+
}
|
569
|
+
}
|
570
|
+
return result;
|
571
|
+
},
|
572
|
+
|
573
|
+
map = A_proto.map || function(callback, scope) {
|
574
|
+
for (var result=[], i=0; i < this.length; i++) {
|
575
|
+
result[i] = callback.call(scope, this[i], i, this);
|
576
|
+
}
|
577
|
+
return result;
|
578
|
+
},
|
579
|
+
|
580
|
+
some = A_proto.some || function(callback, scope) {
|
581
|
+
for (var i=0; i < this.length; i++) {
|
582
|
+
if (callback.call(scope, this[i], i, this)) {
|
583
|
+
return true;
|
584
|
+
}
|
585
|
+
}
|
586
|
+
return false;
|
587
|
+
},
|
588
|
+
|
589
|
+
every = A_proto.every || function(callback, scope) {
|
590
|
+
for (var i=0; i < this.length; i++) {
|
591
|
+
if (!callback.call(scope, this[i], i, this)) {
|
592
|
+
return false;
|
593
|
+
}
|
594
|
+
}
|
595
|
+
return true;
|
596
|
+
},
|
597
|
+
|
598
|
+
first = function(callback, scope) {
|
599
|
+
for (var i=0; i < this.length; i++) {
|
600
|
+
if (callback.call(scope, this[i], i, this)) {
|
601
|
+
return this[i];
|
602
|
+
}
|
603
|
+
}
|
604
|
+
return undefined;
|
571
605
|
},
|
572
606
|
|
573
|
-
// JavaScript 1.6 methods recatching up or faking
|
574
|
-
for_each = A_proto.forEach || build_loop('', '_', ''),
|
575
|
-
filter = A_proto.filter || build_loop('r=[],j=0,', 'if(_)r[j++]=this[i]', 'return r'),
|
576
|
-
reject = build_loop('r=[],j=0,', 'if(!_)r[j++]=this[i]', 'return r'),
|
577
|
-
map = A_proto.map || build_loop('r=[],', 'r[i]=_', 'return r'),
|
578
|
-
some = A_proto.some || build_loop('', 'if(_)return true', 'return false'),
|
579
|
-
every = A_proto.every || build_loop('', 'if(!_)return false', 'return true'),
|
580
|
-
first = build_loop('', 'if(_)return this[i]', 'return [][0]'),
|
581
607
|
last = function(callback, scope) {
|
582
608
|
for (var i=this.length-1; i > -1; i--) {
|
583
609
|
if (callback.call(scope, this[i], i, this)) {
|
584
610
|
return this[i];
|
585
611
|
}
|
586
612
|
}
|
587
|
-
return
|
613
|
+
return undefined;
|
588
614
|
};
|
589
615
|
|
590
616
|
|
@@ -596,9 +622,9 @@ last = function(callback, scope) {
|
|
596
622
|
function guess_callback(argsi, array) {
|
597
623
|
var callback = argsi[0], args = slice.call(argsi, 1), scope = array, attr;
|
598
624
|
|
599
|
-
if (
|
625
|
+
if (typeof(callback) === 'string') {
|
600
626
|
attr = callback;
|
601
|
-
if (array.length &&
|
627
|
+
if (array.length !== 0 && typeof(array[0][attr]) === 'function') {
|
602
628
|
callback = function(object) { return object[attr].apply(object, args); };
|
603
629
|
} else {
|
604
630
|
callback = function(object) { return object[attr]; };
|
@@ -610,15 +636,16 @@ function guess_callback(argsi, array) {
|
|
610
636
|
return [callback, scope];
|
611
637
|
}
|
612
638
|
|
639
|
+
// defining the manual break errors class
|
640
|
+
function Break() {}
|
641
|
+
|
613
642
|
// calls the given method with preprocessing the arguments
|
614
643
|
function call_method(func, scope, args) {
|
615
|
-
var result;
|
616
|
-
|
617
644
|
try {
|
618
|
-
|
619
|
-
} catch(e) { if (!(e instanceof
|
645
|
+
return func.apply(scope, guess_callback(args, scope));
|
646
|
+
} catch(e) { if (!(e instanceof Break)) { throw(e); } }
|
620
647
|
|
621
|
-
return
|
648
|
+
return undefined;
|
622
649
|
}
|
623
650
|
|
624
651
|
// checks the value as a boolean
|
@@ -641,7 +668,7 @@ Array.include({
|
|
641
668
|
* @return Integer index or -1 if not found
|
642
669
|
*/
|
643
670
|
indexOf: A_proto.indexOf || function(value, from) {
|
644
|
-
for (var i=(from<0) ? Math.max(0, this.length+from) : from || 0
|
671
|
+
for (var i=(from<0) ? Math.max(0, this.length+from) : from || 0; i < this.length; i++) {
|
645
672
|
if (this[i] === value) {
|
646
673
|
return i;
|
647
674
|
}
|
@@ -689,7 +716,7 @@ Array.include({
|
|
689
716
|
* @return mixed a random item
|
690
717
|
*/
|
691
718
|
random: function() {
|
692
|
-
return this.length ? this[Math.random(this.length-1)]
|
719
|
+
return this.length === 0 ? undefined : this[Math.random(this.length-1)];
|
693
720
|
},
|
694
721
|
|
695
722
|
/**
|
@@ -716,7 +743,7 @@ Array.include({
|
|
716
743
|
* @return boolean check result
|
717
744
|
*/
|
718
745
|
empty: function() {
|
719
|
-
return
|
746
|
+
return this.length === 0;
|
720
747
|
},
|
721
748
|
|
722
749
|
/**
|
@@ -818,11 +845,10 @@ Array.include({
|
|
818
845
|
* @return Array new merged
|
819
846
|
*/
|
820
847
|
merge: function() {
|
821
|
-
for (var copy = this.clone(), arg, i=0
|
822
|
-
arg = arguments[i];
|
823
|
-
arg = ensure_array(arg);
|
848
|
+
for (var copy = this.clone(), arg, i=0; i < arguments.length; i++) {
|
849
|
+
arg = ensure_array(arguments[i]);
|
824
850
|
|
825
|
-
for (j=0; j < arg.length; j++) {
|
851
|
+
for (var j=0; j < arg.length; j++) {
|
826
852
|
if (copy.indexOf(arg[j]) == -1) {
|
827
853
|
copy.push(arg[j]);
|
828
854
|
}
|
@@ -875,8 +901,8 @@ Array.include({
|
|
875
901
|
* @return boolean check result
|
876
902
|
*/
|
877
903
|
includes: function() {
|
878
|
-
for (var i=0
|
879
|
-
if (this.indexOf(arguments[i])
|
904
|
+
for (var i=0; i < arguments.length; i++) {
|
905
|
+
if (this.indexOf(arguments[i]) === -1) {
|
880
906
|
return false;
|
881
907
|
}
|
882
908
|
}
|
@@ -891,9 +917,9 @@ Array.include({
|
|
891
917
|
* @return Array filtered copy
|
892
918
|
*/
|
893
919
|
without: function() {
|
894
|
-
var filter =
|
920
|
+
var filter = slice.call(arguments);
|
895
921
|
return this.filter(function(value) {
|
896
|
-
return
|
922
|
+
return filter.indexOf(value) === -1;
|
897
923
|
});
|
898
924
|
},
|
899
925
|
|
@@ -962,14 +988,12 @@ Array.include({
|
|
962
988
|
* @return Number a summ of values on the list
|
963
989
|
*/
|
964
990
|
sum: function() {
|
965
|
-
for(var
|
991
|
+
for(var sum=0, i=0; i<this.length; sum += this[i++]) {}
|
966
992
|
return sum;
|
967
993
|
}
|
968
994
|
});
|
969
995
|
|
970
|
-
|
971
|
-
include: 'includes'
|
972
|
-
});
|
996
|
+
A_proto.include = A_proto.includes;
|
973
997
|
|
974
998
|
|
975
999
|
/**
|
@@ -981,7 +1005,7 @@ $alias(A_proto, {
|
|
981
1005
|
* The trim function taken from work of Steven Levithan
|
982
1006
|
* - http://blog.stevenlevithan.com/archives/faster-trim-javascript
|
983
1007
|
*
|
984
|
-
* Copyright (C) 2008-
|
1008
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
985
1009
|
*/
|
986
1010
|
String.include({
|
987
1011
|
/**
|
@@ -999,7 +1023,7 @@ String.include({
|
|
999
1023
|
* @return boolean check result
|
1000
1024
|
*/
|
1001
1025
|
blank: function() {
|
1002
|
-
return
|
1026
|
+
return this == false;
|
1003
1027
|
},
|
1004
1028
|
|
1005
1029
|
/**
|
@@ -1007,7 +1031,7 @@ String.include({
|
|
1007
1031
|
*
|
1008
1032
|
* @return String trimmed version
|
1009
1033
|
*/
|
1010
|
-
trim: String
|
1034
|
+
trim: String.prototype.trim || function() {
|
1011
1035
|
var str = this.replace(/^\s\s*/, ''), i = str.length;
|
1012
1036
|
while ((/\s/).test(str.charAt(--i))) {}
|
1013
1037
|
return str.slice(0, i + 1);
|
@@ -1028,10 +1052,13 @@ String.include({
|
|
1028
1052
|
* @return String without scripts
|
1029
1053
|
*/
|
1030
1054
|
stripScripts: function(option) {
|
1031
|
-
var scripts = '', text = this.replace(
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1055
|
+
var scripts = '', text = this.replace(
|
1056
|
+
/<script[^>]*>([\s\S]*?)<\/script>/img,
|
1057
|
+
function(match, source) {
|
1058
|
+
scripts += source + "\n";
|
1059
|
+
return '';
|
1060
|
+
}
|
1061
|
+
);
|
1035
1062
|
|
1036
1063
|
if (option === true) {
|
1037
1064
|
$eval(scripts);
|
@@ -1108,9 +1135,9 @@ String.include({
|
|
1108
1135
|
* @return boolean check result
|
1109
1136
|
*/
|
1110
1137
|
startsWith: function(string, ignorecase) {
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1138
|
+
return (ignorecase !== true ? this.indexOf(string) :
|
1139
|
+
this.toLowerCase().indexOf(string.toLowerCase())
|
1140
|
+
) === 0;
|
1114
1141
|
},
|
1115
1142
|
|
1116
1143
|
/**
|
@@ -1121,9 +1148,10 @@ String.include({
|
|
1121
1148
|
* @return boolean check result
|
1122
1149
|
*/
|
1123
1150
|
endsWith: function(string, ignorecase) {
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1151
|
+
return this.length - (
|
1152
|
+
ignorecase !== true ? this.lastIndexOf(string) :
|
1153
|
+
this.toLowerCase().lastIndexOf(string.toLowerCase())
|
1154
|
+
) === string.length;
|
1127
1155
|
},
|
1128
1156
|
|
1129
1157
|
/**
|
@@ -1132,7 +1160,7 @@ String.include({
|
|
1132
1160
|
* @return Integer or NaN
|
1133
1161
|
*/
|
1134
1162
|
toInt: function(base) {
|
1135
|
-
return parseInt(this, base
|
1163
|
+
return parseInt(this, base === undefined ? 10 : base);
|
1136
1164
|
},
|
1137
1165
|
|
1138
1166
|
/**
|
@@ -1141,12 +1169,13 @@ String.include({
|
|
1141
1169
|
* @return Float or NaN
|
1142
1170
|
*/
|
1143
1171
|
toFloat: function(strict) {
|
1144
|
-
return parseFloat(strict ? this :
|
1172
|
+
return parseFloat(strict === true ? this :
|
1173
|
+
this.replace(',', '.').replace(/(\d)-(\d)/, '$1.$2'));
|
1145
1174
|
}
|
1146
1175
|
|
1147
1176
|
});
|
1148
1177
|
|
1149
|
-
|
1178
|
+
String.prototype.include = String.prototype.includes;
|
1150
1179
|
|
1151
1180
|
|
1152
1181
|
/**
|
@@ -1156,7 +1185,7 @@ $alias(String[PROTO], {include: 'includes'});
|
|
1156
1185
|
* Some of the functionality inspired by
|
1157
1186
|
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
1158
1187
|
*
|
1159
|
-
* Copyright (C) 2008-
|
1188
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
1160
1189
|
*/
|
1161
1190
|
Function.include({
|
1162
1191
|
/**
|
@@ -1170,7 +1199,10 @@ Function.include({
|
|
1170
1199
|
bind: function() {
|
1171
1200
|
var args = $A(arguments), scope = args.shift(), func = this;
|
1172
1201
|
return function() {
|
1173
|
-
return func.apply(scope,
|
1202
|
+
return func.apply(scope,
|
1203
|
+
(args.length !== 0 || arguments.length !== 0) ?
|
1204
|
+
args.concat($A(arguments)) : args
|
1205
|
+
);
|
1174
1206
|
};
|
1175
1207
|
},
|
1176
1208
|
|
@@ -1362,81 +1394,65 @@ RegExp.escape = function(string) {
|
|
1362
1394
|
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
1363
1395
|
* - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto
|
1364
1396
|
*
|
1365
|
-
* Copyright (C) 2008-
|
1397
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
1366
1398
|
*/
|
1367
1399
|
var Class = RightJS.Class = function() {
|
1368
|
-
var args
|
1369
|
-
|
1400
|
+
var args = $A(arguments).slice(0,2),
|
1401
|
+
props = args.pop() || {},
|
1402
|
+
parent = args.pop(),
|
1403
|
+
klass = arguments[2], // you can send your own klass as the third argument
|
1404
|
+
SKlass = function() {};
|
1405
|
+
|
1406
|
+
// if the parent class only was specified
|
1407
|
+
if (!args.length && !isHash(props)) {
|
1408
|
+
parent = props; props = {};
|
1409
|
+
}
|
1370
1410
|
|
1371
1411
|
// !#server:begin
|
1372
|
-
if (
|
1373
|
-
|
1412
|
+
if (!klass && parent && (parent === Wrapper || parent.ancestors.include(Wrapper))) {
|
1413
|
+
klass = Wrapper_makeKlass();
|
1374
1414
|
}
|
1375
1415
|
// !#server:end
|
1376
1416
|
|
1377
|
-
// basic
|
1378
|
-
|
1379
|
-
|
1380
|
-
|
1381
|
-
|
1382
|
-
|
1383
|
-
|
1384
|
-
|
1385
|
-
|
1417
|
+
// defining the basic klass function
|
1418
|
+
klass = $ext(klass || function() {
|
1419
|
+
Class_checkPrebind(this);
|
1420
|
+
return 'initialize' in this ?
|
1421
|
+
this.initialize.apply(this, arguments) :
|
1422
|
+
this;
|
1423
|
+
}, Class_Methods);
|
1424
|
+
|
1425
|
+
// handling the inheritance
|
1426
|
+
parent = parent || Class;
|
1427
|
+
|
1428
|
+
SKlass.prototype = parent.prototype;
|
1429
|
+
klass.prototype = new SKlass();
|
1430
|
+
klass.parent = parent;
|
1431
|
+
klass.prototype.constructor = klass;
|
1432
|
+
|
1433
|
+
// collecting the list of ancestors
|
1434
|
+
klass.ancestors = [];
|
1435
|
+
while (parent) {
|
1436
|
+
klass.ancestors.push(parent);
|
1437
|
+
parent = parent.parent;
|
1386
1438
|
}
|
1387
1439
|
|
1388
|
-
//
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
1393
|
-
|
1394
|
-
$ext(klass, Class_Methods).inherit(parent);
|
1395
|
-
|
1396
|
-
// catching the injections
|
1397
|
-
Class_attachInjections(klass, properties);
|
1440
|
+
// handling the module injections
|
1441
|
+
['extend', 'include'].each(function(name) {
|
1442
|
+
if (name in props) {
|
1443
|
+
klass[name].apply(klass, ensure_array(props[name]));
|
1444
|
+
}
|
1445
|
+
});
|
1398
1446
|
|
1399
|
-
return klass.include(
|
1447
|
+
return klass.include(props);
|
1400
1448
|
},
|
1401
1449
|
|
1402
1450
|
/**
|
1403
1451
|
* Class utility methods
|
1404
1452
|
*
|
1405
|
-
* Copyright (C) 2008-
|
1453
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
1406
1454
|
*/
|
1407
|
-
commons = $w('selfExtended self_extended selfIncluded self_included'),
|
1408
|
-
extend = commons.concat($w(PROTO+' parent extend include')),
|
1409
|
-
include = commons.concat(['constructor']),
|
1410
|
-
clean_module = function (module, ext) {
|
1411
|
-
return Object.without.apply(Object, [module].concat(ext ? extend : include));
|
1412
|
-
},
|
1413
|
-
|
1414
1455
|
Class_Methods = {
|
1415
|
-
/**
|
1416
|
-
* Makes the class get inherited from another one
|
1417
|
-
*
|
1418
|
-
* @param Object another class
|
1419
|
-
* @return Class this
|
1420
|
-
*/
|
1421
|
-
inherit: function(parent) {
|
1422
|
-
// handling the parent class assign
|
1423
|
-
if (parent && parent[PROTO]) {
|
1424
|
-
var s_klass = dummy();
|
1425
|
-
s_klass[PROTO] = parent[PROTO];
|
1426
|
-
this[PROTO] = new s_klass();
|
1427
|
-
this.parent = parent;
|
1428
|
-
}
|
1429
|
-
|
1430
|
-
// collecting the list of ancestors
|
1431
|
-
this.ancestors = [];
|
1432
|
-
while (parent) {
|
1433
|
-
this.ancestors.push(parent);
|
1434
|
-
parent = parent.parent;
|
1435
|
-
}
|
1436
|
-
|
1437
|
-
return (this[PROTO].constructor = this);
|
1438
|
-
},
|
1439
|
-
|
1440
1456
|
/**
|
1441
1457
|
* this method will extend the class-level with the given objects
|
1442
1458
|
*
|
@@ -1453,13 +1469,8 @@ Class_Methods = {
|
|
1453
1469
|
*/
|
1454
1470
|
extend: function() {
|
1455
1471
|
$A(arguments).filter(isHash).each(function(module) {
|
1456
|
-
|
1457
|
-
|
1458
|
-
$ext(this, clean_module(module, true));
|
1459
|
-
|
1460
|
-
if (callback) {
|
1461
|
-
callback.call(module, this);
|
1462
|
-
}
|
1472
|
+
$ext(this, Class_clean_module(module, true));
|
1473
|
+
Class_handle_module_callbacks(this, module, true);
|
1463
1474
|
}, this);
|
1464
1475
|
|
1465
1476
|
return this;
|
@@ -1475,44 +1486,53 @@ Class_Methods = {
|
|
1475
1486
|
* @return Class the klass
|
1476
1487
|
*/
|
1477
1488
|
include: function() {
|
1478
|
-
var
|
1489
|
+
var klasses = [this].concat(this.ancestors);
|
1479
1490
|
|
1480
1491
|
$A(arguments).filter(isHash).each(function(module) {
|
1481
|
-
|
1482
|
-
|
1483
|
-
|
1484
|
-
|
1492
|
+
Object.each(Class_clean_module(module, false), function(name, method) {
|
1493
|
+
// searching for the super-method
|
1494
|
+
for (var super_method, i=0; i < klasses.length; i++) {
|
1495
|
+
if (name in klasses[i].prototype) {
|
1496
|
+
super_method = klasses[i].prototype[name];
|
1497
|
+
break;
|
1498
|
+
}
|
1499
|
+
}
|
1485
1500
|
|
1486
|
-
this[
|
1487
|
-
|
1488
|
-
|
1489
|
-
|
1501
|
+
this.prototype[name] = isFunction(method) && isFunction(super_method) ?
|
1502
|
+
function() {
|
1503
|
+
this.$super = super_method;
|
1504
|
+
return method.apply(this, arguments);
|
1505
|
+
} : method;
|
1490
1506
|
}, this);
|
1491
1507
|
|
1492
|
-
|
1493
|
-
callback.call(module, this);
|
1494
|
-
}
|
1508
|
+
Class_handle_module_callbacks(this, module, false);
|
1495
1509
|
}, this);
|
1496
1510
|
|
1497
1511
|
return this;
|
1498
1512
|
}
|
1499
|
-
}
|
1513
|
+
},
|
1500
1514
|
|
1501
|
-
|
1502
|
-
|
1503
|
-
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
1507
|
-
|
1508
|
-
|
1509
|
-
|
1510
|
-
|
1511
|
-
|
1512
|
-
|
1513
|
-
|
1514
|
-
|
1515
|
-
|
1515
|
+
Class_module_callback_names = $w(
|
1516
|
+
'selfExtended self_extended selfIncluded self_included extend include'
|
1517
|
+
);
|
1518
|
+
|
1519
|
+
// hooking up the class-methods to the root class
|
1520
|
+
$ext(Class, Class_Methods);
|
1521
|
+
Class.prototype.$super = undefined;
|
1522
|
+
|
1523
|
+
function Class_clean_module(module, extend) {
|
1524
|
+
return Object.without.apply(Object, [module].concat(
|
1525
|
+
Class_module_callback_names.concat( extend ?
|
1526
|
+
$w('prototype parent ancestors') : ['constructor']
|
1527
|
+
)
|
1528
|
+
));
|
1529
|
+
}
|
1530
|
+
|
1531
|
+
function Class_handle_module_callbacks(klass, module, extend) {
|
1532
|
+
(module[Class_module_callback_names[extend ? 0 : 2]] ||
|
1533
|
+
module[Class_module_callback_names[extend ? 1 : 3]] ||
|
1534
|
+
function() {}
|
1535
|
+
).call(module, klass);
|
1516
1536
|
}
|
1517
1537
|
|
1518
1538
|
/**
|
@@ -1528,14 +1548,35 @@ function Class_attachInjections(klass, properties) {
|
|
1528
1548
|
* @return Object hash or null if nothing found
|
1529
1549
|
*/
|
1530
1550
|
function Class_findSet(object, property) {
|
1531
|
-
var upcased
|
1551
|
+
var upcased = property.toUpperCase(),
|
1532
1552
|
constructor = object.constructor,
|
1533
|
-
candidates
|
1534
|
-
|
1553
|
+
candidates = [object, constructor].concat(constructor.ancestors || []),
|
1554
|
+
i = 0;
|
1555
|
+
|
1556
|
+
for (; i < candidates.length; i++) {
|
1557
|
+
if (upcased in candidates[i]) {
|
1558
|
+
return candidates[i][upcased];
|
1559
|
+
} else if (property in candidates[i]) {
|
1560
|
+
return candidates[i][property];
|
1561
|
+
}
|
1562
|
+
}
|
1535
1563
|
|
1536
|
-
return
|
1564
|
+
return null;
|
1537
1565
|
}
|
1538
1566
|
|
1567
|
+
/**
|
1568
|
+
* Handles the 'prebind' feature for Class instances
|
1569
|
+
*
|
1570
|
+
* @param Class instance
|
1571
|
+
* @return void
|
1572
|
+
*/
|
1573
|
+
function Class_checkPrebind(object) {
|
1574
|
+
if ('prebind' in object && isArray(object.prebind)) {
|
1575
|
+
object.prebind.each(function(method) {
|
1576
|
+
object[method] = object[method].bind(object);
|
1577
|
+
});
|
1578
|
+
}
|
1579
|
+
}
|
1539
1580
|
|
1540
1581
|
/**
|
1541
1582
|
* This is a simple mix-in module to be included in other classes
|
@@ -1547,7 +1588,7 @@ function Class_findSet(object, property) {
|
|
1547
1588
|
* The idea of the module is inspired by
|
1548
1589
|
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
1549
1590
|
*
|
1550
|
-
* Copyright (C) 2008-
|
1591
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
1551
1592
|
*/
|
1552
1593
|
var Options = RightJS.Options = {
|
1553
1594
|
/**
|
@@ -1557,7 +1598,9 @@ var Options = RightJS.Options = {
|
|
1557
1598
|
* @return Object current instance
|
1558
1599
|
*/
|
1559
1600
|
setOptions: function(opts) {
|
1560
|
-
var options = this.options =
|
1601
|
+
var options = this.options = $ext($ext({},
|
1602
|
+
Object.clone(Class_findSet(this, 'Options'))), opts
|
1603
|
+
), match, key;
|
1561
1604
|
|
1562
1605
|
// hooking up the observer options
|
1563
1606
|
if (isFunction(this.on)) {
|
@@ -1597,7 +1640,7 @@ var Options = RightJS.Options = {
|
|
1597
1640
|
* The naming principle is inspired by
|
1598
1641
|
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
1599
1642
|
*
|
1600
|
-
* Copyright (C) 2008-
|
1643
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
1601
1644
|
*/
|
1602
1645
|
var Observer = RightJS.Observer = new Class({
|
1603
1646
|
include: Options,
|
@@ -1609,7 +1652,7 @@ var Observer = RightJS.Observer = new Class({
|
|
1609
1652
|
*/
|
1610
1653
|
initialize: function(options) {
|
1611
1654
|
this.setOptions(options);
|
1612
|
-
Observer_createShortcuts(this, Class_findSet(this, '
|
1655
|
+
Observer_createShortcuts(this, Class_findSet(this, 'Events'));
|
1613
1656
|
return this;
|
1614
1657
|
},
|
1615
1658
|
|
@@ -1624,51 +1667,7 @@ var Observer = RightJS.Observer = new Class({
|
|
1624
1667
|
* @return Observer self
|
1625
1668
|
*/
|
1626
1669
|
on: function() {
|
1627
|
-
|
1628
|
-
|
1629
|
-
if (isString(event)) {
|
1630
|
-
if (!('$listeners' in this)) { this.$listeners = []; }
|
1631
|
-
|
1632
|
-
var callback = args.shift();
|
1633
|
-
switch (typeof callback) {
|
1634
|
-
case "string":
|
1635
|
-
name = callback;
|
1636
|
-
callback = this[callback];
|
1637
|
-
|
1638
|
-
case "function":
|
1639
|
-
var hash = {};
|
1640
|
-
|
1641
|
-
// DON'T move it in the one-line hash variable definition,
|
1642
|
-
// it causes problems with the Konqueror 3 later on
|
1643
|
-
hash.e = event;
|
1644
|
-
hash.f = callback;
|
1645
|
-
hash.a = args;
|
1646
|
-
hash.r = name;
|
1647
|
-
|
1648
|
-
this.$listeners.push(hash);
|
1649
|
-
break;
|
1650
|
-
|
1651
|
-
default:
|
1652
|
-
if (isArray(callback)) {
|
1653
|
-
for (var i=0; i < callback.length; i++) {
|
1654
|
-
this.on.apply(this, [event].concat(
|
1655
|
-
ensure_array(callback[i])
|
1656
|
-
).concat(args));
|
1657
|
-
}
|
1658
|
-
}
|
1659
|
-
}
|
1660
|
-
|
1661
|
-
} else {
|
1662
|
-
// assuming it's a hash of key-value pairs
|
1663
|
-
for (name in event) {
|
1664
|
-
this.on.apply(this, [name].concat(
|
1665
|
-
ensure_array(event[name])
|
1666
|
-
).concat(args));
|
1667
|
-
}
|
1668
|
-
}
|
1669
|
-
|
1670
|
-
|
1671
|
-
|
1670
|
+
Observer_on(this, arguments, function(h) { return h; });
|
1672
1671
|
return this;
|
1673
1672
|
},
|
1674
1673
|
|
@@ -1684,7 +1683,7 @@ var Observer = RightJS.Observer = new Class({
|
|
1684
1683
|
*/
|
1685
1684
|
observes: function(event, callback) {
|
1686
1685
|
if (!isString(event)) { callback = event; event = null; }
|
1687
|
-
if (isString(callback)) { callback = this[callback]; }
|
1686
|
+
if (isString(callback)) { callback = callback in this ? this[callback] : null; }
|
1688
1687
|
|
1689
1688
|
return (this.$listeners || []).some(function(i) {
|
1690
1689
|
return (event && callback) ? i.e === event && i.f === callback :
|
@@ -1703,20 +1702,7 @@ var Observer = RightJS.Observer = new Class({
|
|
1703
1702
|
* @return Observer self
|
1704
1703
|
*/
|
1705
1704
|
stopObserving: function(event, callback) {
|
1706
|
-
|
1707
|
-
for (var key in event) {
|
1708
|
-
this.stopObserving(key, event[key]);
|
1709
|
-
}
|
1710
|
-
} else {
|
1711
|
-
if (!isString(event)) { callback = event; event = null; }
|
1712
|
-
if (isString(callback)){ callback = this[callback]; }
|
1713
|
-
|
1714
|
-
this.$listeners = (this.$listeners || []).filter(function(i) {
|
1715
|
-
return (event && callback) ? (i.e !== event || i.f !== callback) :
|
1716
|
-
(event ? i.e !== event : i.f !== callback);
|
1717
|
-
}, this);
|
1718
|
-
}
|
1719
|
-
|
1705
|
+
Observer_stopObserving(this, event, callback, function() {});
|
1720
1706
|
return this;
|
1721
1707
|
},
|
1722
1708
|
|
@@ -1764,8 +1750,8 @@ var Observer = RightJS.Observer = new Class({
|
|
1764
1750
|
* @return Object extended object
|
1765
1751
|
*/
|
1766
1752
|
Observer_create = Observer.create = function(object, events) {
|
1767
|
-
$ext(object, Object.without(Observer
|
1768
|
-
return Observer_createShortcuts(object, events || Class_findSet(object, '
|
1753
|
+
$ext(object, Object.without(Observer.prototype, 'initialize', 'setOptions'), true);
|
1754
|
+
return Observer_createShortcuts(object, events || Class_findSet(object, 'Events'));
|
1769
1755
|
},
|
1770
1756
|
|
1771
1757
|
/**
|
@@ -1777,7 +1763,10 @@ Observer_create = Observer.create = function(object, events) {
|
|
1777
1763
|
*/
|
1778
1764
|
Observer_createShortcuts = Observer.createShortcuts = function(object, names) {
|
1779
1765
|
(names || []).each(function(name) {
|
1780
|
-
var method_name = 'on'+name.replace(/(^|_|:)([a-z])/g,
|
1766
|
+
var method_name = 'on'+name.replace(/(^|_|:)([a-z])/g,
|
1767
|
+
function(match, pre, chr) { return chr.toUpperCase(); }
|
1768
|
+
);
|
1769
|
+
|
1781
1770
|
if (!(method_name in object)) {
|
1782
1771
|
object[method_name] = function() {
|
1783
1772
|
return this.on.apply(this, [name].concat($A(arguments)));
|
@@ -1788,35 +1777,100 @@ Observer_createShortcuts = Observer.createShortcuts = function(object, names) {
|
|
1788
1777
|
return object;
|
1789
1778
|
};
|
1790
1779
|
|
1780
|
+
function Observer_on(object, o_args, preprocess) {
|
1781
|
+
var args = slice.call(o_args, 2),
|
1782
|
+
event = o_args[0],
|
1783
|
+
callback = o_args[1],
|
1784
|
+
name = false;
|
1785
|
+
|
1786
|
+
if (isString(event)) {
|
1787
|
+
switch (typeof callback) {
|
1788
|
+
case "string":
|
1789
|
+
name = callback;
|
1790
|
+
callback = callback in object ? object[callback] : function() {};
|
1791
|
+
|
1792
|
+
case "function":
|
1793
|
+
('$listeners' in object ? object.$listeners : (
|
1794
|
+
object.$listeners = []
|
1795
|
+
)).push(preprocess({
|
1796
|
+
e: event, f: callback, a: args, r: name || false, t: object
|
1797
|
+
}));
|
1798
|
+
break;
|
1799
|
+
|
1800
|
+
default:
|
1801
|
+
if (isArray(callback)) {
|
1802
|
+
for (var i=0; i < callback.length; i++) {
|
1803
|
+
object.on.apply(object, [event].concat(
|
1804
|
+
ensure_array(callback[i])
|
1805
|
+
).concat(args));
|
1806
|
+
}
|
1807
|
+
}
|
1808
|
+
}
|
1809
|
+
|
1810
|
+
} else {
|
1811
|
+
// assuming it's a hash of key-value pairs
|
1812
|
+
args = slice.call(o_args, 1);
|
1791
1813
|
|
1792
|
-
|
1793
|
-
|
1794
|
-
|
1795
|
-
|
1796
|
-
|
1797
|
-
|
1798
|
-
|
1799
|
-
|
1814
|
+
for (name in event) {
|
1815
|
+
object.on.apply(object, [name].concat(
|
1816
|
+
ensure_array(event[name])
|
1817
|
+
).concat(args));
|
1818
|
+
}
|
1819
|
+
}
|
1820
|
+
}
|
1821
|
+
|
1822
|
+
function Observer_stopObserving(object, event, callback, preprocess) {
|
1823
|
+
if (isHash(event)) {
|
1824
|
+
for (var key in event) {
|
1825
|
+
object.stopObserving(key, event[key]);
|
1826
|
+
}
|
1827
|
+
} else {
|
1828
|
+
if (!isString(event)) { callback = event; event = null; }
|
1829
|
+
if (isString(callback)){ callback = object[callback]; }
|
1830
|
+
|
1831
|
+
object.$listeners = (object.$listeners || []).filter(function(i) {
|
1832
|
+
var result = (event && callback) ?
|
1833
|
+
(i.e !== event || i.f !== callback) :
|
1834
|
+
(event ? i.e !== event : i.f !== callback);
|
1835
|
+
|
1836
|
+
if (!result) { preprocess(i); }
|
1837
|
+
|
1838
|
+
return result;
|
1839
|
+
});
|
1840
|
+
}
|
1841
|
+
}
|
1800
1842
|
|
1801
1843
|
|
1802
1844
|
/**
|
1803
1845
|
* this object will contain info about the current browser
|
1804
1846
|
*
|
1805
|
-
* Copyright (C) 2008-
|
1847
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
1806
1848
|
*/
|
1807
|
-
var agent = navigator.userAgent,
|
1849
|
+
var agent = navigator.userAgent,
|
1850
|
+
Browser_Opera = 'opera' in window,
|
1851
|
+
Browser_IE = 'attachEvent' in window && !Browser_Opera,
|
1808
1852
|
|
1809
1853
|
Browser = RightJS.Browser = {
|
1810
|
-
IE:
|
1811
|
-
Opera:
|
1854
|
+
IE: Browser_IE,
|
1855
|
+
Opera: Browser_Opera,
|
1812
1856
|
WebKit: agent.include('AppleWebKit/'),
|
1813
1857
|
Gecko: agent.include('Gecko') && !agent.include('KHTML'),
|
1814
1858
|
MobileSafari: /Apple.*Mobile.*Safari/.test(agent),
|
1815
1859
|
Konqueror: agent.include('Konqueror'),
|
1816
1860
|
|
1817
|
-
// marker for the browsers which
|
1818
|
-
OLD:
|
1819
|
-
|
1861
|
+
// internal marker for the browsers which require the olds module
|
1862
|
+
OLD: !document.querySelector,
|
1863
|
+
// internal marker for IE browsers version <= 8
|
1864
|
+
IE8L: false
|
1865
|
+
},
|
1866
|
+
|
1867
|
+
IE8_OR_LESS = false;
|
1868
|
+
|
1869
|
+
try {
|
1870
|
+
// checking if that an IE version <= 8
|
1871
|
+
document.createElement('<input/>');
|
1872
|
+
Browser.OLD = Browser.IE8L = IE8_OR_LESS = true;
|
1873
|
+
} catch(e) {}
|
1820
1874
|
|
1821
1875
|
|
1822
1876
|
/**
|
@@ -1826,96 +1880,190 @@ Browser = RightJS.Browser = {
|
|
1826
1880
|
* so that we could control the common functionality
|
1827
1881
|
* among all the wrappers
|
1828
1882
|
*
|
1829
|
-
* Copyright (C) 2010 Nikolay Nemshilov
|
1883
|
+
* Copyright (C) 2010-2011 Nikolay Nemshilov
|
1830
1884
|
*/
|
1831
1885
|
|
1832
|
-
var Wrapper = RightJS.Wrapper =
|
1886
|
+
var Wrapper = RightJS.Wrapper = new Class({
|
1887
|
+
// predefining the property in the prototype
|
1888
|
+
_: undefined,
|
1889
|
+
|
1890
|
+
/**
|
1891
|
+
* Default constructor
|
1892
|
+
*
|
1893
|
+
* @param mixed raw dom unit
|
1894
|
+
* @return void
|
1895
|
+
*/
|
1896
|
+
initialize: function(raw_object) {
|
1897
|
+
this._ = raw_object;
|
1898
|
+
}
|
1899
|
+
});
|
1833
1900
|
|
1834
|
-
|
1835
|
-
|
1836
|
-
this.initialize(object, options);
|
1901
|
+
// exposing the cache so it could be manupulated externally
|
1902
|
+
Wrapper.Cache = Wrappers_Cache;
|
1837
1903
|
|
1838
|
-
|
1904
|
+
// instantiating the actual class object for a wrapper
|
1905
|
+
function Wrapper_makeKlass() {
|
1906
|
+
/**
|
1907
|
+
* Default wrappers Klass function
|
1908
|
+
*
|
1909
|
+
* @param mixed the raw object
|
1910
|
+
* @param Object options
|
1911
|
+
* @return void
|
1912
|
+
*/
|
1913
|
+
return function(object, options) {
|
1914
|
+
Class_checkPrebind(this);
|
1839
1915
|
|
1840
|
-
//
|
1841
|
-
// an element of a subtype via the basic Element constructor
|
1842
|
-
if (this.constructor === Element && (cast = Wrapper.Cast(unit)) !== undefined) {
|
1843
|
-
instance = new cast(unit);
|
1844
|
-
if ('$listeners' in this) {
|
1845
|
-
instance.$listeners = this.$listeners;
|
1846
|
-
}
|
1847
|
-
}
|
1916
|
+
this.initialize.apply(this, arguments); // <- there might be a different number of args in a subclass
|
1848
1917
|
|
1849
|
-
uid
|
1918
|
+
var item = this._, uid = UID_KEY in item ? item[UID_KEY] :
|
1919
|
+
// NOTE we use positive indexes for dom-elements and negative for everything else
|
1920
|
+
(item[UID_KEY] = (item.nodeType === 1 ? 1 : -1) * UID++);
|
1850
1921
|
|
1851
|
-
|
1922
|
+
Wrappers_Cache[uid] = this;
|
1852
1923
|
};
|
1924
|
+
}
|
1853
1925
|
|
1854
|
-
|
1855
|
-
|
1856
|
-
|
1857
|
-
|
1858
|
-
|
1926
|
+
/**
|
1927
|
+
* Element's own Klass function
|
1928
|
+
* we need that because it does some dynamic typecasting mumbo jumbo
|
1929
|
+
* plus we would like to optimize some stuff here and there
|
1930
|
+
*
|
1931
|
+
* @param raw dom element or the tag name
|
1932
|
+
* @param Object options
|
1933
|
+
* @return Element instance
|
1934
|
+
*/
|
1935
|
+
function Element_Klass(element, options) {
|
1936
|
+
Element_initialize(this, element, options);
|
1859
1937
|
|
1860
|
-
|
1861
|
-
|
1938
|
+
var inst = this, raw = inst._, cast = Wrapper.Cast(raw),
|
1939
|
+
uid = UID_KEY in raw ? raw[UID_KEY] : (raw[UID_KEY] = UID++);
|
1940
|
+
|
1941
|
+
if (cast !== undefined) {
|
1942
|
+
inst = new cast(raw, options);
|
1943
|
+
if ('$listeners' in this) {
|
1944
|
+
inst.$listeners = this.$listeners;
|
1945
|
+
}
|
1946
|
+
}
|
1862
1947
|
|
1863
|
-
|
1864
|
-
Class_attachInjections(Klass, methods);
|
1948
|
+
Wrappers_Cache[uid] = inst;
|
1865
1949
|
|
1866
|
-
|
1867
|
-
|
1868
|
-
};
|
1950
|
+
return inst;
|
1951
|
+
}
|
1869
1952
|
|
1870
1953
|
// searches for a suitable class for dynamic typecasting
|
1871
1954
|
Wrapper.Cast = function(unit) {
|
1872
1955
|
return unit.tagName in Element_wrappers ? Element_wrappers[unit.tagName] : undefined;
|
1873
1956
|
};
|
1874
1957
|
|
1875
|
-
// exposing the cache so it could be manupulated externally
|
1876
|
-
Wrapper.Cache = Wrappers_Cache;
|
1877
|
-
|
1878
|
-
|
1879
1958
|
/**
|
1880
|
-
*
|
1959
|
+
* Event's own Klass function, we don't need to check
|
1960
|
+
* nothing in here, don't need to hit the wrappers cache and so one
|
1881
1961
|
*
|
1882
|
-
*
|
1962
|
+
* @param raw dom-event or a string event-name
|
1963
|
+
* @param bounding element or an object with options
|
1964
|
+
* @return void
|
1883
1965
|
*/
|
1884
|
-
|
1885
|
-
|
1886
|
-
|
1887
|
-
|
1966
|
+
function Event_Klass(event, bound_element) {
|
1967
|
+
if (typeof(event) === 'string') {
|
1968
|
+
event = $ext({type: event}, bound_element);
|
1969
|
+
this.stopped = event.bubbles === false;
|
1888
1970
|
|
1889
|
-
|
1890
|
-
|
1891
|
-
|
1971
|
+
if (isHash(bound_element)) {
|
1972
|
+
$ext(this, bound_element);
|
1973
|
+
}
|
1892
1974
|
}
|
1893
|
-
|
1975
|
+
|
1976
|
+
this._ = event;
|
1977
|
+
this.type = event.type;
|
1978
|
+
|
1979
|
+
this.which = event.which;
|
1980
|
+
this.keyCode = event.keyCode;
|
1981
|
+
|
1982
|
+
this.target = wrap(
|
1983
|
+
// Webkit throws events on textual nodes as well, gotta fix that
|
1984
|
+
event.target != null && 'nodeType' in event.target && event.target.nodeType === 3 ?
|
1985
|
+
event.target.parentNode : event.target
|
1986
|
+
);
|
1987
|
+
|
1988
|
+
this.currentTarget = wrap(event.currentTarget);
|
1989
|
+
this.relatedTarget = wrap(event.relatedTarget);
|
1990
|
+
|
1991
|
+
this.pageX = event.pageX;
|
1992
|
+
this.pageY = event.pageY;
|
1993
|
+
|
1994
|
+
// making old IE attrs looks like w3c standards
|
1995
|
+
if (IE8_OR_LESS && 'srcElement' in event) {
|
1996
|
+
this.which = event.button === 2 ? 3 : event.button === 4 ? 2 : 1;
|
1997
|
+
|
1998
|
+
this.target = wrap(event.srcElement) || bound_element;
|
1999
|
+
this.relatedTarget = this.target._ === event.fromElement ? wrap(event.toElement) : this.target;
|
2000
|
+
this.currentTarget = bound_element;
|
2001
|
+
|
2002
|
+
var scrolls = this.target.win().scrolls();
|
2003
|
+
|
2004
|
+
this.pageX = event.clientX + scrolls.x;
|
2005
|
+
this.pageY = event.clientY + scrolls.y;
|
2006
|
+
}
|
2007
|
+
}
|
1894
2008
|
|
1895
2009
|
|
1896
2010
|
/**
|
1897
|
-
*
|
2011
|
+
* Private quick wrapping function, unlike `$`
|
2012
|
+
* it doesn't search by ID and handle double-wrapps
|
2013
|
+
* just pure dom-wrapping functionality
|
1898
2014
|
*
|
1899
|
-
*
|
2015
|
+
* @param raw dom unit
|
2016
|
+
* @return Wrapper dom-wrapper
|
1900
2017
|
*/
|
1901
|
-
|
1902
|
-
|
1903
|
-
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
|
1908
|
-
|
1909
|
-
|
1910
|
-
|
1911
|
-
|
2018
|
+
function wrap(object) {
|
2019
|
+
if (object != null) {
|
2020
|
+
var wrapper = UID_KEY in object ? Wrappers_Cache[object[UID_KEY]] : undefined;
|
2021
|
+
|
2022
|
+
if (wrapper !== undefined) {
|
2023
|
+
return wrapper;
|
2024
|
+
} else if (object.nodeType === 1) {
|
2025
|
+
return new Element(object);
|
2026
|
+
} else if (object.nodeType === 9) {
|
2027
|
+
return new Document(object);
|
2028
|
+
} else if (object.window == object) {
|
2029
|
+
return new Window(object);
|
2030
|
+
} else if (isElement(object.target) || isElement(object.srcElement)) {
|
2031
|
+
return new Event(object);
|
2032
|
+
}
|
2033
|
+
}
|
2034
|
+
|
2035
|
+
return object;
|
2036
|
+
}
|
2037
|
+
|
2038
|
+
/**
|
2039
|
+
* A simple document wrapper
|
2040
|
+
*
|
2041
|
+
* Copyright (C) 2010-2011 Nikolay Nemshilov
|
2042
|
+
*/
|
2043
|
+
var Document = RightJS.Document = new Class(Wrapper, {
|
2044
|
+
// returns the window reference
|
2045
|
+
win: function() {
|
2046
|
+
return wrap(this._.defaultView || this._.parentWindow);
|
2047
|
+
}
|
2048
|
+
}),
|
2049
|
+
|
2050
|
+
// a common local wrapped document reference
|
2051
|
+
current_Document = wrap(document);
|
2052
|
+
|
1912
2053
|
|
2054
|
+
/**
|
2055
|
+
* the window object extensions
|
2056
|
+
*
|
2057
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
2058
|
+
*/
|
2059
|
+
var Window = RightJS.Window = new Class(Wrapper, {
|
1913
2060
|
/**
|
1914
|
-
*
|
2061
|
+
* Selfreference to have a common interface with the rest of the wrappers
|
2062
|
+
* in case of events handling
|
1915
2063
|
*
|
1916
|
-
* @return Window
|
2064
|
+
* @return Window
|
1917
2065
|
*/
|
1918
|
-
|
2066
|
+
win: function() {
|
1919
2067
|
return this;
|
1920
2068
|
},
|
1921
2069
|
|
@@ -1925,7 +2073,7 @@ var Window = RightJS.Window = new Wrapper({
|
|
1925
2073
|
* @return Object x: d+, y: d+
|
1926
2074
|
*/
|
1927
2075
|
size: function() {
|
1928
|
-
var win = this._, html =
|
2076
|
+
var win = this._, html = win.document.documentElement;
|
1929
2077
|
return win.innerWidth ? {x: win.innerWidth, y: win.innerHeight} :
|
1930
2078
|
{x: html.clientWidth, y: html.clientHeight};
|
1931
2079
|
},
|
@@ -1936,7 +2084,7 @@ var Window = RightJS.Window = new Wrapper({
|
|
1936
2084
|
* @return Object x: d+, y: d+
|
1937
2085
|
*/
|
1938
2086
|
scrolls: function() {
|
1939
|
-
var win = this._, doc =
|
2087
|
+
var win = this._, doc = win.document, body = doc.body, html = doc.documentElement;
|
1940
2088
|
|
1941
2089
|
return (win.pageXOffset || win.pageYOffset) ? {x: win.pageXOffset, y: win.pageYOffset} :
|
1942
2090
|
(body && (body.scrollLeft || body.scrollTop)) ? {x: body.scrollLeft, y: body.scrollTop} :
|
@@ -1952,9 +2100,10 @@ var Window = RightJS.Window = new Wrapper({
|
|
1952
2100
|
* @return window self
|
1953
2101
|
*/
|
1954
2102
|
scrollTo: function(left, top, fx_options) {
|
1955
|
-
var left_pos = left, top_pos = top,
|
2103
|
+
var left_pos = left, top_pos = top,
|
2104
|
+
element = isNumber(left) ? null : $(left);
|
1956
2105
|
|
1957
|
-
if(element
|
2106
|
+
if(element instanceof Element) {
|
1958
2107
|
left = element.position();
|
1959
2108
|
}
|
1960
2109
|
|
@@ -1984,9 +2133,9 @@ var Window = RightJS.Window = new Wrapper({
|
|
1984
2133
|
* The additional method names are inspired by
|
1985
2134
|
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
1986
2135
|
*
|
1987
|
-
* Copyright (C) 2008-
|
2136
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
1988
2137
|
*/
|
1989
|
-
var Event = RightJS.Event = new Wrapper
|
2138
|
+
var Event = RightJS.Event = new Class(Wrapper, {
|
1990
2139
|
// predefining the keys to spped up the assignments
|
1991
2140
|
type: null,
|
1992
2141
|
|
@@ -2007,50 +2156,7 @@ var Event = RightJS.Event = new Wrapper({
|
|
2007
2156
|
* @param HTMLElement the bound element
|
2008
2157
|
* @return void
|
2009
2158
|
*/
|
2010
|
-
initialize:
|
2011
|
-
if (typeof event === 'string') {
|
2012
|
-
event = Object.merge({type: event}, bound_element);
|
2013
|
-
this.stopped = event.bubbles === false;
|
2014
|
-
|
2015
|
-
if (isHash(bound_element)) {
|
2016
|
-
$ext(this, bound_element);
|
2017
|
-
}
|
2018
|
-
}
|
2019
|
-
|
2020
|
-
this._ = event;
|
2021
|
-
this.type = event.type;
|
2022
|
-
|
2023
|
-
this.which = event.which;
|
2024
|
-
this.keyCode = event.keyCode;
|
2025
|
-
|
2026
|
-
this.target = $(event.target);
|
2027
|
-
this.currentTarget = $(event.currentTarget);
|
2028
|
-
this.relatedTarget = $(event.relatedTarget);
|
2029
|
-
|
2030
|
-
this.pageX = event.pageX;
|
2031
|
-
this.pageY = event.pageY;
|
2032
|
-
|
2033
|
-
if (!('target' in event) && 'srcElement' in event) {
|
2034
|
-
// grabbin the IE properties
|
2035
|
-
this.which = event.button == 2 ? 3 : event.button == 4 ? 2 : 1;
|
2036
|
-
|
2037
|
-
// faking the target property
|
2038
|
-
this.target = $(event.srcElement) || bound_element;
|
2039
|
-
|
2040
|
-
// faking the relatedTarget, currentTarget and other targets
|
2041
|
-
this.relatedTarget = this.target._ === event.fromElement ? $(event.toElement) : this.target;
|
2042
|
-
this.currentTarget = bound_element;
|
2043
|
-
|
2044
|
-
// faking the mouse position
|
2045
|
-
var scrolls = this.target.window().scrolls();
|
2046
|
-
|
2047
|
-
this.pageX = event.clientX + scrolls.x;
|
2048
|
-
this.pageY = event.clientY + scrolls.y;
|
2049
|
-
} else if (event.target && 'nodeType' in event.target && event.target.nodeType === 3) {
|
2050
|
-
// Safari fix
|
2051
|
-
this.target = $(event.target.parentNode);
|
2052
|
-
}
|
2053
|
-
},
|
2159
|
+
initialize: Event_Klass, // the actual initialization happens in the Klass function
|
2054
2160
|
|
2055
2161
|
/**
|
2056
2162
|
* Stops the event bubbling process
|
@@ -2058,11 +2164,12 @@ var Event = RightJS.Event = new Wrapper({
|
|
2058
2164
|
* @return RightJS.Event this
|
2059
2165
|
*/
|
2060
2166
|
stopPropagation: function() {
|
2061
|
-
if (
|
2167
|
+
if (this._.stopPropagation) {
|
2062
2168
|
this._.stopPropagation();
|
2063
2169
|
} else {
|
2064
2170
|
this._.cancelBubble = true;
|
2065
2171
|
}
|
2172
|
+
|
2066
2173
|
this.stopped = true;
|
2067
2174
|
return this;
|
2068
2175
|
},
|
@@ -2073,11 +2180,12 @@ var Event = RightJS.Event = new Wrapper({
|
|
2073
2180
|
* @return RightJS.Event this
|
2074
2181
|
*/
|
2075
2182
|
preventDefault: function() {
|
2076
|
-
if (
|
2183
|
+
if (this._.preventDefault) {
|
2077
2184
|
this._.preventDefault();
|
2078
2185
|
} else {
|
2079
2186
|
this._.returnValue = false;
|
2080
2187
|
}
|
2188
|
+
|
2081
2189
|
return this;
|
2082
2190
|
},
|
2083
2191
|
|
@@ -2102,15 +2210,20 @@ var Event = RightJS.Event = new Wrapper({
|
|
2102
2210
|
/**
|
2103
2211
|
* Returns the event's offset relative to the target element
|
2104
2212
|
*
|
2105
|
-
* @return Object {x: ..., y: ...}
|
2213
|
+
* @return Object {x: ..., y: ...} or null
|
2106
2214
|
*/
|
2107
2215
|
offset: function() {
|
2108
|
-
|
2216
|
+
if(this.target instanceof Element) {
|
2217
|
+
var element_position = this.target.position();
|
2109
2218
|
|
2110
|
-
|
2111
|
-
|
2112
|
-
|
2113
|
-
|
2219
|
+
return {
|
2220
|
+
x: this.pageX - element_position.x,
|
2221
|
+
y: this.pageY - element_position.y
|
2222
|
+
};
|
2223
|
+
}
|
2224
|
+
|
2225
|
+
// triggered outside browser window (at toolbar etc.)
|
2226
|
+
return null;
|
2114
2227
|
},
|
2115
2228
|
|
2116
2229
|
/**
|
@@ -2122,19 +2235,21 @@ var Event = RightJS.Event = new Wrapper({
|
|
2122
2235
|
* @return Element element or null
|
2123
2236
|
*/
|
2124
2237
|
find: function(css_rule) {
|
2125
|
-
if (this.target instanceof
|
2126
|
-
var target
|
2127
|
-
|
2128
|
-
search = this.currentTarget.find(css_rule);
|
2238
|
+
if (this.target instanceof Wrapper && this.currentTarget instanceof Wrapper) {
|
2239
|
+
var target = this.target._,
|
2240
|
+
search = this.currentTarget.find(css_rule, true);
|
2129
2241
|
|
2130
|
-
|
2131
|
-
|
2132
|
-
|
2133
|
-
|
2134
|
-
|
2242
|
+
while (target) {
|
2243
|
+
if (search.indexOf(target) !== -1) {
|
2244
|
+
return wrap(target);
|
2245
|
+
}
|
2246
|
+
target = target.parentNode;
|
2247
|
+
}
|
2135
2248
|
}
|
2249
|
+
|
2250
|
+
return undefined;
|
2136
2251
|
}
|
2137
|
-
}),
|
2252
|
+
}, Event_Klass),
|
2138
2253
|
|
2139
2254
|
Event_delegation_shortcuts = [];
|
2140
2255
|
|
@@ -2142,95 +2257,87 @@ Event_delegation_shortcuts = [];
|
|
2142
2257
|
/**
|
2143
2258
|
* The DOM Element unit handling
|
2144
2259
|
*
|
2145
|
-
* Copyright (C) 2008-
|
2260
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
2146
2261
|
*/
|
2147
2262
|
|
2148
|
-
|
2149
|
-
|
2150
|
-
|
2151
|
-
|
2152
|
-
|
2153
|
-
|
2154
|
-
|
2155
|
-
|
2156
|
-
|
2157
|
-
|
2158
|
-
|
2263
|
+
var Element = RightJS.Element = new Class(Wrapper, {
|
2264
|
+
/**
|
2265
|
+
* constructor
|
2266
|
+
*
|
2267
|
+
* NOTE: this constructor will dynamically typecast
|
2268
|
+
* the wrappers depending on the element tag-name
|
2269
|
+
*
|
2270
|
+
* @param String element tag name or an HTMLElement instance
|
2271
|
+
* @param Object options
|
2272
|
+
* @return Element element
|
2273
|
+
*/
|
2274
|
+
initialize: function(element, options) {
|
2275
|
+
Element_initialize(this, element, options);
|
2276
|
+
}
|
2159
2277
|
|
2160
|
-
|
2278
|
+
}, Element_Klass),
|
2161
2279
|
|
2162
|
-
|
2280
|
+
Element_wrappers = Element.Wrappers = {},
|
2163
2281
|
elements_cache = {},
|
2164
2282
|
|
2165
2283
|
/**
|
2166
|
-
*
|
2167
|
-
*
|
2168
|
-
* NOTE: this function is called in a context of a dom-wrapper
|
2284
|
+
* bulds dom-elements
|
2169
2285
|
*
|
2170
2286
|
* @param String element tag name
|
2171
2287
|
* @param Object options
|
2172
2288
|
* @return HTMLElement
|
2173
2289
|
*/
|
2174
|
-
|
2175
|
-
|
2176
|
-
|
2177
|
-
|
2178
|
-
// applying the options
|
2179
|
-
if (options !== undefined) {
|
2180
|
-
for (var key in options) {
|
2181
|
-
if (key in element_arguments_map) {
|
2182
|
-
element[element_arguments_map[key]] = options[key];
|
2183
|
-
} else if (key in element_methods_map) {
|
2184
|
-
this[element_methods_map[key]](options[key]);
|
2185
|
-
} else {
|
2186
|
-
this.set(key, options[key]);
|
2187
|
-
}
|
2188
|
-
}
|
2189
|
-
}
|
2290
|
+
make_element = function (tag, options) {
|
2291
|
+
return (tag in elements_cache ? elements_cache[tag] : (
|
2292
|
+
elements_cache[tag] = document.createElement(tag)
|
2293
|
+
)).cloneNode(false);
|
2190
2294
|
};
|
2191
2295
|
|
2192
2296
|
//
|
2193
2297
|
// IE 6,7,8 (not 9!) browsers have a bug with checkbox and radio input elements
|
2194
|
-
// it doesn't place the 'checked' property correctly,
|
2195
|
-
//
|
2298
|
+
// it doesn't place the 'checked' property correctly, plus there are some issues
|
2299
|
+
// with clonned SELECT objects, so we are replaceing the elements maker in here
|
2196
2300
|
//
|
2197
|
-
|
2198
|
-
|
2199
|
-
|
2200
|
-
|
2201
|
-
|
2202
|
-
|
2301
|
+
if (IE8_OR_LESS) {
|
2302
|
+
make_element = function(tag, options) {
|
2303
|
+
if (tag === 'input' && options !== undefined) {
|
2304
|
+
tag = '<input name="'+ options.name +
|
2305
|
+
'" type='+ options.type +
|
2306
|
+
(options.checked ? ' checked' : '') +
|
2307
|
+
'/>';
|
2308
|
+
}
|
2309
|
+
|
2310
|
+
return document.createElement(tag);
|
2311
|
+
};
|
2312
|
+
}
|
2203
2313
|
|
2204
2314
|
/**
|
2205
|
-
*
|
2315
|
+
* Basic element's constructor
|
2206
2316
|
*
|
2317
|
+
* @param Element wrapper instance
|
2318
|
+
* @param mixed raw dom element of a string tag name
|
2319
|
+
* @param Object options
|
2320
|
+
* @return void
|
2207
2321
|
*/
|
2208
|
-
|
2209
|
-
|
2210
|
-
|
2211
|
-
|
2212
|
-
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
|
2217
|
-
|
2218
|
-
|
2219
|
-
|
2220
|
-
|
2221
|
-
|
2222
|
-
} else {
|
2223
|
-
this._ = element;
|
2322
|
+
function Element_initialize(inst, element, options) {
|
2323
|
+
if (typeof element === 'string') {
|
2324
|
+
inst._ = make_element(element, options);
|
2325
|
+
|
2326
|
+
if (options !== undefined) {
|
2327
|
+
for (var key in options) {
|
2328
|
+
switch (key) {
|
2329
|
+
case 'id': inst._.id = options[key]; break;
|
2330
|
+
case 'html': inst._.innerHTML = options[key]; break;
|
2331
|
+
case 'class': inst._.className = options[key]; break;
|
2332
|
+
case 'on': inst.on(options[key]); break;
|
2333
|
+
default: inst.set(key, options[key]);
|
2334
|
+
}
|
2335
|
+
}
|
2224
2336
|
}
|
2225
|
-
}
|
2226
|
-
|
2227
|
-
|
2228
|
-
|
2229
|
-
// constructs the event
|
2230
|
-
construct: element_constructor
|
2231
|
-
});
|
2232
|
-
|
2233
|
-
Element.Wrappers = Element_wrappers;
|
2337
|
+
} else {
|
2338
|
+
inst._ = element;
|
2339
|
+
}
|
2340
|
+
}
|
2234
2341
|
|
2235
2342
|
|
2236
2343
|
/**
|
@@ -2248,12 +2355,16 @@ Element.Wrappers = Element_wrappers;
|
|
2248
2355
|
* The insertions system implementation is inspired by
|
2249
2356
|
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
2250
2357
|
*
|
2251
|
-
* Copyright (C) 2008-
|
2358
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
2252
2359
|
*/
|
2253
2360
|
|
2254
2361
|
Element.include({
|
2255
2362
|
parent: function(css_rule) {
|
2256
|
-
|
2363
|
+
var parent = this._.parentNode, parent_type = parent && parent.nodeType;
|
2364
|
+
|
2365
|
+
return css_rule ? this.parents(css_rule)[0] :
|
2366
|
+
(parent_type === 1 || parent_type === 9) ? // <- IE6 sometimes has a fragment node in there
|
2367
|
+
wrap(parent) : null;
|
2257
2368
|
},
|
2258
2369
|
|
2259
2370
|
parents: function(css_rule) {
|
@@ -2305,7 +2416,7 @@ Element.include({
|
|
2305
2416
|
* The content might be one of the following data
|
2306
2417
|
*
|
2307
2418
|
* o) an element instance
|
2308
|
-
* o) a String
|
2419
|
+
* o) a String (all the scripts will be parsed out and executed)
|
2309
2420
|
* o) a list of Elements
|
2310
2421
|
* o) a hash like {position: content}
|
2311
2422
|
*
|
@@ -2315,7 +2426,7 @@ Element.include({
|
|
2315
2426
|
*/
|
2316
2427
|
insert: function(content, position) {
|
2317
2428
|
var scripts = null, element = this._;
|
2318
|
-
position =
|
2429
|
+
position = position === undefined ? 'bottom' : position;
|
2319
2430
|
|
2320
2431
|
if (typeof(content) !== 'object') {
|
2321
2432
|
scripts = content = (''+content);
|
@@ -2323,11 +2434,12 @@ Element.include({
|
|
2323
2434
|
content = content._;
|
2324
2435
|
}
|
2325
2436
|
|
2326
|
-
Element_insertions[position](element,
|
2327
|
-
|
2328
|
-
(
|
2329
|
-
|
2330
|
-
|
2437
|
+
Element_insertions[position](element,
|
2438
|
+
content.nodeType === undefined ?
|
2439
|
+
Element_createFragment(
|
2440
|
+
(position === 'bottom' || position === 'top') ?
|
2441
|
+
element : element.parentNode, content
|
2442
|
+
) : content
|
2331
2443
|
);
|
2332
2444
|
|
2333
2445
|
if (scripts !== null) { scripts.evalScripts(); }
|
@@ -2404,8 +2516,8 @@ Element.include({
|
|
2404
2516
|
* @return String text content or Element this
|
2405
2517
|
*/
|
2406
2518
|
text: function(text) {
|
2407
|
-
return text === undefined ? this._.
|
2408
|
-
this.update(this.
|
2519
|
+
return text === undefined ? (this._.textContent || this._.innerText) :
|
2520
|
+
this.update(this.doc()._.createTextNode(text));
|
2409
2521
|
},
|
2410
2522
|
|
2411
2523
|
/**
|
@@ -2462,10 +2574,29 @@ Element.include({
|
|
2462
2574
|
* @return Element new clone
|
2463
2575
|
*/
|
2464
2576
|
clone: function() {
|
2465
|
-
|
2466
|
-
|
2467
|
-
|
2468
|
-
|
2577
|
+
return new Element(this._.cloneNode(true));
|
2578
|
+
},
|
2579
|
+
|
2580
|
+
/**
|
2581
|
+
* Returns an index of the element among the other child elements
|
2582
|
+
*
|
2583
|
+
* NOTE: doesn't count the textual nodes!
|
2584
|
+
*
|
2585
|
+
* @return Integer index
|
2586
|
+
*/
|
2587
|
+
index: function() {
|
2588
|
+
var node = this._,
|
2589
|
+
sibling = node.parentNode.firstChild,
|
2590
|
+
index = 0;
|
2591
|
+
|
2592
|
+
while (sibling !== node) {
|
2593
|
+
if (sibling.nodeType === 1) { // counting elements only
|
2594
|
+
index ++;
|
2595
|
+
}
|
2596
|
+
sibling = sibling.nextSibling;
|
2597
|
+
}
|
2598
|
+
|
2599
|
+
return index;
|
2469
2600
|
}
|
2470
2601
|
});
|
2471
2602
|
|
@@ -2478,11 +2609,11 @@ Element.include({
|
|
2478
2609
|
* @return Array found elements
|
2479
2610
|
*/
|
2480
2611
|
function recursively_collect(where, attr, css_rule) {
|
2481
|
-
var node = where._, result = [];
|
2612
|
+
var node = where._, result = [], i=0, no_rule = !css_rule;
|
2482
2613
|
|
2483
2614
|
while ((node = node[attr])) {
|
2484
|
-
if (node.
|
2485
|
-
result
|
2615
|
+
if (node.nodeType === 1 && (no_rule || wrap(node).match(css_rule))) {
|
2616
|
+
result[i++] = wrap(node);
|
2486
2617
|
}
|
2487
2618
|
}
|
2488
2619
|
|
@@ -2544,28 +2675,30 @@ $alias(Element_wraps, {
|
|
2544
2675
|
var fragment = document.createDocumentFragment(),
|
2545
2676
|
tmp_cont = document.createElement('DIV');
|
2546
2677
|
|
2547
|
-
function Element_createFragment(content) {
|
2678
|
+
function Element_createFragment(context, content) {
|
2548
2679
|
if (typeof(content) === 'string') {
|
2549
|
-
var tag =
|
2680
|
+
var tag = context.tagName,
|
2550
2681
|
tmp = tmp_cont,
|
2551
|
-
wrap = Element_wraps[tag]
|
2682
|
+
wrap = tag in Element_wraps ? Element_wraps[tag] : ['', '', 1],
|
2552
2683
|
depth = wrap[2];
|
2553
2684
|
|
2554
2685
|
tmp.innerHTML = wrap[0] + '<'+ tag + '>' + content + '</'+ tag + '>' + wrap[1];
|
2555
2686
|
|
2556
|
-
while (depth--
|
2687
|
+
while (depth-- !== 0) {
|
2557
2688
|
tmp = tmp.firstChild;
|
2558
2689
|
}
|
2559
2690
|
|
2560
2691
|
content = tmp.childNodes;
|
2561
|
-
}
|
2562
2692
|
|
2563
|
-
|
2564
|
-
|
2565
|
-
|
2566
|
-
|
2567
|
-
|
2568
|
-
|
2693
|
+
while (content.length !== 0) {
|
2694
|
+
fragment.appendChild(content[0]);
|
2695
|
+
}
|
2696
|
+
|
2697
|
+
} else {
|
2698
|
+
for (var i=0, length = content.length, node; i < length; i++) {
|
2699
|
+
node = content[content.length === length ? i : 0];
|
2700
|
+
fragment.appendChild(node instanceof Element ? node._ : node);
|
2701
|
+
}
|
2569
2702
|
}
|
2570
2703
|
|
2571
2704
|
return fragment;
|
@@ -2581,7 +2714,7 @@ function Element_createFragment(content) {
|
|
2581
2714
|
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
2582
2715
|
* - Dojo (www.dojotoolkit.org) Copyright (C) The Dojo Foundation
|
2583
2716
|
*
|
2584
|
-
* Copyright (C) 2008-
|
2717
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
2585
2718
|
*/
|
2586
2719
|
Element.include({
|
2587
2720
|
/**
|
@@ -2612,13 +2745,13 @@ Element.include({
|
|
2612
2745
|
c_key = key.indexOf('-') < 0 ? key : key.camelize();
|
2613
2746
|
|
2614
2747
|
if (key === 'opacity') {
|
2615
|
-
if (
|
2748
|
+
if (Browser_IE) {
|
2616
2749
|
element_style.filter = 'alpha(opacity='+ hash[key] * 100 +')';
|
2617
2750
|
} else {
|
2618
2751
|
element_style.opacity = hash[key];
|
2619
2752
|
}
|
2620
2753
|
} else if (key === 'float') {
|
2621
|
-
c_key =
|
2754
|
+
c_key = Browser_IE ? 'styleFloat' : 'cssFloat';
|
2622
2755
|
}
|
2623
2756
|
|
2624
2757
|
element_style[c_key] = hash[key];
|
@@ -2644,10 +2777,12 @@ Element.include({
|
|
2644
2777
|
*
|
2645
2778
|
* @return Object/CSSDefinition computed styles
|
2646
2779
|
*/
|
2647
|
-
computedStyles: function() {
|
2648
|
-
|
2649
|
-
|
2650
|
-
return
|
2780
|
+
computedStyles: HTML.currentStyle ? function() {
|
2781
|
+
return this._.currentStyle || {};
|
2782
|
+
} : HTML.runtimeStyle ? function() {
|
2783
|
+
return this._.runtimeStyle || {};
|
2784
|
+
} : function() {
|
2785
|
+
return this._.ownerDocument.defaultView.getComputedStyle(this._, null);
|
2651
2786
|
},
|
2652
2787
|
|
2653
2788
|
/**
|
@@ -2735,28 +2870,28 @@ Element.include({
|
|
2735
2870
|
* @param String style-key
|
2736
2871
|
* @return String clean style
|
2737
2872
|
*/
|
2738
|
-
function clean_style(style,
|
2739
|
-
|
2740
|
-
|
2741
|
-
|
2742
|
-
|
2743
|
-
|
2744
|
-
|
2745
|
-
|
2873
|
+
function clean_style(style, key) {
|
2874
|
+
key = key.camelize();
|
2875
|
+
|
2876
|
+
if (key === 'opacity') {
|
2877
|
+
return Browser_IE ? (
|
2878
|
+
(/opacity=(\d+)/i.exec(style.filter || '') ||
|
2879
|
+
['', '100'])[1].toInt() / 100
|
2880
|
+
)+'' :style[key].replace(',', '.');
|
2881
|
+
}
|
2746
2882
|
|
2747
|
-
|
2748
|
-
|
2883
|
+
if (key === 'float') {
|
2884
|
+
key = Browser_IE ? 'styleFloat' : 'cssFloat';
|
2885
|
+
}
|
2749
2886
|
|
2750
|
-
|
2751
|
-
value = style[key];
|
2887
|
+
var value = style[key];
|
2752
2888
|
|
2753
|
-
|
2754
|
-
|
2755
|
-
|
2756
|
-
}
|
2889
|
+
// Opera returns named colors with quotes
|
2890
|
+
if (Browser_Opera && /color/i.test(key) && value) {
|
2891
|
+
value = value.replace(/"/g, '');
|
2757
2892
|
}
|
2758
2893
|
|
2759
|
-
return value
|
2894
|
+
return value;
|
2760
2895
|
}
|
2761
2896
|
|
2762
2897
|
|
@@ -2767,7 +2902,7 @@ function clean_style(style, in_key) {
|
|
2767
2902
|
* Most of the naming system in the module inspired by
|
2768
2903
|
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
2769
2904
|
*
|
2770
|
-
* Copyright (C) 2008-
|
2905
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
2771
2906
|
*/
|
2772
2907
|
Element.include({
|
2773
2908
|
/**
|
@@ -2783,11 +2918,15 @@ Element.include({
|
|
2783
2918
|
var key, element = this._;
|
2784
2919
|
|
2785
2920
|
for (key in hash) {
|
2786
|
-
|
2787
|
-
|
2788
|
-
|
2921
|
+
if (key === 'style') {
|
2922
|
+
this.setStyle(hash[key]);
|
2923
|
+
} else {
|
2924
|
+
// some attributes are not available as properties
|
2925
|
+
if (!(key in element)) {
|
2926
|
+
element.setAttribute(key, ''+hash[key]);
|
2927
|
+
}
|
2928
|
+
element[key] = hash[key];
|
2789
2929
|
}
|
2790
|
-
element[key] = hash[key];
|
2791
2930
|
}
|
2792
2931
|
|
2793
2932
|
return this;
|
@@ -2864,16 +3003,25 @@ Element.include({
|
|
2864
3003
|
/**
|
2865
3004
|
* shows the element
|
2866
3005
|
*
|
2867
|
-
* @param String optional effect name
|
2868
|
-
* @param Object the optional effect options
|
2869
3006
|
* @return Element self
|
2870
3007
|
*/
|
2871
|
-
show: function(
|
3008
|
+
show: function() {
|
2872
3009
|
if (this.hidden()) {
|
2873
|
-
|
2874
|
-
|
3010
|
+
var element = this._, value = this._d, dummy;
|
3011
|
+
|
3012
|
+
// trying to guess the default 'style.display' for this kind of elements
|
3013
|
+
if (!value || value === 'none') {
|
3014
|
+
dummy = $E(element.tagName).insertTo(HTML);
|
3015
|
+
value = dummy.getStyle('display');
|
3016
|
+
dummy.remove();
|
3017
|
+
}
|
3018
|
+
|
3019
|
+
// failsafe in case the user been naughty
|
3020
|
+
if (value === 'none') {
|
3021
|
+
value = 'block';
|
3022
|
+
}
|
2875
3023
|
|
2876
|
-
element.style.display =
|
3024
|
+
element.style.display = value;
|
2877
3025
|
}
|
2878
3026
|
|
2879
3027
|
return this;
|
@@ -2882,12 +3030,10 @@ Element.include({
|
|
2882
3030
|
/**
|
2883
3031
|
* toggles the visibility state of the element
|
2884
3032
|
*
|
2885
|
-
* @param String optional effect name
|
2886
|
-
* @param Object the optional effect options
|
2887
3033
|
* @return Element self
|
2888
3034
|
*/
|
2889
|
-
toggle: function(
|
2890
|
-
return this[this.visible() ? 'hide' : 'show'](
|
3035
|
+
toggle: function() {
|
3036
|
+
return this[this.visible() ? 'hide' : 'show']();
|
2891
3037
|
},
|
2892
3038
|
|
2893
3039
|
/**
|
@@ -2908,7 +3054,7 @@ Element.include({
|
|
2908
3054
|
* this module contains the Element's part of functionality
|
2909
3055
|
* responsible for the dimensions and positions getting/setting
|
2910
3056
|
*
|
2911
|
-
* Copyright (C) 2008-
|
3057
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
2912
3058
|
*/
|
2913
3059
|
Element.include({
|
2914
3060
|
/**
|
@@ -2916,8 +3062,8 @@ Element.include({
|
|
2916
3062
|
*
|
2917
3063
|
* @return RightJS.Document
|
2918
3064
|
*/
|
2919
|
-
|
2920
|
-
return
|
3065
|
+
doc: function() {
|
3066
|
+
return wrap(this._.ownerDocument);
|
2921
3067
|
},
|
2922
3068
|
|
2923
3069
|
/**
|
@@ -2925,8 +3071,8 @@ Element.include({
|
|
2925
3071
|
*
|
2926
3072
|
* @return RightJS.Window
|
2927
3073
|
*/
|
2928
|
-
|
2929
|
-
return this.
|
3074
|
+
win: function() {
|
3075
|
+
return this.doc().win();
|
2930
3076
|
},
|
2931
3077
|
|
2932
3078
|
/**
|
@@ -2947,8 +3093,8 @@ Element.include({
|
|
2947
3093
|
*/
|
2948
3094
|
position: function() {
|
2949
3095
|
var rect = this._.getBoundingClientRect(),
|
2950
|
-
html = this.
|
2951
|
-
scrolls = this.
|
3096
|
+
html = this.doc()._.documentElement,
|
3097
|
+
scrolls = this.win().scrolls();
|
2952
3098
|
|
2953
3099
|
return {
|
2954
3100
|
x: rect.left + scrolls.x - html.clientLeft,
|
@@ -3093,7 +3239,7 @@ Element.include({
|
|
3093
3239
|
* @return Element self
|
3094
3240
|
*/
|
3095
3241
|
scrollThere: function(options) {
|
3096
|
-
this.
|
3242
|
+
this.win().scrollTo(this, options);
|
3097
3243
|
return this;
|
3098
3244
|
}
|
3099
3245
|
});
|
@@ -3102,74 +3248,115 @@ Element.include({
|
|
3102
3248
|
/**
|
3103
3249
|
* DOM Element events handling methods
|
3104
3250
|
*
|
3105
|
-
* Copyright (C) 2008-
|
3251
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
3106
3252
|
*/
|
3107
|
-
|
3253
|
+
[Element, Document, Window].each('include', $ext(Observer_create({}), {
|
3254
|
+
/**
|
3255
|
+
* The basic events handling attachment method
|
3256
|
+
* SEE Observer#on for more details about supported arguments
|
3257
|
+
*
|
3258
|
+
* @returnt this
|
3259
|
+
*/
|
3260
|
+
on: function() {
|
3261
|
+
Observer_on(this, arguments, function(hash) {
|
3262
|
+
|
3263
|
+
if (hash.e === 'mouseenter' || hash.e === 'mouseleave') {
|
3264
|
+
mouse_io_activate();
|
3265
|
+
hash.n = hash.e;
|
3266
|
+
hash.w = function() {};
|
3267
|
+
// NOTE: we don't attach this listener to the actual element!
|
3268
|
+
// so it didn't screw with IE's native enter/leave handlers
|
3269
|
+
} else {
|
3270
|
+
if (hash.e === 'contextmenu' && Browser.Konqueror) {
|
3271
|
+
hash.n = 'rightclick';
|
3272
|
+
} else if (hash.e === 'mousewheel' && Browser.Gecko) {
|
3273
|
+
hash.n = 'DOMMouseScroll';
|
3274
|
+
} else {
|
3275
|
+
hash.n = hash.e;
|
3276
|
+
}
|
3108
3277
|
|
3109
|
-
|
3110
|
-
|
3111
|
-
|
3112
|
-
|
3113
|
-
|
3114
|
-
|
3115
|
-
function hack_observer(name, re, text) {
|
3116
|
-
Element_observer[name] = patch_function(Element_observer[name], re, text);
|
3117
|
-
}
|
3278
|
+
hash.w = function(event) {
|
3279
|
+
event = new Event(event, hash.t);
|
3280
|
+
if (hash.f.apply(hash.t, (hash.r?[]:[event]).concat(hash.a)) === false) {
|
3281
|
+
event.stop();
|
3282
|
+
}
|
3283
|
+
};
|
3118
3284
|
|
3119
|
-
|
3120
|
-
|
3121
|
-
|
3122
|
-
|
3123
|
-
|
3124
|
-
|
3125
|
-
// swapping a browser related event names
|
3126
|
-
(Browser.Gecko ? 'if($2.n==="mousewheel")$2.n="DOMMouseScroll";' : '') +
|
3127
|
-
(Browser.Konqueror ? 'if($2.n==="contextmenu")$2.n="rightclick";' : '') +
|
3128
|
-
|
3129
|
-
'$2.w=function(){'+
|
3130
|
-
'var a=$A(arguments),_;'+
|
3131
|
-
'$2.r?a.shift():_=a[0]=new RightJS.Event(a[0],this);'+
|
3132
|
-
'$2.f.apply($2.t,a.concat($2.a))===false&&_.stop()'+
|
3133
|
-
'};$2.t=this;' + (
|
3134
|
-
looks_like_ie ?
|
3135
|
-
'$2.w=$2.w.bind(this);this._.attachEvent("on"+$2.n,$2.w);' :
|
3136
|
-
'this._.addEventListener($2.n,$2.w,false);'
|
3137
|
-
)
|
3138
|
-
);
|
3285
|
+
if (IE8_OR_LESS) {
|
3286
|
+
hash.t._.attachEvent('on'+hash.n, hash.w);
|
3287
|
+
} else {
|
3288
|
+
hash.t._.addEventListener(hash.n, hash.w, false);
|
3289
|
+
}
|
3290
|
+
}
|
3139
3291
|
|
3140
|
-
|
3141
|
-
|
3142
|
-
'$1var r=$4;'+
|
3143
|
-
'if(!r)this._.' + (looks_like_ie ?
|
3144
|
-
'detachEvent("on"+$2.n,$2.w);' :
|
3145
|
-
'removeEventListener($2.n,$2.w,false);'
|
3146
|
-
)+'$3 r'
|
3147
|
-
);
|
3292
|
+
return hash;
|
3293
|
+
});
|
3148
3294
|
|
3149
|
-
|
3150
|
-
|
3151
|
-
/(\w+)(\s*=\s*(\w+).shift\(\))/,
|
3152
|
-
'$1$2;$1=$1 instanceof RightJS.Event?$1:'+
|
3153
|
-
'new RightJS.Event($1,Object.merge({target:this._},$3[0]))'+
|
3154
|
-
';$1.currentTarget=this'
|
3155
|
-
);
|
3295
|
+
return this;
|
3296
|
+
},
|
3156
3297
|
|
3157
|
-
|
3158
|
-
|
3159
|
-
|
3160
|
-
|
3161
|
-
|
3298
|
+
/**
|
3299
|
+
* Stops an event handling
|
3300
|
+
*
|
3301
|
+
* @param String event name or a function callback
|
3302
|
+
* @param function callback or nothing
|
3303
|
+
* @return this
|
3304
|
+
*/
|
3305
|
+
stopObserving: function(event, callback) {
|
3306
|
+
Observer_stopObserving(this, event, callback, function(hash) {
|
3307
|
+
if (IE8_OR_LESS) {
|
3308
|
+
hash.t._.detachEvent('on'+ hash.n, hash.w);
|
3309
|
+
} else {
|
3310
|
+
hash.t._.removeEventListener(hash.n, hash.w, false);
|
3311
|
+
}
|
3312
|
+
});
|
3313
|
+
|
3314
|
+
return this;
|
3315
|
+
},
|
3316
|
+
|
3317
|
+
/**
|
3318
|
+
* Artificially trigers the event on the element
|
3319
|
+
*
|
3320
|
+
* @param string event name or an Event instance
|
3321
|
+
* @param Object options
|
3322
|
+
* @return this
|
3323
|
+
*/
|
3324
|
+
fire: function(event, options) {
|
3325
|
+
var parent = this.parent && this.parent();
|
3326
|
+
|
3327
|
+
if (!(event instanceof Event)) {
|
3328
|
+
event = new Event(event, $ext({target: this._}, options));
|
3329
|
+
}
|
3330
|
+
|
3331
|
+
// setting up the currentTarget reference
|
3332
|
+
event.currentTarget = this;
|
3162
3333
|
|
3163
|
-
|
3164
|
-
|
3334
|
+
(this.$listeners || []).each(function(hash) {
|
3335
|
+
if (hash.e === event.type &&
|
3336
|
+
hash.f.apply(this, (hash.r?[]:[event]).concat(hash.a)) === false
|
3337
|
+
) {
|
3338
|
+
event.stop();
|
3339
|
+
}
|
3340
|
+
}, this);
|
3341
|
+
|
3342
|
+
// manually bypassing the event to the parent one if it should bubble
|
3343
|
+
if (parent && parent.fire && !event.stopped) {
|
3344
|
+
parent.fire(event);
|
3345
|
+
}
|
3346
|
+
|
3347
|
+
return this;
|
3348
|
+
},
|
3165
3349
|
|
3166
|
-
|
3167
|
-
|
3168
|
-
|
3169
|
-
|
3350
|
+
/**
|
3351
|
+
* a simple events terminator method to be hooked like this.onClick('stopEvent');
|
3352
|
+
*
|
3353
|
+
* @return false
|
3354
|
+
*/
|
3355
|
+
stopEvent: function() { return false; }
|
3356
|
+
}));
|
3170
3357
|
|
3171
3358
|
// couple more shortcuts for the window
|
3172
|
-
Observer_createShortcuts(Window
|
3359
|
+
Observer_createShortcuts(Window.prototype, $w('blur focus scroll resize load'));
|
3173
3360
|
|
3174
3361
|
/**
|
3175
3362
|
* Registers a list of event-binding shortcuts like
|
@@ -3183,12 +3370,13 @@ function Element_add_event_shortcuts(tokens) {
|
|
3183
3370
|
tokens = $w(tokens);
|
3184
3371
|
Event_delegation_shortcuts = Event_delegation_shortcuts.concat(tokens);
|
3185
3372
|
|
3186
|
-
Observer_createShortcuts(Element
|
3187
|
-
Observer_createShortcuts(Document
|
3373
|
+
Observer_createShortcuts(Element.prototype, tokens);
|
3374
|
+
Observer_createShortcuts(Document.prototype, tokens);
|
3188
3375
|
}
|
3189
3376
|
|
3190
3377
|
Element_add_event_shortcuts(
|
3191
|
-
'click rightclick contextmenu mousedown mouseup
|
3378
|
+
'click rightclick contextmenu mousedown mouseup '+
|
3379
|
+
'mouseover mouseout mousemove keypress keydown keyup'
|
3192
3380
|
);
|
3193
3381
|
|
3194
3382
|
|
@@ -3198,21 +3386,9 @@ Element_add_event_shortcuts(
|
|
3198
3386
|
* NOTE: this module is just a wrap over the native CSS-selectors feature
|
3199
3387
|
* see the olds/css.js file for the manual selector code
|
3200
3388
|
*
|
3201
|
-
* Copyright (C) 2008-
|
3389
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
3202
3390
|
*/
|
3203
3391
|
|
3204
|
-
/**
|
3205
|
-
* Native css-selectors include the current element into the search context
|
3206
|
-
* and as we actually search only inside of the element we add it's tag
|
3207
|
-
* as a scope for the search
|
3208
|
-
*/
|
3209
|
-
function stub_rule(css_rule, tag) {
|
3210
|
-
var rule = css_rule || '*', element = tag._,
|
3211
|
-
tag_name = 'tagName' in element ? element.tagName : null;
|
3212
|
-
|
3213
|
-
return tag_name === null ? rule : rule.replace(/(^|,)/g, '$1'+ tag_name + ' ');
|
3214
|
-
}
|
3215
|
-
|
3216
3392
|
[Element, Document].each('include', {
|
3217
3393
|
/**
|
3218
3394
|
* Extracts the first element matching the css-rule,
|
@@ -3222,21 +3398,30 @@ function stub_rule(css_rule, tag) {
|
|
3222
3398
|
* @return Element matching node or null
|
3223
3399
|
*/
|
3224
3400
|
first: function(css_rule) {
|
3225
|
-
return
|
3401
|
+
return wrap(this._.querySelector(css_rule || '*'));
|
3226
3402
|
},
|
3227
3403
|
|
3228
3404
|
/**
|
3229
3405
|
* Finds a list of matching nodes, or all the descendant nodes if no css-rule provided
|
3230
3406
|
*
|
3231
3407
|
* @param String css-rule
|
3408
|
+
* @param boolean raw-search
|
3232
3409
|
* @return Array of elements
|
3233
3410
|
*/
|
3234
|
-
find: function(css_rule) {
|
3235
|
-
|
3236
|
-
|
3237
|
-
|
3411
|
+
find: function(css_rule, raw) {
|
3412
|
+
var query = this._.querySelectorAll(css_rule || '*'), result, i=0, l = query.length;
|
3413
|
+
|
3414
|
+
if (raw === true) {
|
3415
|
+
result = $A(query);
|
3416
|
+
} else {
|
3417
|
+
for (result = []; i < l; i++) {
|
3418
|
+
result[i] = wrap(query[i]);
|
3419
|
+
}
|
3420
|
+
}
|
3421
|
+
|
3422
|
+
return result;
|
3423
|
+
},
|
3238
3424
|
|
3239
|
-
Element.include({
|
3240
3425
|
/**
|
3241
3426
|
* checks if the element matches this css-rule
|
3242
3427
|
*
|
@@ -3246,12 +3431,25 @@ Element.include({
|
|
3246
3431
|
* @return Boolean check result
|
3247
3432
|
*/
|
3248
3433
|
match: function(css_rule) {
|
3249
|
-
|
3434
|
+
// finding the top parent element (the element might not be on the document)
|
3435
|
+
var element = this._, parent = element, result, faking = false;
|
3436
|
+
|
3437
|
+
while (parent.parentNode !== null && parent.parentNode.nodeType !== 11) {
|
3438
|
+
parent = parent.parentNode;
|
3439
|
+
}
|
3440
|
+
|
3441
|
+
// creating a fake context when needed
|
3442
|
+
if (element === parent) {
|
3443
|
+
parent = document.createElement('div');
|
3444
|
+
parent.appendChild(element);
|
3445
|
+
faking = true;
|
3446
|
+
}
|
3250
3447
|
|
3251
|
-
|
3252
|
-
result = $(parent || $E('p').insert(this)).find(css_rule).include(this);
|
3448
|
+
result = wrap(parent).find(css_rule, true).indexOf(element) !== -1;
|
3253
3449
|
|
3254
|
-
if (
|
3450
|
+
if (faking) {
|
3451
|
+
parent.removeChild(element);
|
3452
|
+
}
|
3255
3453
|
|
3256
3454
|
return result;
|
3257
3455
|
}
|
@@ -3265,16 +3463,12 @@ Element.include({
|
|
3265
3463
|
* The basic principles of the module are originated from
|
3266
3464
|
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
3267
3465
|
*
|
3268
|
-
* Copyright (C) 2009-
|
3466
|
+
* Copyright (C) 2009-2011 Nikolay Nemshilov
|
3269
3467
|
*/
|
3270
|
-
|
3271
|
-
|
3272
|
-
|
3273
|
-
// redefining the observer method to catch up
|
3274
|
-
proto.on = function(name) {
|
3275
|
-
if (name == 'ready' && !this._wR) {
|
3468
|
+
Document.include({
|
3469
|
+
on: function(name) {
|
3470
|
+
if (name === 'ready' && !this._iR) {
|
3276
3471
|
var document = this._, ready = this.fire.bind(this, 'ready');
|
3277
|
-
document = document.nodeType == 9 ? document : document.document;
|
3278
3472
|
|
3279
3473
|
// IE and Konqueror browsers
|
3280
3474
|
if ('readyState' in document) {
|
@@ -3289,36 +3483,14 @@ Element.include({
|
|
3289
3483
|
document.addEventListener('DOMContentLoaded', ready, false);
|
3290
3484
|
}
|
3291
3485
|
|
3292
|
-
this.
|
3486
|
+
this._iR = true;
|
3293
3487
|
}
|
3294
|
-
return old_on.apply(this, arguments);
|
3295
|
-
};
|
3296
|
-
|
3297
|
-
Observer_createShortcuts(proto, ['ready']);
|
3298
|
-
});
|
3299
|
-
|
3300
|
-
/**
|
3301
|
-
* Deprecated method names aliases
|
3302
|
-
*
|
3303
|
-
* In RightJS 2 some methods were renamed so those are the aliases
|
3304
|
-
* to support the old API
|
3305
|
-
*
|
3306
|
-
* NOTE: Will be nuked in couple of releases!
|
3307
|
-
*/
|
3308
|
-
$alias(Element[PROTO], {
|
3309
|
-
subNodes: 'children',
|
3310
|
-
sizes: 'size',
|
3311
|
-
select: 'find'
|
3312
|
-
});
|
3313
3488
|
|
3314
|
-
|
3315
|
-
|
3316
|
-
});
|
3317
|
-
|
3318
|
-
$alias(Window[PROTO], {
|
3319
|
-
sizes: 'size'
|
3489
|
+
return this.$super.apply(this, arguments);
|
3490
|
+
}
|
3320
3491
|
});
|
3321
3492
|
|
3493
|
+
Observer_createShortcuts(Document.prototype, ['ready']);
|
3322
3494
|
|
3323
3495
|
/**
|
3324
3496
|
* The form unit class and extensions
|
@@ -3327,10 +3499,10 @@ $alias(Window[PROTO], {
|
|
3327
3499
|
* The basic principles of the module are inspired by
|
3328
3500
|
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
3329
3501
|
*
|
3330
|
-
* Copyright (C) 2009-
|
3502
|
+
* Copyright (C) 2009-2011 Nikolay Nemshilov
|
3331
3503
|
*/
|
3332
3504
|
|
3333
|
-
var Form = RightJS.Form = Element_wrappers.FORM = new
|
3505
|
+
var Form = RightJS.Form = Element_wrappers.FORM = new Class(Element, {
|
3334
3506
|
/**
|
3335
3507
|
* constructor
|
3336
3508
|
*
|
@@ -3385,7 +3557,7 @@ var Form = RightJS.Form = Element_wrappers.FORM = new Wrapper(Element, {
|
|
3385
3557
|
* @return Input field
|
3386
3558
|
*/
|
3387
3559
|
input: function(name) {
|
3388
|
-
return
|
3560
|
+
return wrap(this._[name]);
|
3389
3561
|
},
|
3390
3562
|
|
3391
3563
|
/**
|
@@ -3444,7 +3616,9 @@ var Form = RightJS.Form = Element_wrappers.FORM = new Wrapper(Element, {
|
|
3444
3616
|
this.inputs().each(function(element) {
|
3445
3617
|
input = element._;
|
3446
3618
|
name = input.name;
|
3447
|
-
if (!input.disabled && name && (
|
3619
|
+
if (!input.disabled && name && (
|
3620
|
+
!['checkbox', 'radio'].include(input.type) || input.checked
|
3621
|
+
)) {
|
3448
3622
|
value = element.getValue();
|
3449
3623
|
if (name.endsWith('[]')) {
|
3450
3624
|
value = (values[name] || []).concat([value]);
|
@@ -3490,16 +3664,11 @@ var Form = RightJS.Form = Element_wrappers.FORM = new Wrapper(Element, {
|
|
3490
3664
|
// creating the event shortcuts
|
3491
3665
|
Element_add_event_shortcuts('submit reset focus blur disable enable change');
|
3492
3666
|
|
3493
|
-
// deprecated alias
|
3494
|
-
$alias(Form[PROTO], {
|
3495
|
-
getElements: 'elements'
|
3496
|
-
});
|
3497
|
-
|
3498
3667
|
|
3499
3668
|
/**
|
3500
3669
|
* The form input element class
|
3501
3670
|
*
|
3502
|
-
* Copyright (C) 2010 Nikolay Nemshilov
|
3671
|
+
* Copyright (C) 2010-2011 Nikolay Nemshilov
|
3503
3672
|
*/
|
3504
3673
|
var Input = RightJS.Input =
|
3505
3674
|
|
@@ -3510,7 +3679,7 @@ Element_wrappers.SELECT =
|
|
3510
3679
|
Element_wrappers.TEXTAREA =
|
3511
3680
|
Element_wrappers.OPTGROUP =
|
3512
3681
|
|
3513
|
-
new
|
3682
|
+
new Class(Element, {
|
3514
3683
|
/**
|
3515
3684
|
* Constructor
|
3516
3685
|
*
|
@@ -3549,23 +3718,41 @@ new Wrapper(Element, {
|
|
3549
3718
|
* @return Form wrapped form
|
3550
3719
|
*/
|
3551
3720
|
form: function() {
|
3552
|
-
return
|
3721
|
+
return wrap(this._.form);
|
3553
3722
|
},
|
3554
3723
|
|
3555
3724
|
/**
|
3556
|
-
* Overloading the method
|
3725
|
+
* Overloading the method to fix some issues with IE and FF
|
3557
3726
|
*
|
3558
3727
|
* @param mixed content
|
3728
|
+
* @param string optional position
|
3559
3729
|
* @return Input this
|
3560
3730
|
*/
|
3561
|
-
|
3562
|
-
|
3731
|
+
insert: function(content, position) {
|
3732
|
+
this.$super(content, position);
|
3733
|
+
|
3734
|
+
// manually resetting the selected option in here
|
3735
|
+
this.find('option').each(function(option) {
|
3736
|
+
option._.selected = !!option.get('selected');
|
3737
|
+
});
|
3738
|
+
|
3739
|
+
return this;
|
3563
3740
|
},
|
3564
3741
|
|
3565
3742
|
/**
|
3566
|
-
*
|
3743
|
+
* Overloading the method so it always called the '#insert' method
|
3567
3744
|
*
|
3568
|
-
* @
|
3745
|
+
* @param mixed content
|
3746
|
+
* @return Input this
|
3747
|
+
*/
|
3748
|
+
update: function(content) {
|
3749
|
+
return this.clean().insert(content);
|
3750
|
+
},
|
3751
|
+
|
3752
|
+
/**
|
3753
|
+
* uniform access to the element values
|
3754
|
+
*
|
3755
|
+
* @return String element value
|
3569
3756
|
*/
|
3570
3757
|
getValue: function() {
|
3571
3758
|
if (this._.type == 'select-multiple') {
|
@@ -3613,7 +3800,7 @@ new Wrapper(Element, {
|
|
3613
3800
|
focus: function() {
|
3614
3801
|
this._.focus();
|
3615
3802
|
this.focused = true;
|
3616
|
-
if (
|
3803
|
+
if (Browser_IE) { this.fire('focus', {bubbles: false}); }
|
3617
3804
|
return this;
|
3618
3805
|
},
|
3619
3806
|
|
@@ -3625,7 +3812,7 @@ new Wrapper(Element, {
|
|
3625
3812
|
blur: function() {
|
3626
3813
|
this._.blur();
|
3627
3814
|
this.focused = false;
|
3628
|
-
if (
|
3815
|
+
if (Browser_IE) { this.fire('blur', {bubbles: false}); }
|
3629
3816
|
return this;
|
3630
3817
|
},
|
3631
3818
|
|
@@ -3687,34 +3874,13 @@ new Wrapper(Element, {
|
|
3687
3874
|
}
|
3688
3875
|
});
|
3689
3876
|
|
3690
|
-
// SELECT element has a bug in FF that screws the selected options
|
3691
|
-
if ($E('select').update('<option selected="true">1</option><option>2</option>')._.value === '2') {
|
3692
|
-
Input[PROTO].insert = function(content, position) {
|
3693
|
-
Element[PROTO].insert.call(this, content, position);
|
3694
|
-
|
3695
|
-
// manually resetting the selected option in here
|
3696
|
-
this.find('option').each(function(option) {
|
3697
|
-
option._.selected = !!option.get('selected');
|
3698
|
-
});
|
3699
|
-
|
3700
|
-
return this;
|
3701
|
-
};
|
3702
|
-
}
|
3703
3877
|
|
3704
3878
|
/**
|
3705
|
-
* This module provides
|
3879
|
+
* This module provides correct focus/blur events bubbling
|
3706
3880
|
*
|
3707
|
-
* Copyright (C) 2010 Nikolay Nemshilov
|
3881
|
+
* Copyright (C) 2010-2011 Nikolay Nemshilov
|
3708
3882
|
*/
|
3709
3883
|
|
3710
|
-
// patching the Element's 'fire' method again
|
3711
|
-
// to make it to bypass the event to its parent
|
3712
|
-
Element[PROTO].fire = patch_function(
|
3713
|
-
Element_observer.fire,
|
3714
|
-
/(\w+)(\s*=\s*\w+\.shift[\s\S]+)(return this)/m,
|
3715
|
-
'$1$2var p=!$1.stopped&&this.parent&&this.parent();p&&p.fire&&p.fire($1);$3'
|
3716
|
-
);
|
3717
|
-
|
3718
3884
|
/**
|
3719
3885
|
* Triggers a manual focus/blur events bubbling
|
3720
3886
|
*
|
@@ -3726,7 +3892,7 @@ function focus_boobler(raw_event) {
|
|
3726
3892
|
target = event.target,
|
3727
3893
|
parent = target.parent && target.parent();
|
3728
3894
|
|
3729
|
-
event.type =
|
3895
|
+
event.type = raw_event.type === 'focusin' || raw_event.type === 'focus' ? 'focus' : 'blur';
|
3730
3896
|
|
3731
3897
|
if (parent) { parent.fire(event); }
|
3732
3898
|
}
|
@@ -3737,7 +3903,7 @@ function focus_boobler(raw_event) {
|
|
3737
3903
|
* manually like they were normal events
|
3738
3904
|
*
|
3739
3905
|
*/
|
3740
|
-
if (
|
3906
|
+
if (IE8_OR_LESS) {
|
3741
3907
|
document.attachEvent('onfocusin', focus_boobler);
|
3742
3908
|
document.attachEvent('onfocusout', focus_boobler);
|
3743
3909
|
} else {
|
@@ -3745,132 +3911,127 @@ if (Browser.IE) {
|
|
3745
3911
|
document.addEventListener('blur', focus_boobler, true);
|
3746
3912
|
}
|
3747
3913
|
|
3914
|
+
|
3748
3915
|
/**
|
3749
|
-
*
|
3916
|
+
* Provides the mouse enter/leave events handling emulation
|
3750
3917
|
*
|
3751
|
-
*
|
3752
|
-
* @retrun Boolean check result
|
3918
|
+
* Copyright (C) 2010-2011 Nikolay Nemshilov
|
3753
3919
|
*/
|
3754
|
-
|
3755
|
-
var e = document.createElement(tag);
|
3756
|
-
e.setAttribute(name, ';');
|
3757
|
-
return isFunction(e[name]);
|
3758
|
-
}
|
3759
|
-
|
3760
|
-
if (!event_support_for('onsubmit', 'form')) {
|
3761
|
-
/**
|
3762
|
-
* Emulates the 'submit' event bubbling for IE browsers
|
3763
|
-
*
|
3764
|
-
* @param raw dom-event
|
3765
|
-
* @return void
|
3766
|
-
*/
|
3767
|
-
var submit_boobler = function(raw_event) {
|
3768
|
-
var event = $(raw_event), element = event.target._,
|
3769
|
-
type = element.type, form = element.form, parent;
|
3920
|
+
var mouse_io_index = [], mouse_io_inactive = true;
|
3770
3921
|
|
3771
|
-
|
3772
|
-
|
3773
|
-
|
3774
|
-
|
3775
|
-
|
3776
|
-
|
3777
|
-
|
3778
|
-
|
3922
|
+
/**
|
3923
|
+
* Fires the actual mouseenter/mouseleave event
|
3924
|
+
*
|
3925
|
+
* @param original event
|
3926
|
+
* @param raw dom element
|
3927
|
+
* @param integer uid
|
3928
|
+
* @param boolean mouseenter or mouseleave
|
3929
|
+
* @return void
|
3930
|
+
*/
|
3931
|
+
function mouse_io_fire(raw, element, uid, enter) {
|
3932
|
+
var event = new Event(raw);
|
3933
|
+
event.type = enter === true ? 'mouseenter' : 'mouseleave';
|
3934
|
+
event.bubbles = false;
|
3935
|
+
event.stopped = true;
|
3936
|
+
event.target = wrap(element);
|
3937
|
+
|
3938
|
+
// replacing the #find method so that UJS didn't
|
3939
|
+
// get broke with trying to find nested elements
|
3940
|
+
event.find = function(css_rule) {
|
3941
|
+
return $$(css_rule, true)
|
3942
|
+
.indexOf(this.target._) === -1 ?
|
3943
|
+
undefined : this.target;
|
3779
3944
|
};
|
3780
3945
|
|
3781
|
-
|
3782
|
-
|
3946
|
+
event.target.fire(event);
|
3947
|
+
current_Document.fire(event);
|
3783
3948
|
}
|
3784
3949
|
|
3785
|
-
|
3786
|
-
|
3787
|
-
|
3788
|
-
|
3789
|
-
|
3790
|
-
|
3791
|
-
|
3792
|
-
|
3793
|
-
|
3794
|
-
|
3795
|
-
|
3796
|
-
|
3797
|
-
|
3798
|
-
|
3799
|
-
|
3800
|
-
|
3801
|
-
|
3802
|
-
|
3803
|
-
|
3804
|
-
|
3950
|
+
/**
|
3951
|
+
* Figures out the enter/leave events by listening the
|
3952
|
+
* mouseovers in the document
|
3953
|
+
*
|
3954
|
+
* @param raw dom event
|
3955
|
+
* @return void
|
3956
|
+
*/
|
3957
|
+
function mouse_io_handler(e) {
|
3958
|
+
var target = e.target || e.srcElement,
|
3959
|
+
from = e.relatedTarget || e.fromElement,
|
3960
|
+
element = target,
|
3961
|
+
passed = false,
|
3962
|
+
parents = [],
|
3963
|
+
uid, event;
|
3964
|
+
|
3965
|
+
while (element.nodeType === 1) {
|
3966
|
+
uid = $uid(element);
|
3967
|
+
|
3968
|
+
if (mouse_io_index[uid] === undefined) {
|
3969
|
+
mouse_io_fire(e, element, uid,
|
3970
|
+
mouse_io_index[uid] = true
|
3971
|
+
);
|
3972
|
+
}
|
3805
3973
|
|
3806
|
-
if (
|
3807
|
-
|
3808
|
-
event.type = 'change';
|
3809
|
-
parent.fire(event);
|
3974
|
+
if (element === from) {
|
3975
|
+
passed = true;
|
3810
3976
|
}
|
3811
|
-
},
|
3812
3977
|
|
3813
|
-
|
3814
|
-
* Catches the input field changes
|
3815
|
-
*
|
3816
|
-
* @param raw dom-event
|
3817
|
-
* @return void
|
3818
|
-
*/
|
3819
|
-
catch_inputs_access = function(raw_event) {
|
3820
|
-
var event = $(raw_event),
|
3821
|
-
target = event.target,
|
3822
|
-
type = target._.type,
|
3823
|
-
tag = target._.tagName,
|
3824
|
-
input_is_radio = (type === 'radio' || type === 'checkbox');
|
3978
|
+
parents.push(element);
|
3825
3979
|
|
3826
|
-
|
3827
|
-
|
3828
|
-
(event.type === 'keydown' && (
|
3829
|
-
(event.keyCode == 13 && (tag !== 'TEXTAREA')) ||
|
3830
|
-
type === 'select-multiple'
|
3831
|
-
))
|
3832
|
-
) {
|
3833
|
-
change_boobler(event, target);
|
3834
|
-
}
|
3835
|
-
},
|
3980
|
+
element = element.parentNode;
|
3981
|
+
}
|
3836
3982
|
|
3837
|
-
|
3838
|
-
|
3839
|
-
|
3840
|
-
|
3841
|
-
|
3842
|
-
|
3843
|
-
|
3844
|
-
|
3845
|
-
target = event.target;
|
3983
|
+
if (from && !passed) {
|
3984
|
+
while (from !== null && from.nodeType === 1 && parents.indexOf(from) === -1) {
|
3985
|
+
uid = $uid(from);
|
3986
|
+
if (mouse_io_index[uid] !== undefined) {
|
3987
|
+
mouse_io_fire(e, from, uid,
|
3988
|
+
mouse_io_index[uid] = undefined
|
3989
|
+
);
|
3990
|
+
}
|
3846
3991
|
|
3847
|
-
|
3848
|
-
change_boobler(event, target);
|
3992
|
+
from = from.parentNode;
|
3849
3993
|
}
|
3850
|
-
}
|
3994
|
+
}
|
3995
|
+
}
|
3851
3996
|
|
3852
|
-
|
3853
|
-
|
3854
|
-
|
3997
|
+
/**
|
3998
|
+
* Calling 'mouseleave' for all currently active elements on the page
|
3999
|
+
*
|
4000
|
+
* @return void
|
4001
|
+
*/
|
4002
|
+
function mouse_io_reset(e) {
|
4003
|
+
mouse_io_index.each(function(value, uid) {
|
4004
|
+
if (value && Wrappers_Cache[uid]) {
|
4005
|
+
mouse_io_fire(e, Wrappers_Cache[uid]._, uid, false);
|
4006
|
+
}
|
4007
|
+
});
|
4008
|
+
}
|
3855
4009
|
|
3856
|
-
|
3857
|
-
|
3858
|
-
|
3859
|
-
|
3860
|
-
|
3861
|
-
|
4010
|
+
/**
|
4011
|
+
* Activating the mouse-io events emulation
|
4012
|
+
*
|
4013
|
+
* @return void
|
4014
|
+
*/
|
4015
|
+
function mouse_io_activate() {
|
4016
|
+
if (mouse_io_inactive) {
|
4017
|
+
mouse_io_inactive = false;
|
3862
4018
|
|
3863
|
-
if (
|
3864
|
-
|
4019
|
+
if (Browser_IE) {
|
4020
|
+
document.attachEvent('onmouseover', mouse_io_handler);
|
4021
|
+
window.attachEvent('blur', mouse_io_reset);
|
4022
|
+
} else {
|
4023
|
+
document.addEventListener('mouseover', mouse_io_handler, false);
|
4024
|
+
window.addEventListener('blur', mouse_io_reset, false);
|
3865
4025
|
}
|
3866
|
-
}
|
4026
|
+
}
|
3867
4027
|
}
|
3868
4028
|
|
4029
|
+
Element_add_event_shortcuts('mouseenter mouseleave');
|
3869
4030
|
|
3870
4031
|
/**
|
3871
4032
|
* This module the standard events delegation interface
|
3872
4033
|
*
|
3873
|
-
* Copyright (C) 2010 Nikolay Nemshilov
|
4034
|
+
* Copyright (C) 2010-2011 Nikolay Nemshilov
|
3874
4035
|
*/
|
3875
4036
|
[Element, Document].each('include', {
|
3876
4037
|
/**
|
@@ -3972,15 +4133,24 @@ if (!event_support_for('onchange', 'input')) {
|
|
3972
4133
|
}
|
3973
4134
|
});
|
3974
4135
|
|
4136
|
+
/**
|
4137
|
+
* Builds the actual event listener that will delegate stuff
|
4138
|
+
* to other elements as they reach the element where the listener
|
4139
|
+
* attached
|
4140
|
+
*
|
4141
|
+
* @param String css rule
|
4142
|
+
* @param Arguments the original arguments list
|
4143
|
+
* @param Object scope
|
4144
|
+
* @return Function the actual event listener
|
4145
|
+
*/
|
3975
4146
|
function build_delegative_listener(css_rule, entry, scope) {
|
4147
|
+
var args = $A(entry), callback = args.shift();
|
3976
4148
|
return function(event) {
|
3977
|
-
var target = event.
|
3978
|
-
|
3979
|
-
|
3980
|
-
callback.apply(target,
|
3981
|
-
|
3982
|
-
}
|
3983
|
-
return undefined;
|
4149
|
+
var target = event.find(css_rule);
|
4150
|
+
return target === undefined ? target :
|
4151
|
+
typeof(callback) === 'string' ?
|
4152
|
+
target[callback].apply(target, args) :
|
4153
|
+
callback.apply(target, [event].concat(args));
|
3984
4154
|
};
|
3985
4155
|
}
|
3986
4156
|
|
@@ -4044,6 +4214,12 @@ function delegation_listeners(args, object) {
|
|
4044
4214
|
}
|
4045
4215
|
|
4046
4216
|
|
4217
|
+
/**
|
4218
|
+
* Some String level shortcuts to handle collections of elements
|
4219
|
+
*
|
4220
|
+
* Copyright (C) 2011 Nikolay Nemshilov
|
4221
|
+
*/
|
4222
|
+
|
4047
4223
|
/**
|
4048
4224
|
* Some nice shortcuts for the document-level events delegation handling
|
4049
4225
|
*
|
@@ -4077,17 +4253,17 @@ Object.each({
|
|
4077
4253
|
stopObserving: 'undelegate',
|
4078
4254
|
observes: 'delegates'
|
4079
4255
|
}, function(name, method) {
|
4080
|
-
String[
|
4081
|
-
var
|
4256
|
+
String.prototype[name] = function() {
|
4257
|
+
var args = $A(arguments), result;
|
4082
4258
|
|
4083
4259
|
args.splice(1,0,''+this);
|
4084
|
-
result =
|
4260
|
+
result = current_Document[method].apply(current_Document, args);
|
4085
4261
|
|
4086
|
-
return result ===
|
4262
|
+
return result === current_Document ? this : result;
|
4087
4263
|
};
|
4088
4264
|
});
|
4089
|
-
var old_on = String
|
4090
|
-
String
|
4265
|
+
var old_on = String.prototype.on;
|
4266
|
+
String.prototype.on = function(hash) {
|
4091
4267
|
if (isHash(hash)) {
|
4092
4268
|
for (var key in hash) {
|
4093
4269
|
old_on.apply(this, [key].concat([hash[key]]));
|
@@ -4107,11 +4283,44 @@ String[PROTO].on = function(hash) {
|
|
4107
4283
|
* "#css.rule".onMouseover('method_name');
|
4108
4284
|
*/
|
4109
4285
|
Event_delegation_shortcuts.each(function(name) {
|
4110
|
-
String[
|
4286
|
+
String.prototype['on'+name.capitalize()] = function() {
|
4111
4287
|
return this.on.apply(this, [name].concat($A(arguments)));
|
4112
4288
|
};
|
4113
4289
|
});
|
4114
4290
|
|
4291
|
+
/**
|
4292
|
+
* The rest of the DOM methods access
|
4293
|
+
*
|
4294
|
+
* USAGE:
|
4295
|
+
* "#css.rule".addClass('boo-hoo');
|
4296
|
+
* "#css.rule".setStyle({color: 'red'});
|
4297
|
+
*
|
4298
|
+
*/
|
4299
|
+
$w('Element Input Form').each(function(klass) {
|
4300
|
+
Object.each(klass in RightJS ? RightJS[klass].prototype : {}, function(name, method) {
|
4301
|
+
if (isFunction(method) && !(name in String.prototype)) {
|
4302
|
+
String.prototype[name] = function() {
|
4303
|
+
var nodes = $$(this, true), i=0, l = nodes.length, first=true, element, result;
|
4304
|
+
for (; i < l; i++) {
|
4305
|
+
element = wrap(nodes[i]);
|
4306
|
+
result = element[name].apply(element, arguments);
|
4307
|
+
|
4308
|
+
// checking if that's a data-retrieving call
|
4309
|
+
if (first) {
|
4310
|
+
if (result !== element) {
|
4311
|
+
return result;
|
4312
|
+
}
|
4313
|
+
first = false;
|
4314
|
+
}
|
4315
|
+
}
|
4316
|
+
|
4317
|
+
// don't return the string itself in here,
|
4318
|
+
// it will screw with data-retrieving calls on empty collections
|
4319
|
+
return null;
|
4320
|
+
};
|
4321
|
+
}
|
4322
|
+
});
|
4323
|
+
});
|
4115
4324
|
|
4116
4325
|
/**
|
4117
4326
|
* XMLHttpRequest wrapper
|
@@ -4122,7 +4331,7 @@ Event_delegation_shortcuts.each(function(name) {
|
|
4122
4331
|
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
4123
4332
|
* - jQuery (http://jquery.com) Copyright (C) John Resig
|
4124
4333
|
*
|
4125
|
-
* Copyright (C) 2008-
|
4334
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
4126
4335
|
*/
|
4127
4336
|
var Xhr = RightJS.Xhr = new Class(Observer, {
|
4128
4337
|
extend: {
|
@@ -4159,7 +4368,7 @@ var Xhr = RightJS.Xhr = new Class(Observer, {
|
|
4159
4368
|
* @return Xhr request
|
4160
4369
|
*/
|
4161
4370
|
load: function(url, options) {
|
4162
|
-
return new this(url,
|
4371
|
+
return new this(url, $ext({method: 'get'}, options)).send();
|
4163
4372
|
}
|
4164
4373
|
},
|
4165
4374
|
|
@@ -4224,7 +4433,11 @@ var Xhr = RightJS.Xhr = new Class(Observer, {
|
|
4224
4433
|
* @return Xhr self
|
4225
4434
|
*/
|
4226
4435
|
send: function(params) {
|
4227
|
-
var add_params = {},
|
4436
|
+
var add_params = {},
|
4437
|
+
url = this.url,
|
4438
|
+
method = this.method.toLowerCase(),
|
4439
|
+
headers = this.headers,
|
4440
|
+
key, xhr;
|
4228
4441
|
|
4229
4442
|
if (method == 'put' || method == 'delete') {
|
4230
4443
|
add_params._method = method;
|
@@ -4284,7 +4497,7 @@ var Xhr = RightJS.Xhr = new Class(Observer, {
|
|
4284
4497
|
if (!xhr || xhr.canceled) { return this; }
|
4285
4498
|
|
4286
4499
|
xhr.abort();
|
4287
|
-
xhr.onreadystatechange =
|
4500
|
+
xhr.onreadystatechange = function() {};
|
4288
4501
|
xhr.canceled = true;
|
4289
4502
|
|
4290
4503
|
return this.fire('cancel');
|
@@ -4302,12 +4515,10 @@ var Xhr = RightJS.Xhr = new Class(Observer, {
|
|
4302
4515
|
return new Xhr.JSONP(this);
|
4303
4516
|
} else if (this.form && this.form.first('input[type=file]')) {
|
4304
4517
|
return new Xhr.IFramed(this.form);
|
4518
|
+
} else if ('ActiveXObject' in window){
|
4519
|
+
return new ActiveXObject('MSXML2.XMLHTTP');
|
4305
4520
|
} else {
|
4306
|
-
|
4307
|
-
return new XMLHttpRequest();
|
4308
|
-
} catch(e) {
|
4309
|
-
return new ActiveXObject('MSXML2.XMLHTTP');
|
4310
|
-
}
|
4521
|
+
return new XMLHttpRequest();
|
4311
4522
|
}
|
4312
4523
|
},
|
4313
4524
|
|
@@ -4360,20 +4571,17 @@ var Xhr = RightJS.Xhr = new Class(Observer, {
|
|
4360
4571
|
|
4361
4572
|
// sanitizes the json-response texts
|
4362
4573
|
sanitizedJSON: function() {
|
4363
|
-
|
4364
|
-
|
4365
|
-
|
4366
|
-
|
4367
|
-
|
4368
|
-
if (this.secureJSON) {
|
4369
|
-
throw "JSON error: "+this.text;
|
4370
|
-
}
|
4371
|
-
return null;
|
4574
|
+
if (!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(
|
4575
|
+
this.text.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '')
|
4576
|
+
)) {
|
4577
|
+
if (this.secureJSON) {
|
4578
|
+
throw "JSON error: "+this.text;
|
4372
4579
|
}
|
4580
|
+
return null;
|
4373
4581
|
}
|
4374
4582
|
|
4375
|
-
|
4376
|
-
|
4583
|
+
return 'JSON' in window ? JSON.parse(this.text) :
|
4584
|
+
(new Function("return "+this.text))();
|
4377
4585
|
},
|
4378
4586
|
|
4379
4587
|
// initializes the request callbacks
|
@@ -4443,21 +4651,8 @@ $ext(Observer_create(Xhr), {
|
|
4443
4651
|
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
4444
4652
|
* - jQuery (http://jquery.com) Copyright (C) John Resig
|
4445
4653
|
*
|
4446
|
-
* Copyright (C) 2009-
|
4654
|
+
* Copyright (C) 2009-2011 Nikolay V. Nemshilov
|
4447
4655
|
*/
|
4448
|
-
|
4449
|
-
/**
|
4450
|
-
* Catches the form submit events and sends the form remotely
|
4451
|
-
*
|
4452
|
-
* @param Event submit
|
4453
|
-
* @param Object xhr options
|
4454
|
-
* @return void
|
4455
|
-
*/
|
4456
|
-
function remote_send(event, options) {
|
4457
|
-
event.stop();
|
4458
|
-
this.send(Object.merge({spinner: this.first('.spinner')}, options));
|
4459
|
-
}
|
4460
|
-
|
4461
4656
|
Form.include({
|
4462
4657
|
/**
|
4463
4658
|
* sends the form via xhr request
|
@@ -4469,13 +4664,31 @@ Form.include({
|
|
4469
4664
|
options = options || {};
|
4470
4665
|
options.method = options.method || this._.method || 'post';
|
4471
4666
|
|
4472
|
-
|
4473
|
-
|
4667
|
+
this.xhr = new Xhr(
|
4668
|
+
this._.action || document.location.href,
|
4669
|
+
$ext({spinner: this.first('.spinner')}, options)
|
4670
|
+
)
|
4671
|
+
.onComplete(this.enable.bind(this))
|
4672
|
+
.onCancel(this.enable.bind(this))
|
4673
|
+
.send(this);
|
4474
4674
|
|
4475
4675
|
this.disable.bind(this).delay(1); // webkit needs this async call with iframed calls
|
4476
4676
|
return this;
|
4477
4677
|
},
|
4478
4678
|
|
4679
|
+
/**
|
4680
|
+
* Cancels current Xhr request (if there are any)
|
4681
|
+
*
|
4682
|
+
* @return Form this
|
4683
|
+
*/
|
4684
|
+
cancelXhr: function() {
|
4685
|
+
if (this.xhr instanceof Xhr) {
|
4686
|
+
this.xhr.cancel();
|
4687
|
+
}
|
4688
|
+
|
4689
|
+
return this;
|
4690
|
+
},
|
4691
|
+
|
4479
4692
|
/**
|
4480
4693
|
* makes the form be remote by default
|
4481
4694
|
*
|
@@ -4483,10 +4696,11 @@ Form.include({
|
|
4483
4696
|
* @return Form this
|
4484
4697
|
*/
|
4485
4698
|
remotize: function(options) {
|
4486
|
-
if (!this.
|
4487
|
-
this.on('submit',
|
4699
|
+
if (!this.remote) {
|
4700
|
+
this.on('submit', Form_remote_send, options);
|
4488
4701
|
this.remote = true;
|
4489
4702
|
}
|
4703
|
+
|
4490
4704
|
return this;
|
4491
4705
|
},
|
4492
4706
|
|
@@ -4496,13 +4710,24 @@ Form.include({
|
|
4496
4710
|
* @return Form this
|
4497
4711
|
*/
|
4498
4712
|
unremotize: function() {
|
4499
|
-
this.stopObserving('submit',
|
4713
|
+
this.stopObserving('submit', Form_remote_send);
|
4500
4714
|
this.remote = false;
|
4501
|
-
|
4502
4715
|
return this;
|
4503
4716
|
}
|
4504
4717
|
});
|
4505
4718
|
|
4719
|
+
/**
|
4720
|
+
* Catches the form submit events and sends the form remotely
|
4721
|
+
*
|
4722
|
+
* @param Event submit
|
4723
|
+
* @param Object xhr options
|
4724
|
+
* @return void
|
4725
|
+
*/
|
4726
|
+
function Form_remote_send(event, options) {
|
4727
|
+
event.stop();
|
4728
|
+
this.send(options);
|
4729
|
+
}
|
4730
|
+
|
4506
4731
|
|
4507
4732
|
/**
|
4508
4733
|
* this module contains the Element unit XHR related extensions
|
@@ -4510,7 +4735,7 @@ Form.include({
|
|
4510
4735
|
* Credits:
|
4511
4736
|
* - jQuery (http://jquery.com) Copyright (C) John Resig
|
4512
4737
|
*
|
4513
|
-
* Copyright (C) 2008-
|
4738
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
4514
4739
|
*/
|
4515
4740
|
Element.include({
|
4516
4741
|
/**
|
@@ -4522,7 +4747,7 @@ Element.include({
|
|
4522
4747
|
* @return Element this
|
4523
4748
|
*/
|
4524
4749
|
load: function(url, options) {
|
4525
|
-
new Xhr(url,
|
4750
|
+
new Xhr(url, $ext({method: 'get'}, options)).update(this);
|
4526
4751
|
return this;
|
4527
4752
|
}
|
4528
4753
|
});
|
@@ -4532,13 +4757,12 @@ Element.include({
|
|
4532
4757
|
* A dummy XmlHTTPRequest interface to be used in other
|
4533
4758
|
* fake requests
|
4534
4759
|
*
|
4535
|
-
* Copyright (C) 2010 Nikolay Nemshilov
|
4760
|
+
* Copyright (C) 2010-2011 Nikolay Nemshilov
|
4536
4761
|
*/
|
4537
4762
|
Xhr.Dummy = {
|
4538
|
-
open:
|
4539
|
-
|
4540
|
-
|
4541
|
-
onreadystatechange: dummy()
|
4763
|
+
open: function() {},
|
4764
|
+
setRequestHeader: function() {},
|
4765
|
+
onreadystatechange: function() {}
|
4542
4766
|
};
|
4543
4767
|
|
4544
4768
|
|
@@ -4546,7 +4770,7 @@ Xhr.Dummy = {
|
|
4546
4770
|
* This unit presents a fake drop in replacement for the XmlHTTPRequest unit
|
4547
4771
|
* but works with an iframe targeting in the background
|
4548
4772
|
*
|
4549
|
-
* Copyright (C) 2008-
|
4773
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
4550
4774
|
*/
|
4551
4775
|
Xhr.IFramed = new Class({
|
4552
4776
|
include: Xhr.Dummy,
|
@@ -4561,7 +4785,7 @@ Xhr.IFramed = new Class({
|
|
4561
4785
|
this.form = form;
|
4562
4786
|
this.id = 'xhr_'+ new Date().getTime();
|
4563
4787
|
|
4564
|
-
form.
|
4788
|
+
this.form.doc().first('body').append('<i><iframe name="'+this.id+'" id="'+this.id+
|
4565
4789
|
'" width="0" height="0" frameborder="0" src="about:blank"></iframe></i>',
|
4566
4790
|
'after');
|
4567
4791
|
|
@@ -4575,7 +4799,7 @@ Xhr.IFramed = new Class({
|
|
4575
4799
|
onLoad: function() {
|
4576
4800
|
this.status = 200;
|
4577
4801
|
this.readyState = 4;
|
4578
|
-
|
4802
|
+
|
4579
4803
|
this.form.set('target', '');
|
4580
4804
|
|
4581
4805
|
try {
|
@@ -4583,6 +4807,10 @@ Xhr.IFramed = new Class({
|
|
4583
4807
|
} catch(e) { }
|
4584
4808
|
|
4585
4809
|
this.onreadystatechange();
|
4810
|
+
},
|
4811
|
+
|
4812
|
+
abort: function() {
|
4813
|
+
$(this.id).set('src', 'about:blank');
|
4586
4814
|
}
|
4587
4815
|
});
|
4588
4816
|
|
@@ -4590,7 +4818,7 @@ Xhr.IFramed = new Class({
|
|
4590
4818
|
/**
|
4591
4819
|
* The JSONP Xhr request tonnel
|
4592
4820
|
*
|
4593
|
-
* Copyright (C) 2010 Nikolay Nemshilov
|
4821
|
+
* Copyright (C) 2010-2011 Nikolay Nemshilov
|
4594
4822
|
*/
|
4595
4823
|
Xhr.JSONP = new Class({
|
4596
4824
|
include: Xhr.Dummy,
|
@@ -4654,6 +4882,16 @@ Xhr.JSONP = new Class({
|
|
4654
4882
|
this.xhr.json = this.xhr.responseJSON = data;
|
4655
4883
|
|
4656
4884
|
this.onreadystatechange();
|
4885
|
+
},
|
4886
|
+
|
4887
|
+
/**
|
4888
|
+
* We can't really cancel a JSONP request
|
4889
|
+
* but we can prevent the default handler to ckick in
|
4890
|
+
*
|
4891
|
+
* @return void
|
4892
|
+
*/
|
4893
|
+
abort: function() {
|
4894
|
+
window[this.name] = function() {};
|
4657
4895
|
}
|
4658
4896
|
});
|
4659
4897
|
|
@@ -4665,7 +4903,7 @@ Xhr.JSONP = new Class({
|
|
4665
4903
|
* The basic principles, structures and naming system are inspired by
|
4666
4904
|
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
4667
4905
|
*
|
4668
|
-
* Copyright (C) 2008-
|
4906
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
4669
4907
|
*/
|
4670
4908
|
var Fx = RightJS.Fx = new Class(Observer, {
|
4671
4909
|
extend: {
|
@@ -4680,7 +4918,7 @@ var Fx = RightJS.Fx = new Class(Observer, {
|
|
4680
4918
|
|
4681
4919
|
// default options
|
4682
4920
|
Options: {
|
4683
|
-
fps:
|
4921
|
+
fps: IE8_OR_LESS ? 40 : 60,
|
4684
4922
|
duration: 'normal',
|
4685
4923
|
transition: 'Sin',
|
4686
4924
|
queue: true
|
@@ -4707,10 +4945,7 @@ var Fx = RightJS.Fx = new Class(Observer, {
|
|
4707
4945
|
Lin: function(i) {
|
4708
4946
|
return i;
|
4709
4947
|
}
|
4710
|
-
}
|
4711
|
-
|
4712
|
-
ch: [], // scheduled effects registries
|
4713
|
-
cr: [] // currently running effects registries
|
4948
|
+
}
|
4714
4949
|
},
|
4715
4950
|
|
4716
4951
|
/**
|
@@ -4720,12 +4955,8 @@ var Fx = RightJS.Fx = new Class(Observer, {
|
|
4720
4955
|
*/
|
4721
4956
|
initialize: function(element, options) {
|
4722
4957
|
this.$super(options);
|
4723
|
-
|
4724
|
-
|
4725
|
-
var uid = $uid(element);
|
4726
|
-
this.ch = (Fx.ch[uid] = Fx.ch[uid] || []);
|
4727
|
-
this.cr = (Fx.cr[uid] = Fx.cr[uid] || []);
|
4728
|
-
}
|
4958
|
+
this.element = $(element);
|
4959
|
+
fx_register(this);
|
4729
4960
|
},
|
4730
4961
|
|
4731
4962
|
/**
|
@@ -4734,21 +4965,21 @@ var Fx = RightJS.Fx = new Class(Observer, {
|
|
4734
4965
|
* @return Fx this
|
4735
4966
|
*/
|
4736
4967
|
start: function() {
|
4737
|
-
if (this
|
4738
|
-
this.prepare.apply(this, arguments);
|
4968
|
+
if (fx_add_to_queue(this, arguments)) { return this; }
|
4739
4969
|
|
4740
|
-
var options
|
4741
|
-
duration
|
4742
|
-
|
4970
|
+
var options = this.options,
|
4971
|
+
duration = Fx.Durations[options.duration] || options.duration,
|
4972
|
+
transition = Fx.Transitions[options.transition] || options.transition,
|
4973
|
+
steps = (duration / 1000 * this.options.fps).ceil(),
|
4974
|
+
interval = (1000 / this.options.fps).round();
|
4743
4975
|
|
4744
|
-
|
4745
|
-
this.number = 1;
|
4976
|
+
fx_mark_current(this);
|
4746
4977
|
|
4747
|
-
|
4748
|
-
this.cr.push(this); // adding this effect to the list of currently active
|
4749
|
-
}
|
4978
|
+
this.prepare.apply(this, arguments);
|
4750
4979
|
|
4751
|
-
|
4980
|
+
fx_start_timer(this, transition, interval, steps);
|
4981
|
+
|
4982
|
+
return this.fire('start', this);
|
4752
4983
|
},
|
4753
4984
|
|
4754
4985
|
/**
|
@@ -4757,7 +4988,11 @@ var Fx = RightJS.Fx = new Class(Observer, {
|
|
4757
4988
|
* @return Fx this
|
4758
4989
|
*/
|
4759
4990
|
finish: function() {
|
4760
|
-
|
4991
|
+
fx_stop_timer(this);
|
4992
|
+
fx_remove_from_queue(this);
|
4993
|
+
this.fire('finish');
|
4994
|
+
fx_run_next(this);
|
4995
|
+
return this;
|
4761
4996
|
},
|
4762
4997
|
|
4763
4998
|
/**
|
@@ -4770,100 +5005,140 @@ var Fx = RightJS.Fx = new Class(Observer, {
|
|
4770
5005
|
* @return Fx this
|
4771
5006
|
*/
|
4772
5007
|
cancel: function() {
|
4773
|
-
this
|
4774
|
-
|
4775
|
-
|
4776
|
-
|
4777
|
-
/**
|
4778
|
-
* pauses the transition
|
4779
|
-
*
|
4780
|
-
* @return Fx this
|
4781
|
-
*/
|
4782
|
-
pause: function() {
|
4783
|
-
return this.stopTimer();
|
4784
|
-
},
|
4785
|
-
|
4786
|
-
/**
|
4787
|
-
* resumes a paused transition
|
4788
|
-
*
|
4789
|
-
* @return Fx this
|
4790
|
-
*/
|
4791
|
-
resume: function() {
|
4792
|
-
return this.startTimer();
|
5008
|
+
fx_stop_timer(this);
|
5009
|
+
fx_remove_from_queue(this);
|
5010
|
+
return this.fire('cancel');
|
4793
5011
|
},
|
4794
5012
|
|
4795
5013
|
// protected
|
4796
5014
|
// dummy method, should be implemented in a subclass
|
4797
|
-
prepare: function(
|
5015
|
+
prepare: function() {},
|
4798
5016
|
|
4799
5017
|
// dummy method, processes the element properties
|
4800
|
-
render: function(
|
5018
|
+
render: function() {}
|
5019
|
+
}),
|
4801
5020
|
|
4802
|
-
|
4803
|
-
|
4804
|
-
step: function(that) {
|
4805
|
-
if (that.number > that.steps) {
|
4806
|
-
that.finish();
|
4807
|
-
} else {
|
4808
|
-
if (!that.w) {
|
4809
|
-
that.w = true;
|
4810
|
-
that.render(that.transition(that.number / that.steps));
|
4811
|
-
that.w = false;
|
4812
|
-
}
|
4813
|
-
that.number ++;
|
4814
|
-
}
|
4815
|
-
},
|
5021
|
+
// global effects registry
|
5022
|
+
scheduled_fx = [], running_fx = [];
|
4816
5023
|
|
4817
|
-
|
4818
|
-
|
4819
|
-
|
4820
|
-
|
4821
|
-
|
5024
|
+
/**
|
5025
|
+
* Registers the element in the effects queue
|
5026
|
+
*
|
5027
|
+
* @param Fx effect
|
5028
|
+
* @return void
|
5029
|
+
*/
|
5030
|
+
function fx_register(fx) {
|
5031
|
+
var uid = $uid((fx.element || {})._ || {});
|
5032
|
+
fx.ch = (scheduled_fx[uid] = scheduled_fx[uid] || []);
|
5033
|
+
fx.cr = (running_fx[uid] = running_fx[uid] || []);
|
5034
|
+
}
|
4822
5035
|
|
4823
|
-
|
4824
|
-
|
4825
|
-
|
4826
|
-
|
4827
|
-
|
4828
|
-
|
4829
|
-
|
5036
|
+
/**
|
5037
|
+
* Registers the effect in the effects queue
|
5038
|
+
*
|
5039
|
+
* @param Fx fx
|
5040
|
+
* @param Arguments original arguments list
|
5041
|
+
* @return boolean true if it queued and false if it's ready to go
|
5042
|
+
*/
|
5043
|
+
function fx_add_to_queue(fx, args) {
|
5044
|
+
var chain = fx.ch, queue = fx.options.queue;
|
4830
5045
|
|
4831
|
-
|
4832
|
-
|
4833
|
-
|
4834
|
-
var chain = this.ch, queue = this.options.queue;
|
5046
|
+
if (!chain || fx.$ch) {
|
5047
|
+
return (fx.$ch = false);
|
5048
|
+
}
|
4835
5049
|
|
4836
|
-
|
4837
|
-
|
4838
|
-
|
5050
|
+
if (queue) {
|
5051
|
+
chain.push([args, fx]);
|
5052
|
+
}
|
4839
5053
|
|
4840
|
-
|
4841
|
-
|
4842
|
-
}
|
5054
|
+
return queue && chain[0][1] !== fx;
|
5055
|
+
}
|
4843
5056
|
|
4844
|
-
|
4845
|
-
|
5057
|
+
/**
|
5058
|
+
* Puts the fx into the list of currently running effects
|
5059
|
+
*
|
5060
|
+
* @param Fx fx
|
5061
|
+
* @return void
|
5062
|
+
*/
|
5063
|
+
function fx_mark_current(fx) {
|
5064
|
+
if (fx.cr) {
|
5065
|
+
fx.cr.push(fx);
|
5066
|
+
}
|
5067
|
+
}
|
4846
5068
|
|
4847
|
-
|
4848
|
-
|
4849
|
-
|
4850
|
-
|
4851
|
-
|
4852
|
-
|
4853
|
-
|
4854
|
-
|
4855
|
-
|
5069
|
+
/**
|
5070
|
+
* Removes the fx from the queue
|
5071
|
+
*
|
5072
|
+
* @param Fx fx
|
5073
|
+
* @return void
|
5074
|
+
*/
|
5075
|
+
function fx_remove_from_queue(fx) {
|
5076
|
+
var currents = fx.cr;
|
5077
|
+
if (currents) {
|
5078
|
+
currents.splice(currents.indexOf(fx), 1);
|
5079
|
+
}
|
5080
|
+
}
|
4856
5081
|
|
4857
|
-
|
4858
|
-
|
4859
|
-
|
4860
|
-
|
4861
|
-
|
4862
|
-
|
4863
|
-
|
5082
|
+
/**
|
5083
|
+
* Tries to invoke the next effect in the queue
|
5084
|
+
*
|
5085
|
+
* @param Fx fx
|
5086
|
+
* @return void
|
5087
|
+
*/
|
5088
|
+
function fx_run_next(fx) {
|
5089
|
+
var chain = fx.ch, next = chain.shift();
|
5090
|
+
if ((next = chain[0])) {
|
5091
|
+
next[1].$ch = true;
|
5092
|
+
next[1].start.apply(next[1], next[0]);
|
4864
5093
|
}
|
5094
|
+
}
|
4865
5095
|
|
4866
|
-
|
5096
|
+
/**
|
5097
|
+
* Cancels all currently running and scheduled effects
|
5098
|
+
* on the element
|
5099
|
+
*
|
5100
|
+
* @param Element element
|
5101
|
+
* @return void
|
5102
|
+
*/
|
5103
|
+
function fx_cancel_all(element) {
|
5104
|
+
var uid = $uid(element._);
|
5105
|
+
|
5106
|
+
(running_fx[uid] || []).each('cancel');
|
5107
|
+
(scheduled_fx[uid] || []).splice(0);
|
5108
|
+
}
|
5109
|
+
|
5110
|
+
/**
|
5111
|
+
* Initializes the fx rendering timer
|
5112
|
+
*
|
5113
|
+
* @param Fx fx
|
5114
|
+
* @param Function transition stops calculator
|
5115
|
+
* @param Float interval
|
5116
|
+
* @param Integer number of steps
|
5117
|
+
* @return void
|
5118
|
+
*/
|
5119
|
+
function fx_start_timer(fx, transition, interval, steps) {
|
5120
|
+
var number = 1;
|
5121
|
+
fx._timer = setInterval(function() {
|
5122
|
+
if (number > steps) {
|
5123
|
+
fx.finish();
|
5124
|
+
} else {
|
5125
|
+
fx.render(transition(number/steps));
|
5126
|
+
number ++;
|
5127
|
+
}
|
5128
|
+
}, interval);
|
5129
|
+
}
|
5130
|
+
|
5131
|
+
/**
|
5132
|
+
* Cancels the Fx rendering timer (if any)
|
5133
|
+
*
|
5134
|
+
* @param Fx fx
|
5135
|
+
* @return void
|
5136
|
+
*/
|
5137
|
+
function fx_stop_timer(fx) {
|
5138
|
+
if (fx._timer) {
|
5139
|
+
clearInterval(fx._timer);
|
5140
|
+
}
|
5141
|
+
}
|
4867
5142
|
|
4868
5143
|
|
4869
5144
|
/**
|
@@ -4941,14 +5216,8 @@ String.include({
|
|
4941
5216
|
* Some ideas are inspired by
|
4942
5217
|
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
4943
5218
|
*
|
4944
|
-
* Copyright (C) 2008-
|
5219
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
4945
5220
|
*/
|
4946
|
-
var methods = Element.prototype,
|
4947
|
-
old_hide = methods.hide,
|
4948
|
-
old_show = methods.show,
|
4949
|
-
old_remove = methods.remove,
|
4950
|
-
old_scroll = methods.scrollTo;
|
4951
|
-
|
4952
5221
|
Element.include({
|
4953
5222
|
/**
|
4954
5223
|
* Stops all the visual effects on the element
|
@@ -4956,7 +5225,7 @@ Element.include({
|
|
4956
5225
|
* @return Element this
|
4957
5226
|
*/
|
4958
5227
|
stop: function() {
|
4959
|
-
(
|
5228
|
+
fx_cancel_all(this);
|
4960
5229
|
return this;
|
4961
5230
|
},
|
4962
5231
|
|
@@ -4968,7 +5237,7 @@ Element.include({
|
|
4968
5237
|
* @return Element this
|
4969
5238
|
*/
|
4970
5239
|
hide: function(fx, options) {
|
4971
|
-
return (fx && this.visible()) ? this
|
5240
|
+
return (fx && this.visible()) ? call_fx(this, fx, ['out', options]) : this.$super();
|
4972
5241
|
},
|
4973
5242
|
|
4974
5243
|
/**
|
@@ -4979,7 +5248,18 @@ Element.include({
|
|
4979
5248
|
* @return Element this
|
4980
5249
|
*/
|
4981
5250
|
show: function(fx, options) {
|
4982
|
-
return (fx && !this.visible()) ? this
|
5251
|
+
return (fx && !this.visible()) ? call_fx(this, fx, ['in', options]) : this.$super();
|
5252
|
+
},
|
5253
|
+
|
5254
|
+
/**
|
5255
|
+
* Toggles the element state with visual effect
|
5256
|
+
*
|
5257
|
+
* @param String fx name
|
5258
|
+
* @param Object fx options
|
5259
|
+
* @return Element this
|
5260
|
+
*/
|
5261
|
+
toggle: function(fx, options) {
|
5262
|
+
return fx ? call_fx(this, fx, ['toggle', options]) : this.$super();
|
4983
5263
|
},
|
4984
5264
|
|
4985
5265
|
/**
|
@@ -4990,9 +5270,9 @@ Element.include({
|
|
4990
5270
|
* @return Element this
|
4991
5271
|
*/
|
4992
5272
|
remove: function(fx, options) {
|
4993
|
-
return (fx && this.visible()) ? this
|
4994
|
-
onFinish:
|
4995
|
-
})]) :
|
5273
|
+
return (fx && this.visible()) ? call_fx(this, fx, ['out', $ext(options || {}, {
|
5274
|
+
onFinish: this.$super.bind(this)
|
5275
|
+
})]) : this.$super();
|
4996
5276
|
},
|
4997
5277
|
|
4998
5278
|
/**
|
@@ -5003,7 +5283,7 @@ Element.include({
|
|
5003
5283
|
* @return Element self
|
5004
5284
|
*/
|
5005
5285
|
morph: function(style, options) {
|
5006
|
-
return this
|
5286
|
+
return call_fx(this, 'morph', [style, options || {}]); // <- don't replace with arguments
|
5007
5287
|
},
|
5008
5288
|
|
5009
5289
|
/**
|
@@ -5015,7 +5295,7 @@ Element.include({
|
|
5015
5295
|
* @return Element self
|
5016
5296
|
*/
|
5017
5297
|
highlight: function() {
|
5018
|
-
return this
|
5298
|
+
return call_fx(this, 'highlight', arguments);
|
5019
5299
|
},
|
5020
5300
|
|
5021
5301
|
/**
|
@@ -5025,7 +5305,7 @@ Element.include({
|
|
5025
5305
|
* @return Element self
|
5026
5306
|
*/
|
5027
5307
|
fade: function() {
|
5028
|
-
return this
|
5308
|
+
return call_fx(this, 'fade', arguments);
|
5029
5309
|
},
|
5030
5310
|
|
5031
5311
|
/**
|
@@ -5036,7 +5316,7 @@ Element.include({
|
|
5036
5316
|
* @return Element self
|
5037
5317
|
*/
|
5038
5318
|
slide: function() {
|
5039
|
-
return this
|
5319
|
+
return call_fx(this, 'slide', arguments);
|
5040
5320
|
},
|
5041
5321
|
|
5042
5322
|
/**
|
@@ -5047,7 +5327,7 @@ Element.include({
|
|
5047
5327
|
* @return Element this
|
5048
5328
|
*/
|
5049
5329
|
scroll: function(value, options) {
|
5050
|
-
return this
|
5330
|
+
return call_fx(this, 'scroll', [value, options||{}]);
|
5051
5331
|
},
|
5052
5332
|
|
5053
5333
|
/**
|
@@ -5059,35 +5339,134 @@ Element.include({
|
|
5059
5339
|
* @return Element this
|
5060
5340
|
*/
|
5061
5341
|
scrollTo: function(value, options) {
|
5062
|
-
return isHash(options) ? this.scroll(value, options) :
|
5063
|
-
}
|
5064
|
-
|
5065
|
-
|
5066
|
-
// protected
|
5067
|
-
|
5068
|
-
// runs an Fx on the element
|
5069
|
-
fx: function(name, params) {
|
5070
|
-
var args = $A(params).compact(), options = isHash(args.last()) ? args.pop() : {},
|
5071
|
-
fx = new Fx[name.capitalize()](this, options);
|
5342
|
+
return isHash(options) ? this.scroll(value, options) : this.$super.apply(this, arguments);
|
5343
|
+
}
|
5344
|
+
});
|
5072
5345
|
|
5073
|
-
|
5346
|
+
/**
|
5347
|
+
* Calls the visual effect on the element
|
5348
|
+
*
|
5349
|
+
* @param Element context
|
5350
|
+
* @param String fx-name
|
5351
|
+
* @param Object fx-options
|
5352
|
+
* @return Element context
|
5353
|
+
*/
|
5354
|
+
function call_fx(element, name, params) {
|
5355
|
+
var args = $A(params).compact(),
|
5356
|
+
options = isHash(args.last()) ? args.pop() : {},
|
5357
|
+
fx = new Fx[name.capitalize()](element, options);
|
5074
5358
|
|
5075
|
-
|
5076
|
-
}
|
5359
|
+
fx.start.apply(fx, args);
|
5077
5360
|
|
5078
|
-
|
5361
|
+
return element;
|
5362
|
+
}
|
5079
5363
|
|
5080
5364
|
|
5081
5365
|
/**
|
5082
5366
|
* This class provides the basic effect for styles manipulation
|
5083
5367
|
*
|
5084
|
-
*
|
5085
|
-
* The idea is inspired by the Morph effect from
|
5086
|
-
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
5087
|
-
*
|
5088
|
-
* Copyright (C) 2008-2010 Nikolay Nemshilov
|
5368
|
+
* Copyright (C) 2008-2011 Nikolay Nemshilov
|
5089
5369
|
*/
|
5090
5370
|
|
5371
|
+
/////////////////////////////////////////////////////////////////////////////
|
5372
|
+
// Native css-transitions based implementation
|
5373
|
+
/////////////////////////////////////////////////////////////////////////////
|
5374
|
+
|
5375
|
+
var native_fx_prefix = ['WebkitT', 'OT', 'MozT', 'MsT', 't'].first(function(name) {
|
5376
|
+
return name + 'ransition' in HTML.style;
|
5377
|
+
}),
|
5378
|
+
native_fx_transition = native_fx_prefix + 'ransition',
|
5379
|
+
native_fx_property = native_fx_transition + 'Property',
|
5380
|
+
native_fx_duration = native_fx_transition + 'Duration',
|
5381
|
+
native_fx_function = native_fx_transition + 'TimingFunction',
|
5382
|
+
|
5383
|
+
// basic transition algorithm replacements
|
5384
|
+
native_fx_functions = {
|
5385
|
+
Sin: 'cubic-bezier(.3,0,.6,1)',
|
5386
|
+
Cos: 'cubic-bezier(0,.3,.6,0)',
|
5387
|
+
Log: 'cubic-bezier(0.6,.3,.8)',
|
5388
|
+
Exp: 'cubic-bezier(.6,0,.8,.3)',
|
5389
|
+
Lin: 'cubic-bezier(0,0,1,1)'
|
5390
|
+
};
|
5391
|
+
|
5392
|
+
function native_fx_prepare(style) {
|
5393
|
+
var options = this.options,
|
5394
|
+
element = this.element,
|
5395
|
+
element_style = element._.style,
|
5396
|
+
old_style = Object.only(
|
5397
|
+
element.computedStyles(),
|
5398
|
+
native_fx_property,
|
5399
|
+
native_fx_duration,
|
5400
|
+
native_fx_function
|
5401
|
+
);
|
5402
|
+
|
5403
|
+
function reset_transitions_style() {
|
5404
|
+
for (var key in old_style) {
|
5405
|
+
element_style[key] = old_style[key];
|
5406
|
+
}
|
5407
|
+
}
|
5408
|
+
|
5409
|
+
this
|
5410
|
+
.onFinish(reset_transitions_style)
|
5411
|
+
.onCancel(function() {
|
5412
|
+
element_style[native_fx_property] = 'none';
|
5413
|
+
setTimeout(reset_transitions_style, 1);
|
5414
|
+
});
|
5415
|
+
|
5416
|
+
// setting up the transition
|
5417
|
+
element_style[native_fx_property] = 'all';
|
5418
|
+
element_style[native_fx_duration] = (Fx.Durations[options.duration] || options.duration) +'ms';
|
5419
|
+
element_style[native_fx_function] = native_fx_functions[options.transition] || options.transition;
|
5420
|
+
|
5421
|
+
setTimeout(function() { element.setStyle(style); }, 0);
|
5422
|
+
}
|
5423
|
+
|
5424
|
+
// NOTE: OPERA's css-transitions are a bit jerky so we disable them by default
|
5425
|
+
Fx.Options.engine = native_fx_prefix === undefined || Browser_Opera ? 'javascript' : 'native';
|
5426
|
+
|
5427
|
+
////////////////////////////////////////////////////////////////////////////
|
5428
|
+
// Manual version
|
5429
|
+
////////////////////////////////////////////////////////////////////////////
|
5430
|
+
|
5431
|
+
Fx.Morph = new Class(Fx, {
|
5432
|
+
// protected
|
5433
|
+
|
5434
|
+
// parepares the effect
|
5435
|
+
prepare: function(style) {
|
5436
|
+
if (this.options.engine === 'native' && native_fx_prefix !== undefined) {
|
5437
|
+
this.render = this.transition = function() {};
|
5438
|
+
native_fx_prepare.call(this, style);
|
5439
|
+
} else {
|
5440
|
+
var keys = style_keys(style),
|
5441
|
+
before = clone_style(this.element, keys),
|
5442
|
+
after = end_style(this.element, style, keys);
|
5443
|
+
|
5444
|
+
clean_styles(this.element, before, after);
|
5445
|
+
|
5446
|
+
this.before = parse_style(before);
|
5447
|
+
this.after = parse_style(after);
|
5448
|
+
}
|
5449
|
+
},
|
5450
|
+
|
5451
|
+
render: function(delta) {
|
5452
|
+
var before, after, value, style = this.element._.style, key, i, l;
|
5453
|
+
for (key in this.after) {
|
5454
|
+
before = this.before[key];
|
5455
|
+
after = this.after[key];
|
5456
|
+
|
5457
|
+
for (i=0, l = after.length; i < l; i++) {
|
5458
|
+
value = before[i] + (after[i] - before[i]) * delta;
|
5459
|
+
if (after.r) {
|
5460
|
+
value = Math.round(value);
|
5461
|
+
}
|
5462
|
+
after.t[i*2 + 1] = value;
|
5463
|
+
}
|
5464
|
+
|
5465
|
+
style[key] = after.t.join('');
|
5466
|
+
}
|
5467
|
+
}
|
5468
|
+
});
|
5469
|
+
|
5091
5470
|
// a list of common style names to compact the code a bit
|
5092
5471
|
var directions = $w('Top Left Right Bottom');
|
5093
5472
|
|
@@ -5098,6 +5477,32 @@ function add_variants(keys, key, variants) {
|
|
5098
5477
|
}
|
5099
5478
|
}
|
5100
5479
|
|
5480
|
+
// creates an appropriate style-keys list out of the user styles
|
5481
|
+
function style_keys(style) {
|
5482
|
+
var keys = [], border_types = ['Style', 'Color', 'Width'], key, i, j;
|
5483
|
+
|
5484
|
+
for (key in style) {
|
5485
|
+
if (key.startsWith('border')) {
|
5486
|
+
for (i=0; i < 3; i++) {
|
5487
|
+
for (j=0; j < 4; j++) {
|
5488
|
+
keys.push('border' + directions[j] + border_types[i]);
|
5489
|
+
}
|
5490
|
+
}
|
5491
|
+
} else if (key === 'margin' || key === 'padding') {
|
5492
|
+
add_variants(keys, key, directions);
|
5493
|
+
} else if (key.startsWith('background')) {
|
5494
|
+
add_variants(keys, 'background', ['Color', 'Position', 'PositionX', 'PositionY']);
|
5495
|
+
} else if (key === 'opacity' && Browser_IE) {
|
5496
|
+
keys.push('filter');
|
5497
|
+
} else {
|
5498
|
+
keys.push(key);
|
5499
|
+
}
|
5500
|
+
}
|
5501
|
+
|
5502
|
+
return keys;
|
5503
|
+
}
|
5504
|
+
|
5505
|
+
|
5101
5506
|
// checks if the color is transparent
|
5102
5507
|
function is_transparent(color) {
|
5103
5508
|
return color === 'transparent' || color === 'rgba(0, 0, 0, 0)';
|
@@ -5106,10 +5511,10 @@ function is_transparent(color) {
|
|
5106
5511
|
// adjusts the border-styles
|
5107
5512
|
function check_border_styles(element, before, after) {
|
5108
5513
|
for (var i=0; i < 4; i++) {
|
5109
|
-
var
|
5110
|
-
bd_style = 'border' +
|
5111
|
-
bd_width = 'border' +
|
5112
|
-
bd_color = 'border' +
|
5514
|
+
var
|
5515
|
+
bd_style = 'border' + directions[i] + 'Style',
|
5516
|
+
bd_width = 'border' + directions[i] + 'Width',
|
5517
|
+
bd_color = 'border' + directions[i] + 'Color';
|
5113
5518
|
|
5114
5519
|
if (bd_style in before && before[bd_style] != after[bd_style]) {
|
5115
5520
|
var style = element._.style;
|
@@ -5149,7 +5554,7 @@ function parse_style(values) {
|
|
5149
5554
|
|
5150
5555
|
// cleans up and optimizies the styles
|
5151
5556
|
function clean_styles(element, before, after) {
|
5152
|
-
var
|
5557
|
+
var key;
|
5153
5558
|
|
5154
5559
|
for (key in after) {
|
5155
5560
|
// checking the height/width options
|
@@ -5169,8 +5574,8 @@ function clean_styles(element, before, after) {
|
|
5169
5574
|
// cleaing up the list
|
5170
5575
|
for (key in after) {
|
5171
5576
|
// proprocessing colors
|
5172
|
-
if (after[key] !== before[key] &&
|
5173
|
-
if (
|
5577
|
+
if (after[key] !== before[key] && /color/i.test(key)) {
|
5578
|
+
if (Browser_Opera) {
|
5174
5579
|
after[key] = after[key].replace(/"/g, '');
|
5175
5580
|
before[key] = before[key].replace(/"/g, '');
|
5176
5581
|
}
|
@@ -5187,131 +5592,54 @@ function clean_styles(element, before, after) {
|
|
5187
5592
|
}
|
5188
5593
|
|
5189
5594
|
// removing unprocessable keys
|
5190
|
-
if (after[key] === before[key] ||
|
5595
|
+
if (after[key] === before[key] || !/\d/.test(before[key]) || !/\d/.test(after[key])) {
|
5191
5596
|
delete(after[key]);
|
5192
5597
|
delete(before[key]);
|
5193
5598
|
}
|
5194
5599
|
}
|
5195
5600
|
}
|
5196
5601
|
|
5197
|
-
|
5198
|
-
|
5199
|
-
|
5200
|
-
* @param Object the style hash
|
5201
|
-
* @return Array of clean style keys list
|
5202
|
-
*/
|
5203
|
-
function style_keys(style) {
|
5204
|
-
var keys = [], border_types = ['Style', 'Color', 'Width'], key, i, j;
|
5205
|
-
|
5206
|
-
for (key in style) {
|
5207
|
-
if (key.startsWith('border')) {
|
5208
|
-
for (i=0; i < border_types.length; i++) {
|
5209
|
-
for (j=0; j < directions.length; j++) {
|
5210
|
-
keys.push('border' + directions[j] + border_types[i]);
|
5211
|
-
}
|
5212
|
-
}
|
5213
|
-
} else if (key == 'margin' || key == 'padding') {
|
5214
|
-
add_variants(keys, key, directions);
|
5215
|
-
} else if (key.startsWith('background')) {
|
5216
|
-
add_variants(keys, 'background', ['Color', 'Position', 'PositionX', 'PositionY']);
|
5217
|
-
} else if (key == 'opacity' && Browser.IE) {
|
5218
|
-
keys.push('filter');
|
5219
|
-
} else {
|
5220
|
-
keys.push(key);
|
5221
|
-
}
|
5222
|
-
}
|
5223
|
-
|
5224
|
-
return keys;
|
5225
|
-
}
|
5226
|
-
|
5227
|
-
Fx.Morph = new Class(Fx, {
|
5228
|
-
|
5229
|
-
// protected
|
5602
|
+
// cloning the element current styles hash
|
5603
|
+
function clone_style(element, keys) {
|
5604
|
+
var i=0, len = keys.length, style = element.computedStyles(), clean = {}, key;
|
5230
5605
|
|
5231
|
-
|
5232
|
-
|
5233
|
-
|
5234
|
-
|
5235
|
-
after = this._endStyle(style, keys);
|
5236
|
-
|
5237
|
-
clean_styles(this.element, before, after);
|
5238
|
-
|
5239
|
-
this.before = parse_style(before);
|
5240
|
-
this.after = parse_style(after);
|
5241
|
-
},
|
5242
|
-
|
5243
|
-
render: function(delta) {
|
5244
|
-
var before, after, value, style = this.element._.style, key, i, l;
|
5245
|
-
for (key in this.after) {
|
5246
|
-
before = this.before[key];
|
5247
|
-
after = this.after[key];
|
5248
|
-
|
5249
|
-
for (i=0, l = after.length; i < l; i++) {
|
5250
|
-
value = before[i] + (after[i] - before[i]) * delta;
|
5251
|
-
if (after.r) {
|
5252
|
-
value = Math.round(value);
|
5253
|
-
}
|
5254
|
-
after.t[i*2 + 1] = value;
|
5255
|
-
}
|
5256
|
-
|
5257
|
-
style[key] = after.t.join('');
|
5606
|
+
for (; i < len; i++) {
|
5607
|
+
key = keys[i];
|
5608
|
+
if (key in style) {
|
5609
|
+
clean[key] = ''+ style[key];
|
5258
5610
|
}
|
5259
|
-
},
|
5260
5611
|
|
5261
|
-
|
5262
|
-
|
5263
|
-
|
5264
|
-
* @param Object style
|
5265
|
-
* @return Object end style
|
5266
|
-
*/
|
5267
|
-
_endStyle: function(style, keys) {
|
5268
|
-
var element = this.element,
|
5269
|
-
dummy = element.clone()
|
5270
|
-
.setStyle('position:absolute;z-index:-1;visibility:hidden')
|
5271
|
-
.setWidth(element.size().x)
|
5272
|
-
.setStyle(style);
|
5273
|
-
|
5274
|
-
if (element.parent()) {
|
5275
|
-
element.insert(dummy, 'before');
|
5612
|
+
// libwebkit bug fix for in case of languages pack applied
|
5613
|
+
if (key === 'opacity') {
|
5614
|
+
clean[key] = clean[key].replace(',', '.');
|
5276
5615
|
}
|
5616
|
+
}
|
5277
5617
|
|
5278
|
-
|
5279
|
-
|
5280
|
-
dummy.remove();
|
5281
|
-
|
5282
|
-
return after;
|
5283
|
-
},
|
5284
|
-
|
5285
|
-
/**
|
5286
|
-
* Fast styles cloning
|
5287
|
-
*
|
5288
|
-
* @param Element element
|
5289
|
-
* @param Array style keys
|
5290
|
-
* @return Hash of styles
|
5291
|
-
*/
|
5292
|
-
_cloneStyle: function(element, keys) {
|
5293
|
-
for (var i=0, len = keys.length, style = element.computedStyles(), clean = {}, key; i < len; i++) {
|
5294
|
-
key = keys[i];
|
5295
|
-
if (key in style) {
|
5296
|
-
clean[key] = ''+ style[key];
|
5297
|
-
}
|
5618
|
+
return clean;
|
5619
|
+
}
|
5298
5620
|
|
5299
|
-
|
5300
|
-
|
5301
|
-
|
5302
|
-
|
5303
|
-
|
5621
|
+
// calculating the end styles hash
|
5622
|
+
function end_style(element, style, keys) {
|
5623
|
+
var dummy = element.clone()
|
5624
|
+
.setStyle('position:absolute;z-index:-1;visibility:hidden')
|
5625
|
+
.setWidth(element.size().x)
|
5626
|
+
.setStyle(style), after;
|
5304
5627
|
|
5305
|
-
|
5628
|
+
if (element.parent()) {
|
5629
|
+
element.insert(dummy, 'before');
|
5306
5630
|
}
|
5307
|
-
});
|
5308
5631
|
|
5632
|
+
after = clone_style(dummy, keys);
|
5633
|
+
dummy.remove();
|
5634
|
+
|
5635
|
+
return after;
|
5636
|
+
}
|
5309
5637
|
|
5310
5638
|
|
5311
5639
|
/**
|
5312
5640
|
* the elements hightlighting effect
|
5313
5641
|
*
|
5314
|
-
* Copyright (C) 2008-
|
5642
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
5315
5643
|
*/
|
5316
5644
|
Fx.Highlight = new Class(Fx.Morph, {
|
5317
5645
|
extend: {
|
@@ -5331,19 +5659,22 @@ Fx.Highlight = new Class(Fx.Morph, {
|
|
5331
5659
|
* @return self
|
5332
5660
|
*/
|
5333
5661
|
prepare: function(start, end) {
|
5334
|
-
var element
|
5662
|
+
var element = this.element,
|
5663
|
+
element_style = element._.style,
|
5664
|
+
style_name = 'backgroundColor',
|
5665
|
+
end_color = end || element.getStyle(style_name);
|
5335
5666
|
|
5336
5667
|
if (is_transparent(end_color)) {
|
5337
|
-
this.onFinish(function() {
|
5668
|
+
this.onFinish(function() { element_style[style_name] = 'transparent'; });
|
5338
5669
|
|
5339
5670
|
// trying to find the end color
|
5340
|
-
end_color = [element].concat(element.parents())
|
5341
|
-
|
5342
|
-
|
5343
|
-
|
5671
|
+
end_color = [element].concat(element.parents())
|
5672
|
+
.map('getStyle', style_name)
|
5673
|
+
.reject(is_transparent)
|
5674
|
+
.compact().first() || '#FFF';
|
5344
5675
|
}
|
5345
5676
|
|
5346
|
-
|
5677
|
+
element_style[style_name] = (start || this.options.color);
|
5347
5678
|
|
5348
5679
|
return this.$super({backgroundColor: end_color});
|
5349
5680
|
}
|
@@ -5353,7 +5684,7 @@ Fx.Highlight = new Class(Fx.Morph, {
|
|
5353
5684
|
/**
|
5354
5685
|
* this is a superclass for the bidirectional effects
|
5355
5686
|
*
|
5356
|
-
* Copyright (C) 2008-
|
5687
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
5357
5688
|
*/
|
5358
5689
|
Fx.Twin = new Class(Fx.Morph, {
|
5359
5690
|
|
@@ -5363,8 +5694,9 @@ Fx.Twin = new Class(Fx.Morph, {
|
|
5363
5694
|
* @return Fx self
|
5364
5695
|
*/
|
5365
5696
|
finish: function() {
|
5366
|
-
if (this.how
|
5367
|
-
|
5697
|
+
if (this.how === 'out') {
|
5698
|
+
// calling 'prototype' to prevent circular calls from subclasses
|
5699
|
+
Element.prototype.hide.call(this.element);
|
5368
5700
|
}
|
5369
5701
|
|
5370
5702
|
return this.$super();
|
@@ -5380,7 +5712,7 @@ Fx.Twin = new Class(Fx.Morph, {
|
|
5380
5712
|
setHow: function(how) {
|
5381
5713
|
this.how = how || 'toggle';
|
5382
5714
|
|
5383
|
-
if (this.how
|
5715
|
+
if (this.how === 'toggle') {
|
5384
5716
|
this.how = this.element.visible() ? 'out' : 'in';
|
5385
5717
|
}
|
5386
5718
|
}
|
@@ -5391,7 +5723,7 @@ Fx.Twin = new Class(Fx.Morph, {
|
|
5391
5723
|
/**
|
5392
5724
|
* the slide effects wrapper
|
5393
5725
|
*
|
5394
|
-
* Copyright (C) 2008-
|
5726
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
5395
5727
|
*/
|
5396
5728
|
Fx.Slide = new Class(Fx.Twin, {
|
5397
5729
|
extend: {
|
@@ -5404,111 +5736,145 @@ Fx.Slide = new Class(Fx.Twin, {
|
|
5404
5736
|
prepare: function(how) {
|
5405
5737
|
this.setHow(how);
|
5406
5738
|
|
5407
|
-
|
5408
|
-
|
5409
|
-
|
5410
|
-
|
5411
|
-
|
5412
|
-
|
5413
|
-
|
5414
|
-
|
5415
|
-
|
5416
|
-
|
5417
|
-
|
5418
|
-
|
5419
|
-
},
|
5420
|
-
|
5421
|
-
_getBack: function() {
|
5422
|
-
this.element.setStyle(this.styles);
|
5423
|
-
},
|
5424
|
-
|
5425
|
-
// calculates the final style
|
5426
|
-
_getStyle: function(direction) {
|
5427
|
-
var style = {}, size = this.size,
|
5428
|
-
margin_left = this.styles.marginLeft.toFloat() || 0,
|
5429
|
-
margin_top = this.styles.marginTop.toFloat() || 0;
|
5430
|
-
|
5431
|
-
if (this.how == 'out') {
|
5432
|
-
style[['top', 'bottom'].include(direction) ? 'height' : 'width'] = '0px';
|
5433
|
-
|
5434
|
-
if (direction == 'right') {
|
5435
|
-
style.marginLeft = margin_left + size.x+'px';
|
5436
|
-
} else if (direction == 'bottom') {
|
5437
|
-
style.marginTop = margin_top + size.y +'px';
|
5739
|
+
// calling 'prototype' to prevent circular calls from subclasses
|
5740
|
+
var element = Element.prototype.show.call(this.element),
|
5741
|
+
element_style = element._.style,
|
5742
|
+
old_styles = Object.only(
|
5743
|
+
element_style,
|
5744
|
+
'overflow', 'width', 'height',
|
5745
|
+
'marginTop', 'marginLeft'
|
5746
|
+
);
|
5747
|
+
|
5748
|
+
function restore_styles() {
|
5749
|
+
for (var key in old_styles) {
|
5750
|
+
element_style[key] = old_styles[key];
|
5438
5751
|
}
|
5752
|
+
}
|
5439
5753
|
|
5440
|
-
|
5441
|
-
var element_style = this.element._.style;
|
5754
|
+
this.onFinish(restore_styles).onCancel(restore_styles);
|
5442
5755
|
|
5443
|
-
|
5444
|
-
style.height = size.y + 'px';
|
5445
|
-
element_style.height = '0px';
|
5446
|
-
} else {
|
5447
|
-
style.width = size.x + 'px';
|
5448
|
-
element_style.width = '0px';
|
5449
|
-
}
|
5756
|
+
element_style.overflow = 'hidden';
|
5450
5757
|
|
5451
|
-
|
5452
|
-
|
5453
|
-
|
5454
|
-
|
5455
|
-
|
5456
|
-
|
5457
|
-
|
5758
|
+
return this.$super(fx_slide_prepare_styles(
|
5759
|
+
element_style,
|
5760
|
+
element.size(),
|
5761
|
+
this.options.direction,
|
5762
|
+
this.how
|
5763
|
+
));
|
5764
|
+
}
|
5765
|
+
});
|
5766
|
+
|
5767
|
+
function fx_slide_prepare_styles(element_style, size, direction, how) {
|
5768
|
+
var style = {},
|
5769
|
+
margin_left = element_style.marginLeft.toFloat() || 0,
|
5770
|
+
margin_top = element_style.marginTop.toFloat() || 0,
|
5771
|
+
to_right = direction === 'right',
|
5772
|
+
to_bottom = direction === 'bottom',
|
5773
|
+
vertical = direction === 'top' || to_bottom;
|
5774
|
+
|
5775
|
+
if (how === 'out') {
|
5776
|
+
style[vertical ? 'height' : 'width'] = '0px';
|
5777
|
+
|
5778
|
+
if (to_right) {
|
5779
|
+
style.marginLeft = margin_left + size.x+'px';
|
5780
|
+
} else if (to_bottom) {
|
5781
|
+
style.marginTop = margin_top + size.y +'px';
|
5782
|
+
}
|
5783
|
+
} else {
|
5784
|
+
if (vertical) {
|
5785
|
+
style.height = size.y + 'px';
|
5786
|
+
element_style.height = '0px';
|
5787
|
+
} else {
|
5788
|
+
style.width = size.x + 'px';
|
5789
|
+
element_style.width = '0px';
|
5458
5790
|
}
|
5459
5791
|
|
5460
|
-
|
5792
|
+
if (to_right) {
|
5793
|
+
style.marginLeft = margin_left + 'px';
|
5794
|
+
element_style.marginLeft = margin_left + size.x + 'px';
|
5795
|
+
} else if (to_bottom) {
|
5796
|
+
style.marginTop = margin_top + 'px';
|
5797
|
+
element_style.marginTop = margin_top + size.y + 'px';
|
5798
|
+
}
|
5461
5799
|
}
|
5462
5800
|
|
5463
|
-
|
5801
|
+
return style;
|
5802
|
+
}
|
5464
5803
|
|
5465
5804
|
|
5466
5805
|
/**
|
5467
5806
|
* The opacity effects wrapper
|
5468
5807
|
*
|
5469
|
-
* Copyright (C) 2008-
|
5808
|
+
* Copyright (C) 2008-2011 Nikolay V. Nemshilov
|
5470
5809
|
*/
|
5471
5810
|
Fx.Fade = new Class(Fx.Twin, {
|
5472
5811
|
prepare: function(how) {
|
5473
5812
|
this.setHow(how);
|
5474
5813
|
|
5475
|
-
if (this.how
|
5476
|
-
|
5814
|
+
if (this.how === 'in') {
|
5815
|
+
// calling 'prototype' to prevent circular calls from subclasses
|
5816
|
+
Element.prototype.show.call(this.element.setStyle({opacity: 0}));
|
5477
5817
|
}
|
5478
5818
|
|
5479
|
-
return this.$super({opacity:
|
5819
|
+
return this.$super({opacity: this.how === 'in' ? 1 : 0});
|
5480
5820
|
}
|
5481
5821
|
});
|
5482
5822
|
|
5483
5823
|
|
5824
|
+
/**
|
5825
|
+
* An abstract attributes based Fx
|
5826
|
+
*
|
5827
|
+
* Copyright (C) 2010 Nikolay Nemshilov
|
5828
|
+
*/
|
5829
|
+
Fx.Attr = new Class(Fx, {
|
5830
|
+
|
5831
|
+
prepare: function(attrs) {
|
5832
|
+
this.before = {};
|
5833
|
+
this.after = attrs;
|
5834
|
+
var key, element = this.element._;
|
5835
|
+
|
5836
|
+
for (key in attrs) {
|
5837
|
+
this.before[key] = element[key];
|
5838
|
+
}
|
5839
|
+
},
|
5840
|
+
|
5841
|
+
render: function(delta) {
|
5842
|
+
var key, element = this.element._, before = this.before;
|
5843
|
+
for (key in before) {
|
5844
|
+
element[key] = before[key] + (this.after[key] - before[key]) * delta;
|
5845
|
+
}
|
5846
|
+
}
|
5847
|
+
|
5848
|
+
});
|
5849
|
+
|
5484
5850
|
/**
|
5485
5851
|
* A smooth scrolling visual effect
|
5486
5852
|
*
|
5487
|
-
* Copyright (C) 2009-
|
5853
|
+
* Copyright (C) 2009-2011 Nikolay Nemshilov
|
5488
5854
|
*/
|
5489
|
-
Fx.Scroll = new Class(Fx, {
|
5855
|
+
Fx.Scroll = new Class(Fx.Attr, {
|
5490
5856
|
|
5491
5857
|
initialize: function(element, options) {
|
5492
5858
|
element = $(element);
|
5493
5859
|
// swapping the actual scrollable when it's the window
|
5494
|
-
this.$super(
|
5860
|
+
this.$super(
|
5861
|
+
element instanceof Window ?
|
5862
|
+
element._.document[
|
5863
|
+
Browser.WebKit ? 'body' : 'documentElement'
|
5864
|
+
] : element,
|
5865
|
+
options
|
5866
|
+
);
|
5495
5867
|
},
|
5496
5868
|
|
5497
5869
|
prepare: function(value) {
|
5498
|
-
var
|
5499
|
-
|
5500
|
-
this.after = value;
|
5870
|
+
var attrs = {};
|
5501
5871
|
|
5502
|
-
if ('x' in value) {
|
5503
|
-
if ('y' in value) {
|
5504
|
-
},
|
5872
|
+
if ('x' in value) { attrs.scrollLeft = value.x; }
|
5873
|
+
if ('y' in value) { attrs.scrollTop = value.y; }
|
5505
5874
|
|
5506
|
-
|
5507
|
-
var before = this.before, key;
|
5508
|
-
for (key in before) {
|
5509
|
-
this.element._['scroll' + (key == 'x' ? 'Left' : 'Top')] = before[key] + (this.after[key] - before[key]) * delta;
|
5510
|
-
}
|
5875
|
+
this.$super(attrs);
|
5511
5876
|
}
|
5877
|
+
|
5512
5878
|
});
|
5513
5879
|
|
5514
5880
|
|
@@ -5588,8 +5954,10 @@ var Cookie = RightJS.Cookie = new Class({
|
|
5588
5954
|
* @return mixed saved value or null if nothing found
|
5589
5955
|
*/
|
5590
5956
|
get: function() {
|
5591
|
-
var value = this.options.document.cookie.match(
|
5592
|
-
|
5957
|
+
var value = this.options.document.cookie.match(
|
5958
|
+
'(?:^|;)\\s*' + RegExp.escape(this.name) + '=([^;]*)'
|
5959
|
+
);
|
5960
|
+
return value ? decodeURIComponent(value[1]) : null;
|
5593
5961
|
},
|
5594
5962
|
|
5595
5963
|
/**
|
@@ -5618,11 +5986,16 @@ return RightJS;
|
|
5618
5986
|
* finds the core inclusion tag and uses it's src attribute
|
5619
5987
|
* to dynamically load the olds patch
|
5620
5988
|
*
|
5621
|
-
* Copyright (C) 2009-
|
5989
|
+
* Copyright (C) 2009-2011 Nikolay V. Nemshilov
|
5622
5990
|
*/
|
5623
|
-
if (
|
5624
|
-
|
5625
|
-
|
5626
|
-
|
5627
|
-
|
5991
|
+
if (RightJS.Browser.OLD) {
|
5992
|
+
(function(d) {
|
5993
|
+
var script = d.createElement('script'),
|
5994
|
+
scripts = d.getElementsByTagName('script'),
|
5995
|
+
rjs_spt = scripts[scripts.length - 1];
|
5996
|
+
|
5997
|
+
script.src = rjs_spt.src.replace(/(^|\/)(right)([^\/]+)$/, '$1$2-olds$3');
|
5998
|
+
|
5999
|
+
rjs_spt.parentNode.appendChild(script);
|
6000
|
+
})(document);
|
5628
6001
|
}
|