Merge branch 'master' of https://source.jalview.org/git/jalviewjs.git
[jalviewjs.git] / site / j2s / java / lang / String.js
index 64cda74..30d881a 100644 (file)
-Clazz.load (["java.lang.CharSequence", "$.Comparable", "java.io.Serializable", "java.util.Comparator"], "java.lang.String", null, function () {\r
-if (String.prototype.$replace == null) { // not defined yet! ClazzLoader may try to load this twice!\r
-java.lang.String = String;\r
-if (Clazz.supportsNativeObject) {\r
-       for (var i = 0; i < Clazz.extendedObjectMethods.length; i++) {\r
-               var p = Clazz.extendedObjectMethods[i];\r
-               if ("to$tring" == p || "toString" == p || "equals" == p || "hashCode" == p) {\r
-                       continue;\r
-               }\r
-               String.prototype[p] = Clazz._O.prototype[p];\r
-       }\r
-}\r
-//Clazz.decorateAsType (String, "String", null, [java.io.Serializable, CharSequence, Comparable]);\r
-Clazz.implementOf (String, [java.io.Serializable, CharSequence, Comparable]);\r
-//Number.equals = Clazz.innerFunctions.equals;\r
-String.getName = Clazz.innerFunctions.getName;\r
-\r
-String.serialVersionUID = String.prototype.serialVersionUID = -6849794470754667710;\r
-\r
-String.prototype.$replace = function (c1, c2) {\r
-       /*\r
-       var sp = "\\$.*+{}?^()[]";\r
-       if (sp.indexOf (c1) != -1) {\r
-               c1 = "\\" + c1;\r
-       }\r
-       */\r
-       c1 = c1.replace (/([\\\/\$\.\*\+\{\}\?\^\(\)\[\]])/g, function ($0, $1) {\r
-               return "\\" + $1;\r
-       });\r
-       var regExp = new RegExp (c1, "gm");\r
-       return this.replace (regExp, c2);\r
-};\r
-String.prototype.$generateExpFunction = function (str) {\r
-       var arr = [];\r
-       var orders = [];\r
-       var idx = 0;\r
-       arr[0] = "";\r
-       var i = 0;\r
-       for (; i < str.length; i++) {\r
-               var ch = str.charAt (i);\r
-               if (i != str.length - 1 && ch == '\\') {\r
-                       i++;\r
-                       var c = str.charAt (i);\r
-                       if (c == '\\') {\r
-                               arr[idx] += '\\';\r
-                       }\r
-                       arr[idx] += c;\r
-               } else if (i != str.length - 1 && ch == '$') {\r
-                       i++;\r
-                       orders[idx] = parseInt (str.charAt (i));\r
-                       idx++;\r
-                       arr[idx] = "";\r
-               } else if (ch == '\r') {\r
-                       arr[idx] += "\\r";\r
-               } else if (ch == '\n') {\r
-                       arr[idx] += "\\n";\r
-               } else if (ch == '\t') {\r
-                       arr[idx] += "\\t";\r
-               } else if (ch == '\"') {\r
-                       arr[idx] += "\\\"";\r
-               } else {\r
-                       arr[idx] += ch;\r
-               }\r
-       }\r
-       var funStr = "f = function (";\r
-       var max = Math.max.apply({},orders);\r
-       for (i = 0; i <= max; i++) {\r
-               funStr += "$" + i;\r
-               if (i != max) {\r
-                       funStr += ", ";\r
-               }\r
-       }\r
-       funStr += ") { return ";\r
-       for (i = 0; i < arr.length - 1; i++) {\r
-               funStr += "\"" + arr[i] + "\" + $" + orders[i] + " + ";\r
-       }\r
-       funStr += "\"" + arr[i] + "\"; }";\r
-       var f = null;\r
-       eval (funStr)\r
-       return f;\r
-};\r
-\r
-String.prototype.replaceAll = function (exp, str) {\r
-       var regExp = new RegExp (exp, "gm");\r
-       return this.replace (regExp, this.$generateExpFunction (str));\r
-};\r
-String.prototype.replaceFirst = function (exp, str) {\r
-       var regExp = new RegExp (exp, "m");\r
-       return this.replace (regExp, this.$generateExpFunction (str));\r
-};\r
-String.prototype.matches = function (exp) {\r
-       if (exp != null) {\r
-               exp = "^(" + exp + ")$";\r
-       }\r
-       var regExp = new RegExp (exp, "gm");\r
-       var m = this.match (regExp);\r
-       return m != null && m.length != 0;\r
-};\r
-String.prototype.regionMatches = function (ignoreCase, toffset,\r
-               other, ooffset, len) {\r
-       /*\r
-        * Support different method signatures\r
-        */\r
-       if (typeof ignoreCase == "number"\r
-                       || (ignoreCase != true && ignoreCase != false)) {\r
-               len = ooffset;\r
-               ooffset = other;\r
-               other = toffset;\r
-               toffset = ignoreCase;\r
-               ignoreCase = false;\r
-       }\r
-       var to = toffset;\r
-       var po = ooffset;\r
-       // Note: toffset, ooffset, or len might be near -1>>>1.\r
-       if ((ooffset < 0) || (toffset < 0) || (toffset > this.length - len) ||\r
-                       (ooffset > other.length - len)) {\r
-               return false;\r
-       }\r
-       var s1 = this.substring (toffset, toffset + len);\r
-       var s2 = other.substring (ooffset, ooffset + len);\r
-       if (ignoreCase) {\r
-               s1 = s1.toLowerCase ();\r
-               s2 = s2.toLowerCase ();\r
-       }\r
-       return s1 == s2;\r
-};\r
-String.prototype.$plit = function (regex, limit) {\r
-       /*\r
-        * Support different method signatures\r
-        */\r
-       if (limit != null && limit > 0) {\r
-               if (limit == 1) {\r
-                       return this;\r
-               }\r
-               var regExp = new RegExp ("(" + regex + ")", "gm");\r
-               var count = 1;\r
-               var s = this.replace (regExp, function ($0, $1) {\r
-                       count++;\r
-                       if (count == limit) {\r
-                               return "@@_@@";\r
-                       } else if (count > limit) {\r
-                               return $0;\r
-                       } else {\r
-                               return $0;\r
-                       }\r
-               });\r
-               regExp = new RegExp (regex, "gm");\r
-               var arr = this.split (regExp);\r
-               if (arr.length > limit) {\r
-                       arr[limit - 1] = s.substring (s.indexOf ("@@_@@") + 5);\r
-                       arr.length = limit;\r
-               }\r
-               return arr;\r
-       } else {\r
-               var regExp = new RegExp (regex, "gm");\r
-               return this.split (regExp);\r
-       }\r
-};\r
-\r
-String.prototype.trim = function () {\r
-       var len = this.length;\r
-       var st = 0;\r
-\r
-       while ((st < len) && (this.charAt (st) <= ' ')) {\r
-           st++;\r
-       }\r
-       while ((st < len) && (this.charAt (len - 1) <= ' ')) {\r
-           len--;\r
-       }\r
-       return ((st > 0) || (len < len)) ? this.substring (st, len) : this;\r
-};\r
-\r
-String.prototype.trim = function () {\r
-       return this.replace (/^\s+/g, '').replace (/\s+$/g, '');\r
-};\r
-\r
-/* private */\r
-String.prototype.startsWith_string_number = function (prefix, toffset) {\r
-       var to = toffset;\r
-       var po = 0;\r
-       var pc = prefix.length;\r
-       // Note: toffset might be near -1>>>1.\r
-       if ((toffset < 0) || (toffset > this.length - pc)) {\r
-           return false;\r
-       }\r
-       while (--pc >= 0) {\r
-           if (this.charAt (to++) != prefix.charAt (po++)) {\r
-               return false;\r
-           }\r
-       }\r
-       return true;\r
-};\r
-\r
-String.prototype.startsWith = function (prefix) { /* prefix, toffset */\r
-       if (arguments.length == 1) {\r
-               return this.startsWith_string_number (arguments[0], 0);\r
-       } else if (arguments.length == 2) {\r
-               return this.startsWith_string_number (arguments[0], arguments[1]);\r
-       } else {\r
-               return false;\r
-       }\r
-};\r
-\r
-String.prototype.endsWith = function (suffix) {\r
-       return this.startsWith (suffix, this.length - suffix.length);\r
-};\r
-\r
-String.prototype.equals = function (anObject) {\r
-       return this.valueOf () == anObject;\r
-};\r
-\r
-String.prototype.equalsIgnoreCase = function (anotherString) {\r
-       return (anotherString == null) ? false : (this == anotherString \r
-                       || this.toLowerCase () == anotherString.toLowerCase ());\r
-};\r
-\r
-/* private */\r
-String.prototype.hash = 0;\r
-\r
-String.prototype.hashCode = function () {\r
-       var h = this.hash;\r
-       if (h == 0) {\r
-               var off = 0;\r
-               var len = this.length;\r
-               for (var i = 0; i < len; i++) {\r
-                       h = 31*h + this.charCodeAt (off++);\r
-                       h &= 0xffffffff;\r
-               }\r
-               this.hash = h;\r
-       }\r
-    return h;\r
-};\r
-\r
-String.prototype.getBytes = function () {\r
-       if (arguments.length == 4) {\r
-               return this.getChars (arguments[0], arguments[1], arguments[2], arguments[3]);\r
-       }\r
-       var s = this;\r
-       if (arguments.length == 1) {\r
-               var cs = arguments[0].toString().toLowerCase ();\r
-               var charset = [\r
-                       "utf-8", "UTF8", "us-ascii", "iso-8859-1", "8859_1", "gb2312", "gb18030", "gbk"\r
-               ];\r
-               var existed = false;\r
-               for (var i = 0; i < charset.length; i++) {\r
-                       if (charset[i] == cs) {\r
-                               existed = true;\r
-                               break;\r
-                       }\r
-               }\r
-               if (!existed) {\r
-                       throw new java.io.UnsupportedEncodingException ();\r
-               }\r
-               if (cs == "utf-8" || cs == "utf8") {\r
-                       s = Encoding.convert2UTF8 (this);\r
-               }\r
-       }\r
-       var arrs = new Array (s.length);\r
-       var c = 0, ii = 0;\r
-       for (var i = 0; i < s.length; i++) {\r
-               c = s.charCodeAt (i);\r
-               if (c > 255) {\r
-                       arrs[ii] = 0x1a;\r
-                       arrs[ii + 1] = c & 0xff;\r
-                       arrs[ii + 2] = (c & 0xff00) >> 8;\r
-                       ii+=2;\r
-               } else {\r
-                       arrs[ii] = c;\r
-               }\r
-               ii++;\r
-       }\r
-       return arrs;\r
-};\r
-\r
-String.prototype.compareTo = function (anotherString) {\r
-       if (anotherString == null) {\r
-               throw new java.lang.NullPointerException ();\r
-       }\r
-       var len1 = this.length;\r
-       var len2 = anotherString.length;\r
-       var n = Math.min (len1, len2);\r
-       var k = 0;\r
-    while (k < n) {\r
-               var c1 = this.charCodeAt (k);\r
-               var c2 = anotherString.charCodeAt (k);\r
-               if (c1 != c2) {\r
-                       return c1 - c2;\r
-               }\r
-               k++;\r
-       }\r
-       return len1 - len2;\r
-};\r
-\r
-String.prototype.toCharArray = function () {\r
-       var result = new Array (this.length);\r
-       for (var i = 0; i < this.length; i++) {\r
-               result[i] = this.charAt (i);\r
-       }\r
-       return result;\r
-};\r
-String.value0f = String.valueOf;\r
-String.valueOf = function (o) {\r
-       if (o == "undefined") {\r
-               return String.value0f ();\r
-       }\r
-       if (o instanceof Array) {\r
-               if (arguments.length == 1) {\r
-                       return o.join ('');\r
-               } else {\r
-                       var off = arguments[1];\r
-                       var len = arguments[2];\r
-                       var oo = new Array (len);\r
-                       for (var i = 0; i < len; i++) {\r
-                               oo[i] = o[off + i];\r
-                       }\r
-                       return oo.join ('');\r
-               }\r
-       }\r
-       return "" + o;\r
-};\r
-\r
-String.prototype.subSequence = function (beginIndex, endIndex) {\r
-       return this.substring(beginIndex, endIndex);\r
-};\r
-\r
-String.prototype.compareToIgnoreCase = function (str) {\r
-       if (str == null) {\r
-               throw new NullPointerException ();\r
-       }\r
-       var s1 = this.toUpperCase ();\r
-       var s2 = str.toUpperCase ();\r
-       if (s1 == s2) {\r
-               return 0;\r
-       } else {\r
-               var s1 = this.toLowerCase ();\r
-               var s2 = str.toLowerCase ();\r
-               if (s1 == s2) {\r
-                       return 0;\r
-               } else if (s1 > s2) {\r
-                       return 1;\r
-               } else {\r
-                       return -1;\r
-               }\r
-       }\r
-};\r
-\r
-String.prototype.contentEquals = function (sb) {\r
-       if (this.length != sb.length ()) {\r
-               return false;\r
-       }\r
-       var v = sb.getValue ();\r
-       var i = 0;\r
-       var j = 0;\r
-       var n = this.length;\r
-       while (n-- != 0) {\r
-               if (this.charCodeAt (i++) != v[j++]) {\r
-                       return false;\r
-               }\r
-       }\r
-       return true;\r
-};\r
-\r
-String.prototype.getChars = function (srcBegin, srcEnd, dst, dstBegin) {\r
-       if (srcBegin < 0) {\r
-               throw new StringIndexOutOfBoundsException(srcBegin);\r
-       }\r
-       if (srcEnd > this.length) {\r
-               throw new StringIndexOutOfBoundsException(srcEnd);\r
-       }\r
-       if (srcBegin > srcEnd) {\r
-               throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);\r
-       }\r
-       if (dst == null) {\r
-               throw new NullPointerException ();\r
-       }\r
-       for (var i = 0; i < srcEnd - srcBegin; i++) {\r
-               dst[dstBegin + i] = this.charAt (srcBegin + i);\r
-       }\r
-};\r
-String.prototype.$concat = String.prototype.concat;\r
-String.prototype.concat = function (s) {\r
-       if (s == null) {\r
-               throw new NullPointerException ();\r
-       }\r
-       return this.$concat (s);\r
-};\r
-\r
-String.prototype.$lastIndexOf = String.prototype.lastIndexOf;\r
-String.prototype.lastIndexOf = function (s, last) {\r
-       if (last != null && last + this.length <= 0) {  \r
-               return -1;\r
-       }\r
-       if (last != null) {\r
-               return this.$lastIndexOf (s, last);\r
-       } else {\r
-               return this.$lastIndexOf (s);\r
-       }\r
-};\r
-\r
-String.prototype.intern = function () {\r
-       return this.valueOf ();\r
-};\r
-String.copyValueOf = String.prototype.copyValueOf = function () {\r
-       if (arguments.length == 1) {\r
-               return String.instantialize (arguments[0]);\r
-       } else {\r
-               return String.instantialize (arguments[0], arguments[1], arguments[2]);\r
-       }\r
-};\r
-String.indexOf = function (source, sourceOffset, sourceCount,\r
-               target, targetOffset, targetCount, fromIndex) {\r
-       if (fromIndex >= sourceCount) {\r
-               return (targetCount == 0 ? sourceCount : -1);\r
-       }\r
-       if (fromIndex < 0) {\r
-               fromIndex = 0;\r
-       }\r
-       if (targetCount == 0) {\r
-               return fromIndex;\r
-       }\r
-\r
-       var first  = target[targetOffset];\r
-       var i = sourceOffset + fromIndex;\r
-       var max = sourceOffset + (sourceCount - targetCount);\r
-\r
-       startSearchForFirstChar:\r
-       while (true) {\r
-               /* Look for first character. */\r
-               while (i <= max && source[i] != first) {\r
-                       i++;\r
-               }\r
-               if (i > max) {\r
-                       return -1;\r
-               }\r
-\r
-               /* Found first character, now look at the rest of v2 */\r
-               var j = i + 1;\r
-               var end = j + targetCount - 1;\r
-               var k = targetOffset + 1;\r
-               while (j < end) {\r
-                       if (source[j++] != target[k++]) {\r
-                               i++;\r
-                               /* Look for str's first char again. */\r
-                               continue startSearchForFirstChar;\r
-                       }\r
-               }\r
-               return i - sourceOffset;        /* Found whole string. */\r
-       }\r
-};\r
-\r
-String.instantialize = function () {\r
-       if (arguments.length == 0) {\r
-               return new String ();\r
-       } else if (arguments.length == 1) {\r
-               var x = arguments[0];\r
-               if (typeof x == "string" || x instanceof String) {\r
-                       return new String (x);\r
-               } else if (x instanceof Array || x instanceof Int32Array) {\r
-                       if (x.length > 0 && typeof x[0] == "number") {\r
-                               var arr = new Array (x.length);\r
-                               for (var i = 0; i < x.length; i++) {\r
-                                       arr[i] = String.fromCharCode (x[i] & 0xff);\r
-                               }\r
-                               return Encoding.readUTF8 (arr.join (''));\r
-                       }\r
-                       return x.join ('');\r
-               } else if (x.__CLASS_NAME__ == "StringBuffer" \r
-                               || x.__CLASS_NAME__ == "java.lang.StringBuffer") {\r
-                       var value = x.shareValue();\r
-                       var length = x.length ();\r
-                       var valueCopy = new Array (length);\r
-                       for (var i = 0; i < length; i++) {\r
-                               valueCopy[i] = value[i];\r
-                       }\r
-                       return valueCopy.join ('')\r
-                       //return x.value.join ('');\r
-               } else {\r
-                       return "" + x;\r
-               }\r
-       } else if (arguments.length == 2) {\r
-               var x = arguments[0];\r
-               var hibyte=arguments[1];\r
-               if (typeof hibyte == "string") {\r
-                       return String.instantialize(x,0,x.length, hibyte);\r
-               } else {\r
-                       return String.instantialize(x,hibyte,0,x.length);\r
-               }\r
-       } else if (arguments.length == 3) {\r
-               var bytes = arguments[0];\r
-               var offset = arguments[1];\r
-               var length = arguments[2];\r
-               if (arguments[2] instanceof Array) {\r
-                       bytes = arguments[2];\r
-                       offset = arguments[0];\r
-                       length = arguments[1];\r
-               }\r
-               var arr = new Array (length);\r
-               if (offset < 0 || length + offset > bytes.length) {\r
-                       throw new IndexOutOfBoundsException ();\r
-               }\r
-               if (length > 0) {\r
-                       var isChar = (bytes[offset].length != null);\r
-                       if (isChar) {\r
-                               for (var i = 0; i < length; i++) {\r
-                                       arr[i] = bytes[offset + i];\r
-                               }\r
-                       } else {\r
-                               for (var i = 0; i < length; i++) {\r
-                                       arr[i]=String.fromCharCode (bytes[offset+i]);\r
-                               }\r
-                       }\r
-               }\r
-               return arr.join ('');\r
-       } else if (arguments.length == 4) {\r
-               var bytes = arguments[0];\r
-               var y = arguments[3];\r
-               if (typeof y == "string" || y instanceof String) {\r
-                       var offset = arguments[1];\r
-                       var length = arguments[2];\r
-                       var arr = new Array (length);\r
-                       for (var i = 0; i < length; i++) {\r
-                               arr[i] = bytes[offset + i];\r
-                               if (typeof arr[i] == "number") {\r
-                                       arr[i] = String.fromCharCode (arr[i] & 0xff);\r
-                               }\r
-                       }\r
-                       var cs = y.toLowerCase ();\r
-                       if (cs == "utf-8" || cs == "utf8") {\r
-                               return Encoding.readUTF8 (arr.join (''));\r
-                       } else {\r
-                               return arr.join ('');\r
-                       }\r
-               } else {\r
-                       var count = arguments[3];\r
-                       var offset = arguments[2];\r
-                       var hibyte = arguments[1];\r
-                       var value = new Array (count);\r
-                       if (hibyte == 0) {\r
-                               for (var i = count ; i-- > 0 ;) {\r
-                                       value[i] = String.fromCharCode (bytes[i + offset] & 0xff);\r
-                               }\r
-                       } else {\r
-                               hibyte <<= 8;\r
-                               for (var i = count ; i-- > 0 ;) {\r
-                                       value[i] = String.fromCharCode (hibyte | (bytes[i + offset] & 0xff));\r
-                               }\r
-                       }\r
-                       return value.join ('');\r
-               }\r
-       } else {\r
-               var s = "";\r
-               for (var i = 0; i < arguments.length; i++) {\r
-               s += arguments[i];\r
-               }\r
-               return s;\r
-       }\r
-};\r
-\r
-if (navigator.userAgent.toLowerCase ().indexOf ("chrome") != -1) { // Google Chrome's bug\r
-       String.prototype.toString = function () {\r
-               return this;\r
-       };\r
-}\r
-\r
-} // end of String.prototype.$replace\r
+Clazz.load (["java.lang.CharSequence", "$.Comparable", "java.io.Serializable", "java.util.Comparator"], "java.lang.String", null, function () {
+if (String.prototype.$replace == null) { // not defined yet! ClazzLoader may try to load this twice!
+java.lang.String = String;
+if (Clazz.supportsNativeObject) {
+       for (var i = 0; i < Clazz.extendedObjectMethods.length; i++) {
+               var p = Clazz.extendedObjectMethods[i];
+               if ("to$tring" == p || "toString" == p || "equals" == p || "hashCode" == p) {
+                       continue;
+               }
+               String.prototype[p] = Clazz._O.prototype[p];
+       }
+}
+//Clazz.decorateAsType (String, "String", null, [java.io.Serializable, CharSequence, Comparable]);
+Clazz.implementOf (String, [java.io.Serializable, CharSequence, Comparable]);
+//Number.equals = Clazz.innerFunctions.equals;
+String.getName = Clazz.innerFunctions.getName;
+
+String.serialVersionUID = String.prototype.serialVersionUID = -6849794470754667710;
+
+String.prototype.$replace = function (c1, c2) {
+       /*
+       var sp = "\\$.*+{}?^()[]";
+       if (sp.indexOf (c1) != -1) {
+               c1 = "\\" + c1;
+       }
+       */
+       c1 = c1.replace (/([\\\/\$\.\*\+\{\}\?\^\(\)\[\]])/g, function ($0, $1) {
+               return "\\" + $1;
+       });
+       var regExp = new RegExp (c1, "gm");
+       return this.replace (regExp, c2);
+};
+String.prototype.$generateExpFunction = function (str) {
+       var arr = [];
+       var orders = [];
+       var idx = 0;
+       arr[0] = "";
+       var i = 0;
+       for (; i < str.length; i++) {
+               var ch = str.charAt (i);
+               if (i != str.length - 1 && ch == '\\') {
+                       i++;
+                       var c = str.charAt (i);
+                       if (c == '\\') {
+                               arr[idx] += '\\';
+                       }
+                       arr[idx] += c;
+               } else if (i != str.length - 1 && ch == '$') {
+                       i++;
+                       orders[idx] = parseInt (str.charAt (i));
+                       idx++;
+                       arr[idx] = "";
+               } else if (ch == '\r') {
+                       arr[idx] += "\\r";
+               } else if (ch == '\n') {
+                       arr[idx] += "\\n";
+               } else if (ch == '\t') {
+                       arr[idx] += "\\t";
+               } else if (ch == '\"') {
+                       arr[idx] += "\\\"";
+               } else {
+                       arr[idx] += ch;
+               }
+       }
+       var funStr = "f = function (";
+       var max = Math.max.apply({},orders);
+       for (i = 0; i <= max; i++) {
+               funStr += "$" + i;
+               if (i != max) {
+                       funStr += ", ";
+               }
+       }
+       funStr += ") { return ";
+       for (i = 0; i < arr.length - 1; i++) {
+               funStr += "\"" + arr[i] + "\" + $" + orders[i] + " + ";
+       }
+       funStr += "\"" + arr[i] + "\"; }";
+       var f = null;
+       eval (funStr)
+       return f;
+};
+
+String.prototype.replaceAll = function (exp, str) {
+       var regExp = new RegExp (exp, "gm");
+       return this.replace (regExp, this.$generateExpFunction (str));
+};
+String.prototype.replaceFirst = function (exp, str) {
+       var regExp = new RegExp (exp, "m");
+       return this.replace (regExp, this.$generateExpFunction (str));
+};
+String.prototype.matches = function (exp) {
+       if (exp != null) {
+               exp = "^(" + exp + ")$";
+       }
+       var regExp = new RegExp (exp, "gm");
+       var m = this.match (regExp);
+       return m != null && m.length != 0;
+};
+String.prototype.regionMatches = function (ignoreCase, toffset,
+               other, ooffset, len) {
+       /*
+        * Support different method signatures
+        */
+       if (typeof ignoreCase == "number"
+                       || (ignoreCase != true && ignoreCase != false)) {
+               len = ooffset;
+               ooffset = other;
+               other = toffset;
+               toffset = ignoreCase;
+               ignoreCase = false;
+       }
+       var to = toffset;
+       var po = ooffset;
+       // Note: toffset, ooffset, or len might be near -1>>>1.
+       if ((ooffset < 0) || (toffset < 0) || (toffset > this.length - len) ||
+                       (ooffset > other.length - len)) {
+               return false;
+       }
+       var s1 = this.substring (toffset, toffset + len);
+       var s2 = other.substring (ooffset, ooffset + len);
+       if (ignoreCase) {
+               s1 = s1.toLowerCase ();
+               s2 = s2.toLowerCase ();
+       }
+       return s1 == s2;
+};
+String.prototype.$plit = function (regex, limit) {
+       /*
+        * Support different method signatures
+        */
+       if (limit != null && limit > 0) {
+               if (limit == 1) {
+                       return this;
+               }
+               var regExp = new RegExp ("(" + regex + ")", "gm");
+               var count = 1;
+               var s = this.replace (regExp, function ($0, $1) {
+                       count++;
+                       if (count == limit) {
+                               return "@@_@@";
+                       } else if (count > limit) {
+                               return $0;
+                       } else {
+                               return $0;
+                       }
+               });
+               regExp = new RegExp (regex, "gm");
+               var arr = this.split (regExp);
+               if (arr.length > limit) {
+                       arr[limit - 1] = s.substring (s.indexOf ("@@_@@") + 5);
+                       arr.length = limit;
+               }
+               return arr;
+       } else {
+               var regExp = new RegExp (regex, "gm");
+               return this.split (regExp);
+       }
+};
+
+String.prototype.trim = function () {
+       var len = this.length;
+       var st = 0;
+
+       while ((st < len) && (this.charAt (st) <= ' ')) {
+           st++;
+       }
+       while ((st < len) && (this.charAt (len - 1) <= ' ')) {
+           len--;
+       }
+       return ((st > 0) || (len < len)) ? this.substring (st, len) : this;
+};
+
+String.prototype.trim = function () {
+       return this.replace (/^\s+/g, '').replace (/\s+$/g, '');
+};
+
+/* private */
+String.prototype.startsWith_string_number = function (prefix, toffset) {
+       var to = toffset;
+       var po = 0;
+       var pc = prefix.length;
+       // Note: toffset might be near -1>>>1.
+       if ((toffset < 0) || (toffset > this.length - pc)) {
+           return false;
+       }
+       while (--pc >= 0) {
+           if (this.charAt (to++) != prefix.charAt (po++)) {
+               return false;
+           }
+       }
+       return true;
+};
+
+String.prototype.startsWith = function (prefix) { /* prefix, toffset */
+       if (arguments.length == 1) {
+               return this.startsWith_string_number (arguments[0], 0);
+       } else if (arguments.length == 2) {
+               return this.startsWith_string_number (arguments[0], arguments[1]);
+       } else {
+               return false;
+       }
+};
+
+String.prototype.endsWith = function (suffix) {
+       return this.startsWith (suffix, this.length - suffix.length);
+};
+
+String.prototype.equals = function (anObject) {
+       return this.valueOf () == anObject;
+};
+
+String.prototype.equalsIgnoreCase = function (anotherString) {
+       return (anotherString == null) ? false : (this == anotherString 
+                       || this.toLowerCase () == anotherString.toLowerCase ());
+};
+
+/* private */
+String.prototype.hash = 0;
+
+String.prototype.hashCode = function () {
+       var h = this.hash;
+       if (h == 0) {
+               var off = 0;
+               var len = this.length;
+               for (var i = 0; i < len; i++) {
+                       h = 31*h + this.charCodeAt (off++);
+                       h &= 0xffffffff;
+               }
+               this.hash = h;
+       }
+    return h;
+};
+
+String.prototype.getBytes = function () {
+       if (arguments.length == 4) {
+               return this.getChars (arguments[0], arguments[1], arguments[2], arguments[3]);
+       }
+       var s = this;
+       if (arguments.length == 1) {
+               var cs = arguments[0].toString().toLowerCase ();
+               var charset = [
+                       "utf-8", "UTF8", "us-ascii", "iso-8859-1", "8859_1", "gb2312", "gb18030", "gbk"
+               ];
+               var existed = false;
+               for (var i = 0; i < charset.length; i++) {
+                       if (charset[i] == cs) {
+                               existed = true;
+                               break;
+                       }
+               }
+               if (!existed) {
+                       throw new java.io.UnsupportedEncodingException ();
+               }
+               if (cs == "utf-8" || cs == "utf8") {
+                       s = Encoding.convert2UTF8 (this);
+               }
+       }
+       var arrs = new Array (s.length);
+       var c = 0, ii = 0;
+       for (var i = 0; i < s.length; i++) {
+               c = s.charCodeAt (i);
+               if (c > 255) {
+                       arrs[ii] = 0x1a;
+                       arrs[ii + 1] = c & 0xff;
+                       arrs[ii + 2] = (c & 0xff00) >> 8;
+                       ii+=2;
+               } else {
+                       arrs[ii] = c;
+               }
+               ii++;
+       }
+       return arrs;
+};
+
+String.prototype.compareTo = function (anotherString) {
+       if (anotherString == null) {
+               throw new java.lang.NullPointerException ();
+       }
+       var len1 = this.length;
+       var len2 = anotherString.length;
+       var n = Math.min (len1, len2);
+       var k = 0;
+    while (k < n) {
+               var c1 = this.charCodeAt (k);
+               var c2 = anotherString.charCodeAt (k);
+               if (c1 != c2) {
+                       return c1 - c2;
+               }
+               k++;
+       }
+       return len1 - len2;
+};
+
+String.prototype.toCharArray = function () {
+       var result = new Array (this.length);
+       for (var i = 0; i < this.length; i++) {
+               result[i] = this.charAt (i);
+       }
+       return result;
+};
+String.value0f = String.valueOf;
+String.valueOf = function (o) {
+       if (o == "undefined") {
+               return String.value0f ();
+       }
+       if (o instanceof Array) {
+               if (arguments.length == 1) {
+                       return o.join ('');
+               } else {
+                       var off = arguments[1];
+                       var len = arguments[2];
+                       var oo = new Array (len);
+                       for (var i = 0; i < len; i++) {
+                               oo[i] = o[off + i];
+                       }
+                       return oo.join ('');
+               }
+       }
+       return "" + o;
+};
+
+String.prototype.subSequence = function (beginIndex, endIndex) {
+       return this.substring(beginIndex, endIndex);
+};
+
+String.prototype.compareToIgnoreCase = function (str) {
+       if (str == null) {
+               throw new NullPointerException ();
+       }
+       var s1 = this.toUpperCase ();
+       var s2 = str.toUpperCase ();
+       if (s1 == s2) {
+               return 0;
+       } else {
+               var s1 = this.toLowerCase ();
+               var s2 = str.toLowerCase ();
+               if (s1 == s2) {
+                       return 0;
+               } else if (s1 > s2) {
+                       return 1;
+               } else {
+                       return -1;
+               }
+       }
+};
+
+String.prototype.contentEquals = function (sb) {
+       if (this.length != sb.length ()) {
+               return false;
+       }
+       var v = sb.getValue ();
+       var i = 0;
+       var j = 0;
+       var n = this.length;
+       while (n-- != 0) {
+               if (this.charCodeAt (i++) != v[j++]) {
+                       return false;
+               }
+       }
+       return true;
+};
+
+String.prototype.getChars = function (srcBegin, srcEnd, dst, dstBegin) {
+       if (srcBegin < 0) {
+               throw new StringIndexOutOfBoundsException(srcBegin);
+       }
+       if (srcEnd > this.length) {
+               throw new StringIndexOutOfBoundsException(srcEnd);
+       }
+       if (srcBegin > srcEnd) {
+               throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
+       }
+       if (dst == null) {
+               throw new NullPointerException ();
+       }
+       for (var i = 0; i < srcEnd - srcBegin; i++) {
+               dst[dstBegin + i] = this.charAt (srcBegin + i);
+       }
+};
+String.prototype.$concat = String.prototype.concat;
+String.prototype.concat = function (s) {
+       if (s == null) {
+               throw new NullPointerException ();
+       }
+       return this.$concat (s);
+};
+
+String.prototype.$lastIndexOf = String.prototype.lastIndexOf;
+String.prototype.lastIndexOf = function (s, last) {
+       if (last != null && last + this.length <= 0) {  
+               return -1;
+       }
+       if (last != null) {
+               return this.$lastIndexOf (s, last);
+       } else {
+               return this.$lastIndexOf (s);
+       }
+};
+
+String.prototype.intern = function () {
+       return this.valueOf ();
+};
+String.copyValueOf = String.prototype.copyValueOf = function () {
+       if (arguments.length == 1) {
+               return String.instantialize (arguments[0]);
+       } else {
+               return String.instantialize (arguments[0], arguments[1], arguments[2]);
+       }
+};
+String.indexOf = function (source, sourceOffset, sourceCount,
+               target, targetOffset, targetCount, fromIndex) {
+       if (fromIndex >= sourceCount) {
+               return (targetCount == 0 ? sourceCount : -1);
+       }
+       if (fromIndex < 0) {
+               fromIndex = 0;
+       }
+       if (targetCount == 0) {
+               return fromIndex;
+       }
+
+       var first  = target[targetOffset];
+       var i = sourceOffset + fromIndex;
+       var max = sourceOffset + (sourceCount - targetCount);
+
+       startSearchForFirstChar:
+       while (true) {
+               /* Look for first character. */
+               while (i <= max && source[i] != first) {
+                       i++;
+               }
+               if (i > max) {
+                       return -1;
+               }
+
+               /* Found first character, now look at the rest of v2 */
+               var j = i + 1;
+               var end = j + targetCount - 1;
+               var k = targetOffset + 1;
+               while (j < end) {
+                       if (source[j++] != target[k++]) {
+                               i++;
+                               /* Look for str's first char again. */
+                               continue startSearchForFirstChar;
+                       }
+               }
+               return i - sourceOffset;        /* Found whole string. */
+       }
+};
+
+String.instantialize = function () {
+       if (arguments.length == 0) {
+               return new String ();
+       } else if (arguments.length == 1) {
+               var x = arguments[0];
+               if (typeof x == "string" || x instanceof String) {
+                       return new String (x);
+               } else if (x instanceof Array || x instanceof Int32Array) {
+                       if (x.length > 0 && typeof x[0] == "number") {
+                               var arr = new Array (x.length);
+                               for (var i = 0; i < x.length; i++) {
+                                       arr[i] = String.fromCharCode (x[i] & 0xff);
+                               }
+                               return Encoding.readUTF8 (arr.join (''));
+                       }
+                       return x.join ('');
+               } else if (x.__CLASS_NAME__ == "StringBuffer" 
+                               || x.__CLASS_NAME__ == "java.lang.StringBuffer") {
+                       var value = x.shareValue();
+                       var length = x.length ();
+                       var valueCopy = new Array (length);
+                       for (var i = 0; i < length; i++) {
+                               valueCopy[i] = value[i];
+                       }
+                       return valueCopy.join ('')
+                       //return x.value.join ('');
+               } else {
+                       return "" + x;
+               }
+       } else if (arguments.length == 2) {
+               var x = arguments[0];
+               var hibyte=arguments[1];
+               if (typeof hibyte == "string") {
+                       return String.instantialize(x,0,x.length, hibyte);
+               } else {
+                       return String.instantialize(x,hibyte,0,x.length);
+               }
+       } else if (arguments.length == 3) {
+               var bytes = arguments[0];
+               var offset = arguments[1];
+               var length = arguments[2];
+               if (arguments[2] instanceof Array) {
+                       bytes = arguments[2];
+                       offset = arguments[0];
+                       length = arguments[1];
+               }
+               var arr = new Array (length);
+               if (offset < 0 || length + offset > bytes.length) {
+                       throw new IndexOutOfBoundsException ();
+               }
+               if (length > 0) {
+                       var isChar = (bytes[offset].length != null);
+                       if (isChar) {
+                               for (var i = 0; i < length; i++) {
+                                       arr[i] = bytes[offset + i];
+                               }
+                       } else {
+                               for (var i = 0; i < length; i++) {
+                                       arr[i]=String.fromCharCode (bytes[offset+i]);
+                               }
+                       }
+               }
+               return arr.join ('');
+       } else if (arguments.length == 4) {
+               var bytes = arguments[0];
+               var y = arguments[3];
+               if (typeof y == "string" || y instanceof String) {
+                       var offset = arguments[1];
+                       var length = arguments[2];
+                       var arr = new Array (length);
+                       for (var i = 0; i < length; i++) {
+                               arr[i] = bytes[offset + i];
+                               if (typeof arr[i] == "number") {
+                                       arr[i] = String.fromCharCode (arr[i] & 0xff);
+                               }
+                       }
+                       var cs = y.toLowerCase ();
+                       if (cs == "utf-8" || cs == "utf8") {
+                               return Encoding.readUTF8 (arr.join (''));
+                       } else {
+                               return arr.join ('');
+                       }
+               } else {
+                       var count = arguments[3];
+                       var offset = arguments[2];
+                       var hibyte = arguments[1];
+                       var value = new Array (count);
+                       if (hibyte == 0) {
+                               for (var i = count ; i-- > 0 ;) {
+                                       value[i] = String.fromCharCode (bytes[i + offset] & 0xff);
+                               }
+                       } else {
+                               hibyte <<= 8;
+                               for (var i = count ; i-- > 0 ;) {
+                                       value[i] = String.fromCharCode (hibyte | (bytes[i + offset] & 0xff));
+                               }
+                       }
+                       return value.join ('');
+               }
+       } else {
+               var s = "";
+               for (var i = 0; i < arguments.length; i++) {
+               s += arguments[i];
+               }
+               return s;
+       }
+};
+
+if (navigator.userAgent.toLowerCase ().indexOf ("chrome") != -1) { // Google Chrome's bug
+       String.prototype.toString = function () {
+               return this;
+       };
+}
+
+} // end of String.prototype.$replace
 });
\ No newline at end of file