1
|
1 // $Id: utils.js,v 1.4 2014/02/26 14:47:32 zaretska Exp $
|
|
2
|
|
3 utils = {
|
|
4
|
|
5 KeyCode_TAB: 9,
|
|
6 KeyCode_DELETE: 46,
|
|
7 KeyCode_BACKSPACE: 8,
|
|
8 KeyCode_LEFT_ARROW: 37,
|
|
9 KeyCode_RIGHT_ARROW: 39,
|
|
10 KeyCode_HOME: 36,
|
|
11 KeyCode_END: 35,
|
|
12 KeyCode_PAGE_UP: 33,
|
|
13 KeyCode_PAGE_DOWN: 34,
|
|
14 KeyCode_UP_ARROW: 38,
|
|
15 KeyCode_DOWN_ARROW: 40,
|
|
16 KeyCode_ESC: 27,
|
|
17 KeyCode_ENTER: 13,
|
|
18 KeyCode_SPACE: 32,
|
|
19 KeyCode_SHIFT_KEY: 16,
|
|
20 KeyCode_CTRL_KEY: 17,
|
|
21 KeyCode_ALT_KEY: 18,
|
|
22 KeyCode_LEFT_MS_WINDOWS_KEY: 91,
|
|
23 KeyCode_RIGHT_MS_WINDOWS_KEY: 92,
|
|
24 KeyCode_MS_MENU_KEY: 93,
|
|
25
|
|
26 isObject: function(a) { return (a && typeof a == 'object'); },
|
|
27
|
|
28 isArray: function(a) { return this.isObject(a) && a.constructor == Array; },
|
|
29
|
|
30 insertInHtml: function(text, obj) {
|
|
31 if (document.all) {
|
|
32 obj.innerHTML += text;
|
|
33 } else {
|
|
34 var range = document.createRange();
|
|
35 range.setStartAfter(obj);
|
|
36 var docFrag = range.createContextualFragment(text);
|
|
37 obj.appendChild(docFrag);
|
|
38 }
|
|
39
|
|
40 },
|
|
41
|
|
42 replaceInHtml: function(text, obj) {
|
|
43 if (document.all) {
|
|
44 obj.innerHTML = text;
|
|
45 } else {
|
|
46 while (obj.hasChildNodes()) obj.removeChild(obj.firstChild);
|
|
47 var range = document.createRange();
|
|
48 range.setStartAfter(obj);
|
|
49 var docFrag = range.createContextualFragment(text);
|
|
50 obj.appendChild(docFrag);
|
|
51 }
|
|
52 },
|
|
53
|
|
54
|
|
55 getTargetObj: function(eEvent) {
|
|
56 var oTarget;
|
|
57 var e = eEvent || window.event;
|
|
58 if (e == null) return null;
|
|
59 if (e.srcElement == null) {
|
|
60 oTarget = e.target;
|
|
61 } else {
|
|
62 oTarget = e.srcElement;
|
|
63 }
|
|
64 while ( oTarget && oTarget.nodeType != 1 ) oTarget = oTarget.parentNode;
|
|
65 return oTarget;
|
|
66 },
|
|
67
|
|
68
|
|
69
|
|
70
|
|
71 getParent: function(obj) {
|
|
72 if (obj) {
|
|
73 var result = obj.parentNode;
|
|
74 while (result && result.nodeType != 1) result = result.nextSibling;
|
|
75 if (result) return result;
|
|
76 }
|
|
77 return null;
|
|
78 },
|
|
79
|
|
80 getFirstChild: function(obj) {
|
|
81 if (obj) {
|
|
82 var result = obj.firstChild;
|
|
83 while (result && result.nodeType != 1) result = result.nextSibling;
|
|
84 if (result) return result;
|
|
85 }
|
|
86 return null;
|
|
87 },
|
|
88
|
|
89 getNextSibling: function(obj, tagName) {
|
|
90 if (obj) {
|
|
91 var result = obj.nextSibling;
|
|
92 if (tagName) {
|
|
93 var tn = tagName.toUpperCase();
|
|
94 while (result && result.tagName != tn) result = result.nextSibling;
|
|
95 } else {
|
|
96 while (result && result.nodeType != 1) result = result.nextSibling;
|
|
97 }
|
|
98 return result;
|
|
99 }
|
|
100 return null;
|
|
101 },
|
|
102
|
|
103 getPreviousSibling: function(obj, tagName) {
|
|
104 if (obj) {
|
|
105 var result = obj.previousSibling;
|
|
106 if (tagName) {
|
|
107 var tn = tagName.toUpperCase();
|
|
108 while (result && result.tagName != tn) result = result.previousSibling;
|
|
109 } else {
|
|
110 while (result && result.nodeType != 1) result = result.previousSibling;
|
|
111 }
|
|
112 return result;
|
|
113 }
|
|
114 return null;
|
|
115 },
|
|
116
|
|
117 removeChildren: function(oObj) {
|
|
118 if (!oObj || typeof oObj != "object") return;
|
|
119 while(oObj.hasChildNodes()) oObj.removeChild(oObj.firstChild)
|
|
120 },
|
|
121
|
|
122 insertAfter: function(parent, node, referenceNode) {
|
|
123 parent.insertBefore(node, referenceNode.nextSibling);
|
|
124 },
|
|
125
|
|
126 nextItem: function(item, nodeName) {
|
|
127 if (item == null) return;
|
|
128 var next = item.nextSibling;
|
|
129 while (next != null) {
|
|
130 if (next.nodeName == nodeName) return next;
|
|
131 next = next.nextSibling;
|
|
132 }
|
|
133 return null;
|
|
134 },
|
|
135
|
|
136 previousItem: function(item, nodeName) {
|
|
137 var previous = item.previousSibling;
|
|
138 while (previous != null) {
|
|
139 if (previous.nodeName == nodeName) return previous;
|
|
140 previous = previous.previousSibling;
|
|
141 }
|
|
142 return null
|
|
143 },
|
|
144
|
|
145 moveBefore: function(item1, item2) {
|
|
146 var parent = item1.parentNode;
|
|
147 parent.removeChild(item1);
|
|
148 parent.insertBefore(item1, item2);
|
|
149 },
|
|
150
|
|
151 moveAfter: function(item1, item2) {
|
|
152 var parent = item1.parentNode;
|
|
153 parent.removeChild(item1);
|
|
154 parent.insertBefore(item1, item2 ? item2.nextSibling : null);
|
|
155 },
|
|
156
|
|
157
|
|
158
|
|
159
|
|
160 createCookie: function(name, value, days) {
|
|
161 if (days) {
|
|
162 var date = new Date();
|
|
163 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
|
164 var expires = '; expires=' + date.toGMTString();
|
|
165 } else expires = '';
|
|
166 document.cookie = name + '=' + value + expires + '; path=/';
|
|
167 },
|
|
168
|
|
169 readCookie: function(name) {
|
|
170 var nameEQ = name + '=';
|
|
171 var ca = document.cookie.split(';');
|
|
172 for (var i = 0; i < ca.length; i++) {
|
|
173 var c = ca[i];
|
|
174 while (c.charAt(0)==' ') c = c.substring(1, c.length);
|
|
175 if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
|
|
176 }
|
|
177 return "";
|
|
178 },
|
|
179
|
|
180 eraseCookie: function(name) {
|
|
181 document.cookie = name + "=null; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=nih.gov; path=/";
|
|
182 document.cookie = name + "; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=nih.gov; path=/";
|
|
183 },
|
|
184
|
|
185 addClass: function(element, className) {
|
|
186 if (!this.hasClass(element, className)) {
|
|
187 if (element.className) element.className += " " + className;
|
|
188 else element.className = className;
|
|
189 }
|
|
190 },
|
|
191
|
|
192 removeClass: function(element, className) {
|
|
193 var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
|
|
194 element.className = element.className.replace(regexp, "$2");
|
|
195 },
|
|
196
|
|
197 hasClass: function(element, className) {
|
|
198 var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
|
|
199 return regexp.test(element.className);
|
|
200 },
|
|
201
|
|
202
|
|
203 getXY: function (obj){
|
|
204 /*
|
|
205 +------------- w ----
|
|
206 | (x,y)
|
|
207 |
|
|
208 h
|
|
209 |
|
|
210 */
|
|
211 var b={x:0, y:0, w:obj.offsetWidth, h:obj.offsetHeight};
|
|
212
|
|
213 if (obj.offsetParent) {
|
|
214 while(obj) {
|
|
215 b.x += obj.offsetLeft;
|
|
216 b.y += obj.offsetTop;
|
|
217 obj = obj.offsetParent;
|
|
218 }
|
|
219 } else if (obj.x) {
|
|
220 b.x = obj.x;
|
|
221 b.y = obj.y;
|
|
222 }
|
|
223 return b;
|
|
224 },
|
|
225
|
|
226 /* Based on ppk (untested) */
|
|
227 getEventXY: function(e) {
|
|
228 var xpos = 0;
|
|
229 var ypos = 0;
|
|
230 e = e || window.event;
|
|
231 xpos = e.pageX || (e.clientX + document.body.scrollLeft +
|
|
232 document.documentElement.scrollLeft);
|
|
233 ypos = e.pageY || (e.clientY + document.body.scrollTop +
|
|
234 document.documentElement.scrollTop);
|
|
235 return {x: xpos, y: ypos};
|
|
236 },
|
|
237
|
|
238 drawText: function (sText, sId, add) {
|
|
239 if (!sId) sId = "debug";
|
|
240 var obj = document.getElementById(sId);
|
|
241 if (obj) {
|
|
242 if (add)
|
|
243 this.insertInHtml("<br/>" + sText, obj);
|
|
244 else
|
|
245 this.replaceInHtml(sText, obj);
|
|
246 }
|
|
247 },
|
|
248
|
|
249
|
|
250 selectRange: function (oObj /*:object*/, iStart /*:int*/, iLength /*:int*/) {
|
|
251 if (!(oObj && oObj.value)) return;
|
|
252
|
|
253 if (oObj.createTextRange) {
|
|
254 //use text ranges for Internet Explorer
|
|
255 var oRange = oObj.createTextRange();
|
|
256 oRange.moveStart("character", iStart);
|
|
257 oRange.moveEnd("character", iLength - oObj.value.length);
|
|
258 oRange.select();
|
|
259 } else if (oObj.setSelectionRange) {
|
|
260 //use setSelectionRange() for Mozilla
|
|
261 oObj.setSelectionRange(iStart, iLength);
|
|
262 }
|
|
263 //set focus back to the textbox
|
|
264 oObj.focus();
|
|
265 },
|
|
266
|
|
267 getSelection: function() {
|
|
268 var text = "";
|
|
269 if (window.getSelection) {
|
|
270 text += window.getSelection();
|
|
271 } else if (document.getSelection) {
|
|
272 text += document.getSelection();
|
|
273 } else if (document.selection){ //IE
|
|
274 text += document.selection.createRange().text;
|
|
275 }
|
|
276 return text;
|
|
277 },
|
|
278
|
|
279
|
|
280
|
|
281
|
|
282 // http://ejohn.org/apps/jselect/event.html
|
|
283 addEvent: function(obj, type, fn, b) {
|
|
284 if (obj.attachEvent) {
|
|
285 var name = "" + type + fn;
|
|
286 // name = name.substring(0, name.indexOf("\n")); // IE This doesn't work
|
|
287 obj["e" + name] = fn;
|
|
288 obj[name] = function(){ obj["e" + name](window.event);}
|
|
289 obj.attachEvent("on" + type, obj[name]);
|
|
290 } else {
|
|
291 obj.addEventListener(type, fn, b);
|
|
292 return true;
|
|
293 }
|
|
294 },
|
|
295
|
|
296
|
|
297 removeEvent: function(obj, type, fn, b) {
|
|
298 if (obj.detachEvent) {
|
|
299 var name = "" + type + fn;
|
|
300 // name = name.substring(0, name.indexOf("\n")); //IE This doesn't work
|
|
301 if ("function" == typeof obj[name]) {
|
|
302 obj.detachEvent("on" + type, obj[name]);
|
|
303 obj[name] = null;
|
|
304 obj["e" + name] = null;
|
|
305 }
|
|
306 } else {
|
|
307 obj.removeEventListener(type, fn, b);
|
|
308 return true;
|
|
309 }
|
|
310 },
|
|
311
|
|
312 noBubbleEvent: function(e) {
|
|
313 if (e && e.stopPropagation) e.stopPropagation();
|
|
314 else window.event.cancelBubble = true;
|
|
315 },
|
|
316
|
|
317 targetEvent: function(e) {
|
|
318 if (e.srcElement == null) {
|
|
319 return e.target;
|
|
320 } else {
|
|
321 return window.event.srcElement;
|
|
322 }
|
|
323 },
|
|
324
|
|
325 preventDefault: function(e) {
|
|
326 if (e.preventDefault) e.preventDefault();
|
|
327 else window.event.returnValue = false;
|
|
328 },
|
|
329
|
|
330 relatedTarget: function(e) {
|
|
331 if (!e) var e = window.event;
|
|
332 if (e.relatedTarget) return e.relatedTarget;
|
|
333 else if (e.toElement) return e.toElement;
|
|
334 else if (e.fromElement) return e.fromElement;
|
|
335 },
|
|
336
|
|
337 readStyle: function(element, property) {
|
|
338 if (element.style[property]) {
|
|
339 return element.style[property];
|
|
340 } else if (element.currentStyle) {
|
|
341 return element.currentStyle[property];
|
|
342 } else if (document.defaultView && document.defaultView.getComputedStyle) {
|
|
343 var style = document.defaultView.getComputedStyle(element, null);
|
|
344 if (style) return style.getPropertyValue(property);
|
|
345 }
|
|
346 return "";
|
|
347 },
|
|
348
|
|
349
|
|
350 printObj: function (oObj, iLevel) {
|
|
351 var s = "";
|
|
352 var sIdent = "";
|
|
353 if (!iLevel) iLevel = 0;
|
|
354 for (var i = 0; i < iLevel; i++) {
|
|
355 sIdent += "__";
|
|
356 }
|
|
357 for (var i in oObj) {
|
|
358 var ss = [];
|
|
359 if ("string" == typeof oObj[i]) {
|
|
360 ss = oObj[i].split("<");
|
|
361 }
|
|
362 s += sIdent + " " + i + " : [" + (typeof oObj[i]) + "] : " + ss.join("<") + "<br/>";
|
|
363 // if (oObj[i] && "object" == typeof oObj[i] && iLevel < 2) {
|
|
364 // s+= "<br/>-----" + typeof oObj[i] + " --- " + iLevel + "</br>";
|
|
365 // s += this.printObj(oObj[i], iLevel + 1);
|
|
366 // }
|
|
367 }
|
|
368 return s;
|
|
369 },
|
|
370
|
|
371 jsLoader: {
|
|
372 sBase: "", /* Base is this directory */
|
|
373 oLoaded: [],
|
|
374 load: function (aScripts) {
|
|
375
|
|
376 var oS = document.getElementsByTagName("script");
|
|
377 var k = 0;
|
|
378 for (var j = 0; j < oS.length; j++) {
|
|
379 if (oS[j].src == "") continue;
|
|
380 this.oLoaded[k++] = oS[j].src;
|
|
381 }
|
|
382
|
|
383 var oHead = document.getElementsByTagName("head")[0];
|
|
384
|
|
385 for (var i = 0; i < aScripts.length; i++) {
|
|
386 var sNewSrc = this.sBase + aScripts[i];
|
|
387 var oS = document.getElementsByTagName("script");
|
|
388 var b = true;
|
|
389 for (var j = 0; j < this.oLoaded.length; j++) {
|
|
390 if (sNewSrc == this.oLoaded[j]) {
|
|
391 // alert(sNewSrc + " : already loaded");
|
|
392 b = false;
|
|
393 }
|
|
394 }
|
|
395
|
|
396 if (b) {
|
|
397 var oScript = document.createElement("script");
|
|
398 oScript.src = sNewSrc;
|
|
399 oScript.setAttribute("type", "text/javascript");
|
|
400 oHead.appendChild(oScript);
|
|
401 this.oLoaded[this.oLoaded.length] = sNewSrc;
|
|
402 }
|
|
403 }
|
|
404 }
|
|
405 },
|
|
406
|
|
407 // Create an id that doesn't exist in this document
|
|
408 createNewId: function()
|
|
409 {
|
|
410 var newid = null
|
|
411
|
|
412 while (!newid || document.getElementById(newid)) {
|
|
413 newid = "XID" + Math.round(Math.random() * 65536).toString(16)
|
|
414 }
|
|
415 return newid
|
|
416 }
|
|
417
|
|
418 };
|
|
419
|
|
420
|
|
421 String.prototype.trimSpaces = function(trimMode) {
|
|
422 // 0 = trim begin and end
|
|
423 // 1 = trim begin only
|
|
424 // 2 = trim after only
|
|
425
|
|
426 var targetString = this;
|
|
427 var iPos = 0;
|
|
428 if (!trimMode) trimMode = 0;
|
|
429
|
|
430 if (trimMode==0 || trimMode==1) {
|
|
431 if (targetString.charAt(iPos)==" ") {
|
|
432 while(targetString.charAt(iPos)==" ") iPos++;
|
|
433 targetString = targetString.substr(iPos);
|
|
434 }
|
|
435 }
|
|
436
|
|
437 iPos = targetString.length-1;
|
|
438 if (trimMode==0 || trimMode==2) {
|
|
439 if (targetString.charAt(iPos) == " ") {
|
|
440 while(targetString.charAt(iPos) == " ") iPos--;
|
|
441 targetString = targetString.substr(0, iPos + 1);
|
|
442 }
|
|
443 }
|
|
444 return targetString;
|
|
445 }
|
|
446
|
|
447
|
|
448
|
|
449
|
|
450 /* Shortcuts */
|
|
451
|
|
452 // Get elements by Id's
|
|
453 function $() {
|
|
454 var elements = new Array();
|
|
455
|
|
456 for (var i = 0; i < arguments.length; i++) {
|
|
457 var element = arguments[i];
|
|
458 if (typeof element == 'string')
|
|
459 element = document.getElementById(element);
|
|
460
|
|
461 if (arguments.length == 1)
|
|
462 return element;
|
|
463
|
|
464 elements.push(element);
|
|
465 }
|
|
466
|
|
467 return elements;
|
|
468 }
|
|
469
|
|
470 // Get elements by AttributeValue for Attributename
|
|
471 // http://www.dustindiaz.com/top-ten-javascript/ (but has some errors)
|
|
472 function $C(attrValue, attrName, node, tag) {
|
|
473 //alert([attrValue, attrName, node, tag])
|
|
474 if ("*" == attrValue) {
|
|
475 return $AN(attrName, node, tag);
|
|
476 }
|
|
477 var oElements = new Array();
|
|
478 if (!node) node = document;
|
|
479 if (!tag) tag = '*';
|
|
480 if (!attrName) attrName = 'class';
|
|
481
|
|
482 var els = node.getElementsByTagName(tag);
|
|
483 var elsLen = els.length;
|
|
484 var pattern = new RegExp("(^|\\s)" + attrValue + "(\\s|$)");
|
|
485 var j = 0;
|
|
486 for (i = 0; i < elsLen; i++) {
|
|
487 if (attrName == "class" && pattern.test(els[i].className)) {
|
|
488 // IE behavior
|
|
489 // oElements.push(els[i]);
|
|
490 oElements[j++] = els[i];
|
|
491 } else if (pattern.test(els[i].getAttribute(attrName))) {
|
|
492 oElements[j++] = els[i];
|
|
493 // oElements.push(els[i]);
|
|
494 }
|
|
495 }
|
|
496 return oElements;
|
|
497 }
|
|
498
|
|
499
|
|
500 function $AN(attrName, node, tag) {
|
|
501 var oElements = new Array();
|
|
502 if (node == null) node = document;
|
|
503 if (tag == null)tag = '*';
|
|
504 var els = node.getElementsByTagName(tag);
|
|
505 for (i = 0; i < els.length; i++) {
|
|
506 if (els[i].getAttribute(attrName) != null) {
|
|
507 oElements.push(els[i]);
|
|
508 }
|
|
509 }
|
|
510 return oElements;
|
|
511 }
|
|
512
|
|
513 function dump(aMessage) {
|
|
514 var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
|
|
515 .getService(Components.interfaces.nsIConsoleService);
|
|
516 consoleService.logStringMessage(aMessage);
|
|
517 }
|
|
518
|
|
519
|
|
520 // forEach iterators from Dean Edwards: http://dean.edwards.name/weblog/2006/07/enum/
|
|
521 // generic enumeration
|
|
522 Function.prototype.forEach = function(object, block, context) {
|
|
523 for (var key in object) {
|
|
524 if (typeof this.prototype[key] == "undefined") {
|
|
525 block.call(context, object[key], key, object);
|
|
526 }
|
|
527 }
|
|
528 };
|
|
529
|
|
530 // globally resolve forEach enumeration
|
|
531 var forEach = function(object, block, context) {
|
|
532 if (object) {
|
|
533 var resolve = Object; // default
|
|
534 if (object instanceof Function) {
|
|
535 // functions have a "length" property
|
|
536 resolve = Function;
|
|
537 } else if (object.forEach instanceof Function) {
|
|
538 // the object implements a custom forEach method so use that
|
|
539 object.forEach(block, context);
|
|
540 return;
|
|
541 } else if (typeof object.length == "number") {
|
|
542 // the object is array-like
|
|
543 resolve = Array;
|
|
544 }
|
|
545 resolve.forEach(object, block, context);
|
|
546 }
|
|
547 };
|
|
548
|
|
549 //
|
|
550 // Update Array class to JS 1.5 if not yet there.
|
|
551 //
|
|
552
|
|
553 // array-like enumeration
|
|
554 if (!Array.forEach) { // mozilla already supports this
|
|
555 Array.forEach = function(object, block, context) {
|
|
556 for (var i = 0; i < object.length; i++) {
|
|
557 block.call(context, object[i], i, object);
|
|
558 }
|
|
559 };
|
|
560 }
|
|
561
|
|
562 if (!Array.prototype.indexOf)
|
|
563 Array.prototype.indexOf = function(item, startIndex) {
|
|
564 var len = this.length;
|
|
565 if (startIndex == null)
|
|
566 startIndex = 0;
|
|
567 else if (startIndex < 0) {
|
|
568 startIndex += len;
|
|
569 if (startIndex < 0)
|
|
570 startIndex = 0;
|
|
571 }
|
|
572 for (var i = startIndex; i < len; i++) {
|
|
573 var val = this[i] || this.charAt && this.charAt(i);
|
|
574 if (val == item)
|
|
575 return i;
|
|
576 }
|
|
577 return -1;
|
|
578 };
|
|
579
|
|
580 if (!Array.prototype.lastIndexOf)
|
|
581 Array.prototype.lastIndexOf = function(item, startIndex) {
|
|
582 var len = this.length;
|
|
583 if (startIndex == null || startIndex >= len)
|
|
584 startIndex = len - 1;
|
|
585 else if (startIndex < 0)
|
|
586 startIndex += len;
|
|
587 for (var i = startIndex; i >= 0; i--) {
|
|
588 var val = this[i] || this.charAt && this.charAt(i);
|
|
589 if (val == item)
|
|
590 return i;
|
|
591 }
|
|
592 return -1;
|
|
593 };
|
|
594
|
|
595 if (!Array.prototype.map)
|
|
596 Array.prototype.map = function(func, thisVal) {
|
|
597 var len = this.length;
|
|
598 var ret = new Array(len);
|
|
599 for (var i = 0; i < len; i++)
|
|
600 ret[i] = func.call(thisVal, this[i] || this.charAt && this.charAt(i), i, this);
|
|
601 return ret;
|
|
602 };
|
|
603
|
|
604 if (!Array.prototype.filter)
|
|
605 Array.prototype.filter = function(func, thisVal) {
|
|
606 var len = this.length;
|
|
607 var ret = new Array();
|
|
608 for (var i = 0; i < len; i++) {
|
|
609 var val = this[i] || this.charAt && this.charAt(i);
|
|
610 if(func.call(thisVal, val, i, this))
|
|
611 ret[ret.length] = val;
|
|
612 }
|
|
613 return ret;
|
|
614 };
|
|
615
|
|
616 if (!Array.prototype.every)
|
|
617 Array.prototype.every = function(func, thisVal) {
|
|
618 var len = this.length;
|
|
619 for (var i = 0; i < len; i++)
|
|
620 if (!func.call(thisVal, this[i] || this.charAt && this.charAt(i), i, this))
|
|
621 return false;
|
|
622 return true;
|
|
623 };
|
|
624
|
|
625 if (!Array.prototype.some)
|
|
626 Array.prototype.some = function(func, thisVal) {
|
|
627 var len = this.length;
|
|
628 for (var i = 0; i < len; i++)
|
|
629 if (func.call(thisVal, this[i] || this.charAt && this.charAt(i), i, this))
|
|
630 return true;
|
|
631 return false;
|
|
632 };
|
|
633
|