////////////////////////////////////////////////////////////////////// // Pano2VR HTML5/CSS3 & WebGL Panorama Player 3.1.4/1952 // // License: Brent Butcher // // (c) 2012, Garden Gnome Software, http://gardengnomesoftware.com // ////////////////////////////////////////////////////////////////////// var j=!0,k=null,r=!1;function Ra(){this.y=this.x=0;this.c=-100;this.set=function(f,n,g){this.x=f;this.y=n;this.c=g};this.o=function(f){var n=Math.sin(f),f=Math.cos(f),g=this.y,p=this.c;this.y=f*g-n*p;this.c=n*g+f*p};this.p=function(f){var n=Math.sin(f),f=Math.cos(f),g=this.x,p=this.c;this.x=f*g+n*p;this.c=-n*g+f*p}}glMatrixArrayType="undefined"!=typeof Float32Array?Float32Array:"undefined"!=typeof WebGLFloatArray?WebGLFloatArray:Array; function Eb(f){f[0]=1;f[1]=0;f[2]=0;f[3]=0;f[4]=0;f[5]=1;f[6]=0;f[7]=0;f[8]=0;f[9]=0;f[10]=1;f[11]=0;f[12]=0;f[13]=0;f[14]=0;f[15]=1} function Fb(f,n,g){var p,z=g[0],A=g[1],g=g[2],H=Math.sqrt(z*z+A*A+g*g);if(H){1!=H&&(H=1/H,z*=H,A*=H,g*=H);var S=Math.sin(n),na=Math.cos(n),O=1-na,n=f[0],H=f[1],Ea=f[2],Fa=f[3],Ga=f[4],Ha=f[5],Ia=f[6],fa=f[7],oa=f[8],pa=f[9],qa=f[10],t=f[11],ga=z*z*O+na,Y=A*z*O+g*S,ha=g*z*O-A*S,ia=z*A*O-g*S,K=A*A*O+na,T=g*A*O+z*S,U=z*g*O+A*S,z=A*g*O-z*S,A=g*g*O+na;p?f!=p&&(p[12]=f[12],p[13]=f[13],p[14]=f[14],p[15]=f[15]):p=f;p[0]=n*ga+Ga*Y+oa*ha;p[1]=H*ga+Ha*Y+pa*ha;p[2]=Ea*ga+Ia*Y+qa*ha;p[3]=Fa*ga+fa*Y+t*ha;p[4]= n*ia+Ga*K+oa*T;p[5]=H*ia+Ha*K+pa*T;p[6]=Ea*ia+Ia*K+qa*T;p[7]=Fa*ia+fa*K+t*T;p[8]=n*U+Ga*z+oa*A;p[9]=H*U+Ha*z+pa*A;p[10]=Ea*U+Ia*z+qa*A;p[11]=Fa*U+fa*z+t*A}} function Gb(){var f="perspective",n=["Webkit","Moz","O","ms","Ms"],g;g=r;for(g=0;gMath.abs(L-l)/l&&(Sa=r),d.dirty=j);if(fb&&(0!=P||0!=Q)&&0>D)P*=0.9,Q*=0.9,0.1>P*P+Q*Q?Q=P=0:(Y(P,Q),d.dirty=j);if(0!=wa){switch(wa){case 37:d.changePan(1,j);break;case 38:d.changeTilt(1,j);break;case 39:d.changePan(-1,j);break;case 40:d.changeTilt(-1,j);break;case 43:case 107:case 16:d.changeFovLog(-1,j);break;case 17:case 18:case 109:case 45:case 91:d.changeFovLog(1,j)}d.dirty=j}if(!d.isLoaded&&d.hasConfig){var a,c=0;Ta&& (d.finalPanorama(),Ta=r);for(a=0;ao;)o+=360;if(La){q=gb-o;if(360==xa-ya){for(;-180>q;)q+=360;for(;180< q;)q-=360}C=hb-m;y=ib-l;a=Math.sqrt(q*q+C*C+y*y);if(10*a5*Va?Va/a:0.2,q*=a,C*=a,y*=a;o+=q;m+=C;l+=y;a=new Date;jb=a.getTime();d.dirty=j}else if(R)C=Wa*(0-m)/100,y=Wa*(Xa-l)/100,q=0.95*q+0.05*-ba,o+=q,m+=C,l+=y,d.dirty=j;else if(Ma&&(a=new Date,0>D&&a.getTime()-jb>1E3*kb&&(R=j,y=C=q=0)),fb&&0==wa&&0>D&&(0!=q||0!=C||0!=y))q*=0.9,C*=0.9,y*=0.9,o+=q,m+=C,d.changeFovLog(y),1.0E-4>q*q+C*C+y*y&&(y=C=q=0),d.dirty=j;Hb&&(a=new Date,Ya?a.getTime()- lb>=1E3*Ib&&(Ya=r):(ka+=za,0>ka&&(ka=0,za=-za,Ya=j,lb=a.getTime()),1V&&(L=V),La){if(d.a){a=d.a;for(flag=r;a&&a!=d.control;)a.onclick&&!flag&&(a.onclick(),flag=j),a=a.parentNode}a=Math.abs(Lb-Na)+Math.abs(Mb-Oa);if(700>c-d.f&&0<=a&&20>a){d.a==d.control&&nb&&setTimeout(function(){d.toggleFullscreen()},1);if(d.a){a=d.a;for(flag=r;a&&a!=d.control;)a.ondblclick&&!flag&&(a.ondblclick(),flag=j),a=a.parentNode}d.f=0}else d.f=c;Lb=Na;Mb=Oa}if(d.a){a=d.a;for(flag=r;a&&a!=d.control;){if(a.onmouseout)a.onmouseout(); a.onmouseup&&!flag&&(a.onmouseup(),flag=j);a=a.parentNode}}d.a=k;D=-11}}function Ha(a){a||(a=window.event);var c=a.touches,b=ab();d.mouse.x=c[0].pageX-b.x;d.mouse.y=c[0].pageY-b.y;if(!I){a.preventDefault();c[0]&&(Na=c[0].pageX,Oa=c[0].pageY);if(0<=D){a.preventDefault();for(a=0;aV&&(L=V),LD&&c[0]&&(ob=(new Date).getTime(),Jb=c[0].pageX,Kb=c[0].pageY,Na=c[0].pageX,Oa=c[0].pageY,d.a=c[0].target,c[0].target==d.control&&(a=c[0].pageX,b=c[0].pageY,pb=a,qb=b,$=a,aa=b,Ja=a,Ka=b,D=c[0].identifier,t()),d.a)){a=d.a;for(flag=r;a&&a!=d.control;){if(a.onmouseover)a.onmouseover();a.onmousedown&&!flag&&(a.onmousedown(), flag=j);a=a.parentNode}}1a-ob&&0<=c&&20>c&&(c=Math.abs(Rb-$)+Math.abs(Sb-aa),700>a-d.f&&0<=c&&20>c?(nb&&setTimeout(function(){d.toggleFullscreen()},10),d.f=0):d.f=a,Rb=$,Sb=aa);t()}}function pa(a){var a=a?a:window.event,c=ab();d.mouse.x=a.pageX-c.x;d.mouse.y=a.pageY-c.y;I||(a.preventDefault(),0<=D&&((a.which||0==a.which||1==a.which)&&ga(a.pageX,a.pageY),t()))}function qa(a){if(!I){a=a?a:window.event;a.preventDefault();if((a.which||0==a.which||1==a.which)&&a.target==d.control){var c=a.pageX,a=a.pageY;pb=c;qb=a;$=c; aa=a;Ja=c;Ka=a;D=1;ob=(new Date).getTime();t()}va=ua=0}}function t(){R&&(R=r,y=C=q=0);La&&(La=r,y=C=q=0);jb=(new Date).getTime()}function ga(a,c){sb=a;tb=c;ua=sb-$;va=tb-aa;ja&&($=sb,aa=tb)}function Y(a,c){var b=d.getVFov();o+=a*b/s;m+=c*b/s;U()}function ha(a){ub=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,ub);vertices=[-1,-1,1,1,-1,1,1,1,1,-1,1,1];for(i=0;12>i;i++)2>i%3&&(vertices[i]*=a);e.bufferData(e.ARRAY_BUFFER,new Float32Array(vertices),e.STATIC_DRAW);vb=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER, vb);e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,0,0,0,0,1,1,1]),e.STATIC_DRAW);wb=e.createBuffer();e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,wb);e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,1,2,0,2,3]),e.STATIC_DRAW)}function ia(){var a,c;if(M)for(;0b;b++)c=e.createTexture(),c.i=k,c.g=k,c.m=r,a=new Image,a.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYBgeACDAAADIAAE3iTbkAAAAAElFTkSuQmCC", c.v=a,a.addEventListener&&a.addEventListener("load",T(c),r),Aa[b]&&(a=new Image,a.src=K(Aa[b]),c.i=a,a.addEventListener&&a.addEventListener("load",T(c),r),d.checkLoaded.push(a)),M.push(c);for(b=0;6>b;b++)Pa[b]&&(a=new Image,a.src=K(Pa[b]),a.addEventListener?a.addEventListener("load",T(M[b]),r):a.onload=T(M[b]),M[b].g=a,d.checkLoaded.push(a))}function K(a){return a?"/"==a.charAt(0)||0V&&(l=V);c=d.getVFov()/2;a=180*Math.atan(B/s*Math.tan(c*Math.PI/180))/Math.PI;2*c>ca-da&&(c=(ca-da)/2);d.setVFov(2*c);90>ca?m+c>ca&&(m=ca-c):m>ca&&(m=ca);-90xa-ya){var b=0;if(0!=m){var e,f=s/2;e=f*Math.tan(c*Math.PI/180);f/=Math.tan(Math.abs(m)*Math.PI/180);f-=e;0xa&&(o=xa-(a+b),R&&(ba=-ba,q=0));o-(a+b)m-c&&(m=-90+c)}}function ab(){var a={x:0,y:0},c=u;if(c.offsetParent){do a.x+=c.offsetLeft,a.y+=c.offsetTop;while(c=c.offsetParent)}return a}function la(){d.setViewerSize(d.e.offsetWidth,d.e.offsetHeight)}function ra(a){if(debug=document.getElementById("debug"))debug.innerHTML=a+"
";window.console&&window.console.log(a)}function Wb(a){var c="",b,d,e="",f,h="",g=0,a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");do b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(g++)), d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(g++)),f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(g++)),h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(g++)),b=b<<2|d>>4,d=(d&15)<<4|f>>2,e=(f&3)<<6|h,c+=String.fromCharCode(b),64!=f&&(c+=String.fromCharCode(d)),64!=h&&(c+=String.fromCharCode(e));while(gB?l/2:180*Math.atan(4*s/(3*B)*Math.tan(l/2*Math.PI/180))/Math.PI}return 2*a};this.setVFov=function(a){var a=a/2,c;switch(zb){case 0:l=2*a;break;case 1:a=180*Math.atan(B/s*Math.tan(a*Math.PI/180))/Math.PI;l=2*a;break;case 2:c=Math.sqrt(B*B+s*s);a=180*Math.atan(c/s*Math.tan(a*Math.PI/180))/Math.PI;l=2*a;break;case 3:4*s/3>B||(a=180*Math.atan(3*B/(4*s)*Math.tan(a*Math.PI/180))/Math.PI),l=2*a}};this.updatePanorama= function(){for(var a=new Ra,c=d.l(),b=0;ba.c){var g=-c/a.c,l=a.x*g,g=a.y*g;Math.abs(l)v;v++)Eb(Da),Fb(Da,-m*Math.PI/ 180,[1,0,0]),Fb(Da,(180-o)*Math.PI/180,[0,1,0]),4>v?Fb(Da,-Math.PI/2*v,[0,1,0]):Fb(Da,Math.PI/2*(5==v?1:-1),[1,0,0]),e.bindBuffer(e.ARRAY_BUFFER,ub),e.vertexAttribPointer(x.r,3,e.FLOAT,r,0,0),e.bindBuffer(e.ARRAY_BUFFER,vb),e.vertexAttribPointer(x.q,2,e.FLOAT,r,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,M[v]),e.uniform1i(x.C,0),e.uniformMatrix4fv(x.z,r,Da),e.uniformMatrix4fv(x.n,r,bb),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,wb),e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)}}else{U(); a=r;if(B!=u.offsetWidth||s!=u.offsetHeight)B=parseInt(u.offsetWidth),s=parseInt(u.offsetHeight),u.style[Ca+"OriginX"]=B/2+"px",u.style[Ca+"OriginY"]=s/2+"px",a=j;c=Math.round(d.l());if(d.k!=c||a)d.k=c,u.style[Db]=c;N&&(N.style[Ca]="translate3d("+B/2+"px,"+s/2+"px,"+c+"px)");ea&&(ea.style[Ca]="rotateX("+Number(m).toFixed(10)+"deg) rotateY("+Number(-o).toFixed(10)+"deg)")}};var x;this.initWebGL=function(a){Ub=r;try{if(X=a?a:document.createElement("canvas"),X.width=100,X.height=100,u.appendChild(X), (e=X.getContext("webgl"))||(e=X.getContext("experimental-webgl")),e){e.t=500;e.s=500;e.clearColor(0,0,0,0);e.enable(e.DEPTH_TEST);e.viewport(0,0,500,500);e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT);e.enable(e.TEXTURE_2D);var c=e.createShader(e.FRAGMENT_SHADER);hs="#ifdef GL_ES\n";hs+="precision highp float;\n";hs+="#endif\n";hs+="varying vec2 vTextureCoord;\n";hs+="uniform sampler2D uSampler;\n";hs+="void main(void) {\n";hs+=" gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));\n"; hs+="}\n";e.shaderSource(c,hs);e.compileShader(c);e.getShaderParameter(c,e.COMPILE_STATUS)||(alert(e.getShaderInfoLog(c)),c=k);var b=e.createShader(e.VERTEX_SHADER);hs="attribute vec3 aVertexPosition;\n";hs+="attribute vec2 aTextureCoord;\n";hs+="uniform mat4 uMVMatrix;\n";hs+="uniform mat4 uPMatrix;\n";hs+="varying vec2 vTextureCoord;\n";hs+="void main(void) {\n";hs+=" gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\n";hs+=" vTextureCoord = aTextureCoord;\n";hs+="}\n";e.shaderSource(b, hs);e.compileShader(b);e.getShaderParameter(b,e.COMPILE_STATUS)||(alert(e.getShaderInfoLog(b)),b=k);x=e.createProgram();e.attachShader(x,b);e.attachShader(x,c);e.linkProgram(x);e.getProgramParameter(x,e.LINK_STATUS)||alert("Could not initialise shaders");e.useProgram(x);x.r=e.getAttribLocation(x,"aVertexPosition");e.enableVertexAttribArray(x.r);x.q=e.getAttribLocation(x,"aTextureCoord");e.enableVertexAttribArray(x.q);x.n=e.getUniformLocation(x,"uPMatrix");x.z=e.getUniformLocation(x,"uMVMatrix");x.C= e.getUniformLocation(x,"uSampler");ha(Qa);ia()}}catch(d){ra(d)}e?ma=j:alert("Could not initialise WebGL!")};var M=[],Da=new glMatrixArrayType(16),bb=new glMatrixArrayType(16),ub,vb,wb;this.getPan=function(){return o};this.getPanDest=function(){return gb};this.getPanN=function(){for(var a=o;-180>a;)a+=360;for(;180a){var c=l;l=Number(a);U();d.dirty|=c!=l}};this.changeFov=function(a,c){d.setFov(d.getFov()+a);c&&(y=a)};this.changeFovLog=function(a,c){if(!isNaN(a)){var b;b=a/90*Math.cos(l*Math.PI/360);b=l*Math.exp(b);d.setFov(b);c&&(y=a)}};this.setPanTilt= function(a,c){t();isNaN(a)||(o=a);isNaN(c)||(m=c);d.dirty=j};this.setPanTiltFov=function(a,c,b){t();isNaN(a)||(o=a);isNaN(c)||(m=c);!isNaN(b)&&0b&&(l=b);d.dirty=j};this.setDefaultView=function(){d.setPanTiltFov(xb,yb,Xa)};this.setLocked=function(a){d.setLockedMouse(a);d.setLockedWheel(a);d.setLockedKeyboard(a)};this.setLockedMouse=function(a){I=a};this.setLockedKeyboard=function(a){Za=a};this.setLockedWheel=function(a){rb=a};this.moveTo=function(a,c,b,d){t();La=j;var e=a.toString().split("/"); 1b?b:l;Va=!isNaN(d)&&0>", "U"!=a.charAt(2))?(g(),r):j}};this.addHotspotElements=function(){for(var a=0;ab&&(b=0);if("_main"==a){Z=b;for(var d=0;db&&(b=0);Z=b;for(b=0;bb&&(b=0),h[d].b=b,h[d].obj.volume=b*Z)}};this.removeHotspots=function(){for(var a;0e&&(e=Bb);for(b=0;6>b;b++)c=document.createElement("img"),Ta?""!=Aa[b]&&c.setAttribute("src",K(Aa[b])):c.setAttribute("src",K(Pa[b])),a="position:absolute;",a+="left: 0px;",a+="top: 0px;",a+="width: "+e+"px;",a+="height: "+e+"px;",a+="z-index: 100;",a+=F+"transform-origin: 0 0;", a+=F+"transform: ",a=4>b?a+("rotateY("+-90*b+"deg)"):a+("rotateX("+(4==b?-90:90)+"deg)"),a+=" scale("+Qa+") translate3d("+-e/2+"px,"+-e/2+"px,"+-e/2+"px);",c.setAttribute("style",a),ea.appendChild(c),d.cubeFaces.push(c),d.checkLoaded.push(c),""!=Ab[b]&&(c=document.createElement("img"),c.setAttribute("src",K(Ab[b])),a="position:absolute;",a+="left: 0px;",a+="top: 0px;",a+="width: "+e/1.1+"px;",a+="height: "+e/1.1+"px;",a+="z-index: 100;",a+=F+"transform-origin: 0 0;",a+=F+"transform: ",a=4>b?a+("rotateY("+ -90*b+"deg)"):a+("rotateX("+(4==b?-90:90)+"deg)"),a+=" scale("+Qa+") translate3d("+-e/2.2+"px,"+-e/2.2+"px,"+-e/2.2+"px);",c.setAttribute("style",a),c.style.opacity=0,ea.appendChild(c),d.cubeFacesOverlay.push(c),d.checkLoaded.push(c))};this.finalPanorama=function(){var a;if(N)for(a=0;6>a;a++)d.cubeFaces[a].setAttribute("src",K(Pa[a]))};this.setOverlayOpacity=function(a){var c;if(N)for(c=0;6>c;c++)d.cubeFacesOverlay[c]&&d.cubeFacesOverlay[c].style&&(d.cubeFacesOverlay[c].style.opacity=a)};this.removePanorama= function(){var a;if(N){for(a=0;aa.h?a.w:a.h};this.readConfigString=function(a){window.DOMParser?(parser=new DOMParser,xmlDoc=parser.parseFromString(a,"text/xml")):(xmlDoc=new ActiveXObject("Microsoft.XMLDOM"),xmlDoc.async= "false",xmlDoc.loadXML(a));d.readConfigXml(xmlDoc)};this.readConfigUrl=function(a,c){try{var b;b=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");b.open("GET",a,r);b.send(k);if(b.responseXML){var e=a.lastIndexOf("/");0<=e&&(Ba=a.substr(0,e+1));2<=arguments.length&&(Ba=c);d.readConfigString(b.responseText)}else alert("Error loading panorama XML")}catch(f){alert("Error:"+f)}};var cb=j;this.readConfigXml=function(a){d.removeHotspots();d.removePanorama();d.k=0;for(var a= a.firstChild.firstChild,c,b,f,h=1E6;a;){if("view"==a.nodeName){(b=a.getAttributeNode("fovmode"))&&(zb=Number(b.nodeValue));for(c=a.firstChild;c;)"start"==c.nodeName&&(b=c.getAttributeNode("pan"),xb=o=Number(b?b.nodeValue:0),b=c.getAttributeNode("tilt"),yb=m=Number(b?b.nodeValue:0),b=c.getAttributeNode("fov"),Xa=l=Number(b?b.nodeValue:70)),"min"==c.nodeName&&(b=c.getAttributeNode("pan"),ya=1*(b?b.nodeValue:0),b=c.getAttributeNode("tilt"),da=1*(b?b.nodeValue:-90),b=c.getAttributeNode("fov"),W=1*(b? b.nodeValue:5),1.0E-8>W&&(W=1.0E-8)),"max"==c.nodeName&&(b=c.getAttributeNode("pan"),xa=1*(b?b.nodeValue:0),b=c.getAttributeNode("tilt"),ca=1*(b?b.nodeValue:90),b=c.getAttributeNode("fov"),V=1*(b?b.nodeValue:120),180<=V&&(V=179.9)),c=c.nextSibling}"autorotate"==a.nodeName&&((b=a.getAttributeNode("speed"))&&(ba=1*b.nodeValue),(b=a.getAttributeNode("delay"))&&(kb=1*b.nodeValue),(b=a.getAttributeNode("returntohorizon"))&&(Wa=1*b.nodeValue),cb&&0!=ba&&(R=Ma=j));"input"==a.nodeName&&(f||(f=a));if(f)for(c= 0;6>c;c++)b=f.getAttributeNode("prev"+c+"url"),Aa[c]=b?new String(b.nodeValue):"";"altinput"==a.nodeName&&(c=0,(b=a.getAttributeNode("screensize"))&&(c=1*b.nodeValue),0=d.getMaxScreenResolution()&&cc;c++)(b=f.getAttributeNode("tile"+c+"url"))&&(Pa[c]=new String(b.nodeValue)),b=f.getAttributeNode("tile"+c+"url1"),Ab[c]=b?new String(b.nodeValue):"";for(c=0;6>c;c++)(b=f.getAttributeNode("prev"+c+"url"))&&(Aa[c]=new String(b.nodeValue));(b=f.getAttributeNode("tilesize"))&&(Bb=1*b.nodeValue);(b=f.getAttributeNode("tilescale"))&&(Qa=1*b.nodeValue)}ma?e&&(ha(Qa),ia()): (d.createCube(),d.k=0);d.addHotspotElements();d.dirty=j;cb&&d.divSkin&&d.divSkin.ggViewerInit&&d.divSkin.ggViewerInit();cb=r;d.hasConfig=j;la()};this.openUrl=function(a,c){0