(function(){
'use strict';
/**
* Google streetview panorama
*
* [How to get Panorama ID]{@link http://stackoverflow.com/questions/29916149/google-maps-streetview-how-to-get-panorama-id}
* @constructor
* @param {string} panoId - Panorama id from Google Streetview
* @param {number} [radius=5000] - The minimum radius for this panoram
*/
PANOLENS.GoogleStreetviewPanorama = function ( panoId, radius ) {
PANOLENS.ImagePanorama.call( this, undefined, radius );
this.panoId = panoId;
this.gsvLoader = undefined;
this.loadRequested = false;
this.setupGoogleMapAPI();
}
PANOLENS.GoogleStreetviewPanorama.prototype = Object.create( PANOLENS.ImagePanorama.prototype );
PANOLENS.GoogleStreetviewPanorama.constructor = PANOLENS.GoogleStreetviewPanorama;
/**
* Load Google Street View by panorama id
* @param {string} panoId - Gogogle Street View panorama id
*/
PANOLENS.GoogleStreetviewPanorama.prototype.load = function ( panoId ) {
this.loadRequested = true;
panoId = ( panoId || this.panoId ) || {};
if ( panoId && this.gsvLoader ) {
this.loadGSVLoader( panoId );
} else {
this.gsvLoader = {};
}
};
/**
* Setup Google Map API
*/
PANOLENS.GoogleStreetviewPanorama.prototype.setupGoogleMapAPI = function () {
var script = document.createElement( 'script' );
script.src = 'https://maps.googleapis.com/maps/api/js';
script.onreadystatechange = this.setGSVLoader.bind( this );
script.onload = this.setGSVLoader.bind( this );
document.getElementsByTagName('head')[0].appendChild( script );
};
/**
* Set GSV Loader
*/
PANOLENS.GoogleStreetviewPanorama.prototype.setGSVLoader = function () {
this.gsvLoader = new GSVPANO.PanoLoader();
if ( this.gsvLoader === {} || this.loadRequested ) {
this.load();
}
};
/**
* Get GSV Loader
* @return {object} GSV Loader instance
*/
PANOLENS.GoogleStreetviewPanorama.prototype.getGSVLoader = function () {
return this.gsvLoader;
};
/**
* Load GSV Loader
* @param {string} panoId - Gogogle Street View panorama id
*/
PANOLENS.GoogleStreetviewPanorama.prototype.loadGSVLoader = function ( panoId ) {
this.loadRequested = false;
this.gsvLoader.onProgress = this.onProgress.bind( this );
this.gsvLoader.onPanoramaLoad = this.onLoad.bind( this );
this.gsvLoader.setZoom( this.getZoomLevel() );
this.gsvLoader.load( panoId );
this.gsvLoader.loaded = true;
};
/**
* This will be called when panorama is loaded
* @param {HTMLCanvasElement} canvas - Canvas where the tiles have been drawn
*/
PANOLENS.GoogleStreetviewPanorama.prototype.onLoad = function ( canvas ) {
if ( !this.gsvLoader ) { return; }
PANOLENS.ImagePanorama.prototype.onLoad.call( this, new THREE.Texture( canvas ) );
};
PANOLENS.GoogleStreetviewPanorama.prototype.reset = function () {
this.gsvLoader = undefined;
PANOLENS.ImagePanorama.prototype.reset.call( this );
};
})();