(function($){ 'use strict'; document.addEventListener('DOMContentLoaded', function(){ FastClick.attach(document.body); }); $(function(){ $('.j-mv360tour-public').each(function(i,e){ new MV360TourPublic($(e)); }); }); })(jQuery); function MV360TourPublic($el){ this.$el=$el; this.embed=this.$el.data('embed'); this.$embedEl=''; if(this.embed){ this.$embedEl=this.$el.parent(); } this.initSlickMenu=false; this.$wrapper=this.$el.parent(); this.dataDefault=JSON.parse($el.find('[data-default="1"]').html()); this.options=JSON.parse($el.find('.j-mv360tour-public-opt').html()); this.initVideo(); var opt={ controls: { mouseViewMode: 'drag', }, }; if(this.options.zoomScroll){ opt.controls.scrollZoom=false; } this.viewer=new Marzipano.Viewer(this.$el.get(0), opt); if(this.options.zoom||this.options.move||this.options.gyro){ this.controls=this.viewer.controls(); this.deviceOrientationControlMethod=new MV360TourPublicDeviceOrientationControlMethod(); this.controls.registerMethod('deviceOrientation', this.deviceOrientationControlMethod); this.velocity=0.7; this.friction=3; this.$controls=jQuery('
'); this.$el.append(this.$controls); if(this.options.move){ this.createMoveControls(); } if(this.options.gyro){ this.createGyroscopeControls(); } if(this.options.zoom){ this.createZoomControls(); }} if(this.options.autostart){ this.autorotate=Marzipano.autorotate({ yawSpeed: 0.03, targetPitch: 0, targetFov: Math.PI/2 }); this.startAutorotate(); } this.addSceneTitle(); this.createFirstScene(); if(!this.options.hideMenu){ this.addMenu(); } this.createFullscreenControl(); jQuery(document).on('fullscreenchange mozfullscreenchange webkitfullscreenchange msfullscreenchange', this.changeFullscreenEvent.bind(this)); }; MV360TourPublic.prototype.initVideo=function(){ this.video=document.createElement('video'); this.video.controls=true; this.video.autoplay=false; this.video.loop=true; this.video.playsInline=true; this.video.webkitPlaysInline=true; jQuery(this.video).on('timeupdate', this.updateProgressBar.bind(this)); jQuery(this.video).on('timeupdate', this.updateCurrentTimeIndicator.bind(this)); jQuery(this.video).on('loadedmetadata', this.updateDurationIndicator.bind(this)); this.$controls=jQuery('
'); this.$progressFillElement=jQuery('
'); this.$progressBackgroundElement=jQuery('
'); this.$progressBackgroundElement.append(this.$progressFillElement); this.$currentTimeIndicatorElement=jQuery('
0:00
'); this.$durationIndicatorElement=jQuery('
0:00
'); this.$indicators=jQuery('
'); this.$indicators.append(this.$currentTimeIndicatorElement, this.$durationIndicatorElement); this.$playPauseElement=jQuery('
'); this.$playMobile=jQuery('
'); this.$muteElement=jQuery('
'); this.$controls.append(this.$progressBackgroundElement, this.$indicators, this.$playPauseElement, this.$muteElement); this.$el.append(this.$controls, this.$playMobile); this.$playPauseElement.bind('click', this.playPause.bind(this)); this.$playMobile.bind('click', this.playPause.bind(this)); this.$muteElement.bind('click', this.mute.bind(this)); this.$progressBackgroundElement.bind('click', this.progressBackground.bind(this)); }; MV360TourPublic.prototype.isTouch=function(){ return 'ontouchstart' in window||navigator.maxTouchPoints; }; MV360TourPublic.prototype.isMobileOs=function(){ var check=false; if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)){ check=true; } return check; }; MV360TourPublic.prototype.addSceneTitle=function(){ this.$titleScene=jQuery('
'); this.$titleSceneText=jQuery(''); if(this.options.secondaryColor){ this.$titleScene.css('background-color', this.options.secondaryColor); } if(this.options.primaryColor){ this.$titleScene.css('color', this.options.primaryColor); } this.$el.append(this.$titleScene); this.$titleScene.append(this.$titleSceneText); }; MV360TourPublic.prototype.addMenu=function(){ this.$menuBtn=jQuery(''); this.$menuBtnClose=jQuery(''); this.$menuBtn.bind('click', this.toggleMenu.bind(this)); this.$menuBtnClose.bind('click', this.toggleMenu.bind(this)); if(this.options.primaryColor){ this.$menuBtn.find('svg').css('fill', this.options.primaryColor); this.$menuBtnClose.find('svg').css('fill', this.options.primaryColor); } this.$titleScene.append(this.$menuBtn); this.$menuOverlay=jQuery('
'); if(this.options.primaryColor){ this.$menuOverlay.css('color', this.options.primaryColor); } if(this.options.secondaryColor){ this.$menuOverlay.css('background-color', this.options.secondaryColor); } this.$menuOverlay.append(this.$menuBtnClose); this.$menuList=jQuery(''); this.$menuwrapper=jQuery('
'); this.$menuOverlay.append(this.$menuwrapper); this.$menuwrapper.append(this.$menuList); jQuery('.j-mv360tour-public-data').each(function(i, e){ var $e=jQuery(e); var scene=JSON.parse($e.html()); var dataScene={ id:scene.id, }; if(scene.position){ dataScene.position=scene.position; } var $list_el=jQuery('
  • ' + scene.title + '
  • '); if(this.options.menu){ var $list_el=jQuery('
  • ' + scene.title + '
  • '); if(this.options.secondaryColor){ $list_el.find('span').css('color', this.options.secondaryColor); } if(this.options.primaryColor){ $list_el.find('span').css('background-color', this.options.primaryColor); var rgba=$list_el.find('span').css('background-color').replace('rgb', 'rgba').replace(')',',.7)'); $list_el.find('span').css('background-color', rgba); }} $list_el.bind('click', this.changeScene.bind(this)); this.$menuList.append($list_el); i++; }.bind(this)); this.$el.prepend(this.$menuOverlay); if(this.options.menu){ this.$menuList.on('init', function(){ if(this.options.primaryColor){ this.$menuList.find('.slick-arrow').css('background-color', this.options.primaryColor); } if(this.options.secondaryColor){ this.$menuList.find('.slick-arrow').css('color', this.options.secondaryColor); } this.initSlickMenu=true; }.bind(this)); if(this.embed){ jQuery(window).bind('resize', this.slickMenuEmbed.bind(this)); this.slickMenuEmbed(); }else{ this.$menuList.slick({ slidesToShow: 3, slidesToScroll: 1, arrow: true, responsive: [ { breakpoint: 980, settings: { slidesToShow: 2, }}, { breakpoint: 600, settings: { slidesToShow: 1, }} ] }); }} }; MV360TourPublic.prototype.slickMenuEmbed=function(){ if(this.initSlickMenu){ this.$menuList.slick('unslick'); } if(this.$wrapper.width() <=600){ this.$menuList.slick({ slidesToShow: 1, slidesToScroll: 1, arrow: true, }); }else if(this.$wrapper.width() <=980){ this.$menuList.slick({ slidesToShow: 2, slidesToScroll: 1, arrow: true, }); }else{ this.$menuList.slick({ slidesToShow: 3, slidesToScroll: 1, arrow: true, }); } this.$menuList.slick('setPosition'); }; MV360TourPublic.prototype.toggleMenu=function(e){ if(e){ e.preventDefault(); } if(this.$menuOverlay.hasClass('is-open')){ this.$menuOverlay.removeClass('is-open'); setTimeout(function(){ this.$menuOverlay.removeClass('is-front'); }.bind(this), 400); }else{ this.$menuOverlay.addClass('is-front'); if(this.options.menu){ this.$menuList.slick('setPosition'); } setTimeout(function(){ this.$menuOverlay.addClass('is-open'); }.bind(this), 10); }}; MV360TourPublic.prototype.startAutorotate=function(){ if(this.options.autostart){ this.viewer.startMovement(this.autorotate); this.viewer.setIdleMovement(3000, this.autorotate); }}; MV360TourPublic.prototype.stopAutorotate=function(){ if(this.options.autostart){ this.viewer.stopMovement(); this.viewer.setIdleMovement(Infinity); }}; MV360TourPublic.prototype.stopEventsPropagation=function(element, eventList){ var eventList=['touchstart', 'touchmove', 'touchend', 'touchcancel', 'wheel', 'mousewheel', 'scroll']; for (var i=0; i < eventList.length; i++){ element.addEventListener(eventList[i], function(event){ event.stopPropagation(); }); }}; MV360TourPublic.prototype.createZoomControls=function(){ this.$zoomIn=jQuery(''); this.$zoomOut=jQuery(''); if(this.options.secondaryColor){ this.$zoomOut.css('background-color', this.options.secondaryColor); this.$zoomIn.css('background-color', this.options.secondaryColor); } if(this.options.primaryColor){ this.$zoomOut.css('color', this.options.primaryColor); this.$zoomIn.css('color', this.options.primaryColor); } this.controls.registerMethod('inElement', new Marzipano.ElementPressControlMethod(this.$zoomIn.get(0), 'zoom', -this.velocity, this.friction), true); this.controls.registerMethod('outElement', new Marzipano.ElementPressControlMethod(this.$zoomOut.get(0), 'zoom', this.velocity, this.friction), true); this.$controls.append(this.$zoomIn); this.$controls.append(this.$zoomOut); }; MV360TourPublic.prototype.changeFullscreenEvent=function(e){ if((window.fullScreen)||(window.innerWidth==screen.width&&window.innerHeight==screen.height)){ this.$fullScreen.addClass('is-open'); }else{ this.$fullScreen.removeClass('is-open'); }}; MV360TourPublic.prototype.createFullscreenControl=function(){ var color='#fff'; if(this.options.primaryColor){ color=this.options.primaryColor; } this.$fullScreen=jQuery(''); this.$fullScreen.bind('click', this.toggleFullscreen.bind(this)); this.$titleScene.append(this.$fullScreen); }; MV360TourPublic.prototype.toggleFullscreen=function(){ if(!this.fullScreen){ if(this.$el.get(0).requestFullscreen){ this.$el.get(0).requestFullscreen(); }else if(this.$el.get(0).mozRequestFullScreen){ this.$el.get(0).mozRequestFullScreen(); }else if(this.$el.get(0).webkitRequestFullscreen){ this.$el.get(0).webkitRequestFullscreen(); }else if(this.$el.get(0).msRequestFullscreen){ this.$el.get(0).msRequestFullscreen(); } this.fullScreen=1; }else{ if(document.exitFullscreen){ document.exitFullscreen(); }else if(document.mozCancelFullScreen){ document.mozCancelFullScreen(); }else if(document.webkitExitFullscreen){ document.webkitExitFullscreen(); }else if(document.msExitFullscreen){ document.msExitFullscreen(); } this.fullScreen=0; }} MV360TourPublic.prototype.createGyroscopeControls=function(){ var bg='#000'; if(this.options.secondaryColor){ bg=this.options.secondaryColor; } var color='#fff'; if(this.options.primaryColor){ color=this.options.primaryColor; } this.$gyroscope=jQuery(''); this.$gyroscope.bind('click', this.toggleGyro.bind(this)); this.$controls.append(this.$gyroscope); }; MV360TourPublic.prototype.toggleGyro=function(){ if(!this.gyroEnabled){ this.deviceOrientationControlMethod.getPitch(function(err, pitch){ if(!err){ var view=this.scenes[this.getSceneOffset(this.activeSceneId)].scene._view; var pos={ fov: view._fov, pitch: view._pitch, yaw: view._yaw, }; pos.pitch=pitch; this.scenes[this.getSceneOffset(this.activeSceneId)].scene.lookTo(pos, {transitionDuration:0}); }}.bind(this)); this.controls.enableMethod('deviceOrientation'); this.gyroEnabled=true; }else{ this.controls.disableMethod('deviceOrientation'); this.gyroEnabled=false; }}; MV360TourPublic.prototype.createMoveControls=function(){ this.$arrowTop=jQuery(''); this.$arrowBottom=jQuery(''); this.$arrowLeft=jQuery(''); this.$arrowRight=jQuery(''); if(this.options.secondaryColor){ this.$arrowTop.css('background-color', this.options.secondaryColor); this.$arrowBottom.css('background-color', this.options.secondaryColor); this.$arrowLeft.css('background-color', this.options.secondaryColor); this.$arrowRight.css('background-color', this.options.secondaryColor); } if(this.options.primaryColor){ this.$arrowTop.css('color', this.options.primaryColor); this.$arrowBottom.css('color', this.options.primaryColor); this.$arrowLeft.css('color', this.options.primaryColor); this.$arrowRight.css('color', this.options.primaryColor); } this.controls.registerMethod('upElement', new Marzipano.ElementPressControlMethod(this.$arrowTop.get(0), 'y', -this.velocity, this.friction), true); this.controls.registerMethod('downElement', new Marzipano.ElementPressControlMethod(this.$arrowBottom.get(0), 'y', this.velocity, this.friction), true); this.controls.registerMethod('leftElement', new Marzipano.ElementPressControlMethod(this.$arrowLeft.get(0), 'x', -this.velocity, this.friction), true); this.controls.registerMethod('rightElement', new Marzipano.ElementPressControlMethod(this.$arrowRight.get(0), 'x', this.velocity, this.friction), true); this.$controls.append(this.$arrowTop); this.$controls.append(this.$arrowBottom); this.$controls.append(this.$arrowLeft); this.$controls.append(this.$arrowRight); }; MV360TourPublic.prototype.getDefaultSceneOffset=function(){ var i=0; var offset; while (i < this.scenes.length){ if(this.scenes[i].data.default){ offset=i; } i++; } return offset; }; MV360TourPublic.prototype.getSceneOffset=function(id){ var i=0; var offset; while (i < this.scenes.length){ if(this.scenes[i].data.id==id){ offset=i; } i++; } return offset; }; MV360TourPublic.prototype.createFirstScene=function(){ var scene=this.createScene(this.dataDefault); this.changeScene(null, scene); if(this.dataDefault.img&&this.dataDefault.img.src){ this.scene=this.createSceneImage(this.dataDefault); }else{ this.scene=this.createSceneVideo(this.dataDefault); }}; MV360TourPublic.prototype.createScene=function(data){ var scene=''; if(data.img&&data.img.src){ scene=this.createSceneImage(data); }else{ scene=this.createSceneVideo(data); } return scene; }; MV360TourPublic.prototype.getScene=function(id){ if(typeof(id)=='object'){ id=id.id; } return this.createScene(JSON.parse(this.$el.find('[data-scene="' + id + '"]').html())); }; MV360TourPublic.prototype.createSceneImage=function(data){ var source=Marzipano.ImageUrlSource.fromString(data.img.src); var geometry=new Marzipano.EquirectGeometry([{ width: data.img.width }]); var limiter=Marzipano.RectilinearView.limit.traditional(2600, 120*Math.PI/180); var view=new Marzipano.RectilinearView(data.position, limiter); var scene=this.viewer.createScene({ source: source, geometry: geometry, view: view, pinFirstLevel: true }); var i=0; if(data.hotspots){ while (i < data.hotspots.length){ var hotspot=data.hotspots[i]; var element=this.createHotspotHtml(hotspot); scene.hotspotContainer().createHotspot(element, { yaw: hotspot.position.yaw, pitch: hotspot.position.pitch }); i++; }} return { data: data, scene: scene, view: view };}; MV360TourPublic.prototype.createSceneVideo=function(data){ var asset=new VideoAsset(); var source=new Marzipano.SingleAssetSource(asset); var limiter=Marzipano.RectilinearView.limit.traditional(2600, 120*Math.PI/180); var view=new Marzipano.RectilinearView(data.position, limiter); var scene=this.viewer.createScene({ source: source, geometry: new Marzipano.EquirectGeometry([{ width: 1 }]), view: view, pinFirstLevel: true, }); var i=0; if(data.hotspots){ while (i < data.hotspots.length){ var hotspot=data.hotspots[i]; var element=this.createHotspotHtml(hotspot); scene.hotspotContainer().createHotspot(element, { yaw: hotspot.position.yaw, pitch: hotspot.position.pitch }); i++; }} data.video.asset=asset; return { data: data, scene: scene, view: view };}; MV360TourPublic.prototype.createHotspotHtml=function(hotspot){ var $el=jQuery('
    '); this.stopEventsPropagation($el.get(0)); if(hotspot.icon&&hotspot.icon.url){ $el.addClass('mv360tour-hotspot-icon'); $el.css('background-image', 'url('+hotspot.icon.url+')'); if(hotspot.icon.width){ $el.css('width', hotspot.icon.width+'px'); $el.css('margin-left', hotspot.icon.width/2*-1+'px'); } if(hotspot.icon.height){ $el.css('height', hotspot.icon.height+'px'); $el.css('margin-top', hotspot.icon.height/2*-1+'px'); }}else{ $el.addClass('mv360tour-hotspot'); } switch (hotspot.type){ case 'image': var $container=jQuery('
    '); if(hotspot.title){ var $title=jQuery('
    ' + hotspot.title + '
    '); if(hotspot.popup&&hotspot.popup.titleColor){ $title.css('color', hotspot.popup.titleColor); } $container.append($title); } $container.append(''); if(hotspot.popup&&hotspot.popup.titleBgColor){ if($title){ $title.find('span').css('background-color', hotspot.popup.titleBgColor); var rgba=$title.find('span').css('background-color').replace('rgb', 'rgba').replace(')',',.7)'); $title.find('span').css('background-color', rgba); }} $el.append($container); var $clickOffset=jQuery(''); $el.append($clickOffset); $clickOffset.bind('click touchend', this.toggleHotspot.bind(this)); break; case 'text': var $container=jQuery('
    '); if(hotspot.title){ var title=jQuery('