JScript::JScript(ScriptNode *node)
{
	if (0 < node->getNUrls()) {

		JNIEnv		*jniEnv	= getJniEnv();
		SceneGraph	*sg		= node->getSceneGraph();

		// get script class
		char	buffer[1024];

		// Class IDs
		mNodeObjectClassID = jniEnv->FindClass(getClassName(node->getUrl(0), buffer));
#if defined(CX3D_SUPPORT_URL)
		if (mNodeObjectClassID == NULL) {
			if (sg->getUrlStream(node->getUrl(0))) {
				mNodeObjectClassID = jniEnv->FindClass(getClassName(sg->getUrlOutputFilename(), buffer));
				sg->deleteUrlOutputFilename();
			}
		}
#endif

		if (!mNodeObjectClassID)
			return;

		// MethodIDs
		jclass classid				= getNodeObjectClassID();
		mInitMethodID				= jniEnv->GetMethodID(classid, "<init>",	"()V");

		mSetNameMethodID			= jniEnv->GetMethodID(classid, "setName",	"(Ljava/lang/String;)V");
		mAddEventInMethodID			= jniEnv->GetMethodID(classid, "addEventIn",		"(Ljava/lang/String;Lvrml/Field;)V");
		mAddEventOutMethodID		= jniEnv->GetMethodID(classid, "addEventOut",		"(Ljava/lang/String;Lvrml/Field;)V");
		mAddFieldMethodID			= jniEnv->GetMethodID(classid, "addField",			"(Ljava/lang/String;Lvrml/Field;)V");
		mAddExposedFieldMethodID	= jniEnv->GetMethodID(classid, "addExposedField",	"(Ljava/lang/String;Lvrml/Field;)V");

		mGetEventInMethodID			= jniEnv->GetMethodID(classid, "getEventIn",		"(Ljava/lang/String;)Lvrml/Field;");
		mGetEventOutMethodID		= jniEnv->GetMethodID(classid, "getEventOut",		"(Ljava/lang/String;)Lvrml/Field;");
		mGetFieldMethodID			= jniEnv->GetMethodID(classid, "getField",			"(Ljava/lang/String;)Lvrml/Field;");
		mGetExposedFieldMethodID	= jniEnv->GetMethodID(classid, "getExposedField",	"(Ljava/lang/String;)Lvrml/Field;");

		mGetNEventInMethodID		= jniEnv->GetMethodID(classid, "getNEventIn",		"()I");
		mGetNEventOutMethodID		= jniEnv->GetMethodID(classid, "getNEventOut",		"()I");
		mGetNFieldsMethodID			= jniEnv->GetMethodID(classid, "getNFields",		"()I");
		mGetNExposedFieldsMethodID	= jniEnv->GetMethodID(classid, "getNExposedFields",	"()I");

		// MethodIDs
		mInitializeMethodID			= jniEnv->GetMethodID(classid, "initialize",	"()V");
		mShutdownMethodID			= jniEnv->GetMethodID(classid, "shutdown",		"()V");
		mProcessEventMethodID		= jniEnv->GetMethodID(classid, "processEvent",	"(Lvrml/Event;)V");

		assert(mInitMethodID);
		assert(mGetEventInMethodID && mGetEventOutMethodID && mGetFieldMethodID);
		assert(mInitializeMethodID && mShutdownMethodID && mProcessEventMethodID);
/*
		assert(mSetNameMethodID);
		assert(mAddEventInMethodID && mAddEventOutMethodID && mAddFieldMethodID && mAddExposedFieldMethodID);
		assert(mGetExposedFieldMethodID);
		assert(mGetNEventInMethodID && mGetNEventOutMethodID && mGetNFieldsMethodID && mGetNExposedFieldsMethodID);
*/

		// Create object
		jobject object = jniEnv->NewObject(classid, getInitMethodID());
		setNodeObject(object);
		addFields(node);

		assert(object);

		initialize();
	}
	else {
		mNodeObjectClassID			= NULL;
		mInitMethodID				= NULL;
		mSetNameMethodID			= NULL;
		mAddEventInMethodID			= NULL;
		mAddEventOutMethodID		= NULL;
		mAddFieldMethodID			= NULL;
		mAddExposedFieldMethodID	= NULL;
		mGetEventInMethodID			= NULL;
		mGetEventOutMethodID		= NULL;
		mGetFieldMethodID			= NULL;
		mGetExposedFieldMethodID	= NULL;

		setNodeObject(NULL);
	}
}