( function () {

	//
	// VRM is based on glTF 2.0 and VRM extension is defined
	// in top-level json.extensions.VRM

	class VRMLoader extends THREE.Loader {

		constructor( manager ) {

			if ( THREE.GLTFLoader === undefined ) {

				throw new Error( 'THREE.VRMLoader: Import THREE.GLTFLoader.' );

			}

			super( manager );
			this.gltfLoader = new THREE.GLTFLoader( manager );

		}

		load( url, onLoad, onProgress, onError ) {

			const scope = this;
			this.gltfLoader.load( url, function ( gltf ) {

				try {

					scope.parse( gltf, onLoad );

				} catch ( e ) {

					if ( onError ) {

						onError( e );

					} else {

						console.error( e );

					}

					scope.manager.itemError( url );

				}

			}, onProgress, onError );

		}

		setDRACOLoader( dracoLoader ) {

			this.gltfLoader.setDRACOLoader( dracoLoader );
			return this;

		}

		parse( gltf, onLoad ) {

			// const gltfParser = gltf.parser;
			// const gltfExtensions = gltf.userData.gltfExtensions || {};
			// const vrmExtension = gltfExtensions.VRM || {};
			// handle VRM Extension here
			onLoad( gltf );

		}

	}

	THREE.VRMLoader = VRMLoader;

} )();