Merge branch 'master' of https://source.jalview.org/git/jalviewjs.git
[jalviewjs.git] / site / j2s / java / lang / ClassExt.js
index 48e59f2..7c4d2bf 100644 (file)
-/******************************************************************************\r
- * Copyright (c) 2007 java2script.org and others.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     Zhou Renjian - initial API and implementation\r
- *****************************************************************************/\r
-/*******\r
- * @author zhou renjian\r
- * @create March 10, 2006\r
- *******/\r
-\r
-if (window["Clazz"] == null || window["Clazz"].unloadClass == null) {\r
-/**\r
- * Once ClassExt.js is part of Class.js.\r
- * In order to make the Class.js as small as possible, part of its content\r
- * is moved into this ClassExt.js.\r
- *\r
- * See also http://j2s.sourceforge.net/j2sclazz/\r
- */\r
\r
-/**\r
- * Clazz.MethodNotFoundException is used to notify the developer about calling\r
- * methods with incorrect parameters.\r
- */\r
-/* protected */\r
-// Override the Clazz.MethodNotFoundException in Class.js to give details\r
-Clazz.MethodNotFoundException = function (obj, clazz, method, params) {\r
-       var paramStr = "";\r
-       if (params != null) {\r
-               paramStr = params.substring (1).replace (/\\/g, ",");\r
-       }\r
-       var leadingStr = "";\r
-       if (method != null && method != "construct") {\r
-               leadingStr = "Method";\r
-       } else {\r
-               leadingStr = "Constructor";\r
-       }\r
-       this.message = leadingStr + " " + Clazz.getClassName (clazz, true) + "." \r
-                                       + method + "(" + paramStr + ") is not found!";\r
-       this.toString = function () {\r
-               return "MethodNotFoundException:" + this.message;\r
-       }\r
-};\r
-\r
-/**\r
- * Prepare callback for instance of anonymous Class.\r
- * For example for the callback:\r
- *     this.callbacks.MyEditor.sayHello();\r
- *\r
- * @param objThis the host object for callback\r
- * @param args arguments object. args[0] will be classThisObj -- the "this"\r
- * object to be hooked\r
- * \r
- * Attention: parameters should not be null!\r
- */\r
-/* protected */\r
-Clazz.prepareCallback = function (objThis, args) {\r
-       var classThisObj = args[0];\r
-       var cbName = "b$"; // "callbacks";\r
-       if (objThis != null && classThisObj != null && classThisObj !== window) {\r
-               var obs = new Array ();\r
-               if (objThis[cbName] == null) {\r
-                       objThis[cbName] = obs;\r
-               } else { // must make a copy!\r
-                       for (var s in objThis[cbName]) {\r
-                               if (s != "length") {\r
-                                       obs[s] = objThis[cbName][s];\r
-                               }\r
-                       }\r
-                       objThis[cbName] = obs;\r
-               }\r
-               var className = Clazz.getClassName (classThisObj, true);\r
-               //if (obs[className] == null) { /* == null make no sense! */\r
-                       //obs[className] = classThisObj;\r
-                       /*\r
-                        * TODO: the following line is SWT-specific! Try to move it out!\r
-                        */\r
-                       obs[className.replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj;\r
-                       var clazz = Clazz.getClass (classThisObj);\r
-                       while (clazz.superClazz != null) {\r
-                               clazz = clazz.superClazz;\r
-                               //obs[Clazz.getClassName (clazz)] = classThisObj;\r
-                               /*\r
-                                * TODO: the following line is SWT-specific! Try to move it out!\r
-                                */\r
-                               obs[Clazz.getClassName (clazz, true)\r
-                                               .replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj;\r
-                       }\r
-               //}\r
-               var cbs = classThisObj[cbName];\r
-               if (cbs != null && cbs instanceof Array) {\r
-                       for (var s in cbs) {\r
-                               if (s != "length") {\r
-                                       obs[s] = cbs[s];\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       // Shift the arguments\r
-       for (var i = 0; i < args.length - 1; i++) {\r
-               args[i] = args[i + 1];\r
-       }\r
-       args.length--;\r
-       // arguments will be returned!\r
-};\r
-\r
-/**\r
- * Construct instance of the given inner class.\r
- *\r
- * @param classInner given inner class, alway with name like "*$*"\r
- * @param objThis this instance which can be used to call back.\r
- * @param finalVars final variables which the inner class may use\r
- * @return the constructed object\r
- *\r
- * @see Clazz#cloneFinals\r
- */\r
-/* public */\r
-Clazz.innerTypeInstance = function (clazzInner, objThis, finalVars) {\r
-       if (clazzInner == null) {\r
-               clazzInner = arguments.callee.caller;\r
-       }\r
-       var obj = null;\r
-       /*if (arguments.length == 2) {\r
-               obj = new clazzInner (objThis);\r
-       } else */if (arguments.length == 3) {\r
-               obj = new clazzInner (objThis);\r
-       } else if (arguments.length == 4) {\r
-               if (objThis.__CLASS_NAME__ == clazzInner.__CLASS_NAME__\r
-                               && arguments[3] === Clazz.inheritArgs) {\r
-                       obj = objThis;\r
-               } else {\r
-                       obj = new clazzInner (objThis, arguments[3]);\r
-               }\r
-       } else if (arguments.length == 5) {\r
-               obj = new clazzInner (objThis, arguments[3], arguments[4]);\r
-       } else if (arguments.length == 6) {\r
-               obj = new clazzInner (objThis, arguments[3], arguments[4], \r
-                               arguments[5]);\r
-       } else if (arguments.length == 7) {\r
-               obj = new clazzInner (objThis, arguments[3], arguments[4], \r
-                               arguments[5], arguments[6]);\r
-       } else if (arguments.length == 8) {\r
-               obj = new clazzInner (objThis, arguments[3], arguments[4], \r
-                               arguments[5], arguments[6], arguments[7]);\r
-       } else if (arguments.length == 9) {\r
-               obj = new clazzInner (objThis, arguments[3], arguments[4], \r
-                               arguments[5], arguments[6], arguments[7], arguments[8]);\r
-       } else if (arguments.length == 10) {\r
-               obj = new clazzInner (objThis, arguments[3], arguments[4], \r
-                               arguments[5], arguments[6], arguments[7], arguments[8],\r
-                               arguments[9]);\r
-       } else {\r
-               /*\r
-                * Should construct instance manually.\r
-                */\r
-               obj = new clazzInner ();\r
-               if (obj.construct == null) {\r
-                       throw new String ("No support anonymous class constructor with " \r
-                                       + "more than 7 parameters.");\r
-               }\r
-               var args = new Array ();\r
-               for (var i = 3; i < arguments.length; i++) {\r
-                       args[i - 3] = arguments[i];\r
-               }\r
-               obj.construct.apply (obj, args);\r
-       }\r
-       // f$ is short for the once choosen "$finals"\r
-       if (finalVars != null && objThis.f$ == null) {\r
-               obj.f$ = finalVars;\r
-       } else if (finalVars == null && objThis.f$ != null) {\r
-               obj.f$ = objThis.f$;\r
-       } else if (finalVars != null && objThis.f$ != null) {\r
-               var o = new Object ();\r
-               for (var attr in objThis.f$) {\r
-                       o[attr] = objThis.f$[attr];\r
-               }\r
-               for (var attr in finalVars) {\r
-                       o[attr] = finalVars[attr];\r
-               }\r
-               obj.f$ = o;\r
-       }\r
-       /*\r
-       if (finalVars != null && objThis.$finals == null) {\r
-               obj.$finals = finalVars;\r
-       } else if (finalVars == null && objThis.$finals != null) {\r
-               obj.$finals = objThis.$finals;\r
-       } else if (finalVars != null && objThis.$finals != null) {\r
-               var o = new Object ();\r
-               for (var attr in objThis.$finals) {\r
-                       o[attr] = objThis.$finals[attr];\r
-               }\r
-               for (var attr in finalVars) {\r
-                       o[attr] = finalVars[attr];\r
-               }\r
-               obj.$finals = o;\r
-       }\r
-       */\r
-       //Clazz.prepareCallback (obj, objThis);\r
-       return obj;\r
-};\r
-\r
-/**\r
- * Clone variables whose modifier is "final".\r
- * Usage: var o = Clazz.cloneFinals ("name", name, "age", age);\r
- *\r
- * @return Object with all final variables\r
- */\r
-/* protected */\r
-Clazz.cloneFinals = function () {\r
-       var o = new Object ();\r
-       var length = arguments.length / 2;\r
-       for (var i = 0; i < length; i++) {\r
-               o[arguments[i + i]] = arguments[i + i + 1];\r
-       }\r
-       return o;\r
-};\r
-\r
-/* public */\r
-Clazz.isClassDefined = Clazz.isDefinedClass = function (clazzName) {\r
-       if (clazzName != null && clazzName.length != 0) {\r
-               if (Clazz.allClasses[clazzName]) {\r
-                       return true;\r
-               }\r
-               var pkgFrags = clazzName.split (/\./);\r
-               var pkg = null;\r
-               for (var i = 0; i < pkgFrags.length; i++) {\r
-                       if (pkg == null) {\r
-                               if (Clazz.allPackage[pkgFrags[0]] == null) {\r
-                                       //error (clazzName + " / " + false);\r
-                                       return false;\r
-                               }\r
-                               pkg = Clazz.allPackage[pkgFrags[0]];\r
-                       } else {\r
-                               if (pkg[pkgFrags[i]] == null) {\r
-                                       //error (clazzName + " / " + false);\r
-                                       return false;\r
-                               }\r
-                               pkg = pkg[pkgFrags[i]]\r
-                       }\r
-               }\r
-               //error (clazzName + " / " + (pkg != null));\r
-               //return pkg != null;\r
-               if (pkg != null) {\r
-                       Clazz.allClasses[clazzName] = true;\r
-                       return true;\r
-               } else {\r
-                       return false;\r
-               }\r
-       } else {\r
-               /* consider null or empty name as non-defined class */\r
-               return false;\r
-       }\r
-};\r
-/**\r
- * Define the enum constant.\r
- * @param classEnum enum type\r
- * @param enumName enum constant\r
- * @param enumOrdinal enum ordinal\r
- * @param initialParams enum constant constructor parameters\r
- * @return return defined enum constant\r
- */\r
-/* public */\r
-Clazz.defineEnumConstant = function (clazzEnum, enumName, enumOrdinal, initialParams, clazzEnumExt) {\r
-       var o = null;\r
-       if (clazzEnumExt != null) {\r
-               o = new clazzEnumExt ();\r
-       } else {\r
-               o = new clazzEnum ();\r
-       }\r
-       Clazz.superConstructor (o, clazzEnum, [enumName, enumOrdinal]);\r
-       if (initialParams != null && initialParams.length != 0) {\r
-               o.construct.apply (o, initialParams);\r
-       }\r
-       clazzEnum[enumName] = o;\r
-       clazzEnum.prototype[enumName] = o;\r
-       return o;\r
-};\r
-\r
-/**\r
- * Make arrays.\r
- *\r
- * @return the created Array object\r
- */\r
-/* public */\r
-Clazz.newArray  = function () {\r
-       var args = arguments;\r
-       if (arguments.length == 1) {\r
-               if (arguments[0] instanceof Array) {\r
-                       args = arguments[0];\r
-               }\r
-       }\r
-       if (args.length <= 1) {\r
-               return new Array ();\r
-       } else if (args.length == 2) {\r
-               var dim = args[0];\r
-               if (typeof dim == "string") {\r
-                       dim = dim.charCodeAt (0); // char\r
-               }\r
-               var val = args[1];\r
-               var arr = new Array (dim);\r
-               for (var i = 0; i < dim; i++) {\r
-                       arr[i] = val;\r
-               }\r
-               return arr;\r
-       } else {\r
-               var dim = args[0];\r
-               if (typeof dim == "string") {\r
-                       dim = dim.charCodeAt (0); // char\r
-               }\r
-               var len = args.length - 1;\r
-               var xargs = new Array (len);\r
-               for (var i = 0; i < len; i++) {\r
-                       xargs[i] = args[i + 1];\r
-               }\r
-               var arr = new Array (dim);\r
-               for (var i = 0; i < dim; i++) {\r
-                       // Call recursively!\r
-                       arr[i] = Clazz.newArray (xargs);\r
-               }\r
-               return arr;\r
-       }\r
-};\r
-\r
-/**\r
- * Make the RunnableCompatiability instance as a JavaScript function.\r
- *\r
- * @param jsr Instance of RunnableCompatiability\r
- * @return JavaScript function instance represents the method run of jsr.\r
- */\r
-/* public */\r
-Clazz.makeFunction = function (jsr) {\r
-       return function (e) {\r
-               if (e == null) {\r
-                       e = window.event;\r
-               }\r
-               if (jsr.setEvent != null) {\r
-                       jsr.setEvent (e);\r
-               }\r
-               jsr.run ();\r
-               /*\r
-               if (e != null && jsr.isReturned != null && jsr.isReturned()) {\r
-                       // Is it correct to stopPropagation here? --Feb 19, 2006\r
-                       e.cancelBubble = true;\r
-                       if (e.stopPropagation) {\r
-                               e.stopPropagation();\r
-                       }\r
-               }\r
-               */\r
-               if (jsr.returnSet == 1) {\r
-                       return jsr.returnNumber;\r
-               } else if (jsr.returnSet == 2) {\r
-                       return jsr.returnBoolean;\r
-               } else if (jsr.returnSet == 3) {\r
-                       return jsr.returnObject;\r
-               }\r
-       };\r
-};\r
-\r
-/* protected */\r
-Clazz.defineStatics = function (clazz) {\r
-       for (var i = 0; i < (arguments.length - 1) / 2; i++) {\r
-               var name = arguments[i + i + 1];\r
-               clazz[name] = clazz.prototype[name] = arguments[i + i + 2];\r
-       }\r
-};\r
-\r
-/* protected */\r
-Clazz.prepareFields = function (clazz, fieldsFun) {\r
-       var stacks = new Array ();\r
-       if (clazz.con$truct != null) {\r
-               var ss = clazz.con$truct.stacks;\r
-               var idx = clazz.con$truct.index;\r
-               for (var i = idx; i < ss.length; i++) {\r
-                       stacks[i] = ss[i];\r
-               }\r
-       }\r
-       clazz.con$truct = clazz.prototype.con$truct = function () {\r
-               var stacks = arguments.callee.stacks;\r
-               if (stacks != null) {\r
-                       for (var i = 0; i < stacks.length; i++) {\r
-                               stacks[i].apply (this, []);\r
-                       }\r
-               }\r
-       };\r
-       stacks[stacks.length] = fieldsFun;\r
-       clazz.con$truct.stacks = stacks;\r
-       clazz.con$truct.index = 0;\r
-};\r
-\r
-/*\r
- * Serialize those public or protected fields in class \r
- * net.sf.j2s.ajax.SimpleSerializable.\r
- */\r
-/* protected */\r
-Clazz.registerSerializableFields = function (clazz) {\r
-       var args = arguments;\r
-       var length = args.length;\r
-       var newArr = new Array ();\r
-       if (clazz.declared$Fields != null) {\r
-               for (var i = 0; i < clazz.declared$Fields.length; i++) {\r
-                       newArr[i] = clazz.declared$Fields[i];\r
-               }\r
-       }\r
-       clazz.declared$Fields = newArr;\r
-       \r
-       if (length > 0 && length % 2 == 1) {\r
-               var fs = clazz.declared$Fields;\r
-               for (var i = 1; i <= (length - 1) / 2; i++) {\r
-                       var o = { name : args[i + i - 1], type : args[i + i] };\r
-                       var existed = false;\r
-                       for (var j = 0; j < fs.length; j++) {\r
-                               if (fs[j].name == o.name) { // reloaded classes\r
-                                       fs[j].type = o.type; // update type\r
-                                       existed = true;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if (!existed) {\r
-                               fs[fs.length] = o;\r
-                       }\r
-               }\r
-       }\r
-};\r
-\r
-/*\r
- * Get the caller method for those methods that are wrapped by \r
- * Clazz.searchAndExecuteMethod.\r
- *\r
- * @param args caller method's arguments\r
- * @return caller method, null if there is not wrapped by \r
- * Clazz.searchAndExecuteMethod or is called directly.\r
- */\r
-/* protected */\r
-/*-# getMixedCallerMethod -> gMCM  #-*/\r
-Clazz.getMixedCallerMethod = function (args) {\r
-       var o = new Object ();\r
-       var argc = args.callee.caller; // Clazz.tryToSearchAndExecute\r
-       if (argc == null) return null;\r
-       if (argc !== Clazz.tryToSearchAndExecute) { // inherited method's apply\r
-               argc = argc.arguments.callee.caller;\r
-               if (argc == null) return null;\r
-       }\r
-       if (argc !== Clazz.tryToSearchAndExecute) return null;\r
-       argc = argc.arguments.callee.caller; // Clazz.searchAndExecuteMethod\r
-       if (argc == null || argc !== Clazz.searchAndExecuteMethod) return null;\r
-       o.claxxRef = argc.arguments[1];\r
-       o.fxName = argc.arguments[2];\r
-       o.paramTypes = Clazz.getParamsType (argc.arguments[3]);\r
-       argc = argc.arguments.callee.caller; // Clazz.generateDelegatingMethod\r
-       if (argc == null) return null;\r
-       argc = argc.arguments.callee.caller; // the private method's caller\r
-       if (argc == null) return null;\r
-       o.caller = argc;\r
-       return o;\r
-};\r
-\r
-/*\r
- * Check and return super private method.\r
- * In order make private methods be executed correctly, some extra javascript\r
- * must be inserted into the beggining of the method body of the non-private \r
- * methods that with the same method signature as following:\r
- * <code>\r
- *                     var $private = Clazz.checkPrivateMethod (arguments);\r
- *                     if ($private != null) {\r
- *                             return $private.apply (this, arguments);\r
- *                     }\r
- * </code>\r
- * Be cautious about this. The above codes should be insert by Java2Script\r
- * compiler or with double checks to make sure things work correctly.\r
- *\r
- * @param args caller method's arguments\r
- * @return private method if there are private method fitted for the current \r
- * calling environment\r
- */\r
-/* public */\r
-Clazz.checkPrivateMethod = function (args) {\r
-       var m = Clazz.getMixedCallerMethod (args);\r
-       if (m == null) return null;\r
-       var callerFx = m.claxxRef.prototype[m.caller.exName];\r
-       if (callerFx == null) return null; // may not be in the class hierarchies\r
-       var ppFun = null;\r
-       if (callerFx.claxxOwner != null) {\r
-               ppFun = callerFx.claxxOwner.prototype[m.fxName];\r
-       } else {\r
-               var stacks = callerFx.stacks;\r
-               for (var i = stacks.length - 1; i >= 0; i--) {\r
-                       var fx = stacks[i].prototype[m.caller.exName];\r
-                       if (fx === m.caller) {\r
-                               ppFun = stacks[i].prototype[m.fxName];\r
-                       } else if (fx != null) {\r
-                               for (var fn in fx) {\r
-                                       if (fn.indexOf ('\\') == 0 && fx[fn] === m.caller) {\r
-                                               ppFun = stacks[i].prototype[m.fxName];\r
-                                               break;\r
-                                       }\r
-                               }\r
-                       }\r
-                       if (ppFun != null) {\r
-                               break;\r
-                       }\r
-               }\r
-       }\r
-       if (ppFun != null && ppFun.claxxOwner == null) {\r
-               ppFun = ppFun["\\" + m.paramTypes];\r
-       }\r
-       if (ppFun != null && ppFun.isPrivate && ppFun !== args.callee) {\r
-               return ppFun;\r
-       }\r
-       return null;\r
-};\r
-var $fz = null; // for private method declaration\r
-//var cla$$ = null;\r
-var c$ = null;\r
-/*-# cla$$$tack -> cst  #-*/\r
-Clazz.cla$$$tack = new Array ();\r
-Clazz.pu$h = function () {\r
-       if (c$ != null) { // if (cla$$ != null) {\r
-               Clazz.cla$$$tack[Clazz.cla$$$tack.length] = c$; // cla$$;\r
-       }\r
-};\r
-Clazz.p0p = function () {\r
-       if (Clazz.cla$$$tack.length > 0) {\r
-               var clazz = Clazz.cla$$$tack[Clazz.cla$$$tack.length - 1];\r
-               Clazz.cla$$$tack.length--;\r
-               return clazz;\r
-       } else {\r
-               return null;\r
-       }\r
-};\r
-\r
-/*# {$no.debug.support} >>x #*/\r
-/*\r
- * Option to switch on/off of stack traces.\r
- */\r
-/* protect */\r
-Clazz.tracingCalling = false;\r
-\r
-/*\r
- * Use to mark that the Throwable instance is created or not.\r
- */\r
-/* private */\r
-Clazz.initializingException = false;\r
-\r
-/* private */\r
-Clazz.callingStack = function (caller, owner) {\r
-       this.caller = caller;\r
-       this.owner = owner;\r
-};\r
-Clazz.callingStackTraces = new Array ();\r
-Clazz.pu$hCalling = function (stack) {\r
-       Clazz.callingStackTraces[Clazz.callingStackTraces.length] = stack;\r
-};\r
-Clazz.p0pCalling = function () {\r
-       var length = Clazz.callingStackTraces.length;\r
-       if (length > 0) {\r
-               var stack = Clazz.callingStackTraces[length - 1];\r
-               Clazz.callingStackTraces.length--;\r
-               return stack;\r
-       } else {\r
-               return null;\r
-       }\r
-};\r
-/*# x<< #*/\r
-\r
-/**\r
- * The first folder is considered as the primary folder.\r
- * And try to be compatiable with ClazzLoader system.\r
- */\r
-/* private */\r
-if (window["ClazzLoader"] != null && ClazzLoader.binaryFolders != null) {\r
-       Clazz.binaryFolders = ClazzLoader.binaryFolders;\r
-} else {\r
-       Clazz.binaryFolders = ["bin/", "", "j2slib/"];\r
-}\r
-\r
-Clazz.addBinaryFolder = function (bin) {\r
-       if (bin != null) {\r
-               var bins = Clazz.binaryFolders;\r
-               for (var i = 0; i < bins.length; i++) {\r
-                       if (bins[i] == bin) {\r
-                               return ;\r
-                       }\r
-               }\r
-               bins[bins.length] = bin;\r
-       }\r
-};\r
-Clazz.removeBinaryFolder = function (bin) {\r
-       if (bin != null) {\r
-               var bins = Clazz.binaryFolders;\r
-               for (var i = 0; i < bins.length; i++) {\r
-                       if (bins[i] == bin) {\r
-                               for (var j = i; j < bins.length - 1; j++) {\r
-                                       bins[j] = bins[j + 1];\r
-                               }\r
-                               bins.length--;\r
-                               return bin;\r
-                       }\r
-               }\r
-       }\r
-       return null;\r
-};\r
-Clazz.setPrimaryFolder = function (bin) {\r
-       if (bin != null) {\r
-               Clazz.removeBinaryFolder (bin);\r
-               var bins = Clazz.binaryFolders;\r
-               for (var i = bins.length - 1; i >= 0; i--) {\r
-                       bins[i + 1] = bins[i];\r
-               }\r
-               bins[0] = bin;\r
-       }\r
-};\r
-\r
-/**\r
- * This is a simple implementation for Clazz#load. It just ignore dependencies\r
- * of the class. This will be fine for jar *.z.js file.\r
- * It will be overriden by ClazzLoader#load.\r
- * For more details, see ClazzLoader.js\r
- */\r
-/* protected */\r
-Clazz.load = function (musts, clazz, optionals, declaration) {\r
-       if (declaration != null) {\r
-               declaration ();\r
-       }\r
-};\r
-\r
-/*\r
- * Invade the Object prototype!\r
- * TODO: make sure that invading Object prototype does not affect other\r
- * existed library, such as Dojo, YUI, Prototype, ...\r
- */\r
-java.lang.Object = Clazz._O;\r
-\r
-JavaObject.getName = Clazz.innerFunctions.getName;\r
-\r
-w$ = window; // Short for browser's window object\r
-d$ = document; // Short for browser's document object\r
-System = {\r
-       currentTimeMillis : function () {\r
-               return new Date ().getTime ();\r
-       },\r
-       props : null, //new java.util.Properties (),\r
-       getProperties : function () {\r
-               return System.props;\r
-       },\r
-       setProperties : function (props) {\r
-               System.props = props;\r
-       },\r
-       getProperty : function (key, def) {\r
-               if (System.props != null) {\r
-                       return System.props.getProperty (key, def);\r
-               }\r
-               if (def != null) {\r
-                       return def;\r
-               }\r
-               return key;\r
-       },\r
-       setProperty : function (key, val) {\r
-               if (System.props == null) {\r
-                       return ;\r
-               }\r
-               System.props.setProperty (key, val);\r
-       },\r
-       currentTimeMillis : function () {\r
-               return new Date ().getTime ();\r
-       },\r
-       arraycopy : function (src, srcPos, dest, destPos, length) {\r
-               if (src !== dest) {\r
-                       for (var i = 0; i < length; i++) {\r
-                               dest[destPos + i] = src[srcPos + i];\r
-                       }\r
-               } else {\r
-                       var swap = [];\r
-                       for (var i = 0; i < length; i++) {\r
-                               swap[i] = src[srcPos + i];\r
-                       }\r
-                       for (var i = 0; i < length; i++) {\r
-                               dest[destPos + i] = swap[i];\r
-                       }\r
-               }\r
-       }\r
-};\r
-System.out = new Clazz._O ();\r
-System.out.__CLASS_NAME__ = "java.io.PrintStream";\r
-System.out.print = function () {};\r
-System.out.printf = function () {};\r
-System.out.println = function () {};\r
-\r
-System.err = new Clazz._O ();\r
-System.err.__CLASS_NAME__ = "java.io.PrintStream";\r
-System.err.print = function () {};\r
-System.err.printf = function () {};\r
-System.err.println = function () {};\r
-\r
-popup = assert = log = error = window.alert;\r
-\r
-Thread = function () {};\r
-Thread.J2S_THREAD = Thread.prototype.J2S_THREAD = new Thread ();\r
-Thread.currentThread = Thread.prototype.currentThread = function () {\r
-       return this.J2S_THREAD;\r
-};\r
-\r
-/* public */\r
-Clazz.intCast = function (n) { // 32bit\r
-       var b1 = (n & 0xff000000) >> 24;\r
-       var b2 = (n & 0xff0000) >> 16;\r
-       var b3 = (n & 0xff00) >> 8;\r
-       var b4 = n & 0xff;\r
-       if ((b1 & 0x80) != 0) {\r
-               return -(((b1 & 0x7f) << 24) + (b2 << 16) + (b3 << 8) + b4 + 1);\r
-       } else {\r
-               return (b1 << 24) + (b2 << 16) + (b3 << 8) + b4;\r
-       }\r
-};\r
-\r
-/* public */\r
-Clazz.shortCast = function (s) { // 16bit\r
-       var b1 = (n & 0xff00) >> 8;\r
-       var b2 = n & 0xff;\r
-       if ((b1 & 0x80) != 0) {\r
-               return -(((b1 & 0x7f) << 8) + b2 + 1);\r
-       } else {\r
-               return (b1 << 8) + b4;\r
-       }\r
-};\r
-\r
-/* public */\r
-Clazz.byteCast = function (b) { // 8bit\r
-       if ((b & 0x80) != 0) {\r
-               return -((b & 0x7f) + 1);\r
-       } else {\r
-               return b & 0xff;\r
-       }\r
-};\r
-\r
-/* public */\r
-Clazz.charCast = function (c) { // 8bit\r
-       return String.fromCharCode (c & 0xff).charAt (0);\r
-};\r
-\r
-/**\r
- * Warning: Unsafe conversion!\r
- */\r
-/* public */\r
-Clazz.floatCast = function (f) { // 32bit\r
-       return f;\r
-};\r
-\r
-/*\r
- * Try to fix JavaScript's shift operator defects on long type numbers.\r
- */\r
-\r
-Clazz.longMasks = [];\r
-\r
-Clazz.longReverseMasks = [];\r
-\r
-Clazz.longBits = [];\r
-\r
-(function () {\r
-       var arr = [1];\r
-       for (var i = 1; i < 53; i++) {\r
-               arr[i] = arr[i - 1] + arr[i - 1]; // * 2 or << 1\r
-       }\r
-       Clazz.longBits = arr;\r
-       Clazz.longMasks[52] = arr[52];\r
-       for (var i = 51; i >= 0; i--) {\r
-               Clazz.longMasks[i] = Clazz.longMasks[i + 1] + arr[i];\r
-       }\r
-       Clazz.longReverseMasks[0] = arr[0];\r
-       for (var i = 1; i < 52; i++) {\r
-               Clazz.longReverseMasks[i] = Clazz.longReverseMasks[i - 1] + arr[i];\r
-       }\r
-}) ();\r
-\r
-/* public */\r
-Clazz.longLeftShift = function (l, o) { // 64bit\r
-       if (o == 0) return l;\r
-       if (o >= 64) return 0;\r
-       if (o > 52) {\r
-               error ("[Java2Script] Error : JavaScript does not support long shift!");\r
-               return l;\r
-       }\r
-       if ((l & Clazz.longMasks[o - 1]) != 0) {\r
-               error ("[Java2Script] Error : Such shift operator results in wrong calculation!");\r
-               return l;\r
-       }\r
-       var high = l & Clazz.longMasks[52 - 32 + o];\r
-       if (high != 0) {\r
-               return high * Clazz.longBits[o] + (l & Clazz.longReverseMasks[32 - o]) << 0;\r
-       } else {\r
-               return l << o;\r
-       }\r
-};\r
-\r
-/* public */\r
-Clazz.intLeftShift = function (n, o) { // 32bit\r
-       return (n << o) & 0xffffffff;\r
-};\r
-\r
-/* public */\r
-Clazz.longRightShift = function (l, o) { // 64bit\r
-       if ((l & Clazz.longMasks[52 - 32]) != 0) {\r
-               return Math.round((l & Clazz.longMasks[52 - 32]) / Clazz.longBits[32 - o]) + (l & Clazz.longReverseMasks[o]) >> o;\r
-       } else {\r
-               return l >> o;\r
-       }\r
-};\r
-\r
-/* public */\r
-Clazz.intRightShift = function (n, o) { // 32bit\r
-       return n >> o; // no needs for this shifting wrapper\r
-};\r
-\r
-/* public */\r
-Clazz.long0RightShift = function (l, o) { // 64bit\r
-       return l >>> o;\r
-};\r
-\r
-/* public */\r
-Clazz.int0RightShift = function (n, o) { // 64bit\r
-       return n >>> o; // no needs for this shifting wrapper\r
-};\r
-\r
-// Compress the common public API method in shorter name\r
-$_L=Clazz.load;$_W=Clazz.declareAnonymous;$_T=Clazz.declareType;$_J=Clazz.declarePackage;$_C=Clazz.decorateAsClass;$_Z=Clazz.instantialize;$_I=Clazz.declareInterface;$_D=Clazz.isClassDefined;$_H=Clazz.pu$h;$_P=Clazz.p0p;$_B=Clazz.prepareCallback;$_N=Clazz.innerTypeInstance;$_K=Clazz.makeConstructor;$_U=Clazz.superCall;$_R=Clazz.superConstructor;$_M=Clazz.defineMethod;$_V=Clazz.overrideMethod;$_S=Clazz.defineStatics;$_E=Clazz.defineEnumConstant;$_F=Clazz.cloneFinals;$_Y=Clazz.prepareFields;$_A=Clazz.newArray;$_O=Clazz.instanceOf;$_G=Clazz.inheritArgs;$_X=Clazz.checkPrivateMethod;$_Q=Clazz.makeFunction;$_s=Clazz.registerSerializableFields;\r
-\r
-\r
-var reflect = Clazz.declarePackage ("java.lang.reflect");\r
-Clazz.declarePackage ("java.security");\r
-\r
-Clazz.innerFunctionNames = Clazz.innerFunctionNames.concat (["getSuperclass",\r
-               "isAssignableFrom", "getMethods", "getMethod", "getDeclaredMethods", \r
-               "getDeclaredMethod", "getConstructor", "getModifiers", "isArray", "newInstance"]);\r
-\r
-Clazz.innerFunctions.getSuperclass = function () {\r
-       return this.superClazz; \r
-};\r
-Clazz.innerFunctions.isAssignableFrom = function (clazz) {\r
-       return Clazz.getInheritedLevel (clazz, this) >= 0;      \r
-};\r
-Clazz.innerFunctions.getConstructor = function () {\r
-       return new java.lang.reflect.Constructor (this, [], [], \r
-                       java.lang.reflect.Modifier.PUBLIC);\r
-};\r
-/**\r
- * TODO: fix bug for polymorphic methods!\r
- */\r
-Clazz.innerFunctions.getDeclaredMethods = Clazz.innerFunctions.getMethods = function () {\r
-       var ms = new Array ();\r
-       var p = this.prototype;\r
-       for (var attr in p) {\r
-               if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) {\r
-                       /* there are polynormical methods. */\r
-                       ms[ms.length] = new java.lang.reflect.Method (this, attr,\r
-                                       [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC);\r
-               }\r
-       }\r
-       p = this;\r
-       for (var attr in p) {\r
-               if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) {\r
-                       ms[ms.length] = new java.lang.reflect.Method (this, attr,\r
-                                       [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC\r
-                                       | java.lang.reflect.Modifier.STATIC);\r
-               }\r
-       }\r
-       return ms;\r
-};\r
-Clazz.innerFunctions.getDeclaredMethod = Clazz.innerFunctions.getMethod = function (name, clazzes) {\r
-       var p = this.prototype;\r
-       for (var attr in p) {\r
-               if (name == attr && typeof p[attr] == "function" \r
-                               && p[attr].__CLASS_NAME__ == null) {\r
-                       /* there are polynormical methods. */\r
-                       return new java.lang.reflect.Method (this, attr,\r
-                                       [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC);\r
-               }\r
-       }\r
-       p = this;\r
-       for (var attr in p) {\r
-               if (name == attr && typeof p[attr] == "function" \r
-                               && p[attr].__CLASS_NAME__ == null) {\r
-                       return new java.lang.reflect.Method (this, attr,\r
-                                       [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC\r
-                                       | java.lang.reflect.Modifier.STATIC);\r
-               }\r
-       }\r
-       return null;\r
-};\r
-Clazz.innerFunctions.getModifiers = function () {\r
-       return java.lang.reflect.Modifier.PUBLIC;\r
-};\r
-Clazz.innerFunctions.isArray = function () {\r
-       return false;\r
-};\r
-Clazz.innerFunctions.newInstance = function () {\r
-       var clz = this;\r
-       return new clz ();\r
-};\r
-\r
-//Object.newInstance = Clazz.innerFunctions.newInstance;\r
-{\r
-       var inF = Clazz.innerFunctionNames;\r
-       for (var i = 0; i < inF.length; i++) {\r
-               JavaObject[inF[i]] = Clazz.innerFunctions[inF[i]];\r
-               Array[inF[i]] = Clazz.innerFunctions[inF[i]];\r
-       }\r
-       Array["isArray"] = function () {\r
-               return true;\r
-       };\r
-}\r
-\r
-/* public */\r
-Clazz.forName = function (clazzName) {\r
-       if (Clazz.isClassDefined (clazzName)) {\r
-               return Clazz.evalType (clazzName);\r
-       }\r
-       if (window["ClazzLoader"] != null) {\r
-               ClazzLoader.setLoadingMode ("xhr.sync");\r
-               ClazzLoader.loadClass (clazzName);\r
-               return Clazz.evalType (clazzName);\r
-       } else {\r
-               alert ("[Java2Script] Error: No ClassLoader!");\r
-       }\r
-};\r
-\r
-/* For hotspot and unloading */\r
-\r
-/* private */\r
-Clazz.cleanDelegateMethod = function (m) {\r
-       if (m == null) return;\r
-       if (typeof m == "function" && m.lastMethod != null\r
-                       && m.lastParams != null && m.lastClaxxRef != null) {\r
-               m.lastMethod = null;\r
-               m.lastParams = null;\r
-               m.lastClaxxRef = null;\r
-       }\r
-};\r
-\r
-/* public */\r
-Clazz.unloadClass = function (qClazzName) {\r
-       var cc = Clazz.evalType (qClazzName);\r
-       if (cc != null) {\r
-               Clazz.unloadedClasses[qClazzName] = cc;\r
-               var clazzName = qClazzName;\r
-               var pkgFrags = clazzName.split (/\./);\r
-               var pkg = null;\r
-               for (var i = 0; i < pkgFrags.length - 1; i++) {\r
-                       if (pkg == null) {\r
-                               pkg = Clazz.allPackage[pkgFrags[0]];\r
-                       } else {\r
-                               pkg = pkg[pkgFrags[i]]\r
-                       }\r
-               }\r
-               if (pkg == null) {\r
-                       Clazz.allPackage[pkgFrags[0]] = null;\r
-                       window[pkgFrags[0]] = null;\r
-                       // also try to unload inner or anonymous classes\r
-                       for (var c in window) {\r
-                               if (c.indexOf (qClazzName + "$") == 0) {\r
-                                       Clazz.unloadClass (c);\r
-                                       window[c] = null;\r
-                               }\r
-                       }\r
-               } else {\r
-                       pkg[pkgFrags[pkgFrags.length - 1]] = null;\r
-                       // also try to unload inner or anonymous classes\r
-                       for (var c in pkg) {\r
-                               if (c.indexOf (pkgFrags[pkgFrags.length - 1] + "$") == 0) {\r
-                                       Clazz.unloadClass (pkg.__PKG_NAME__ + "." + c);\r
-                                       pkg[c] = null;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               if (Clazz.allClasses[qClazzName] == true) {\r
-                       Clazz.allClasses[qClazzName] = false;\r
-                       // also try to unload inner or anonymous classes\r
-                       for (var c in Clazz.allClasses) {\r
-                               if (c.indexOf (qClazzName + "$") == 0) {\r
-                                       Clazz.allClasses[c] = false;\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               for (var m in cc) {\r
-                       Clazz.cleanDelegateMethod (cc[m]);\r
-               }\r
-               for (var m in cc.prototype) {\r
-                       Clazz.cleanDelegateMethod (cc.prototype[m]);\r
-               }\r
-\r
-               if (window["ClazzLoader"] != null) {\r
-                       ClazzLoader.unloadClassExt (qClazzName);\r
-               }\r
-               \r
-               return true;\r
-       }\r
-       return false;\r
-};\r
-\r
-//written by Dean Edwards, 2005\r
-//with input from Tino Zijdel, Matthias Miller, Diego Perini\r
-\r
-//http://dean.edwards.name/weblog/2005/10/add-event/\r
-\r
-// Merge Dean Edwards' addEvent for Java2Script\r
-/* public */\r
-Clazz.addEvent = function (element, type, handler) {\r
-       if (element.addEventListener) {\r
-               element.addEventListener(type, handler, false);\r
-       } else {\r
-               // assign each event handler a unique ID\r
-               if (!handler.$$guid) handler.$$guid = Clazz.addEvent.guid++;\r
-               // create a hash table of event types for the element\r
-               if (!element.events) element.events = {};\r
-               // create a hash table of event handlers for each element/event pair\r
-               var handlers = element.events[type];\r
-               if (!handlers) {\r
-                       handlers = element.events[type] = {};\r
-                       // store the existing event handler (if there is one)\r
-                       if (element["on" + type]) {\r
-                               handlers[0] = element["on" + type];\r
-                       }\r
-               }\r
-               // store the event handler in the hash table\r
-               handlers[handler.$$guid] = handler;\r
-               // assign a global event handler to do all the work\r
-               element["on" + type] = Clazz.handleEvent;\r
-       }\r
-};\r
-/* private */\r
-//a counter used to create unique IDs\r
-Clazz.addEvent.guid = 1;\r
-\r
-/* public */\r
-Clazz.removeEvent = function (element, type, handler) {\r
-       if (element.removeEventListener) {\r
-               element.removeEventListener(type, handler, false);\r
-       } else {\r
-               // delete the event handler from the hash table\r
-               if (element.events && element.events[type]) {\r
-                       delete element.events[type][handler.$$guid];\r
-               }\r
-       }\r
-};\r
-\r
-/* private */\r
-Clazz.isVeryOldIE = navigator.userAgent.indexOf("MSIE 6.0") != -1 || navigator.userAgent.indexOf("MSIE 5.5") != -1 || navigator.userAgent.indexOf("MSIE 5.0") != -1;\r
-\r
-/* protected */\r
-Clazz.handleEvent = function (event) {\r
-       var returnValue = true;\r
-       // grab the event object (IE uses a global event object)\r
-       if (!Clazz.isVeryOldIE) {\r
-               event = event || Clazz.fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);\r
-       } else { // The above line is buggy in IE 6.0\r
-               if (event == null) {\r
-                       var evt = null;\r
-                       try {\r
-                               var pWindow = (this.ownerDocument || this.document || this).parentWindow;\r
-                               if (pWindow != null) {\r
-                                       evt = pWindow.event;\r
-                               }\r
-                       } catch (e) {\r
-                               evt = window.event;\r
-                       }\r
-                       event = Clazz.fixEvent(evt);\r
-               }\r
-       }\r
-       // get a reference to the hash table of event handlers\r
-       var handlers = this.events[event.type];\r
-       // execute each event handler\r
-       for (var i in handlers) {\r
-               if (isNaN (i)) {\r
-                       continue;\r
-               }\r
-               this.$$handleEvent = handlers[i];\r
-               if (typeof this.$$handleEvent != "function") {\r
-                       continue;\r
-               }\r
-               if (this.$$handleEvent(event) === false) {\r
-                       returnValue = false;\r
-               }\r
-       }\r
-       return returnValue;\r
-};\r
-\r
-/* private */\r
-Clazz.fixEvent = function (event) {\r
-       // add W3C standard event methods\r
-       event.preventDefault = Clazz.fixEvent.preventDefault;\r
-       event.stopPropagation = Clazz.fixEvent.stopPropagation;\r
-       return event;\r
-};\r
-Clazz.fixEvent.preventDefault = function() {\r
-       this.returnValue = false;\r
-};\r
-Clazz.fixEvent.stopPropagation = function() {\r
-       this.cancelBubble = true;\r
-};\r
-\r
-}\r
+/******************************************************************************
+ * Copyright (c) 2007 java2script.org and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Zhou Renjian - initial API and implementation
+ *****************************************************************************/
+/*******
+ * @author zhou renjian
+ * @create March 10, 2006
+ *******/
+
+if (window["Clazz"] == null || window["Clazz"].unloadClass == null) {
+/**
+ * Once ClassExt.js is part of Class.js.
+ * In order to make the Class.js as small as possible, part of its content
+ * is moved into this ClassExt.js.
+ *
+ * See also http://j2s.sourceforge.net/j2sclazz/
+ */
+/**
+ * Clazz.MethodNotFoundException is used to notify the developer about calling
+ * methods with incorrect parameters.
+ */
+/* protected */
+// Override the Clazz.MethodNotFoundException in Class.js to give details
+Clazz.MethodNotFoundException = function (obj, clazz, method, params) {
+       var paramStr = "";
+       if (params != null) {
+               paramStr = params.substring (1).replace (/\\/g, ",");
+       }
+       var leadingStr = "";
+       if (method != null && method != "construct") {
+               leadingStr = "Method";
+       } else {
+               leadingStr = "Constructor";
+       }
+       this.message = leadingStr + " " + Clazz.getClassName (clazz, true) + "." 
+                                       + method + "(" + paramStr + ") is not found!";
+       this.toString = function () {
+               return "MethodNotFoundException:" + this.message;
+       }
+};
+
+/**
+ * Prepare callback for instance of anonymous Class.
+ * For example for the callback:
+ *     this.callbacks.MyEditor.sayHello();
+ *
+ * @param objThis the host object for callback
+ * @param args arguments object. args[0] will be classThisObj -- the "this"
+ * object to be hooked
+ * 
+ * Attention: parameters should not be null!
+ */
+/* protected */
+Clazz.prepareCallback = function (objThis, args) {
+       var classThisObj = args[0];
+       var cbName = "b$"; // "callbacks";
+       if (objThis != null && classThisObj != null && classThisObj !== window) {
+               var obs = new Array ();
+               if (objThis[cbName] == null) {
+                       objThis[cbName] = obs;
+               } else { // must make a copy!
+                       for (var s in objThis[cbName]) {
+                               if (s != "length") {
+                                       obs[s] = objThis[cbName][s];
+                               }
+                       }
+                       objThis[cbName] = obs;
+               }
+               var className = Clazz.getClassName (classThisObj, true);
+               //if (obs[className] == null) { /* == null make no sense! */
+                       //obs[className] = classThisObj;
+                       /*
+                        * TODO: the following line is SWT-specific! Try to move it out!
+                        */
+                       obs[className.replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj;
+                       var clazz = Clazz.getClass (classThisObj);
+                       while (clazz.superClazz != null) {
+                               clazz = clazz.superClazz;
+                               //obs[Clazz.getClassName (clazz)] = classThisObj;
+                               /*
+                                * TODO: the following line is SWT-specific! Try to move it out!
+                                */
+                               obs[Clazz.getClassName (clazz, true)
+                                               .replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj;
+                       }
+               //}
+               var cbs = classThisObj[cbName];
+               if (cbs != null && cbs instanceof Array) {
+                       for (var s in cbs) {
+                               if (s != "length") {
+                                       obs[s] = cbs[s];
+                               }
+                       }
+               }
+       }
+       // Shift the arguments
+       for (var i = 0; i < args.length - 1; i++) {
+               args[i] = args[i + 1];
+       }
+       args.length--;
+       // arguments will be returned!
+};
+
+/**
+ * Construct instance of the given inner class.
+ *
+ * @param classInner given inner class, alway with name like "*$*"
+ * @param objThis this instance which can be used to call back.
+ * @param finalVars final variables which the inner class may use
+ * @return the constructed object
+ *
+ * @see Clazz#cloneFinals
+ */
+/* public */
+Clazz.innerTypeInstance = function (clazzInner, objThis, finalVars) {
+       if (clazzInner == null) {
+               clazzInner = arguments.callee.caller;
+       }
+       var obj = null;
+       /*if (arguments.length == 2) {
+               obj = new clazzInner (objThis);
+       } else */if (arguments.length == 3) {
+               obj = new clazzInner (objThis);
+       } else if (arguments.length == 4) {
+               if (objThis.__CLASS_NAME__ == clazzInner.__CLASS_NAME__
+                               && arguments[3] === Clazz.inheritArgs) {
+                       obj = objThis;
+               } else {
+                       obj = new clazzInner (objThis, arguments[3]);
+               }
+       } else if (arguments.length == 5) {
+               obj = new clazzInner (objThis, arguments[3], arguments[4]);
+       } else if (arguments.length == 6) {
+               obj = new clazzInner (objThis, arguments[3], arguments[4], 
+                               arguments[5]);
+       } else if (arguments.length == 7) {
+               obj = new clazzInner (objThis, arguments[3], arguments[4], 
+                               arguments[5], arguments[6]);
+       } else if (arguments.length == 8) {
+               obj = new clazzInner (objThis, arguments[3], arguments[4], 
+                               arguments[5], arguments[6], arguments[7]);
+       } else if (arguments.length == 9) {
+               obj = new clazzInner (objThis, arguments[3], arguments[4], 
+                               arguments[5], arguments[6], arguments[7], arguments[8]);
+       } else if (arguments.length == 10) {
+               obj = new clazzInner (objThis, arguments[3], arguments[4], 
+                               arguments[5], arguments[6], arguments[7], arguments[8],
+                               arguments[9]);
+       } else {
+               /*
+                * Should construct instance manually.
+                */
+               obj = new clazzInner ();
+               if (obj.construct == null) {
+                       throw new String ("No support anonymous class constructor with " 
+                                       + "more than 7 parameters.");
+               }
+               var args = new Array ();
+               for (var i = 3; i < arguments.length; i++) {
+                       args[i - 3] = arguments[i];
+               }
+               obj.construct.apply (obj, args);
+       }
+       // f$ is short for the once choosen "$finals"
+       if (finalVars != null && objThis.f$ == null) {
+               obj.f$ = finalVars;
+       } else if (finalVars == null && objThis.f$ != null) {
+               obj.f$ = objThis.f$;
+       } else if (finalVars != null && objThis.f$ != null) {
+               var o = new Object ();
+               for (var attr in objThis.f$) {
+                       o[attr] = objThis.f$[attr];
+               }
+               for (var attr in finalVars) {
+                       o[attr] = finalVars[attr];
+               }
+               obj.f$ = o;
+       }
+       /*
+       if (finalVars != null && objThis.$finals == null) {
+               obj.$finals = finalVars;
+       } else if (finalVars == null && objThis.$finals != null) {
+               obj.$finals = objThis.$finals;
+       } else if (finalVars != null && objThis.$finals != null) {
+               var o = new Object ();
+               for (var attr in objThis.$finals) {
+                       o[attr] = objThis.$finals[attr];
+               }
+               for (var attr in finalVars) {
+                       o[attr] = finalVars[attr];
+               }
+               obj.$finals = o;
+       }
+       */
+       //Clazz.prepareCallback (obj, objThis);
+       return obj;
+};
+
+/**
+ * Clone variables whose modifier is "final".
+ * Usage: var o = Clazz.cloneFinals ("name", name, "age", age);
+ *
+ * @return Object with all final variables
+ */
+/* protected */
+Clazz.cloneFinals = function () {
+       var o = new Object ();
+       var length = arguments.length / 2;
+       for (var i = 0; i < length; i++) {
+               o[arguments[i + i]] = arguments[i + i + 1];
+       }
+       return o;
+};
+
+/* public */
+Clazz.isClassDefined = Clazz.isDefinedClass = function (clazzName) {
+       if (clazzName != null && clazzName.length != 0) {
+               if (Clazz.allClasses[clazzName]) {
+                       return true;
+               }
+               var pkgFrags = clazzName.split (/\./);
+               var pkg = null;
+               for (var i = 0; i < pkgFrags.length; i++) {
+                       if (pkg == null) {
+                               if (Clazz.allPackage[pkgFrags[0]] == null) {
+                                       //error (clazzName + " / " + false);
+                                       return false;
+                               }
+                               pkg = Clazz.allPackage[pkgFrags[0]];
+                       } else {
+                               if (pkg[pkgFrags[i]] == null) {
+                                       //error (clazzName + " / " + false);
+                                       return false;
+                               }
+                               pkg = pkg[pkgFrags[i]]
+                       }
+               }
+               //error (clazzName + " / " + (pkg != null));
+               //return pkg != null;
+               if (pkg != null) {
+                       Clazz.allClasses[clazzName] = true;
+                       return true;
+               } else {
+                       return false;
+               }
+       } else {
+               /* consider null or empty name as non-defined class */
+               return false;
+       }
+};
+/**
+ * Define the enum constant.
+ * @param classEnum enum type
+ * @param enumName enum constant
+ * @param enumOrdinal enum ordinal
+ * @param initialParams enum constant constructor parameters
+ * @return return defined enum constant
+ */
+/* public */
+Clazz.defineEnumConstant = function (clazzEnum, enumName, enumOrdinal, initialParams, clazzEnumExt) {
+       var o = null;
+       if (clazzEnumExt != null) {
+               o = new clazzEnumExt ();
+       } else {
+               o = new clazzEnum ();
+       }
+       Clazz.superConstructor (o, clazzEnum, [enumName, enumOrdinal]);
+       if (initialParams != null && initialParams.length != 0) {
+               o.construct.apply (o, initialParams);
+       }
+       clazzEnum[enumName] = o;
+       clazzEnum.prototype[enumName] = o;
+       return o;
+};
+
+/**
+ * Make arrays.
+ *
+ * @return the created Array object
+ */
+/* public */
+Clazz.newArray  = function () {
+       var args = arguments;
+       if (arguments.length == 1) {
+               if (arguments[0] instanceof Array) {
+                       args = arguments[0];
+               }
+       }
+       if (args.length <= 1) {
+               return new Array ();
+       } else if (args.length == 2) {
+               var dim = args[0];
+               if (typeof dim == "string") {
+                       dim = dim.charCodeAt (0); // char
+               }
+               var val = args[1];
+               var arr = new Array (dim);
+               for (var i = 0; i < dim; i++) {
+                       arr[i] = val;
+               }
+               return arr;
+       } else {
+               var dim = args[0];
+               if (typeof dim == "string") {
+                       dim = dim.charCodeAt (0); // char
+               }
+               var len = args.length - 1;
+               var xargs = new Array (len);
+               for (var i = 0; i < len; i++) {
+                       xargs[i] = args[i + 1];
+               }
+               var arr = new Array (dim);
+               for (var i = 0; i < dim; i++) {
+                       // Call recursively!
+                       arr[i] = Clazz.newArray (xargs);
+               }
+               return arr;
+       }
+};
+
+/**
+ * Make the RunnableCompatiability instance as a JavaScript function.
+ *
+ * @param jsr Instance of RunnableCompatiability
+ * @return JavaScript function instance represents the method run of jsr.
+ */
+/* public */
+Clazz.makeFunction = function (jsr) {
+       return function (e) {
+               if (e == null) {
+                       e = window.event;
+               }
+               if (jsr.setEvent != null) {
+                       jsr.setEvent (e);
+               }
+               jsr.run ();
+               /*
+               if (e != null && jsr.isReturned != null && jsr.isReturned()) {
+                       // Is it correct to stopPropagation here? --Feb 19, 2006
+                       e.cancelBubble = true;
+                       if (e.stopPropagation) {
+                               e.stopPropagation();
+                       }
+               }
+               */
+               if (jsr.returnSet == 1) {
+                       return jsr.returnNumber;
+               } else if (jsr.returnSet == 2) {
+                       return jsr.returnBoolean;
+               } else if (jsr.returnSet == 3) {
+                       return jsr.returnObject;
+               }
+       };
+};
+
+/* protected */
+Clazz.defineStatics = function (clazz) {
+       for (var i = 0; i < (arguments.length - 1) / 2; i++) {
+               var name = arguments[i + i + 1];
+               clazz[name] = clazz.prototype[name] = arguments[i + i + 2];
+       }
+};
+
+/* protected */
+Clazz.prepareFields = function (clazz, fieldsFun) {
+       var stacks = new Array ();
+       if (clazz.con$truct != null) {
+               var ss = clazz.con$truct.stacks;
+               var idx = clazz.con$truct.index;
+               for (var i = idx; i < ss.length; i++) {
+                       stacks[i] = ss[i];
+               }
+       }
+       clazz.con$truct = clazz.prototype.con$truct = function () {
+               var stacks = arguments.callee.stacks;
+               if (stacks != null) {
+                       for (var i = 0; i < stacks.length; i++) {
+                               stacks[i].apply (this, []);
+                       }
+               }
+       };
+       stacks[stacks.length] = fieldsFun;
+       clazz.con$truct.stacks = stacks;
+       clazz.con$truct.index = 0;
+};
+
+/*
+ * Serialize those public or protected fields in class 
+ * net.sf.j2s.ajax.SimpleSerializable.
+ */
+/* protected */
+Clazz.registerSerializableFields = function (clazz) {
+       var args = arguments;
+       var length = args.length;
+       var newArr = new Array ();
+       if (clazz.declared$Fields != null) {
+               for (var i = 0; i < clazz.declared$Fields.length; i++) {
+                       newArr[i] = clazz.declared$Fields[i];
+               }
+       }
+       clazz.declared$Fields = newArr;
+       
+       if (length > 0 && length % 2 == 1) {
+               var fs = clazz.declared$Fields;
+               for (var i = 1; i <= (length - 1) / 2; i++) {
+                       var o = { name : args[i + i - 1], type : args[i + i] };
+                       var existed = false;
+                       for (var j = 0; j < fs.length; j++) {
+                               if (fs[j].name == o.name) { // reloaded classes
+                                       fs[j].type = o.type; // update type
+                                       existed = true;
+                                       break;
+                               }
+                       }
+                       if (!existed) {
+                               fs[fs.length] = o;
+                       }
+               }
+       }
+};
+
+/*
+ * Get the caller method for those methods that are wrapped by 
+ * Clazz.searchAndExecuteMethod.
+ *
+ * @param args caller method's arguments
+ * @return caller method, null if there is not wrapped by 
+ * Clazz.searchAndExecuteMethod or is called directly.
+ */
+/* protected */
+/*-# getMixedCallerMethod -> gMCM  #-*/
+Clazz.getMixedCallerMethod = function (args) {
+       var o = new Object ();
+       var argc = args.callee.caller; // Clazz.tryToSearchAndExecute
+       if (argc == null) return null;
+       if (argc !== Clazz.tryToSearchAndExecute) { // inherited method's apply
+               argc = argc.arguments.callee.caller;
+               if (argc == null) return null;
+       }
+       if (argc !== Clazz.tryToSearchAndExecute) return null;
+       argc = argc.arguments.callee.caller; // Clazz.searchAndExecuteMethod
+       if (argc == null || argc !== Clazz.searchAndExecuteMethod) return null;
+       o.claxxRef = argc.arguments[1];
+       o.fxName = argc.arguments[2];
+       o.paramTypes = Clazz.getParamsType (argc.arguments[3]);
+       argc = argc.arguments.callee.caller; // Clazz.generateDelegatingMethod
+       if (argc == null) return null;
+       argc = argc.arguments.callee.caller; // the private method's caller
+       if (argc == null) return null;
+       o.caller = argc;
+       return o;
+};
+
+/*
+ * Check and return super private method.
+ * In order make private methods be executed correctly, some extra javascript
+ * must be inserted into the beggining of the method body of the non-private 
+ * methods that with the same method signature as following:
+ * <code>
+ *                     var $private = Clazz.checkPrivateMethod (arguments);
+ *                     if ($private != null) {
+ *                             return $private.apply (this, arguments);
+ *                     }
+ * </code>
+ * Be cautious about this. The above codes should be insert by Java2Script
+ * compiler or with double checks to make sure things work correctly.
+ *
+ * @param args caller method's arguments
+ * @return private method if there are private method fitted for the current 
+ * calling environment
+ */
+/* public */
+Clazz.checkPrivateMethod = function (args) {
+       var m = Clazz.getMixedCallerMethod (args);
+       if (m == null) return null;
+       var callerFx = m.claxxRef.prototype[m.caller.exName];
+       if (callerFx == null) return null; // may not be in the class hierarchies
+       var ppFun = null;
+       if (callerFx.claxxOwner != null) {
+               ppFun = callerFx.claxxOwner.prototype[m.fxName];
+       } else {
+               var stacks = callerFx.stacks;
+               for (var i = stacks.length - 1; i >= 0; i--) {
+                       var fx = stacks[i].prototype[m.caller.exName];
+                       if (fx === m.caller) {
+                               ppFun = stacks[i].prototype[m.fxName];
+                       } else if (fx != null) {
+                               for (var fn in fx) {
+                                       if (fn.indexOf ('\\') == 0 && fx[fn] === m.caller) {
+                                               ppFun = stacks[i].prototype[m.fxName];
+                                               break;
+                                       }
+                               }
+                       }
+                       if (ppFun != null) {
+                               break;
+                       }
+               }
+       }
+       if (ppFun != null && ppFun.claxxOwner == null) {
+               ppFun = ppFun["\\" + m.paramTypes];
+       }
+       if (ppFun != null && ppFun.isPrivate && ppFun !== args.callee) {
+               return ppFun;
+       }
+       return null;
+};
+var $fz = null; // for private method declaration
+//var cla$$ = null;
+var c$ = null;
+/*-# cla$$$tack -> cst  #-*/
+Clazz.cla$$$tack = new Array ();
+Clazz.pu$h = function () {
+       if (c$ != null) { // if (cla$$ != null) {
+               Clazz.cla$$$tack[Clazz.cla$$$tack.length] = c$; // cla$$;
+       }
+};
+Clazz.p0p = function () {
+       if (Clazz.cla$$$tack.length > 0) {
+               var clazz = Clazz.cla$$$tack[Clazz.cla$$$tack.length - 1];
+               Clazz.cla$$$tack.length--;
+               return clazz;
+       } else {
+               return null;
+       }
+};
+
+/*# {$no.debug.support} >>x #*/
+/*
+ * Option to switch on/off of stack traces.
+ */
+/* protect */
+Clazz.tracingCalling = false;
+
+/*
+ * Use to mark that the Throwable instance is created or not.
+ */
+/* private */
+Clazz.initializingException = false;
+
+/* private */
+Clazz.callingStack = function (caller, owner) {
+       this.caller = caller;
+       this.owner = owner;
+};
+Clazz.callingStackTraces = new Array ();
+Clazz.pu$hCalling = function (stack) {
+       Clazz.callingStackTraces[Clazz.callingStackTraces.length] = stack;
+};
+Clazz.p0pCalling = function () {
+       var length = Clazz.callingStackTraces.length;
+       if (length > 0) {
+               var stack = Clazz.callingStackTraces[length - 1];
+               Clazz.callingStackTraces.length--;
+               return stack;
+       } else {
+               return null;
+       }
+};
+/*# x<< #*/
+
+/**
+ * The first folder is considered as the primary folder.
+ * And try to be compatiable with ClazzLoader system.
+ */
+/* private */
+if (window["ClazzLoader"] != null && ClazzLoader.binaryFolders != null) {
+       Clazz.binaryFolders = ClazzLoader.binaryFolders;
+} else {
+       Clazz.binaryFolders = ["bin/", "", "j2slib/"];
+}
+
+Clazz.addBinaryFolder = function (bin) {
+       if (bin != null) {
+               var bins = Clazz.binaryFolders;
+               for (var i = 0; i < bins.length; i++) {
+                       if (bins[i] == bin) {
+                               return ;
+                       }
+               }
+               bins[bins.length] = bin;
+       }
+};
+Clazz.removeBinaryFolder = function (bin) {
+       if (bin != null) {
+               var bins = Clazz.binaryFolders;
+               for (var i = 0; i < bins.length; i++) {
+                       if (bins[i] == bin) {
+                               for (var j = i; j < bins.length - 1; j++) {
+                                       bins[j] = bins[j + 1];
+                               }
+                               bins.length--;
+                               return bin;
+                       }
+               }
+       }
+       return null;
+};
+Clazz.setPrimaryFolder = function (bin) {
+       if (bin != null) {
+               Clazz.removeBinaryFolder (bin);
+               var bins = Clazz.binaryFolders;
+               for (var i = bins.length - 1; i >= 0; i--) {
+                       bins[i + 1] = bins[i];
+               }
+               bins[0] = bin;
+       }
+};
+
+/**
+ * This is a simple implementation for Clazz#load. It just ignore dependencies
+ * of the class. This will be fine for jar *.z.js file.
+ * It will be overriden by ClazzLoader#load.
+ * For more details, see ClazzLoader.js
+ */
+/* protected */
+Clazz.load = function (musts, clazz, optionals, declaration) {
+       if (declaration != null) {
+               declaration ();
+       }
+};
+
+/*
+ * Invade the Object prototype!
+ * TODO: make sure that invading Object prototype does not affect other
+ * existed library, such as Dojo, YUI, Prototype, ...
+ */
+java.lang.Object = Clazz._O;
+
+JavaObject.getName = Clazz.innerFunctions.getName;
+
+w$ = window; // Short for browser's window object
+d$ = document; // Short for browser's document object
+System = {
+       currentTimeMillis : function () {
+               return new Date ().getTime ();
+       },
+       props : null, //new java.util.Properties (),
+       getProperties : function () {
+               return System.props;
+       },
+       setProperties : function (props) {
+               System.props = props;
+       },
+       getProperty : function (key, def) {
+               if (System.props != null) {
+                       return System.props.getProperty (key, def);
+               }
+               if (def != null) {
+                       return def;
+               }
+               return key;
+       },
+       setProperty : function (key, val) {
+               if (System.props == null) {
+                       return ;
+               }
+               System.props.setProperty (key, val);
+       },
+       currentTimeMillis : function () {
+               return new Date ().getTime ();
+       },
+       arraycopy : function (src, srcPos, dest, destPos, length) {
+               if (src !== dest) {
+                       for (var i = 0; i < length; i++) {
+                               dest[destPos + i] = src[srcPos + i];
+                       }
+               } else {
+                       var swap = [];
+                       for (var i = 0; i < length; i++) {
+                               swap[i] = src[srcPos + i];
+                       }
+                       for (var i = 0; i < length; i++) {
+                               dest[destPos + i] = swap[i];
+                       }
+               }
+       }
+};
+System.out = new Clazz._O ();
+System.out.__CLASS_NAME__ = "java.io.PrintStream";
+System.out.print = function () {};
+System.out.printf = function () {};
+System.out.println = function () {};
+
+System.err = new Clazz._O ();
+System.err.__CLASS_NAME__ = "java.io.PrintStream";
+System.err.print = function () {};
+System.err.printf = function () {};
+System.err.println = function () {};
+
+popup = assert = log = error = window.alert;
+
+Thread = function () {};
+Thread.J2S_THREAD = Thread.prototype.J2S_THREAD = new Thread ();
+Thread.currentThread = Thread.prototype.currentThread = function () {
+       return this.J2S_THREAD;
+};
+
+/* public */
+Clazz.intCast = function (n) { // 32bit
+       var b1 = (n & 0xff000000) >> 24;
+       var b2 = (n & 0xff0000) >> 16;
+       var b3 = (n & 0xff00) >> 8;
+       var b4 = n & 0xff;
+       if ((b1 & 0x80) != 0) {
+               return -(((b1 & 0x7f) << 24) + (b2 << 16) + (b3 << 8) + b4 + 1);
+       } else {
+               return (b1 << 24) + (b2 << 16) + (b3 << 8) + b4;
+       }
+};
+
+/* public */
+Clazz.shortCast = function (s) { // 16bit
+       var b1 = (n & 0xff00) >> 8;
+       var b2 = n & 0xff;
+       if ((b1 & 0x80) != 0) {
+               return -(((b1 & 0x7f) << 8) + b2 + 1);
+       } else {
+               return (b1 << 8) + b4;
+       }
+};
+
+/* public */
+Clazz.byteCast = function (b) { // 8bit
+       if ((b & 0x80) != 0) {
+               return -((b & 0x7f) + 1);
+       } else {
+               return b & 0xff;
+       }
+};
+
+/* public */
+Clazz.charCast = function (c) { // 8bit
+       return String.fromCharCode (c & 0xff).charAt (0);
+};
+
+/**
+ * Warning: Unsafe conversion!
+ */
+/* public */
+Clazz.floatCast = function (f) { // 32bit
+       return f;
+};
+
+/*
+ * Try to fix JavaScript's shift operator defects on long type numbers.
+ */
+
+Clazz.longMasks = [];
+
+Clazz.longReverseMasks = [];
+
+Clazz.longBits = [];
+
+(function () {
+       var arr = [1];
+       for (var i = 1; i < 53; i++) {
+               arr[i] = arr[i - 1] + arr[i - 1]; // * 2 or << 1
+       }
+       Clazz.longBits = arr;
+       Clazz.longMasks[52] = arr[52];
+       for (var i = 51; i >= 0; i--) {
+               Clazz.longMasks[i] = Clazz.longMasks[i + 1] + arr[i];
+       }
+       Clazz.longReverseMasks[0] = arr[0];
+       for (var i = 1; i < 52; i++) {
+               Clazz.longReverseMasks[i] = Clazz.longReverseMasks[i - 1] + arr[i];
+       }
+}) ();
+
+/* public */
+Clazz.longLeftShift = function (l, o) { // 64bit
+       if (o == 0) return l;
+       if (o >= 64) return 0;
+       if (o > 52) {
+               error ("[Java2Script] Error : JavaScript does not support long shift!");
+               return l;
+       }
+       if ((l & Clazz.longMasks[o - 1]) != 0) {
+               error ("[Java2Script] Error : Such shift operator results in wrong calculation!");
+               return l;
+       }
+       var high = l & Clazz.longMasks[52 - 32 + o];
+       if (high != 0) {
+               return high * Clazz.longBits[o] + (l & Clazz.longReverseMasks[32 - o]) << 0;
+       } else {
+               return l << o;
+       }
+};
+
+/* public */
+Clazz.intLeftShift = function (n, o) { // 32bit
+       return (n << o) & 0xffffffff;
+};
+
+/* public */
+Clazz.longRightShift = function (l, o) { // 64bit
+       if ((l & Clazz.longMasks[52 - 32]) != 0) {
+               return Math.round((l & Clazz.longMasks[52 - 32]) / Clazz.longBits[32 - o]) + (l & Clazz.longReverseMasks[o]) >> o;
+       } else {
+               return l >> o;
+       }
+};
+
+/* public */
+Clazz.intRightShift = function (n, o) { // 32bit
+       return n >> o; // no needs for this shifting wrapper
+};
+
+/* public */
+Clazz.long0RightShift = function (l, o) { // 64bit
+       return l >>> o;
+};
+
+/* public */
+Clazz.int0RightShift = function (n, o) { // 64bit
+       return n >>> o; // no needs for this shifting wrapper
+};
+
+// Compress the common public API method in shorter name
+$_L=Clazz.load;$_W=Clazz.declareAnonymous;$_T=Clazz.declareType;$_J=Clazz.declarePackage;$_C=Clazz.decorateAsClass;$_Z=Clazz.instantialize;$_I=Clazz.declareInterface;$_D=Clazz.isClassDefined;$_H=Clazz.pu$h;$_P=Clazz.p0p;$_B=Clazz.prepareCallback;$_N=Clazz.innerTypeInstance;$_K=Clazz.makeConstructor;$_U=Clazz.superCall;$_R=Clazz.superConstructor;$_M=Clazz.defineMethod;$_V=Clazz.overrideMethod;$_S=Clazz.defineStatics;$_E=Clazz.defineEnumConstant;$_F=Clazz.cloneFinals;$_Y=Clazz.prepareFields;$_A=Clazz.newArray;$_O=Clazz.instanceOf;$_G=Clazz.inheritArgs;$_X=Clazz.checkPrivateMethod;$_Q=Clazz.makeFunction;$_s=Clazz.registerSerializableFields;
+
+
+var reflect = Clazz.declarePackage ("java.lang.reflect");
+Clazz.declarePackage ("java.security");
+
+Clazz.innerFunctionNames = Clazz.innerFunctionNames.concat (["getSuperclass",
+               "isAssignableFrom", "getMethods", "getMethod", "getDeclaredMethods", 
+               "getDeclaredMethod", "getConstructor", "getModifiers", "isArray", "newInstance"]);
+
+Clazz.innerFunctions.getSuperclass = function () {
+       return this.superClazz; 
+};
+Clazz.innerFunctions.isAssignableFrom = function (clazz) {
+       return Clazz.getInheritedLevel (clazz, this) >= 0;      
+};
+Clazz.innerFunctions.getConstructor = function () {
+       return new java.lang.reflect.Constructor (this, [], [], 
+                       java.lang.reflect.Modifier.PUBLIC);
+};
+/**
+ * TODO: fix bug for polymorphic methods!
+ */
+Clazz.innerFunctions.getDeclaredMethods = Clazz.innerFunctions.getMethods = function () {
+       var ms = new Array ();
+       var p = this.prototype;
+       for (var attr in p) {
+               if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) {
+                       /* there are polynormical methods. */
+                       ms[ms.length] = new java.lang.reflect.Method (this, attr,
+                                       [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC);
+               }
+       }
+       p = this;
+       for (var attr in p) {
+               if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) {
+                       ms[ms.length] = new java.lang.reflect.Method (this, attr,
+                                       [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC
+                                       | java.lang.reflect.Modifier.STATIC);
+               }
+       }
+       return ms;
+};
+Clazz.innerFunctions.getDeclaredMethod = Clazz.innerFunctions.getMethod = function (name, clazzes) {
+       var p = this.prototype;
+       for (var attr in p) {
+               if (name == attr && typeof p[attr] == "function" 
+                               && p[attr].__CLASS_NAME__ == null) {
+                       /* there are polynormical methods. */
+                       return new java.lang.reflect.Method (this, attr,
+                                       [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC);
+               }
+       }
+       p = this;
+       for (var attr in p) {
+               if (name == attr && typeof p[attr] == "function" 
+                               && p[attr].__CLASS_NAME__ == null) {
+                       return new java.lang.reflect.Method (this, attr,
+                                       [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC
+                                       | java.lang.reflect.Modifier.STATIC);
+               }
+       }
+       return null;
+};
+Clazz.innerFunctions.getModifiers = function () {
+       return java.lang.reflect.Modifier.PUBLIC;
+};
+Clazz.innerFunctions.isArray = function () {
+       return false;
+};
+Clazz.innerFunctions.newInstance = function () {
+       var clz = this;
+       return new clz ();
+};
+
+//Object.newInstance = Clazz.innerFunctions.newInstance;
+{
+       var inF = Clazz.innerFunctionNames;
+       for (var i = 0; i < inF.length; i++) {
+               JavaObject[inF[i]] = Clazz.innerFunctions[inF[i]];
+               Array[inF[i]] = Clazz.innerFunctions[inF[i]];
+       }
+       Array["isArray"] = function () {
+               return true;
+       };
+}
+
+/* public */
+Clazz.forName = function (clazzName) {
+       if (Clazz.isClassDefined (clazzName)) {
+               return Clazz.evalType (clazzName);
+       }
+       if (window["ClazzLoader"] != null) {
+               ClazzLoader.setLoadingMode ("xhr.sync");
+               ClazzLoader.loadClass (clazzName);
+               return Clazz.evalType (clazzName);
+       } else {
+               alert ("[Java2Script] Error: No ClassLoader!");
+       }
+};
+
+/* For hotspot and unloading */
+
+/* private */
+Clazz.cleanDelegateMethod = function (m) {
+       if (m == null) return;
+       if (typeof m == "function" && m.lastMethod != null
+                       && m.lastParams != null && m.lastClaxxRef != null) {
+               m.lastMethod = null;
+               m.lastParams = null;
+               m.lastClaxxRef = null;
+       }
+};
+
+/* public */
+Clazz.unloadClass = function (qClazzName) {
+       var cc = Clazz.evalType (qClazzName);
+       if (cc != null) {
+               Clazz.unloadedClasses[qClazzName] = cc;
+               var clazzName = qClazzName;
+               var pkgFrags = clazzName.split (/\./);
+               var pkg = null;
+               for (var i = 0; i < pkgFrags.length - 1; i++) {
+                       if (pkg == null) {
+                               pkg = Clazz.allPackage[pkgFrags[0]];
+                       } else {
+                               pkg = pkg[pkgFrags[i]]
+                       }
+               }
+               if (pkg == null) {
+                       Clazz.allPackage[pkgFrags[0]] = null;
+                       window[pkgFrags[0]] = null;
+                       // also try to unload inner or anonymous classes
+                       for (var c in window) {
+                               if (c.indexOf (qClazzName + "$") == 0) {
+                                       Clazz.unloadClass (c);
+                                       window[c] = null;
+                               }
+                       }
+               } else {
+                       pkg[pkgFrags[pkgFrags.length - 1]] = null;
+                       // also try to unload inner or anonymous classes
+                       for (var c in pkg) {
+                               if (c.indexOf (pkgFrags[pkgFrags.length - 1] + "$") == 0) {
+                                       Clazz.unloadClass (pkg.__PKG_NAME__ + "." + c);
+                                       pkg[c] = null;
+                               }
+                       }
+               }
+
+               if (Clazz.allClasses[qClazzName] == true) {
+                       Clazz.allClasses[qClazzName] = false;
+                       // also try to unload inner or anonymous classes
+                       for (var c in Clazz.allClasses) {
+                               if (c.indexOf (qClazzName + "$") == 0) {
+                                       Clazz.allClasses[c] = false;
+                               }
+                       }
+               }
+               
+               for (var m in cc) {
+                       Clazz.cleanDelegateMethod (cc[m]);
+               }
+               for (var m in cc.prototype) {
+                       Clazz.cleanDelegateMethod (cc.prototype[m]);
+               }
+
+               if (window["ClazzLoader"] != null) {
+                       ClazzLoader.unloadClassExt (qClazzName);
+               }
+               
+               return true;
+       }
+       return false;
+};
+
+//written by Dean Edwards, 2005
+//with input from Tino Zijdel, Matthias Miller, Diego Perini
+
+//http://dean.edwards.name/weblog/2005/10/add-event/
+
+// Merge Dean Edwards' addEvent for Java2Script
+/* public */
+Clazz.addEvent = function (element, type, handler) {
+       if (element.addEventListener) {
+               element.addEventListener(type, handler, false);
+       } else {
+               // assign each event handler a unique ID
+               if (!handler.$$guid) handler.$$guid = Clazz.addEvent.guid++;
+               // create a hash table of event types for the element
+               if (!element.events) element.events = {};
+               // create a hash table of event handlers for each element/event pair
+               var handlers = element.events[type];
+               if (!handlers) {
+                       handlers = element.events[type] = {};
+                       // store the existing event handler (if there is one)
+                       if (element["on" + type]) {
+                               handlers[0] = element["on" + type];
+                       }
+               }
+               // store the event handler in the hash table
+               handlers[handler.$$guid] = handler;
+               // assign a global event handler to do all the work
+               element["on" + type] = Clazz.handleEvent;
+       }
+};
+/* private */
+//a counter used to create unique IDs
+Clazz.addEvent.guid = 1;
+
+/* public */
+Clazz.removeEvent = function (element, type, handler) {
+       if (element.removeEventListener) {
+               element.removeEventListener(type, handler, false);
+       } else {
+               // delete the event handler from the hash table
+               if (element.events && element.events[type]) {
+                       delete element.events[type][handler.$$guid];
+               }
+       }
+};
+
+/* private */
+Clazz.isVeryOldIE = navigator.userAgent.indexOf("MSIE 6.0") != -1 || navigator.userAgent.indexOf("MSIE 5.5") != -1 || navigator.userAgent.indexOf("MSIE 5.0") != -1;
+
+/* protected */
+Clazz.handleEvent = function (event) {
+       var returnValue = true;
+       // grab the event object (IE uses a global event object)
+       if (!Clazz.isVeryOldIE) {
+               event = event || Clazz.fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
+       } else { // The above line is buggy in IE 6.0
+               if (event == null) {
+                       var evt = null;
+                       try {
+                               var pWindow = (this.ownerDocument || this.document || this).parentWindow;
+                               if (pWindow != null) {
+                                       evt = pWindow.event;
+                               }
+                       } catch (e) {
+                               evt = window.event;
+                       }
+                       event = Clazz.fixEvent(evt);
+               }
+       }
+       // get a reference to the hash table of event handlers
+       var handlers = this.events[event.type];
+       // execute each event handler
+       for (var i in handlers) {
+               if (isNaN (i)) {
+                       continue;
+               }
+               this.$$handleEvent = handlers[i];
+               if (typeof this.$$handleEvent != "function") {
+                       continue;
+               }
+               if (this.$$handleEvent(event) === false) {
+                       returnValue = false;
+               }
+       }
+       return returnValue;
+};
+
+/* private */
+Clazz.fixEvent = function (event) {
+       // add W3C standard event methods
+       event.preventDefault = Clazz.fixEvent.preventDefault;
+       event.stopPropagation = Clazz.fixEvent.stopPropagation;
+       return event;
+};
+Clazz.fixEvent.preventDefault = function() {
+       this.returnValue = false;
+};
+Clazz.fixEvent.stopPropagation = function() {
+       this.cancelBubble = true;
+};
+
+}