text: /**
   * @author mrdoob / http://mrdoob.com
   * @author Mugen87 / https://github.com/Mugen87
   *
   * Based on @tojiro's vr-samples-utils.js
   */
  
  var WEBVR = {
  
  	createButton: function ( renderer, options ) {
  
  		if ( options && options.referenceSpaceType ) {
  
  			renderer.vr.setReferenceSpaceType( options.referenceSpaceType );
  
  		}
  
  		function showEnterVR( device ) {
  
  			button.style.display = '';
  
  			button.style.cursor = 'pointer';
  			button.style.left = 'calc(50% - 50px)';
  			button.style.width = '100px';
  
  			button.textContent = 'ENTER VR';
  
  			button.onmouseenter = function () {
  
  				button.style.opacity = '1.0';
  
  			};
  
  			button.onmouseleave = function () {
  
  				button.style.opacity = '0.5';
  
  			};
  
  			button.onclick = function () {
  
  				device.isPresenting ? device.exitPresent() : device.requestPresent( [ { source: renderer.domElement } ] );
  
  			};
  
  			renderer.vr.setDevice( device );
  
  		}
  
  		function showEnterXR( /*device*/ ) {
  
  			var currentSession = null;
  
  			function onSessionStarted( session ) {
  
  				session.addEventListener( 'end', onSessionEnded );
  
  				renderer.vr.setSession( session );
  				button.textContent = 'EXIT XR';
  
  				currentSession = session;
  
  			}
  
  			function onSessionEnded( /*event*/ ) {
  
  				currentSession.removeEventListener( 'end', onSessionEnded );
  
  				renderer.vr.setSession( null );
  				button.textContent = 'ENTER XR';
  
  				currentSession = null;
  
  			}
  
  			//
  
  			button.style.display = '';
  
  			button.style.cursor = 'pointer';
  			button.style.left = 'calc(50% - 50px)';
  			button.style.width = '100px';
  
  			button.textContent = 'ENTER XR';
  
  			button.onmouseenter = function () {
  
  				button.style.opacity = '1.0';
  
  			};
  
  			button.onmouseleave = function () {
  
  				button.style.opacity = '0.5';
  
  			};
  
  			button.onclick = function () {
  
  				if ( currentSession === null ) {
  
  					// WebXR's requestReferenceSpace only works if the corresponding feature
  					// was requested at session creation time. For simplicity, just ask for
  					// the interesting ones as optional features, but be aware that the
  					// requestReferenceSpace call will fail if it turns out to be unavailable.
  					// ('local' is always available for immersive sessions and doesn't need to
  					// be requested separately.)
  
  					var sessionInit = { optionalFeatures: [ 'local-floor', 'bounded-floor' ] };
  					navigator.xr.requestSession( 'immersive-vr', sessionInit ).then( onSessionStarted );
  
  				} else {
  
  					currentSession.end();
  
  				}
  
  			};
  
  		}
  
  		function disableButton() {
  
  			button.style.display = '';
  
  			button.style.cursor = 'auto';
  			button.style.left = 'calc(50% - 75px)';
  			button.style.width = '150px';
  
  			button.onmouseenter = null;
  			button.onmouseleave = null;
  
  			button.onclick = null;
  
  		}
  
  		function showVRNotFound() {
  
  			disableButton();
  
  			button.textContent = 'VR NOT FOUND';
  
  			renderer.vr.setDevice( null );
  
  		}
  
  		function showXRNotFound() {
  
  			disableButton();
  
  			button.textContent = 'XR NOT FOUND';
  
  		}
  
  		function stylizeElement( element ) {
  
  			element.style.position = 'absolute';
  			element.style.bottom = '20px';
  			element.style.padding = '12px 6px';
  			element.style.border = '1px solid #fff';
  			element.style.borderRadius = '4px';
  			element.style.background = 'rgba(0,0,0,0.1)';
  			element.style.color = '#fff';
  			element.style.font = 'normal 13px sans-serif';
  			element.style.textAlign = 'center';
  			element.style.opacity = '0.5';
  			element.style.outline = 'none';
  			element.style.zIndex = '999';
  
  		}
  
  		if ( 'xr' in navigator && 'supportsSession' in navigator.xr ) {
  
  			var button = document.createElement( 'button' );
  			button.style.display = 'none';
  
  			stylizeElement( button );
  
  			navigator.xr.supportsSession( 'immersive-vr' ).then( showEnterXR ).catch( showXRNotFound );
  
  			return button;
  
  		} else if ( 'getVRDisplays' in navigator ) {
  
  			var button = document.createElement( 'button' );
  			button.style.display = 'none';
  
  			stylizeElement( button );
  
  			window.addEventListener( 'vrdisplayconnect', function ( event ) {
  
  				showEnterVR( event.display );
  
  			}, false );
  
  			window.addEventListener( 'vrdisplaydisconnect', function ( /*event*/ ) {
  
  				showVRNotFound();
  
  			}, false );
  
  			window.addEventListener( 'vrdisplaypresentchange', function ( event ) {
  
  				button.textContent = event.display.isPresenting ? 'EXIT VR' : 'ENTER VR';
  
  			}, false );
  
  			window.addEventListener( 'vrdisplayactivate', function ( event ) {
  
  				event.display.requestPresent( [ { source: renderer.domElement } ] );
  
  			}, false );
  
  			navigator.getVRDisplays()
  				.then( function ( displays ) {
  
  					if ( displays.length > 0 ) {
  
  						showEnterVR( displays[ 0 ] );
  
  					} else {
  
  						showVRNotFound();
  
  					}
  
  				} ).catch( showVRNotFound );
  
  			return button;
  
  		} else {
  
  			var message = document.createElement( 'a' );
  			message.href = 'https://webvr.info';
  			message.innerHTML = 'WEBVR NOT SUPPORTED';
  
  			message.style.left = 'calc(50% - 90px)';
  			message.style.width = '180px';
  			message.style.textDecoration = 'none';
  
  			stylizeElement( message );
  
  			return message;
  
  		}
  
  	}
  
  };
  