JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / java / lang / String.js
1 Clazz.load (["java.lang.CharSequence", "$.Comparable", "java.io.Serializable", "java.util.Comparator"], "java.lang.String", null, function () {\r
2 if (String.prototype.$replace == null) { // not defined yet! ClazzLoader may try to load this twice!\r
3 java.lang.String = String;\r
4 if (Clazz.supportsNativeObject) {\r
5         for (var i = 0; i < Clazz.extendedObjectMethods.length; i++) {\r
6                 var p = Clazz.extendedObjectMethods[i];\r
7                 if ("to$tring" == p || "toString" == p || "equals" == p || "hashCode" == p) {\r
8                         continue;\r
9                 }\r
10                 String.prototype[p] = Clazz._O.prototype[p];\r
11         }\r
12 }\r
13 //Clazz.decorateAsType (String, "String", null, [java.io.Serializable, CharSequence, Comparable]);\r
14 Clazz.implementOf (String, [java.io.Serializable, CharSequence, Comparable]);\r
15 //Number.equals = Clazz.innerFunctions.equals;\r
16 String.getName = Clazz.innerFunctions.getName;\r
17 \r
18 String.serialVersionUID = String.prototype.serialVersionUID = -6849794470754667710;\r
19 \r
20 String.prototype.$replace = function (c1, c2) {\r
21         /*\r
22         var sp = "\\$.*+{}?^()[]";\r
23         if (sp.indexOf (c1) != -1) {\r
24                 c1 = "\\" + c1;\r
25         }\r
26         */\r
27         c1 = c1.replace (/([\\\/\$\.\*\+\{\}\?\^\(\)\[\]])/g, function ($0, $1) {\r
28                 return "\\" + $1;\r
29         });\r
30         var regExp = new RegExp (c1, "gm");\r
31         return this.replace (regExp, c2);\r
32 };\r
33 String.prototype.$generateExpFunction = function (str) {\r
34         var arr = [];\r
35         var orders = [];\r
36         var idx = 0;\r
37         arr[0] = "";\r
38         var i = 0;\r
39         for (; i < str.length; i++) {\r
40                 var ch = str.charAt (i);\r
41                 if (i != str.length - 1 && ch == '\\') {\r
42                         i++;\r
43                         var c = str.charAt (i);\r
44                         if (c == '\\') {\r
45                                 arr[idx] += '\\';\r
46                         }\r
47                         arr[idx] += c;\r
48                 } else if (i != str.length - 1 && ch == '$') {\r
49                         i++;\r
50                         orders[idx] = parseInt (str.charAt (i));\r
51                         idx++;\r
52                         arr[idx] = "";\r
53                 } else if (ch == '\r') {\r
54                         arr[idx] += "\\r";\r
55                 } else if (ch == '\n') {\r
56                         arr[idx] += "\\n";\r
57                 } else if (ch == '\t') {\r
58                         arr[idx] += "\\t";\r
59                 } else if (ch == '\"') {\r
60                         arr[idx] += "\\\"";\r
61                 } else {\r
62                         arr[idx] += ch;\r
63                 }\r
64         }\r
65         var funStr = "f = function (";\r
66         var max = Math.max.apply({},orders);\r
67         for (i = 0; i <= max; i++) {\r
68                 funStr += "$" + i;\r
69                 if (i != max) {\r
70                         funStr += ", ";\r
71                 }\r
72         }\r
73         funStr += ") { return ";\r
74         for (i = 0; i < arr.length - 1; i++) {\r
75                 funStr += "\"" + arr[i] + "\" + $" + orders[i] + " + ";\r
76         }\r
77         funStr += "\"" + arr[i] + "\"; }";\r
78         var f = null;\r
79         eval (funStr)\r
80         return f;\r
81 };\r
82 \r
83 String.prototype.replaceAll = function (exp, str) {\r
84         var regExp = new RegExp (exp, "gm");\r
85         return this.replace (regExp, this.$generateExpFunction (str));\r
86 };\r
87 String.prototype.replaceFirst = function (exp, str) {\r
88         var regExp = new RegExp (exp, "m");\r
89         return this.replace (regExp, this.$generateExpFunction (str));\r
90 };\r
91 String.prototype.matches = function (exp) {\r
92         if (exp != null) {\r
93                 exp = "^(" + exp + ")$";\r
94         }\r
95         var regExp = new RegExp (exp, "gm");\r
96         var m = this.match (regExp);\r
97         return m != null && m.length != 0;\r
98 };\r
99 String.prototype.regionMatches = function (ignoreCase, toffset,\r
100                 other, ooffset, len) {\r
101         /*\r
102          * Support different method signatures\r
103          */\r
104         if (typeof ignoreCase == "number"\r
105                         || (ignoreCase != true && ignoreCase != false)) {\r
106                 len = ooffset;\r
107                 ooffset = other;\r
108                 other = toffset;\r
109                 toffset = ignoreCase;\r
110                 ignoreCase = false;\r
111         }\r
112         var to = toffset;\r
113         var po = ooffset;\r
114         // Note: toffset, ooffset, or len might be near -1>>>1.\r
115         if ((ooffset < 0) || (toffset < 0) || (toffset > this.length - len) ||\r
116                         (ooffset > other.length - len)) {\r
117                 return false;\r
118         }\r
119         var s1 = this.substring (toffset, toffset + len);\r
120         var s2 = other.substring (ooffset, ooffset + len);\r
121         if (ignoreCase) {\r
122                 s1 = s1.toLowerCase ();\r
123                 s2 = s2.toLowerCase ();\r
124         }\r
125         return s1 == s2;\r
126 };\r
127 String.prototype.$plit = function (regex, limit) {\r
128         /*\r
129          * Support different method signatures\r
130          */\r
131         if (limit != null && limit > 0) {\r
132                 if (limit == 1) {\r
133                         return this;\r
134                 }\r
135                 var regExp = new RegExp ("(" + regex + ")", "gm");\r
136                 var count = 1;\r
137                 var s = this.replace (regExp, function ($0, $1) {\r
138                         count++;\r
139                         if (count == limit) {\r
140                                 return "@@_@@";\r
141                         } else if (count > limit) {\r
142                                 return $0;\r
143                         } else {\r
144                                 return $0;\r
145                         }\r
146                 });\r
147                 regExp = new RegExp (regex, "gm");\r
148                 var arr = this.split (regExp);\r
149                 if (arr.length > limit) {\r
150                         arr[limit - 1] = s.substring (s.indexOf ("@@_@@") + 5);\r
151                         arr.length = limit;\r
152                 }\r
153                 return arr;\r
154         } else {\r
155                 var regExp = new RegExp (regex, "gm");\r
156                 return this.split (regExp);\r
157         }\r
158 };\r
159 \r
160 String.prototype.trim = function () {\r
161         var len = this.length;\r
162         var st = 0;\r
163 \r
164         while ((st < len) && (this.charAt (st) <= ' ')) {\r
165             st++;\r
166         }\r
167         while ((st < len) && (this.charAt (len - 1) <= ' ')) {\r
168             len--;\r
169         }\r
170         return ((st > 0) || (len < len)) ? this.substring (st, len) : this;\r
171 };\r
172 \r
173 String.prototype.trim = function () {\r
174         return this.replace (/^\s+/g, '').replace (/\s+$/g, '');\r
175 };\r
176 \r
177 /* private */\r
178 String.prototype.startsWith_string_number = function (prefix, toffset) {\r
179         var to = toffset;\r
180         var po = 0;\r
181         var pc = prefix.length;\r
182         // Note: toffset might be near -1>>>1.\r
183         if ((toffset < 0) || (toffset > this.length - pc)) {\r
184             return false;\r
185         }\r
186         while (--pc >= 0) {\r
187             if (this.charAt (to++) != prefix.charAt (po++)) {\r
188                 return false;\r
189             }\r
190         }\r
191         return true;\r
192 };\r
193 \r
194 String.prototype.startsWith = function (prefix) { /* prefix, toffset */\r
195         if (arguments.length == 1) {\r
196                 return this.startsWith_string_number (arguments[0], 0);\r
197         } else if (arguments.length == 2) {\r
198                 return this.startsWith_string_number (arguments[0], arguments[1]);\r
199         } else {\r
200                 return false;\r
201         }\r
202 };\r
203 \r
204 String.prototype.endsWith = function (suffix) {\r
205         return this.startsWith (suffix, this.length - suffix.length);\r
206 };\r
207 \r
208 String.prototype.equals = function (anObject) {\r
209         return this.valueOf () == anObject;\r
210 };\r
211 \r
212 String.prototype.equalsIgnoreCase = function (anotherString) {\r
213         return (anotherString == null) ? false : (this == anotherString \r
214                         || this.toLowerCase () == anotherString.toLowerCase ());\r
215 };\r
216 \r
217 /* private */\r
218 String.prototype.hash = 0;\r
219 \r
220 String.prototype.hashCode = function () {\r
221         var h = this.hash;\r
222         if (h == 0) {\r
223                 var off = 0;\r
224                 var len = this.length;\r
225                 for (var i = 0; i < len; i++) {\r
226                         h = 31*h + this.charCodeAt (off++);\r
227                         h &= 0xffffffff;\r
228                 }\r
229                 this.hash = h;\r
230         }\r
231     return h;\r
232 };\r
233 \r
234 String.prototype.getBytes = function () {\r
235         if (arguments.length == 4) {\r
236                 return this.getChars (arguments[0], arguments[1], arguments[2], arguments[3]);\r
237         }\r
238         var s = this;\r
239         if (arguments.length == 1) {\r
240                 var cs = arguments[0].toString().toLowerCase ();\r
241                 var charset = [\r
242                         "utf-8", "UTF8", "us-ascii", "iso-8859-1", "8859_1", "gb2312", "gb18030", "gbk"\r
243                 ];\r
244                 var existed = false;\r
245                 for (var i = 0; i < charset.length; i++) {\r
246                         if (charset[i] == cs) {\r
247                                 existed = true;\r
248                                 break;\r
249                         }\r
250                 }\r
251                 if (!existed) {\r
252                         throw new java.io.UnsupportedEncodingException ();\r
253                 }\r
254                 if (cs == "utf-8" || cs == "utf8") {\r
255                         s = Encoding.convert2UTF8 (this);\r
256                 }\r
257         }\r
258         var arrs = new Array (s.length);\r
259         var c = 0, ii = 0;\r
260         for (var i = 0; i < s.length; i++) {\r
261                 c = s.charCodeAt (i);\r
262                 if (c > 255) {\r
263                         arrs[ii] = 0x1a;\r
264                         arrs[ii + 1] = c & 0xff;\r
265                         arrs[ii + 2] = (c & 0xff00) >> 8;\r
266                         ii+=2;\r
267                 } else {\r
268                         arrs[ii] = c;\r
269                 }\r
270                 ii++;\r
271         }\r
272         return arrs;\r
273 };\r
274 \r
275 String.prototype.compareTo = function (anotherString) {\r
276         if (anotherString == null) {\r
277                 throw new java.lang.NullPointerException ();\r
278         }\r
279         var len1 = this.length;\r
280         var len2 = anotherString.length;\r
281         var n = Math.min (len1, len2);\r
282         var k = 0;\r
283     while (k < n) {\r
284                 var c1 = this.charCodeAt (k);\r
285                 var c2 = anotherString.charCodeAt (k);\r
286                 if (c1 != c2) {\r
287                         return c1 - c2;\r
288                 }\r
289                 k++;\r
290         }\r
291         return len1 - len2;\r
292 };\r
293 \r
294 String.prototype.toCharArray = function () {\r
295         var result = new Array (this.length);\r
296         for (var i = 0; i < this.length; i++) {\r
297                 result[i] = this.charAt (i);\r
298         }\r
299         return result;\r
300 };\r
301 String.value0f = String.valueOf;\r
302 String.valueOf = function (o) {\r
303         if (o == "undefined") {\r
304                 return String.value0f ();\r
305         }\r
306         if (o instanceof Array) {\r
307                 if (arguments.length == 1) {\r
308                         return o.join ('');\r
309                 } else {\r
310                         var off = arguments[1];\r
311                         var len = arguments[2];\r
312                         var oo = new Array (len);\r
313                         for (var i = 0; i < len; i++) {\r
314                                 oo[i] = o[off + i];\r
315                         }\r
316                         return oo.join ('');\r
317                 }\r
318         }\r
319         return "" + o;\r
320 };\r
321 \r
322 String.prototype.subSequence = function (beginIndex, endIndex) {\r
323         return this.substring(beginIndex, endIndex);\r
324 };\r
325 \r
326 String.prototype.compareToIgnoreCase = function (str) {\r
327         if (str == null) {\r
328                 throw new NullPointerException ();\r
329         }\r
330         var s1 = this.toUpperCase ();\r
331         var s2 = str.toUpperCase ();\r
332         if (s1 == s2) {\r
333                 return 0;\r
334         } else {\r
335                 var s1 = this.toLowerCase ();\r
336                 var s2 = str.toLowerCase ();\r
337                 if (s1 == s2) {\r
338                         return 0;\r
339                 } else if (s1 > s2) {\r
340                         return 1;\r
341                 } else {\r
342                         return -1;\r
343                 }\r
344         }\r
345 };\r
346 \r
347 String.prototype.contentEquals = function (sb) {\r
348         if (this.length != sb.length ()) {\r
349                 return false;\r
350         }\r
351         var v = sb.getValue ();\r
352         var i = 0;\r
353         var j = 0;\r
354         var n = this.length;\r
355         while (n-- != 0) {\r
356                 if (this.charCodeAt (i++) != v[j++]) {\r
357                         return false;\r
358                 }\r
359         }\r
360         return true;\r
361 };\r
362 \r
363 String.prototype.getChars = function (srcBegin, srcEnd, dst, dstBegin) {\r
364         if (srcBegin < 0) {\r
365                 throw new StringIndexOutOfBoundsException(srcBegin);\r
366         }\r
367         if (srcEnd > this.length) {\r
368                 throw new StringIndexOutOfBoundsException(srcEnd);\r
369         }\r
370         if (srcBegin > srcEnd) {\r
371                 throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);\r
372         }\r
373         if (dst == null) {\r
374                 throw new NullPointerException ();\r
375         }\r
376         for (var i = 0; i < srcEnd - srcBegin; i++) {\r
377                 dst[dstBegin + i] = this.charAt (srcBegin + i);\r
378         }\r
379 };\r
380 String.prototype.$concat = String.prototype.concat;\r
381 String.prototype.concat = function (s) {\r
382         if (s == null) {\r
383                 throw new NullPointerException ();\r
384         }\r
385         return this.$concat (s);\r
386 };\r
387 \r
388 String.prototype.$lastIndexOf = String.prototype.lastIndexOf;\r
389 String.prototype.lastIndexOf = function (s, last) {\r
390         if (last != null && last + this.length <= 0) {  \r
391                 return -1;\r
392         }\r
393         if (last != null) {\r
394                 return this.$lastIndexOf (s, last);\r
395         } else {\r
396                 return this.$lastIndexOf (s);\r
397         }\r
398 };\r
399 \r
400 String.prototype.intern = function () {\r
401         return this.valueOf ();\r
402 };\r
403 String.copyValueOf = String.prototype.copyValueOf = function () {\r
404         if (arguments.length == 1) {\r
405                 return String.instantialize (arguments[0]);\r
406         } else {\r
407                 return String.instantialize (arguments[0], arguments[1], arguments[2]);\r
408         }\r
409 };\r
410 String.indexOf = function (source, sourceOffset, sourceCount,\r
411                 target, targetOffset, targetCount, fromIndex) {\r
412         if (fromIndex >= sourceCount) {\r
413                 return (targetCount == 0 ? sourceCount : -1);\r
414         }\r
415         if (fromIndex < 0) {\r
416                 fromIndex = 0;\r
417         }\r
418         if (targetCount == 0) {\r
419                 return fromIndex;\r
420         }\r
421 \r
422         var first  = target[targetOffset];\r
423         var i = sourceOffset + fromIndex;\r
424         var max = sourceOffset + (sourceCount - targetCount);\r
425 \r
426         startSearchForFirstChar:\r
427         while (true) {\r
428                 /* Look for first character. */\r
429                 while (i <= max && source[i] != first) {\r
430                         i++;\r
431                 }\r
432                 if (i > max) {\r
433                         return -1;\r
434                 }\r
435 \r
436                 /* Found first character, now look at the rest of v2 */\r
437                 var j = i + 1;\r
438                 var end = j + targetCount - 1;\r
439                 var k = targetOffset + 1;\r
440                 while (j < end) {\r
441                         if (source[j++] != target[k++]) {\r
442                                 i++;\r
443                                 /* Look for str's first char again. */\r
444                                 continue startSearchForFirstChar;\r
445                         }\r
446                 }\r
447                 return i - sourceOffset;        /* Found whole string. */\r
448         }\r
449 };\r
450 \r
451 String.instantialize = function () {\r
452         if (arguments.length == 0) {\r
453                 return new String ();\r
454         } else if (arguments.length == 1) {\r
455                 var x = arguments[0];\r
456                 if (typeof x == "string" || x instanceof String) {\r
457                         return new String (x);\r
458                 } else if (x instanceof Array || x instanceof Int32Array) {\r
459                         if (x.length > 0 && typeof x[0] == "number") {\r
460                                 var arr = new Array (x.length);\r
461                                 for (var i = 0; i < x.length; i++) {\r
462                                         arr[i] = String.fromCharCode (x[i] & 0xff);\r
463                                 }\r
464                                 return Encoding.readUTF8 (arr.join (''));\r
465                         }\r
466                         return x.join ('');\r
467                 } else if (x.__CLASS_NAME__ == "StringBuffer" \r
468                                 || x.__CLASS_NAME__ == "java.lang.StringBuffer") {\r
469                         var value = x.shareValue();\r
470                         var length = x.length ();\r
471                         var valueCopy = new Array (length);\r
472                         for (var i = 0; i < length; i++) {\r
473                                 valueCopy[i] = value[i];\r
474                         }\r
475                         return valueCopy.join ('')\r
476                         //return x.value.join ('');\r
477                 } else {\r
478                         return "" + x;\r
479                 }\r
480         } else if (arguments.length == 2) {\r
481                 var x = arguments[0];\r
482                 var hibyte=arguments[1];\r
483                 if (typeof hibyte == "string") {\r
484                         return String.instantialize(x,0,x.length, hibyte);\r
485                 } else {\r
486                         return String.instantialize(x,hibyte,0,x.length);\r
487                 }\r
488         } else if (arguments.length == 3) {\r
489                 var bytes = arguments[0];\r
490                 var offset = arguments[1];\r
491                 var length = arguments[2];\r
492                 if (arguments[2] instanceof Array) {\r
493                         bytes = arguments[2];\r
494                         offset = arguments[0];\r
495                         length = arguments[1];\r
496                 }\r
497                 var arr = new Array (length);\r
498                 if (offset < 0 || length + offset > bytes.length) {\r
499                         throw new IndexOutOfBoundsException ();\r
500                 }\r
501                 if (length > 0) {\r
502                         var isChar = (bytes[offset].length != null);\r
503                         if (isChar) {\r
504                                 for (var i = 0; i < length; i++) {\r
505                                         arr[i] = bytes[offset + i];\r
506                                 }\r
507                         } else {\r
508                                 for (var i = 0; i < length; i++) {\r
509                                         arr[i]=String.fromCharCode (bytes[offset+i]);\r
510                                 }\r
511                         }\r
512                 }\r
513                 return arr.join ('');\r
514         } else if (arguments.length == 4) {\r
515                 var bytes = arguments[0];\r
516                 var y = arguments[3];\r
517                 if (typeof y == "string" || y instanceof String) {\r
518                         var offset = arguments[1];\r
519                         var length = arguments[2];\r
520                         var arr = new Array (length);\r
521                         for (var i = 0; i < length; i++) {\r
522                                 arr[i] = bytes[offset + i];\r
523                                 if (typeof arr[i] == "number") {\r
524                                         arr[i] = String.fromCharCode (arr[i] & 0xff);\r
525                                 }\r
526                         }\r
527                         var cs = y.toLowerCase ();\r
528                         if (cs == "utf-8" || cs == "utf8") {\r
529                                 return Encoding.readUTF8 (arr.join (''));\r
530                         } else {\r
531                                 return arr.join ('');\r
532                         }\r
533                 } else {\r
534                         var count = arguments[3];\r
535                         var offset = arguments[2];\r
536                         var hibyte = arguments[1];\r
537                         var value = new Array (count);\r
538                         if (hibyte == 0) {\r
539                                 for (var i = count ; i-- > 0 ;) {\r
540                                         value[i] = String.fromCharCode (bytes[i + offset] & 0xff);\r
541                                 }\r
542                         } else {\r
543                                 hibyte <<= 8;\r
544                                 for (var i = count ; i-- > 0 ;) {\r
545                                         value[i] = String.fromCharCode (hibyte | (bytes[i + offset] & 0xff));\r
546                                 }\r
547                         }\r
548                         return value.join ('');\r
549                 }\r
550         } else {\r
551                 var s = "";\r
552                 for (var i = 0; i < arguments.length; i++) {\r
553                 s += arguments[i];\r
554                 }\r
555                 return s;\r
556         }\r
557 };\r
558 \r
559 if (navigator.userAgent.toLowerCase ().indexOf ("chrome") != -1) { // Google Chrome's bug\r
560         String.prototype.toString = function () {\r
561                 return this;\r
562         };\r
563 }\r
564 \r
565 } // end of String.prototype.$replace\r
566 });