-
Notifications
You must be signed in to change notification settings - Fork 1
/
mootools.js
7102 lines (5743 loc) · 180 KB
/
mootools.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
Script: Core.js
Mootools - My Object Oriented javascript.
License:
MIT-style license.
MooTools Copyright:
copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>
MooTools Credits:
- Class is slightly based on Base.js <http://dean.edwards.name/weblog/2006/03/base/> (c) 2006 Dean Edwards, License <http://creativecommons.org/licenses/LGPL/2.1/>
- Some functions are inspired by those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license
- Documentation by Aaron Newton (aaron.newton [at] cnet [dot] com) and Valerio Proietti.
*/
var MooTools = {
version: '1.11'
};
/* Section: Core Functions */
/*
Function: $defined
Returns true if the passed in value/object is defined, that means is not null or undefined.
Arguments:
obj - object to inspect
*/
function $defined(obj){
return (obj != undefined);
};
/*
Function: $type
Returns the type of object that matches the element passed in.
Arguments:
obj - the object to inspect.
Example:
>var myString = 'hello';
>$type(myString); //returns "string"
Returns:
'element' - if obj is a DOM element node
'textnode' - if obj is a DOM text node
'whitespace' - if obj is a DOM whitespace node
'arguments' - if obj is an arguments object
'object' - if obj is an object
'string' - if obj is a string
'number' - if obj is a number
'boolean' - if obj is a boolean
'function' - if obj is a function
'regexp' - if obj is a regular expression
'class' - if obj is a Class. (created with new Class, or the extend of another class).
'collection' - if obj is a native htmlelements collection, such as childNodes, getElementsByTagName .. etc.
false - (boolean) if the object is not defined or none of the above.
*/
function $type(obj){
if (!$defined(obj)) return false;
if (obj.htmlElement) return 'element';
var type = typeof obj;
if (type == 'object' && obj.nodeName){
switch(obj.nodeType){
case 1: return 'element';
case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
}
}
if (type == 'object' || type == 'function'){
switch(obj.constructor){
case Array: return 'array';
case RegExp: return 'regexp';
case Class: return 'class';
}
if (typeof obj.length == 'number'){
if (obj.item) return 'collection';
if (obj.callee) return 'arguments';
}
}
return type;
};
/*
Function: $merge
merges a number of objects recursively without referencing them or their sub-objects.
Arguments:
any number of objects.
Example:
>var mergedObj = $merge(obj1, obj2, obj3);
>//obj1, obj2, and obj3 are unaltered
*/
function $merge(){
var mix = {};
for (var i = 0; i < arguments.length; i++){
for (var property in arguments[i]){
var ap = arguments[i][property];
var mp = mix[property];
if (mp && $type(ap) == 'object' && $type(mp) == 'object') mix[property] = $merge(mp, ap);
else mix[property] = ap;
}
}
return mix;
};
/*
Function: $extend
Copies all the properties from the second passed object to the first passed Object.
If you do myWhatever.extend = $extend the first parameter will become myWhatever, and your extend function will only need one parameter.
Example:
(start code)
var firstOb = {
'name': 'John',
'lastName': 'Doe'
};
var secondOb = {
'age': '20',
'sex': 'male',
'lastName': 'Dorian'
};
$extend(firstOb, secondOb);
//firstOb will become:
{
'name': 'John',
'lastName': 'Dorian',
'age': '20',
'sex': 'male'
};
(end)
Returns:
The first object, extended.
*/
var $extend = function(){
var args = arguments;
if (!args[1]) args = [this, args[0]];
for (var property in args[1]) args[0][property] = args[1][property];
return args[0];
};
/*
Function: $native
Will add a .extend method to the objects passed as a parameter, but the property passed in will be copied to the object's prototype only if non previously existent.
Its handy if you dont want the .extend method of an object to overwrite existing methods.
Used automatically in MooTools to implement Array/String/Function/Number methods to browser that dont support them whitout manual checking.
Arguments:
a number of classes/native javascript objects
*/
var $native = function(){
for (var i = 0, l = arguments.length; i < l; i++){
arguments[i].extend = function(props){
for (var prop in props){
if (!this.prototype[prop]) this.prototype[prop] = props[prop];
if (!this[prop]) this[prop] = $native.generic(prop);
}
};
}
};
$native.generic = function(prop){
return function(bind){
return this.prototype[prop].apply(bind, Array.prototype.slice.call(arguments, 1));
};
};
$native(Function, Array, String, Number);
/*
Function: $chk
Returns true if the passed in value/object exists or is 0, otherwise returns false.
Useful to accept zeroes.
Arguments:
obj - object to inspect
*/
function $chk(obj){
return !!(obj || obj === 0);
};
/*
Function: $pick
Returns the first object if defined, otherwise returns the second.
Arguments:
obj - object to test
picked - the default to return
Example:
(start code)
function say(msg){
alert($pick(msg, 'no meessage supplied'));
}
(end)
*/
function $pick(obj, picked){
return $defined(obj) ? obj : picked;
};
/*
Function: $random
Returns a random integer number between the two passed in values.
Arguments:
min - integer, the minimum value (inclusive).
max - integer, the maximum value (inclusive).
Returns:
a random integer between min and max.
*/
function $random(min, max){
return Math.floor(Math.random() * (max - min + 1) + min);
};
/*
Function: $time
Returns the current timestamp
Returns:
a timestamp integer.
*/
function $time(){
return new Date().getTime();
};
/*
Function: $clear
clears a timeout or an Interval.
Returns:
null
Arguments:
timer - the setInterval or setTimeout to clear.
Example:
>var myTimer = myFunction.delay(5000); //wait 5 seconds and execute my function.
>myTimer = $clear(myTimer); //nevermind
See also:
<Function.delay>, <Function.periodical>
*/
function $clear(timer){
clearTimeout(timer);
clearInterval(timer);
return null;
};
/*
Class: Abstract
Abstract class, to be used as singleton. Will add .extend to any object
Arguments:
an object
Returns:
the object with an .extend property, equivalent to <$extend>.
*/
var Abstract = function(obj){
obj = obj || {};
obj.extend = $extend;
return obj;
};
//window, document
var Window = new Abstract(window);
var Document = new Abstract(document);
document.head = document.getElementsByTagName('head')[0];
/*
Class: window
Some properties are attached to the window object by the browser detection.
Note:
browser detection is entirely object-based. We dont sniff.
Properties:
window.ie - will be set to true if the current browser is internet explorer (any).
window.ie6 - will be set to true if the current browser is internet explorer 6.
window.ie7 - will be set to true if the current browser is internet explorer 7.
window.gecko - will be set to true if the current browser is Mozilla/Gecko.
window.webkit - will be set to true if the current browser is Safari/Konqueror.
window.webkit419 - will be set to true if the current browser is Safari2 / webkit till version 419.
window.webkit420 - will be set to true if the current browser is Safari3 (Webkit SVN Build) / webkit over version 419.
window.opera - is set to true by opera itself.
*/
window.xpath = !!(document.evaluate);
if (window.ActiveXObject) window.ie = window[window.XMLHttpRequest ? 'ie7' : 'ie6'] = true;
else if (document.childNodes && !document.all && !navigator.taintEnabled) window.webkit = window[window.xpath ? 'webkit420' : 'webkit419'] = true;
else if (document.getBoxObjectFor != null) window.gecko = true;
/*compatibility*/
window.khtml = window.webkit;
Object.extend = $extend;
/*end compatibility*/
//htmlelement
if (typeof HTMLElement == 'undefined'){
var HTMLElement = function(){};
if (window.webkit) document.createElement("iframe"); //fixes safari
HTMLElement.prototype = (window.webkit) ? window["[[DOMElement.prototype]]"] : {};
}
HTMLElement.prototype.htmlElement = function(){};
//enables background image cache for internet explorer 6
if (window.ie6) try {document.execCommand("BackgroundImageCache", false, true);} catch(e){};
/*
Script: Class.js
Contains the Class Function, aims to ease the creation of reusable Classes.
License:
MIT-style license.
*/
/*
Class: Class
The base class object of the <http://mootools.net> framework.
Creates a new class, its initialize method will fire upon class instantiation.
Initialize wont fire on instantiation when you pass *null*.
Arguments:
properties - the collection of properties that apply to the class.
Example:
(start code)
var Cat = new Class({
initialize: function(name){
this.name = name;
}
});
var myCat = new Cat('Micia');
alert(myCat.name); //alerts 'Micia'
(end)
*/
var Class = function(properties){
var klass = function(){
return (arguments[0] !== null && this.initialize && $type(this.initialize) == 'function') ? this.initialize.apply(this, arguments) : this;
};
$extend(klass, this);
klass.prototype = properties;
klass.constructor = Class;
return klass;
};
/*
Property: empty
Returns an empty function
*/
Class.empty = function(){};
Class.prototype = {
/*
Property: extend
Returns the copy of the Class extended with the passed in properties.
Arguments:
properties - the properties to add to the base class in this new Class.
Example:
(start code)
var Animal = new Class({
initialize: function(age){
this.age = age;
}
});
var Cat = Animal.extend({
initialize: function(name, age){
this.parent(age); //will call the previous initialize;
this.name = name;
}
});
var myCat = new Cat('Micia', 20);
alert(myCat.name); //alerts 'Micia'
alert(myCat.age); //alerts 20
(end)
*/
extend: function(properties){
var proto = new this(null);
for (var property in properties){
var pp = proto[property];
proto[property] = Class.Merge(pp, properties[property]);
}
return new Class(proto);
},
/*
Property: implement
Implements the passed in properties to the base Class prototypes, altering the base class, unlike <Class.extend>.
Arguments:
properties - the properties to add to the base class.
Example:
(start code)
var Animal = new Class({
initialize: function(age){
this.age = age;
}
});
Animal.implement({
setName: function(name){
this.name = name
}
});
var myAnimal = new Animal(20);
myAnimal.setName('Micia');
alert(myAnimal.name); //alerts 'Micia'
(end)
*/
implement: function(){
for (var i = 0, l = arguments.length; i < l; i++) $extend(this.prototype, arguments[i]);
}
};
//internal
Class.Merge = function(previous, current){
if (previous && previous != current){
var type = $type(current);
if (type != $type(previous)) return current;
switch(type){
case 'function':
var merged = function(){
this.parent = arguments.callee.parent;
return current.apply(this, arguments);
};
merged.parent = previous;
return merged;
case 'object': return $merge(previous, current);
}
}
return current;
};
/*
Script: Class.Extras.js
Contains common implementations for custom classes. In Mootools is implemented in <Ajax>, <XHR> and <Fx.Base> and many more.
License:
MIT-style license.
*/
/*
Class: Chain
An "Utility" Class. Its methods can be implemented with <Class.implement> into any <Class>.
Currently implemented in <Fx.Base>, <XHR> and <Ajax>. In <Fx.Base> for example, is used to execute a list of function, one after another, once the effect is completed.
The functions will not be fired all togheter, but one every completion, to create custom complex animations.
Example:
(start code)
var myFx = new Fx.Style('element', 'opacity');
myFx.start(1,0).chain(function(){
myFx.start(0,1);
}).chain(function(){
myFx.start(1,0);
}).chain(function(){
myFx.start(0,1);
});
//the element will appear and disappear three times
(end)
*/
var Chain = new Class({
/*
Property: chain
adds a function to the Chain instance stack.
Arguments:
fn - the function to append.
*/
chain: function(fn){
this.chains = this.chains || [];
this.chains.push(fn);
return this;
},
/*
Property: callChain
Executes the first function of the Chain instance stack, then removes it. The first function will then become the second.
*/
callChain: function(){
if (this.chains && this.chains.length) this.chains.shift().delay(10, this);
},
/*
Property: clearChain
Clears the stack of a Chain instance.
*/
clearChain: function(){
this.chains = [];
}
});
/*
Class: Events
An "Utility" Class. Its methods can be implemented with <Class.implement> into any <Class>.
In <Fx.Base> Class, for example, is used to give the possibility add any number of functions to the Effects events, like onComplete, onStart, onCancel.
Events in a Class that implements <Events> can be either added as an option, or with addEvent. Never with .options.onEventName.
Example:
(start code)
var myFx = new Fx.Style('element', 'opacity').addEvent('onComplete', function(){
alert('the effect is completed');
}).addEvent('onComplete', function(){
alert('I told you the effect is completed');
});
myFx.start(0,1);
//upon completion it will display the 2 alerts, in order.
(end)
Implementing:
This class can be implemented into other classes to add the functionality to them.
Goes well with the <Options> class.
Example:
(start code)
var Widget = new Class({
initialize: function(){},
finish: function(){
this.fireEvent('onComplete');
}
});
Widget.implement(new Events);
//later...
var myWidget = new Widget();
myWidget.addEvent('onComplete', myfunction);
(end)
*/
var Events = new Class({
/*
Property: addEvent
adds an event to the stack of events of the Class instance.
Arguments:
type - string; the event name (e.g. 'onComplete')
fn - function to execute
*/
addEvent: function(type, fn){
if (fn != Class.empty){
this.$events = this.$events || {};
this.$events[type] = this.$events[type] || [];
this.$events[type].include(fn);
}
return this;
},
/*
Property: fireEvent
fires all events of the specified type in the Class instance.
Arguments:
type - string; the event name (e.g. 'onComplete')
args - array or single object; arguments to pass to the function; if more than one argument, must be an array
delay - (integer) delay (in ms) to wait to execute the event
Example:
(start code)
var Widget = new Class({
initialize: function(arg1, arg2){
...
this.fireEvent("onInitialize", [arg1, arg2], 50);
}
});
Widget.implement(new Events);
(end)
*/
fireEvent: function(type, args, delay){
if (this.$events && this.$events[type]){
this.$events[type].each(function(fn){
fn.create({'bind': this, 'delay': delay, 'arguments': args})();
}, this);
}
return this;
},
/*
Property: removeEvent
removes an event from the stack of events of the Class instance.
Arguments:
type - string; the event name (e.g. 'onComplete')
fn - function that was added
*/
removeEvent: function(type, fn){
if (this.$events && this.$events[type]) this.$events[type].remove(fn);
return this;
}
});
/*
Class: Options
An "Utility" Class. Its methods can be implemented with <Class.implement> into any <Class>.
Used to automate the options settings, also adding Class <Events> when the option begins with on.
Example:
(start code)
var Widget = new Class({
options: {
color: '#fff',
size: {
width: 100
height: 100
}
},
initialize: function(options){
this.setOptions(options);
}
});
Widget.implement(new Options);
//later...
var myWidget = new Widget({
color: '#f00',
size: {
width: 200
}
});
//myWidget.options = {color: #f00, size: {width: 200, height: 100}}
(end)
*/
var Options = new Class({
/*
Property: setOptions
sets this.options
Arguments:
defaults - object; the default set of options
options - object; the user entered options. can be empty too.
Note:
if your Class has <Events> implemented, every option beginning with on, followed by a capital letter (onComplete) becomes an Class instance event.
*/
setOptions: function(){
this.options = $merge.apply(null, [this.options].extend(arguments));
if (this.addEvent){
for (var option in this.options){
if ($type(this.options[option] == 'function') && (/^on[A-Z]/).test(option)) this.addEvent(option, this.options[option]);
}
}
return this;
}
});
/*
Script: Array.js
Contains Array prototypes, <$A>, <$each>
License:
MIT-style license.
*/
/*
Class: Array
A collection of The Array Object prototype methods.
*/
//custom methods
Array.extend({
/*
Property: forEach
Iterates through an array; This method is only available for browsers without native *forEach* support.
For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:forEach>
*forEach* executes the provided function (callback) once for each element present in the array. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
Arguments:
fn - function to execute with each item in the array; passed the item and the index of that item in the array
bind - the object to bind "this" to (see <Function.bind>)
Example:
>['apple','banana','lemon'].each(function(item, index){
> alert(index + " = " + item); //alerts "0 = apple" etc.
>}, bindObj); //optional second arg for binding, not used here
*/
forEach: function(fn, bind){
for (var i = 0, j = this.length; i < j; i++) fn.call(bind, this[i], i, this);
},
/*
Property: filter
This method is provided only for browsers without native *filter* support.
For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:filter>
*filter* calls a provided callback function once for each element in an array, and constructs a new array of all the values for which callback returns a true value. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values. Array elements which do not pass the callback test are simply skipped, and are not included in the new array.
Arguments:
fn - function to execute with each item in the array; passed the item and the index of that item in the array
bind - the object to bind "this" to (see <Function.bind>)
Example:
>var biggerThanTwenty = [10,3,25,100].filter(function(item, index){
> return item > 20;
>});
>//biggerThanTwenty = [25,100]
*/
filter: function(fn, bind){
var results = [];
for (var i = 0, j = this.length; i < j; i++){
if (fn.call(bind, this[i], i, this)) results.push(this[i]);
}
return results;
},
/*
Property: map
This method is provided only for browsers without native *map* support.
For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:map>
*map* calls a provided callback function once for each element in an array, in order, and constructs a new array from the results. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
Arguments:
fn - function to execute with each item in the array; passed the item and the index of that item in the array
bind - the object to bind "this" to (see <Function.bind>)
Example:
>var timesTwo = [1,2,3].map(function(item, index){
> return item*2;
>});
>//timesTwo = [2,4,6];
*/
map: function(fn, bind){
var results = [];
for (var i = 0, j = this.length; i < j; i++) results[i] = fn.call(bind, this[i], i, this);
return results;
},
/*
Property: every
This method is provided only for browsers without native *every* support.
For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every>
*every* executes the provided callback function once for each element present in the array until it finds one where callback returns a false value. If such an element is found, the every method immediately returns false. Otherwise, if callback returned a true value for all elements, every will return true. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
Arguments:
fn - function to execute with each item in the array; passed the item and the index of that item in the array
bind - the object to bind "this" to (see <Function.bind>)
Example:
>var areAllBigEnough = [10,4,25,100].every(function(item, index){
> return item > 20;
>});
>//areAllBigEnough = false
*/
every: function(fn, bind){
for (var i = 0, j = this.length; i < j; i++){
if (!fn.call(bind, this[i], i, this)) return false;
}
return true;
},
/*
Property: some
This method is provided only for browsers without native *some* support.
For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some>
*some* executes the callback function once for each element present in the array until it finds one where callback returns a true value. If such an element is found, some immediately returns true. Otherwise, some returns false. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
Arguments:
fn - function to execute with each item in the array; passed the item and the index of that item in the array
bind - the object to bind "this" to (see <Function.bind>)
Example:
>var isAnyBigEnough = [10,4,25,100].some(function(item, index){
> return item > 20;
>});
>//isAnyBigEnough = true
*/
some: function(fn, bind){
for (var i = 0, j = this.length; i < j; i++){
if (fn.call(bind, this[i], i, this)) return true;
}
return false;
},
/*
Property: indexOf
This method is provided only for browsers without native *indexOf* support.
For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf>
*indexOf* compares a search element to elements of the Array using strict equality (the same method used by the ===, or triple-equals, operator).
Arguments:
item - any type of object; element to locate in the array
from - integer; optional; the index of the array at which to begin the search (defaults to 0)
Example:
>['apple','lemon','banana'].indexOf('lemon'); //returns 1
>['apple','lemon'].indexOf('banana'); //returns -1
*/
indexOf: function(item, from){
var len = this.length;
for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
if (this[i] === item) return i;
}
return -1;
},
/*
Property: each
Same as <Array.forEach>.
Arguments:
fn - function to execute with each item in the array; passed the item and the index of that item in the array
bind - optional, the object that the "this" of the function will refer to.
Example:
>var Animals = ['Cat', 'Dog', 'Coala'];
>Animals.each(function(animal){
> document.write(animal)
>});
*/
/*
Property: copy
returns a copy of the array.
Returns:
a new array which is a copy of the current one.
Arguments:
start - integer; optional; the index where to start the copy, default is 0. If negative, it is taken as the offset from the end of the array.
length - integer; optional; the number of elements to copy. By default, copies all elements from start to the end of the array.
Example:
>var letters = ["a","b","c"];
>var copy = letters.copy(); // ["a","b","c"] (new instance)
*/
copy: function(start, length){
start = start || 0;
if (start < 0) start = this.length + start;
length = length || (this.length - start);
var newArray = [];
for (var i = 0; i < length; i++) newArray[i] = this[start++];
return newArray;
},
/*
Property: remove
Removes all occurrences of an item from the array.
Arguments:
item - the item to remove
Returns:
the Array with all occurrences of the item removed.
Example:
>["1","2","3","2"].remove("2") // ["1","3"];
*/
remove: function(item){
var i = 0;
var len = this.length;
while (i < len){
if (this[i] === item){
this.splice(i, 1);
len--;
} else {
i++;
}
}
return this;
},
/*
Property: contains
Tests an array for the presence of an item.
Arguments:
item - the item to search for in the array.
from - integer; optional; the index at which to begin the search, default is 0. If negative, it is taken as the offset from the end of the array.
Returns:
true - the item was found
false - it wasn't
Example:
>["a","b","c"].contains("a"); // true
>["a","b","c"].contains("d"); // false
*/
contains: function(item, from){
return this.indexOf(item, from) != -1;
},
/*
Property: associate
Creates an object with key-value pairs based on the array of keywords passed in
and the current content of the array.
Arguments:
keys - the array of keywords.
Example:
(start code)
var Animals = ['Cat', 'Dog', 'Coala', 'Lizard'];
var Speech = ['Miao', 'Bau', 'Fruuu', 'Mute'];
var Speeches = Animals.associate(Speech);
//Speeches['Miao'] is now Cat.
//Speeches['Bau'] is now Dog.
//...
(end)
*/
associate: function(keys){
var obj = {}, length = Math.min(this.length, keys.length);
for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
return obj;
},
/*
Property: extend
Extends an array with another one.
Arguments:
array - the array to extend ours with
Example:
>var Animals = ['Cat', 'Dog', 'Coala'];
>Animals.extend(['Lizard']);
>//Animals is now: ['Cat', 'Dog', 'Coala', 'Lizard'];
*/
extend: function(array){
for (var i = 0, j = array.length; i < j; i++) this.push(array[i]);
return this;
},
/*
Property: merge
merges an array in another array, without duplicates. (case- and type-sensitive)
Arguments:
array - the array to merge from.
Example:
>['Cat','Dog'].merge(['Dog','Coala']); //returns ['Cat','Dog','Coala']
*/
merge: function(array){
for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
return this;
},
/*
Property: include