var Sylvester={version:"0.1.3",precision:0.000001};function Vector(){}Vector.prototype={e:function(a){return(a<1||a>this.elements.length)?null:this.elements[a-1]},dimensions:function(){return this.elements.length},modulus:function(){return Math.sqrt(this.dot(this))},eql:function(b){var c=this.elements.length;var a=b.elements||b;if(c!=a.length){return false}do{if(Math.abs(this.elements[c-1]-a[c-1])>Sylvester.precision){return false}}while(--c);return true},dup:function(){return Vector.create(this.elements)},map:function(a){var b=[];this.each(function(c,d){b.push(a(c,d))});return Vector.create(b)},each:function(c){var d=this.elements.length,a=d,b;do{b=a-d;c(this.elements[b],b+1)}while(--d)},toUnitVector:function(){var a=this.modulus();if(a===0){return this.dup()}return this.map(function(b){return b/a})},angleFrom:function(d){var e=d.elements||d;var c=this.elements.length,f=c,g;if(c!=e.length){return null}var a=0,m=0,l=0;this.each(function(k,n){a+=k*e[n-1];m+=k*k;l+=e[n-1]*e[n-1]});m=Math.sqrt(m);l=Math.sqrt(l);if(m*l===0){return null}var b=a/(m*l);if(b<-1){b=-1}if(b>1){b=1}return Math.acos(b)},isParallelTo:function(a){var b=this.angleFrom(a);return(b===null)?null:(b<=Sylvester.precision)},isAntiparallelTo:function(a){var b=this.angleFrom(a);return(b===null)?null:(Math.abs(b-Math.PI)<=Sylvester.precision)},isPerpendicularTo:function(a){var b=this.dot(a);return(b===null)?null:(Math.abs(b)<=Sylvester.precision)},add:function(b){var a=b.elements||b;if(this.elements.length!=a.length){return null}return this.map(function(c,d){return c+a[d-1]})},subtract:function(b){var a=b.elements||b;if(this.elements.length!=a.length){return null}return this.map(function(c,d){return c-a[d-1]})},multiply:function(a){return this.map(function(b){return b*a})},x:function(a){return this.multiply(a)},dot:function(b){var a=b.elements||b;var c,d=0,e=this.elements.length;if(e!=a.length){return null}do{d+=this.elements[e-1]*a[e-1]}while(--e);return d},cross:function(b){var c=b.elements||b;if(this.elements.length!=3||c.length!=3){return null}var a=this.elements;return Vector.create([(a[1]*c[2])-(a[2]*c[1]),(a[2]*c[0])-(a[0]*c[2]),(a[0]*c[1])-(a[1]*c[0])])},max:function(){var a=0,d=this.elements.length,b=d,c;do{c=b-d;if(Math.abs(this.elements[c])>Math.abs(a)){a=this.elements[c]}}while(--d);return a},indexOf:function(a){var c=null,e=this.elements.length,b=e,d;do{d=b-e;if(c===null&&this.elements[d]==a){c=d+1}}while(--e);return c},toDiagonalMatrix:function(){return Matrix.Diagonal(this.elements)},round:function(){return this.map(function(a){return Math.round(a)})},snapTo:function(a){return this.map(function(b){return(Math.abs(b-a)<=Sylvester.precision)?a:b})},distanceFrom:function(d){if(d.anchor){return d.distanceFrom(this)}var a=d.elements||d;if(a.length!=this.elements.length){return null}var c=0,b;this.each(function(e,f){b=e-a[f-1];c+=b*b});return Math.sqrt(c)},liesOn:function(a){return a.contains(this)},liesIn:function(a){return a.contains(this)},rotate:function(c,e){var b,d,a,i,g;switch(this.elements.length){case 2:b=e.elements||e;if(b.length!=2){return null}d=Matrix.Rotation(c).elements;a=this.elements[0]-b[0];i=this.elements[1]-b[1];return Vector.create([b[0]+d[0][0]*a+d[0][1]*i,b[1]+d[1][0]*a+d[1][1]*i]);break;case 3:if(!e.direction){return null}var f=e.pointClosestTo(this).elements;d=Matrix.Rotation(c,e.direction).elements;a=this.elements[0]-f[0];i=this.elements[1]-f[1];g=this.elements[2]-f[2];return Vector.create([f[0]+d[0][0]*a+d[0][1]*i+d[0][2]*g,f[1]+d[1][0]*a+d[1][1]*i+d[1][2]*g,f[2]+d[2][0]*a+d[2][1]*i+d[2][2]*g]);break;default:return null}},reflectionIn:function(c){if(c.anchor){var b=this.elements.slice();var d=c.pointClosestTo(b).elements;return Vector.create([d[0]+(d[0]-b[0]),d[1]+(d[1]-b[1]),d[2]+(d[2]-(b[2]||0))])}else{var a=c.elements||c;if(this.elements.length!=a.length){return null}return this.map(function(e,f){return a[f-1]+(a[f-1]-e)})}},to3D:function(){var a=this.dup();switch(a.elements.length){case 3:break;case 2:a.elements.push(0);break;default:return null}return a},inspect:function(){return"["+this.elements.join(", ")+"]"},setElements:function(a){this.elements=(a.elements||a).slice();return this}};Vector.create=function(b){var a=new Vector();return a.setElements(b)};Vector.i=Vector.create([1,0,0]);Vector.j=Vector.create([0,1,0]);Vector.k=Vector.create([0,0,1]);Vector.Random=function(b){var a=[];do{a.push(Math.random())}while(--b);return Vector.create(a)};Vector.Zero=function(b){var a=[];do{a.push(0)}while(--b);return Vector.create(a)};function Matrix(){}Matrix.prototype={e:function(b,a){if(b<1||b>this.elements.length||a<1||a>this.elements[0].length){return null}return this.elements[b-1][a-1]},row:function(a){if(a>this.elements.length){return null}return Vector.create(this.elements[a-1])},col:function(c){if(c>this.elements[0].length){return null}var b=[],e=this.elements.length,a=e,d;do{d=a-e;b.push(this.elements[d][c-1])}while(--e);return Vector.create(b)},dimensions:function(){return{rows:this.elements.length,cols:this.elements[0].length}},rows:function(){return this.elements.length},cols:function(){return this.elements[0].length},eql:function(a){var k=a.elements||a;if(typeof(k[0][0])=="undefined"){k=Matrix.create(k).elements}if(this.elements.length!=k.length||this.elements[0].length!=k[0].length){return false}var e=this.elements.length,g=e,d,c,f=this.elements[0].length,b;do{d=g-e;c=f;do{b=f-c;if(Math.abs(this.elements[d][b]-k[d][b])>Sylvester.precision){return false}}while(--c)}while(--e);return true},dup:function(){return Matrix.create(this.elements)},map:function(f){var e=[],d=this.elements.length,k=d,c,b,g=this.elements[0].length,a;do{c=k-d;b=g;e[c]=[];do{a=g-b;e[c][a]=f(this.elements[c][a],c+1,a+1)}while(--b)}while(--d);return Matrix.create(e)},isSameSizeAs:function(a){var b=a.elements||a;if(typeof(b[0][0])=="undefined"){b=Matrix.create(b).elements}return(this.elements.length==b.length&&this.elements[0].length==b[0].length)},add:function(a){var b=a.elements||a;if(typeof(b[0][0])=="undefined"){b=Matrix.create(b).elements}if(!this.isSameSizeAs(b)){return null}return this.map(function(c,e,d){return c+b[e-1][d-1]})},subtract:function(a){var b=a.elements||a;if(typeof(b[0][0])=="undefined"){b=Matrix.create(b).elements}if(!this.isSameSizeAs(b)){return null}return this.map(function(c,e,d){return c-b[e-1][d-1]})},canMultiplyFromLeft:function(a){var b=a.elements||a;if(typeof(b[0][0])=="undefined"){b=Matrix.create(b).elements}return(this.elements[0].length==b.length)},multiply:function(r){if(!r.elements){return this.map(function(c){return c*r})}var k=r.modulus?true:false;var o=r.elements||r;if(typeof(o[0][0])=="undefined"){o=Matrix.create(o).elements}if(!this.canMultiplyFromLeft(o)){return null}var e=this.elements.length,f=e,m,b,d=o[0].length,g;var q=this.elements[0].length,a=[],n,l,p;do{m=f-e;a[m]=[];b=d;do{g=d-b;n=0;l=q;do{p=q-l;n+=this.elements[m][p]*o[p][g]}while(--l);a[m][g]=n}while(--b)}while(--e);var o=Matrix.create(a);return k?o.col(1):o},x:function(a){return this.multiply(a)},minor:function(q,p,n,m){var e=[],g=n,l,f,k;var r=this.elements.length,o=this.elements[0].length;do{l=n-g;e[l]=[];f=m;do{k=m-f;e[l][k]=this.elements[(q+l-1)%r][(p+k-1)%o]}while(--f)}while(--g);return Matrix.create(e)},transpose:function(){var f=this.elements.length,g=this.elements[0].length;var e=[],d=g,c,b,a;do{c=g-d;e[c]=[];b=f;do{a=f-b;e[c][a]=this.elements[a][c]}while(--b)}while(--d);return Matrix.create(e)},isSquare:function(){return(this.elements.length==this.elements[0].length)},max:function(){var a=0,e=this.elements.length,g=e,d,c,f=this.elements[0].length,b;do{d=g-e;c=f;do{b=f-c;if(Math.abs(this.elements[d][b])>Math.abs(a)){a=this.elements[d][b]}}while(--c)}while(--e);return a},indexOf:function(a){var d=null,f=this.elements.length,k=f,e,c,g=this.elements[0].length,b;do{e=k-f;c=g;do{b=g-c;if(this.elements[e][b]==a){return{i:e+1,j:b+1}}}while(--c)}while(--f);return null},diagonal:function(){if(!this.isSquare){return null}var c=[],d=this.elements.length,a=d,b;do{b=a-d;c.push(this.elements[b][b])}while(--d);return Vector.create(c)},toRightTriangular:function(){var f=this.dup(),d;var b=this.elements.length,c=b,e,g,l=this.elements[0].length,a;do{e=c-b;if(f.elements[e][e]==0){for(j=e+1;j<c;j++){if(f.elements[j][e]!=0){d=[];g=l;do{a=l-g;d.push(f.elements[e][a]+f.elements[j][a])}while(--g);f.elements[e]=d;break}}}if(f.elements[e][e]!=0){for(j=e+1;j<c;j++){var m=f.elements[j][e]/f.elements[e][e];d=[];g=l;do{a=l-g;d.push(a<=e?0:f.elements[j][a]-f.elements[e][a]*m)}while(--g);f.elements[j]=d}}}while(--b);return f},toUpperTriangular:function(){return this.toRightTriangular()},determinant:function(){if(!this.isSquare()){return null}var e=this.toRightTriangular();var c=e.elements[0][0],d=e.elements.length-1,a=d,b;do{b=a-d+1;c=c*e.elements[b][b]}while(--d);return c},det:function(){return this.determinant()},isSingular:function(){return(this.isSquare()&&this.determinant()===0)},trace:function(){if(!this.isSquare()){return null}var c=this.elements[0][0],d=this.elements.length-1,a=d,b;do{b=a-d+1;c+=this.elements[b][b]}while(--d);return c},tr:function(){return this.trace()},rank:function(){var k=this.toRightTriangular(),g=0;var d=this.elements.length,f=d,c,b,e=this.elements[0].length,a;do{c=f-d;b=e;do{a=e-b;if(Math.abs(k.elements[c][a])>Sylvester.precision){g++;break}}while(--b)}while(--d);return g},rk:function(){return this.rank()},augment:function(m){var k=m.elements||m;if(typeof(k[0][0])=="undefined"){k=Matrix.create(k).elements}var e=this.dup(),l=e.elements[0].length;var c=e.elements.length,d=c,g,a,b=k[0].length,f;if(c!=k.length){return null}do{g=d-c;a=b;do{f=b-a;e.elements[g][l+f]=k[g][f]}while(--a)}while(--c);return e},inverse:function(){if(!this.isSquare()||this.isSingular()){return null}var c=this.elements.length,d=c,k,g;var l=this.augment(Matrix.I(c)).toRightTriangular();var m,n=l.elements[0].length,a,f,b;var o=[],e;do{k=c-1;f=[];m=n;o[k]=[];b=l.elements[k][k];do{a=n-m;e=l.elements[k][a]/b;f.push(e);if(a>=d){o[k].push(e)}}while(--m);l.elements[k]=f;for(g=0;g<k;g++){f=[];m=n;do{a=n-m;f.push(l.elements[g][a]-l.elements[k][a]*l.elements[g][k])}while(--m);l.elements[g]=f}}while(--c);return Matrix.create(o)},inv:function(){return this.inverse()},round:function(){return this.map(function(a){return Math.round(a)})},snapTo:function(a){return this.map(function(b){return(Math.abs(b-a)<=Sylvester.precision)?a:b})},inspect:function(){var c=[];var d=this.elements.length,a=d,b;do{b=a-d;c.push(Vector.create(this.elements[b]).inspect())}while(--d);return c.join("\n")},setElements:function(l){var o,a=l.elements||l;if(typeof(a[0][0])!="undefined"){var d=a.length,f=d,b,c,m;this.elements=[];do{o=f-d;b=a[o].length;c=b;this.elements[o]=[];do{m=c-b;this.elements[o][m]=a[o][m]}while(--b)}while(--d);return this}var e=a.length,g=e;this.elements=[];do{o=g-e;this.elements.push([a[o]])}while(--e);return this}};Matrix.create=function(a){var b=new Matrix();return b.setElements(a)};Matrix.I=function(f){var e=[],a=f,d,c,b;do{d=a-f;e[d]=[];c=a;do{b=a-c;e[d][b]=(d==b)?1:0}while(--c)}while(--f);return Matrix.create(e)};Matrix.Diagonal=function(c){var e=c.length,a=e,b;var d=Matrix.I(e);do{b=a-e;d.elements[b][b]=c[b]}while(--e);return d};Matrix.Rotation=function(b,k){if(!k){return Matrix.create([[Math.cos(b),-Math.sin(b)],[Math.sin(b),Math.cos(b)]])}var d=k.dup();if(d.elements.length!=3){return null}var i=d.modulus();var l=d.elements[0]/i,g=d.elements[1]/i,f=d.elements[2]/i;var n=Math.sin(b),e=Math.cos(b),m=1-e;return Matrix.create([[m*l*l+e,m*l*g-n*f,m*l*f+n*g],[m*l*g+n*f,m*g*g+e,m*g*f-n*l],[m*l*f-n*g,m*g*f+n*l,m*f*f+e]])};Matrix.RotationX=function(a){var d=Math.cos(a),b=Math.sin(a);return Matrix.create([[1,0,0],[0,d,-b],[0,b,d]])};Matrix.RotationY=function(a){var d=Math.cos(a),b=Math.sin(a);return Matrix.create([[d,0,b],[0,1,0],[-b,0,d]])};Matrix.RotationZ=function(a){var d=Math.cos(a),b=Math.sin(a);return Matrix.create([[d,-b,0],[b,d,0],[0,0,1]])};Matrix.Random=function(b,a){return Matrix.Zero(b,a).map(function(){return Math.random()})};Matrix.Zero=function(g,a){var f=[],e=g,d,c,b;do{d=g-e;f[d]=[];c=a;do{b=a-c;f[d][b]=0}while(--c)}while(--e);return Matrix.create(f)};function Line(){}Line.prototype={eql:function(a){return(this.isParallelTo(a)&&this.contains(a.anchor))},dup:function(){return Line.create(this.anchor,this.direction)},translate:function(b){var a=b.elements||b;return Line.create([this.anchor.elements[0]+a[0],this.anchor.elements[1]+a[1],this.anchor.elements[2]+(a[2]||0)],this.direction)},isParallelTo:function(b){if(b.normal){return b.isParallelTo(this)}var a=this.direction.angleFrom(b.direction);return(Math.abs(a)<=Sylvester.precision||Math.abs(a-Math.PI)<=Sylvester.precision)},distanceFrom:function(e){if(e.normal){return e.distanceFrom(this)}if(e.direction){if(this.isParallelTo(e)){return this.distanceFrom(e.anchor)}var k=this.direction.cross(e.direction).toUnitVector().elements;var c=this.anchor.elements,b=e.anchor.elements;return Math.abs((c[0]-b[0])*k[0]+(c[1]-b[1])*k[1]+(c[2]-b[2])*k[2])}else{var f=e.elements||e;var c=this.anchor.elements,a=this.direction.elements;var n=f[0]-c[0],l=f[1]-c[1],g=(f[2]||0)-c[2];var m=Math.sqrt(n*n+l*l+g*g);if(m===0){return 0}var i=(n*a[0]+l*a[1]+g*a[2])/m;var d=1-i*i;return Math.abs(m*Math.sqrt(d<0?0:d))}},contains:function(a){var b=this.distanceFrom(a);return(b!==null&&b<=Sylvester.precision)},liesIn:function(a){return a.contains(this)},intersects:function(a){if(a.normal){return a.intersects(this)}return(!this.isParallelTo(a)&&this.distanceFrom(a)<=Sylvester.precision)},intersectionWith:function(o){if(o.normal){return o.intersectionWith(this)}if(!this.intersects(o)){return null}var m=this.anchor.elements,b=this.direction.elements,l=o.anchor.elements,a=o.direction.elements;var x=b[0],v=b[1],u=b[2],i=a[0],g=a[1],e=a[2];var s=m[0]-l[0],r=m[1]-l[1],q=m[2]-l[2];var n=-x*s-v*r-u*q;var d=i*s+g*r+e*q;var f=x*x+v*v+u*u;var t=i*i+g*g+e*e;var c=x*i+v*g+u*e;var p=(n*t/f+c*d)/(t-c*c);return Vector.create([m[0]+p*x,m[1]+p*v,m[2]+p*u])},pointClosestTo:function(s){if(s.direction){if(this.intersects(s)){return this.intersectionWith(s)}if(this.isParallelTo(s)){return null}var u=this.direction.elements,t=s.direction.elements;var f=u[0],e=u[1],c=u[2],q=t[0],o=t[1],m=t[2];var r=(c*q-f*m),p=(f*o-e*q),n=(e*m-c*o);var l=Vector.create([r*m-p*o,p*q-n*m,n*o-r*q]);var i=Plane.create(s.anchor,l);return i.intersectionWith(this)}else{var i=s.elements||s;if(this.contains(i)){return Vector.create(i)}var v=this.anchor.elements,u=this.direction.elements;var f=u[0],e=u[1],c=u[2],d=v[0],b=v[1],a=v[2];var r=f*(i[1]-b)-e*(i[0]-d),p=e*((i[2]||0)-a)-c*(i[1]-b),n=c*(i[0]-d)-f*((i[2]||0)-a);var g=Vector.create([e*r-c*n,c*p-f*r,f*n-e*p]);var B=this.distanceFrom(i)/g.modulus();return Vector.create([i[0]+g.elements[0]*B,i[1]+g.elements[1]*B,(i[2]||0)+g.elements[2]*B])}},rotate:function(p,q){if(typeof(q.direction)=="undefined"){q=Line.create(q.to3D(),Vector.k)}var g=Matrix.Rotation(p,q.direction).elements;var b=q.pointClosestTo(this.anchor).elements;var d=this.anchor.elements,a=this.direction.elements;var l=b[0],k=b[1],i=b[2],f=d[0],e=d[1],c=d[2];var o=f-l,n=e-k,m=c-i;return Line.create([l+g[0][0]*o+g[0][1]*n+g[0][2]*m,k+g[1][0]*o+g[1][1]*n+g[1][2]*m,i+g[2][0]*o+g[2][1]*n+g[2][2]*m],[g[0][0]*a[0]+g[0][1]*a[1]+g[0][2]*a[2],g[1][0]*a[0]+g[1][1]*a[1]+g[1][2]*a[2],g[2][0]*a[0]+g[2][1]*a[1]+g[2][2]*a[2]])},reflectionIn:function(o){if(o.normal){var f=this.anchor.elements,b=this.direction.elements;var l=f[0],i=f[1],e=f[2],g=b[0],d=b[1],c=b[2];var a=this.anchor.reflectionIn(o).elements;var n=l+g,m=i+d,k=e+c;var p=o.pointClosestTo([n,m,k]).elements;var r=[p[0]+(p[0]-n)-a[0],p[1]+(p[1]-m)-a[1],p[2]+(p[2]-k)-a[2]];return Line.create(a,r)}else{if(o.direction){return this.rotate(Math.PI,o)}else{var q=o.elements||o;return Line.create(this.anchor.reflectionIn([q[0],q[1],(q[2]||0)]),this.direction)}}},setVectors:function(a,c){a=Vector.create(a);c=Vector.create(c);if(a.elements.length==2){a.elements.push(0)}if(c.elements.length==2){c.elements.push(0)}if(a.elements.length>3||c.elements.length>3){return null}var b=c.modulus();if(b===0){return null}this.anchor=a;this.direction=Vector.create([c.elements[0]/b,c.elements[1]/b,c.elements[2]/b]);return this}};Line.create=function(b,c){var a=new Line();return a.setVectors(b,c)};Line.X=Line.create(Vector.Zero(3),Vector.i);Line.Y=Line.create(Vector.Zero(3),Vector.j);Line.Z=Line.create(Vector.Zero(3),Vector.k);function Plane(){}Plane.prototype={eql:function(a){return(this.contains(a.anchor)&&this.isParallelTo(a))},dup:function(){return Plane.create(this.anchor,this.normal)},translate:function(b){var a=b.elements||b;return Plane.create([this.anchor.elements[0]+a[0],this.anchor.elements[1]+a[1],this.anchor.elements[2]+(a[2]||0)],this.normal)},isParallelTo:function(b){var a;if(b.normal){a=this.normal.angleFrom(b.normal);return(Math.abs(a)<=Sylvester.precision||Math.abs(Math.PI-a)<=Sylvester.precision)}else{if(b.direction){return this.normal.isPerpendicularTo(b.direction)}}return null},isPerpendicularTo:function(a){var b=this.normal.angleFrom(a.normal);return(Math.abs(Math.PI/2-b)<=Sylvester.precision)},distanceFrom:function(c){if(this.intersects(c)||this.contains(c)){return 0}if(c.anchor){var a=this.anchor.elements,e=c.anchor.elements,d=this.normal.elements;return Math.abs((a[0]-e[0])*d[0]+(a[1]-e[1])*d[1]+(a[2]-e[2])*d[2])}else{var b=c.elements||c;var a=this.anchor.elements,d=this.normal.elements;return Math.abs((a[0]-b[0])*d[0]+(a[1]-b[1])*d[1]+(a[2]-(b[2]||0))*d[2])}},contains:function(d){if(d.normal){return null}if(d.direction){return(this.contains(d.anchor)&&this.contains(d.anchor.add(d.direction)))}else{var b=d.elements||d;var a=this.anchor.elements,e=this.normal.elements;var c=Math.abs(e[0]*(a[0]-b[0])+e[1]*(a[1]-b[1])+e[2]*(a[2]-(b[2]||0)));return(c<=Sylvester.precision)}},intersects:function(a){if(typeof(a.direction)=="undefined"&&typeof(a.normal)=="undefined"){return null}return !this.isParallelTo(a)},intersectionWith:function(l){if(!this.intersects(l)){return null}if(l.direction){var d=l.anchor.elements,a=l.direction.elements,m=this.anchor.elements,o=this.normal.elements;var s=(o[0]*(m[0]-d[0])+o[1]*(m[1]-d[1])+o[2]*(m[2]-d[2]))/(o[0]*a[0]+o[1]*a[1]+o[2]*a[2]);return Vector.create([d[0]+a[0]*s,d[1]+a[1]*s,d[2]+a[2]*s])}else{if(l.normal){var r=this.normal.cross(l.normal).toUnitVector();var o=this.normal.elements,d=this.anchor.elements,n=l.normal.elements,c=l.anchor.elements;var t=Matrix.Zero(2,2),k=0;while(t.isSingular()){k++;t=Matrix.create([[o[k%3],o[(k+1)%3]],[n[k%3],n[(k+1)%3]]])}var f=t.inverse().elements;var q=o[0]*d[0]+o[1]*d[1]+o[2]*d[2];var p=n[0]*c[0]+n[1]*c[1]+n[2]*c[2];var b=[f[0][0]*q+f[0][1]*p,f[1][0]*q+f[1][1]*p];var g=[];for(var e=1;e<=3;e++){g.push((k==e)?0:b[(e+(5-k)%3)%3])}return Line.create(g,r)}}},pointClosestTo:function(b){var d=b.elements||b;var a=this.anchor.elements,e=this.normal.elements;var c=(a[0]-d[0])*e[0]+(a[1]-d[1])*e[1]+(a[2]-(d[2]||0))*e[2];return Vector.create([d[0]+e[0]*c,d[1]+e[1]*c,(d[2]||0)+e[2]*c])},rotate:function(p,q){var f=Matrix.Rotation(p,q.direction).elements;var a=q.pointClosestTo(this.anchor).elements;var c=this.anchor.elements,l=this.normal.elements;var k=a[0],i=a[1],g=a[2],e=c[0],d=c[1],b=c[2];var o=e-k,n=d-i,m=b-g;return Plane.create([k+f[0][0]*o+f[0][1]*n+f[0][2]*m,i+f[1][0]*o+f[1][1]*n+f[1][2]*m,g+f[2][0]*o+f[2][1]*n+f[2][2]*m],[f[0][0]*l[0]+f[0][1]*l[1]+f[0][2]*l[2],f[1][0]*l[0]+f[1][1]*l[1]+f[1][2]*l[2],f[2][0]*l[0]+f[2][1]*l[1]+f[2][2]*l[2]])},reflectionIn:function(f){if(f.normal){var c=this.anchor.elements,l=this.normal.elements;var e=c[0],d=c[1],b=c[2],o=l[0],n=l[1],m=l[2];var a=this.anchor.reflectionIn(f).elements;var r=e+o,q=d+n,p=b+m;var i=f.pointClosestTo([r,q,p]).elements;var g=[i[0]+(i[0]-r)-a[0],i[1]+(i[1]-q)-a[1],i[2]+(i[2]-p)-a[2]];return Plane.create(a,g)}else{if(f.direction){return this.rotate(Math.PI,f)}else{var k=f.elements||f;return Plane.create(this.anchor.reflectionIn([k[0],k[1],(k[2]||0)]),this.normal)}}},setVectors:function(k,p,o){k=Vector.create(k);k=k.to3D();if(k===null){return null}p=Vector.create(p);p=p.to3D();if(p===null){return null}if(typeof(o)=="undefined"){o=null}else{o=Vector.create(o);o=o.to3D();if(o===null){return null}}var f=k.elements[0],e=k.elements[1],d=k.elements[2];var l=p.elements[0],i=p.elements[1],g=p.elements[2];var m,n;if(o!==null){var c=o.elements[0],b=o.elements[1],a=o.elements[2];m=Vector.create([(i-e)*(a-d)-(g-d)*(b-e),(g-d)*(c-f)-(l-f)*(a-d),(l-f)*(b-e)-(i-e)*(c-f)]);n=m.modulus();if(n===0){return null}m=Vector.create([m.elements[0]/n,m.elements[1]/n,m.elements[2]/n])}else{n=Math.sqrt(l*l+i*i+g*g);if(n===0){return null}m=Vector.create([p.elements[0]/n,p.elements[1]/n,p.elements[2]/n])}this.anchor=k;this.normal=m;return this}};Plane.create=function(a,d,c){var b=new Plane();return b.setVectors(a,d,c)};Plane.XY=Plane.create(Vector.Zero(3),Vector.k);Plane.YZ=Plane.create(Vector.Zero(3),Vector.i);Plane.ZX=Plane.create(Vector.Zero(3),Vector.j);Plane.YX=Plane.XY;Plane.ZY=Plane.YZ;Plane.XZ=Plane.ZX;var $V=Vector.create;var $M=Matrix.create;var $L=Line.create;var $P=Plane.create;Matrix.Translation=function(a){if(a.elements.length==2){var b=Matrix.I(3);b.elements[2][0]=a.elements[0];b.elements[2][1]=a.elements[1];return b}if(a.elements.length==3){var b=Matrix.I(4);b.elements[0][3]=a.elements[0];b.elements[1][3]=a.elements[1];b.elements[2][3]=a.elements[2];return b}throw"Invalid length for Translation"};Matrix.prototype.flatten=function(){var a=[];if(this.elements.length==0){return[]}for(var b=0;b<this.elements[0].length;b++){for(var c=0;c<this.elements.length;c++){a.push(this.elements[c][b])}}return a};Matrix.prototype.ensure4x4=function(){if(this.elements.length==4&&this.elements[0].length==4){return this}if(this.elements.length>4||this.elements[0].length>4){return null}for(var b=0;b<this.elements.length;b++){for(var a=this.elements[b].length;a<4;a++){if(b==a){this.elements[b].push(1)}else{this.elements[b].push(0)}}}for(var b=this.elements.length;b<4;b++){if(b==0){this.elements.push([1,0,0,0])}else{if(b==1){this.elements.push([0,1,0,0])}else{if(b==2){this.elements.push([0,0,1,0])}else{if(b==3){this.elements.push([0,0,0,1])}}}}}return this};Matrix.prototype.make3x3=function(){if(this.elements.length!=4||this.elements[0].length!=4){return null}return Matrix.create([[this.elements[0][0],this.elements[0][1],this.elements[0][2]],[this.elements[1][0],this.elements[1][1],this.elements[1][2]],[this.elements[2][0],this.elements[2][1],this.elements[2][2]]])};Vector.prototype.flatten=function(){return this.elements};function mht(a){var c="";if(a.length==16){for(var b=0;b<4;b++){c+="<span style='font-family: monospace'>["+a[b*4+0].toFixed(4)+","+a[b*4+1].toFixed(4)+","+a[b*4+2].toFixed(4)+","+a[b*4+3].toFixed(4)+"]</span><br>"}}else{if(a.length==9){for(var b=0;b<3;b++){c+="<span style='font-family: monospace'>["+a[b*3+0].toFixed(4)+","+a[b*3+1].toFixed(4)+","+a[b*3+2].toFixed(4)+"]</font><br>"}}else{return a.toString()}}return c}function makeLookAt(s,r,q,d,c,a,g,f,e){var u=$V([s,r,q]);var v=$V([d,c,a]);var n=$V([g,f,e]);var b;var i=u.subtract(v).toUnitVector();var l=n.cross(i).toUnitVector();var k=i.cross(l).toUnitVector();var p=$M([[l.e(1),l.e(2),l.e(3),0],[k.e(1),k.e(2),k.e(3),0],[i.e(1),i.e(2),i.e(3),0],[0,0,0,1]]);var o=$M([[1,0,0,-s],[0,1,0,-r],[0,0,1,-q],[0,0,0,1]]);return p.x(o)}function makeOrtho(b,i,a,g,k,f){var e=-(i+b)/(i-b);var d=-(g+a)/(g-a);var c=-(f+k)/(f-k);return $M([[2/(i-b),0,0,e],[0,2/(g-a),0,d],[0,0,-2/(f-k),c],[0,0,0,1]])}function makePerspective(d,c,b,i){var a=b*Math.tan(d*Math.PI/360);var f=-a;var g=f*c;var e=a*c;return makeFrustum(g,e,f,a,b,i)}function makeFrustum(i,m,b,l,n,k){var g=2*n/(m-i);var e=2*n/(l-b);var f=(m+i)/(m-i);var d=(l+b)/(l-b);var c=-(k+n)/(k-n);var a=-2*k*n/(k-n);return $M([[g,0,f,0],[0,e,d,0],[0,0,c,a],[0,0,-1,0]])}function makeOrtho(b,i,a,g,k,f){var e=-(i+b)/(i-b);var d=-(g+a)/(g-a);var c=-(f+k)/(f-k);return $M([[2/(i-b),0,0,e],[0,2/(g-a),0,d],[0,0,-2/(f-k),c],[0,0,0,1]])}if(!self.bigshot){bigshot={};bigshot.Browser=function(){};bigshot.Browser.prototype={removeAllChildren:function(b){if(b.children.length>0){for(var a=b.children.length-1;a>=0;--a){b.removeChild(b.children[a])}}},mouseEnter:function(b){var a=this.isAChildOf;return function(c){var d=c.relatedTarget;if(this===d||a(this,d)){return}b.call(this,c)}},isAChildOf:function(b,a){if(b===a){return false}while(a&&a!==b){a=a.parentNode}return a===b},unregisterListener:function(d,b,c,a){if(typeof(d.removeEventListener)!="undefined"){d.removeEventListener(b,c,a)}else{if(typeof(d.detachEvent)!="undefined"){d.detachEvent("on"+b,c)}}},registerListener:function(a,b,d,c){if(typeof a.addEventListener!="undefined"){if(b==="mouseenter"){a.addEventListener("mouseover",this.mouseEnter(d),c)}else{if(b==="mouseleave"){a.addEventListener("mouseout",this.mouseEnter(d),c)}else{a.addEventListener(b,d,c)}}}else{if(typeof a.attachEvent!="undefined"){a.attachEvent("on"+b,d)}else{a["on"+b]=d}}},stopEventBubbling:function(a){if(a){if(a.stopPropagation){a.stopPropagation()}else{a.cancelBubble=true}}},stopEventBubblingHandler:function(){var a=this;return function(b){a.stopEventBubbling(b);return false}},stopMouseEventBubbling:function(a){this.registerListener(a,"mousedown",this.stopEventBubblingHandler(),false);this.registerListener(a,"mouseup",this.stopEventBubblingHandler(),false);this.registerListener(a,"mousemove",this.stopEventBubblingHandler(),false)},getElementSize:function(b){var a=new Object();if(b.clientWidth){a.w=b.clientWidth}if(b.clientHeight){a.h=b.clientHeight}return a},browserIsViewporting:function(){if(window.innerWidth<=screen.width){return false}else{return true}},getDevicePixelScale:function(){if(this.browserIsViewporting()){return screen.width/window.innerWidth}else{return 1}},getElementPosition:function(b){var a=new Object();a.x=0;a.y=0;var c=b;while(c){a.x+=c.offsetLeft;a.y+=c.offsetTop;if(c.clientLeft){a.x+=c.clientLeft}if(c.clientTop){a.y+=c.clientTop}if(c.x){a.x+=c.x}if(c.y){a.y+=c.y}c=c.offsetParent}return a},createXMLHttpRequest:function(){try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(a){}try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(a){}try{return new XMLHttpRequest()}catch(a){}alert("XMLHttpRequest not supported");return null}};bigshot.FullScreen=function(a){this.container=a;this.isFullScreen=false;this.savedBodyStyle=null;this.savedParent=null;this.savedSize=null;this.expanderDiv=null;this.restoreSize=false;this.onCloseHandlers=new Array();this.onResizeHandlers=new Array()};bigshot.FullScreen.prototype={browser:new bigshot.Browser(),getRootElement:function(){return this.div},addOnClose:function(a){this.onCloseHandlers.push(a)},onClose:function(){for(var a=0;a<this.onCloseHandlers.length;++a){this.onCloseHandlers[a]()}},addOnResize:function(a){this.onResizeHandlers.push(a)},onResize:function(){for(var a=0;a<this.onResizeHandlers.length;++a){this.onResizeHandlers[a]()}},open:function(){this.isFullScreen=true;this.savedParent=this.container.parentNode;this.savedSize={width:this.container.style.width,height:this.container.style.height};this.savedBodyStyle=document.body.style.cssText;document.body.style.overflow="hidden";this.expanderDiv=document.createElement("div");this.expanderDiv.style.position="absolute";this.expanderDiv.style.top="0px";this.expanderDiv.style.left="0px";this.expanderDiv.style.width=Math.max(window.innerWidth,document.documentElement.clientWidth)+"px";this.expanderDiv.style.height=Math.max(window.innerHeight,document.documentElement.clientHeight)+"px";document.body.appendChild(this.expanderDiv);this.div=document.createElement("div");this.div.style.position="fixed";this.div.style.top=window.pageYOffset+"px";this.div.style.left=window.pageXOffset+"px";this.div.style.width=window.innerWidth+"px";this.div.style.height=window.innerHeight+"px";this.div.style.zIndex="9998";this.div.appendChild(this.container);document.body.appendChild(this.div);var c=this;var b=function(f){setTimeout(function(){c.div.style.width=window.innerWidth+"px";c.div.style.height=window.innerHeight+"px";setTimeout(function(){c.onResize()},1)},1)};var d=function(f){c.expanderDiv.style.width=Math.max(window.innerWidth,document.documentElement.clientWidth)+"px";c.expanderDiv.style.height=Math.max(window.innerHeight,document.documentElement.clientHeight)+"px";setTimeout(function(){c.div.style.top=window.pageYOffset+"px";c.div.style.left=window.pageXOffset+"px";c.div.style.width=window.innerWidth+"px";c.div.style.height=window.innerHeight+"px";setTimeout(function(){c.onResize()},1)},1)};this.exitFullScreenHandler=function(){c.isFullScreen=false;c.browser.unregisterListener(document,"keydown",a);c.browser.unregisterListener(window,"resize",b);c.browser.unregisterListener(document.body,"orientationchange",d);if(c.restoreSize){c.container.style.width=c.savedSize.width;c.container.style.height=c.savedSize.height}document.body.style.cssText=c.savedBodyStyle;c.savedParent.appendChild(c.container);document.body.removeChild(c.div);document.body.removeChild(c.expanderDiv);c.onResize();c.onClose();setTimeout(function(){c.onResize()},1)};var a=function(f){if(f.keyCode==27){c.exitFullScreenHandler()}};this.browser.registerListener(document,"keydown",a,false);this.browser.registerListener(window,"resize",b,false);this.browser.registerListener(document.body,"orientationchange",d,false);this.onResize();return this.exitFullScreenHandler},close:function(){this.exitFullScreenHandler()}};bigshot.DataLoader=function(){};bigshot.DataLoader.prototype={loadImage:function(a,b){},loadXml:function(a,b,c){}};bigshot.DefaultDataLoader=function(a){this.maxRetries=a;if(!this.maxRetries){this.maxRetries=0}};bigshot.DefaultDataLoader.prototype={browser:new bigshot.Browser(),loadImage:function(a,d){var c=document.createElement("img");c.retries=0;var b=this;this.browser.registerListener(c,"load",function(){if(d){d(c)}},false);this.browser.registerListener(c,"error",function(){c.retries++;if(c.retries<=b.maxRetries){setTimeout(function(){c.src=a},c.retries*1000)}},false);c.src=a;return c},loadXml:function(c,a,f){for(var e=0;e<=this.maxRetries;++e){var d=this.browser.createXMLHttpRequest();d.open("GET",c,false);d.send(null);if(d.status==200){var b=d.responseXML;if(b!=null){if(f){f(b)}return b}}if(e==that.maxRetries){if(f){f(null)}return null}}}};bigshot.CachingDataLoader=function(){this.cache={};this.requested={};this.requestedTiles={}};bigshot.CachingDataLoader.prototype={browser:new bigshot.Browser(),loadImage:function(a,d){if(this.cache[a]){if(d){d(this.cache[a])}return this.cache[a]}else{if(this.requested[a]){if(d){this.requested[a].push(d)}return this.requestedTiles[a]}else{var c=this;this.requested[a]=new Array();if(d){this.requested[a].push(d)}var b=document.createElement("img");this.requestedTiles[a]=b;this.browser.registerListener(b,"load",function(){var f=c.requested[a];delete c.requested[a];delete c.requestedTiles[a];c.cache[a]=b;for(var e=0;e<f.length;++e){f[e](b)}},false);b.src=a;return b}}},loadXml:function(a,c,f){if(this.cache[a]){if(f){f(this.cache[a])}return this.cache[a]}else{if(this.requested[a]&&c){if(f){this.requested[a].push(f)}}else{var e=this.browser.createXMLHttpRequest();if(!this.requested[a]){this.requested[a]=new Array()}if(c){if(f){this.requested[a].push(f)}}var d=this;var b=function(){if(d.requested[a]){var g=null;if(e.status==200){g=e.responseXML}var l=d.requested[a];delete d.requested[a];d.cache[a]=g;for(var k=0;k<l.length;++k){l[k](g)}}return g};if(c){e.onreadystatechange=function(){if(e.readyState==4){b()}};e.open("GET",a,true);e.send()}else{e.open("GET",a,false);e.send();return b()}}}}};bigshot.object={extend:function(c,b){for(var a in b.prototype){if(c.prototype[a]){c.prototype[a]._super=b.prototype[a]}else{c.prototype[a]=b.prototype[a]}}},alertr:function(b){var c="";for(var a in b){c+=a+":"+b[a]+"\n"}alert(c)},logr:function(b){var c="";for(var a in b){c+=a+":"+b[a]+"\n"}if(console){console.log(c)}}};bigshot.Hotspot=function(a,e,b,d){var c=document.createElement("div");c.style.position="relative";c.style.overflow="visible";this.browser=new bigshot.Browser();this.element=c;this.x=a;this.y=e;this.w=b;this.h=d};bigshot.Hotspot.prototype={layout:function(c,e,d){var g=this.x*d+c;var f=this.y*d+e;var a=this.w*d;var b=this.h*d;this.element.style.top=f+"px";this.element.style.left=g+"px";this.element.style.width=a+"px";this.element.style.height=b+"px"},getElement:function(){return this.element}};bigshot.LabeledHotspot=function(a,e,b,c,d){bigshot.Hotspot.call(this,a,e,b,c);this.label=document.createElement("div");this.label.style.position="relative";this.label.style.display="inline-block";this.getElement().appendChild(this.label);this.label.innerHTML=d};bigshot.LabeledHotspot.prototype={getLabel:function(){return this.label},layout:function(d,f,e){this.layout._super.call(this,d,f,e);var b=this.browser.getElementSize(this.label);var a=this.w*e;var c=this.h*e;this.label.style.top=(c+4)+"px";this.label.style.left=((a-b.w)/2)+"px"}};bigshot.object.extend(bigshot.LabeledHotspot,bigshot.Hotspot);bigshot.LinkHotspot=function(a,f,b,d,e,c){bigshot.LabeledHotspot.call(this,a,f,b,d,e);this.browser.registerListener(this.getElement(),"click",function(){document.location.href=c})};bigshot.object.extend(bigshot.LinkHotspot,bigshot.LabeledHotspot);bigshot.HotspotLayer=function(a){this.hotspots=new Array();this.browser=new bigshot.Browser();this.container=a.createLayerContainer();this.parentContainer=a.getContainer();this.getContainer=function(){return this.container};this.resize=function(b,c){this.container.style.width=this.parentContainer.clientWidth+"px";this.container.style.height=this.parentContainer.clientHeight+"px"};this.layout=function(m,e,l,f,b,n,c,k){var d=Math.pow(2,m);e-=c*f;l-=c*b;for(var g=0;g<this.hotspots.length;++g){this.hotspots[g].layout(e,l,d)}};this.setMaxTiles=function(c,b){};this.addHotspot=function(b){this.container.appendChild(b.getElement());this.hotspots.push(b)};this.resize(0,0);return bigshot.object.extend(new bigshot.Layer(),this)};bigshot.TileLayer=function(d,c,a,b,e){this.rows=new Array();this.browser=new bigshot.Browser();this.container=d.createLayerContainer();this.parentContainer=d.getContainer();this.parameters=c;this.w=a;this.h=b;this.imageTileCache=e;this.getContainer=function(){return this.container};this.resize=function(f,i){this.container.style.width=this.parentContainer.clientWidth+"px";this.container.style.height=this.parentContainer.clientHeight+"px";this.w=f;this.h=i;this.rows=new Array();this.browser.removeAllChildren(this.container);for(var l=0;l<i;++l){var m=new Array();for(var n=0;n<f;++n){var g=document.createElement("div");g.style.position="absolute";g.style.overflow="hidden";g.style.width=this.container.clientWidth+"px";g.style.height=this.container.clientHeight+"px";var k=document.createElement("div");k.style.position="relative";k.style.visibility="hidden";k.style.border="hidden";m.push(k);this.container.appendChild(g);g.appendChild(k)}this.rows.push(m)}};this.layout=function(z,k,v,n,g,A,i,p){z=Math.min(0,Math.ceil(z));this.imageTileCache.resetUsed();var t=v;for(var f=0;f<this.h;++f){var u=k;for(var s=0;s<this.w;++s){var q=this.rows[f][s];q.style.left=u+"px";q.style.top=t+"px";q.style.visibility="";q.style.width=A+"px";q.style.height=A+"px";q.style.opacity=p;this.browser.removeAllChildren(q);var o=s+n;var m=f+g;if(this.parameters.wrapX){if(o<0||o>=this.imageTileCache.maxTileX){o=(o+this.imageTileCache.maxTileX)%this.imageTileCache.maxTileX}}if(this.parameters.wrapY){if(m<0||m>=this.imageTileCache.maxTileY){m=(m+this.imageTileCache.maxTileY)%this.imageTileCache.maxTileY}}var l=this.imageTileCache.getImage(o,m,z);l.style.width=A+"px";l.style.height=A+"px";q.appendChild(l);u+=i}t+=i}};this.setMaxTiles=function(g,f){this.imageTileCache.setMaxTiles(g,f)};this.resize(a,b);return this};bigshot.LRUMap=function(){this.keyToTime={};this.counter=0;this.size=0};bigshot.LRUMap.prototype={access:function(a){this.remove(a);this.keyToTime[a]=this.counter;++this.counter;++this.size},remove:function(a){if(this.keyToTime[a]){delete this.keyToTime[a];--this.size;return true}else{return false}},getSize:function(){return this.size},leastUsed:function(){var b=this.counter+1;var c=null;for(var a in this.keyToTime){if(this.keyToTime[a]<b){b=this.keyToTime[a];c=a}}return c}};bigshot.ImageTileCache=function(d,a,c){var b=this;this.parameters=c;this.fullImage=null;c.dataLoader.loadImage(c.fileSystem.getPosterFilename(),function(e){b.fullImage=e;if(a){a()}});this.maxCacheSize=512;this.maxTileX=0;this.maxTileY=0;this.cachedImages={};this.requestedImages={};this.usedImages={};this.lastOnLoadFiredAt=0;this.imageRequests=0;this.lruMap=new bigshot.LRUMap();this.onLoaded=d;this.browser=new bigshot.Browser();this.partialImageSize=c.tileSize/4;this.POSTER_ZOOM_LEVEL=Math.log(c.posterSize/Math.max(c.width,c.height))/Math.log(2)};bigshot.ImageTileCache.prototype={resetUsed:function(){this.usedImages={}},setMaxTiles:function(b,a){this.maxTileX=b;this.maxTileY=a},getPartialImage:function(c,b,d){var a=this.getPartialImageFromDownsampled(c,b,d,0,0,this.parameters.tileSize,this.parameters.tileSize);if(a==null){a=this.getPartialImageFromPoster(c,b,d)}return a},getPartialImageFromPoster:function(d,c,e){if(this.fullImage&&this.fullImage.complete){var a=this.fullImage.width/this.parameters.width;var b=a*this.parameters.tileSize/Math.pow(2,e);x0=Math.floor(b*d);y0=Math.floor(b*c);w=Math.floor(b);h=Math.floor(b);return this.createPartialImage(this.fullImage,this.fullImage.width,x0,y0,w,h)}else{return null}},createPartialImage:function(d,f,a,k,l,e){var b=document.createElement("canvas");if(!b.width){return null}b.width=this.partialImageSize;b.height=this.partialImageSize;var m=b.getContext("2d");var c=d.width/f;var i=Math.floor(a*c);var g=Math.floor(k*c);l*=c;if(i+l>=d.width){l=d.width-i-1}e*=c;if(g+e>=d.height){e=d.height-g-1}m.drawImage(d,i,g,l,e,-0.1,-0.1,this.partialImageSize+0.2,this.partialImageSize+0.2);return b},getPartialImageFromDownsampled:function(a,k,d,b,f,g,e){var i=this.getImageKey(a,k,d);var c=this.cachedImages[i];if(c==null){this.requestImage(a,k,d);if(d<this.POSTER_ZOOM_LEVEL){return null}}if(c){return this.createPartialImage(c,this.parameters.tileSize,b,f,g,e)}else{g/=2;e/=2;b/=2;f/=2;if((a%2)==1){b+=this.parameters.tileSize/2}if((k%2)==1){f+=this.parameters.tileSize/2}a=Math.floor(a/2);k=Math.floor(k/2);--d;return this.getPartialImageFromDownsampled(a,k,d,b,f,g,e)}},getEmptyImage:function(){var a=document.createElement("img");if(this.parameters.emptyImage){a.src=this.parameters.emptyImage}else{a.src="data:image/gif,GIF89a%01%00%01%00%80%00%00%00%00%00%FF%FF%FF!%F9%04%00%00%00%00%00%2C%00%00%00%00%01%00%01%00%00%02%02D%01%00%3B"}return a},getImage:function(e,d,f){if(e<0||d<0||e>=this.maxTileX||d>=this.maxTileY){return this.getEmptyImage()}var b=this.getImageKey(e,d,f);this.lruMap.access(b);if(this.cachedImages[b]){if(this.usedImages[b]){var c=this.parameters.dataLoader.loadImage(this.getImageFilename(e,d,f));return c}else{this.usedImages[b]=true;return this.cachedImages[b]}}else{var a=this.getPartialImage(e,d,f);if(a!=null){this.cachedImages[b]=a}else{a=this.getEmptyImage()}return a}},requestImage:function(d,c,e){var a=this.getImageKey(d,c,e);if(!this.requestedImages[a]){this.imageRequests++;var b=this;this.parameters.dataLoader.loadImage(this.getImageFilename(d,c,e),function(g){b.cachedImages[a]=g;delete b.requestedImages[a];b.imageRequests--;var f=new Date();if(b.imageRequests==0||f.getTime()>(b.lastOnLoadFiredAt+50)){b.purgeCache();b.lastOnLoadFiredAt=f.getTime();b.onLoaded()}});this.requestedImages[a]=true}},purgeCache:function(){for(var a=0;a<4;++a){if(this.lruMap.getSize()>this.maxCacheSize){var b=this.lruMap.leastUsed();this.lruMap.remove(b);delete this.cachedImages[b]}}},getImageKey:function(b,a,c){return"I"+b+"_"+a+"_"+c},getImageFilename:function(c,a,d){var b=this.parameters.fileSystem.getImageFilename(c,a,d);return b},};bigshot.Layer=function(){};bigshot.Layer.prototype={getContainer:function(){},setMaxTiles:function(a,b){},resize:function(a,b){},layout:function(g,e,f,a,d,c,i,b){}};bigshot.ImageParameters=function(b){this.posterSize=0;this.emptyImage=null;this.suffix=null;this.width=0;this.height=0;this.container=null;this.minZoom=0;this.tileSize=0;this.overlap=0;this.wrapX=false;this.wrapY=false;this.basePath=null;this.fileSystemType="folder";this.fileSystem=null;this.dataLoader=new bigshot.DefaultDataLoader();this.touchUI=false;if(b){for(var a in b){this[a]=b[a]}}this.merge=function(d,e){for(var c in d){if(e||!this[c]){this[c]=d[c]}}};return this};bigshot.Image=function(b){bigshot.setupFileSystem(b);b.merge(b.fileSystem.getDescriptor(),false);this.parameters=b;this.flying=0;this.container=b.container;this.x=b.width/2;this.y=b.height/2;this.zoom=0;this.width=b.width;this.height=b.height;this.minZoom=b.minZoom;this.maxZoom=2;this.tileSize=b.tileSize;this.overlap=0;this.imageTileCache=null;this.dragStart=null;this.dragged=false;this.layers=new Array();this.fullScreenHandler=null;this.currentGesture=null;var a=this;this.onresizeHandler=function(f){a.onresize()};var d=function(e){if(e.preventDefault){e.preventDefault()}return false};var c=function(e){if(e.clientX){return e}else{return{clientX:e.changedTouches[0].clientX,clientY:e.changedTouches[0].clientY}}};this.thisTileCache=new bigshot.ImageTileCache(function(){a.layout()},null,b);this.addLayer(new bigshot.TileLayer(this,b,0,0,this.thisTileCache));this.resize();this.browser.registerListener(b.container,"DOMMouseScroll",function(f){a.mouseWheel(f);return d(f)},false);this.browser.registerListener(b.container,"mousewheel",function(f){a.mouseWheel(f);return d(f)},false);this.browser.registerListener(b.container,"dblclick",function(f){a.mouseDoubleClick(f);return d(f)},false);this.browser.registerListener(b.container,"mousedown",function(f){a.dragMouseDown(f);return d(f)},false);this.browser.registerListener(b.container,"gesturestart",function(f){a.gestureStart(f);return d(f)},false);this.browser.registerListener(b.container,"gesturechange",function(f){a.gestureChange(f);return d(f)},false);this.browser.registerListener(b.container,"gestureend",function(f){a.gestureEnd(f);return d(f)},false);this.browser.registerListener(b.container,"touchstart",function(f){a.dragMouseDown(c(f));return d(f)},false);this.browser.registerListener(b.container,"mouseup",function(f){a.dragMouseUp(f);return d(f)},false);this.browser.registerListener(b.container,"touchend",function(f){a.dragMouseUp(c(f));return d(f)},false);this.browser.registerListener(b.container,"mousemove",function(f){a.dragMouseMove(f);return d(f)},false);this.browser.registerListener(b.container,"mouseout",function(f){return d(f)},false);this.browser.registerListener(b.container,"touchmove",function(f){a.dragMouseMove(c(f));return d(f)},false);this.browser.registerListener(window,"resize",a.onresizeHandler,false);this.zoomToFit();return this};bigshot.Image.prototype={browser:new bigshot.Browser(),layout:function(){var m=Math.min(0,Math.ceil(this.zoom));var e=Math.pow(2,m);var s=this.tileSize/e;var k=Math.pow(2,this.zoom-m);var d=this.tileSize*k;var n=this.width/s;var l=this.height/s;var g=this.x/s;var f=this.y/s;var o=this.container.clientWidth;var c=this.container.clientHeight;var b=g-(o/2)/d;var a=f-(c/2)/d;var r=Math.floor(b);var q=Math.floor(a);var u=Math.round((b-r)*d);var t=Math.round((a-q)*d);for(var p=0;p<this.layers.length;++p){this.layers[p].layout(this.zoom,-u-d,-t-d,r-1,q-1,Math.ceil(d),Math.ceil(d),1)}},resize:function(){var c=Math.ceil(2*this.container.clientWidth/this.tileSize)+2;var a=Math.ceil(2*this.container.clientHeight/this.tileSize)+2;for(var b=0;b<this.layers.length;++b){this.layers[b].resize(c,a)}},createLayerContainer:function(){var a=document.createElement("div");a.style.position="absolute";a.style.overflow="hidden";return a},getContainer:function(){return this.container},addLayer:function(a){this.container.appendChild(a.getContainer());this.layers.push(a)},setZoom:function(c,e){this.zoom=Math.min(this.maxZoom,Math.max(c,this.minZoom));var g=Math.ceil(this.zoom);var b=Math.pow(2,g);var f=Math.ceil(b*this.width/this.tileSize);var d=Math.ceil(b*this.height/this.tileSize);for(var a=0;a<this.layers.length;++a){this.layers[a].setMaxTiles(f,d)}},setMaxZoom:function(a){this.maxZoom=a},getMaxZoom:function(){return this.maxZoom},setMinZoom:function(a){this.minZoom=a},getMinZoom:function(){return this.minZoom},gestureStart:function(a){this.currentGesture={startZoom:this.zoom,scale:a.scale}},gestureEnd:function(a){this.currentGesture=null},gestureChange:function(b){if(this.currentGesture){var a=this.currentGesture.startZoom+Math.log(b.scale)/Math.log(2);this.setZoom(a);this.layout()}},dragMouseDown:function(a){this.dragStart={x:a.clientX,y:a.clientY};this.dragged=false},dragMouseMove:function(b){if(this.currentGesture==null&&this.dragStart!=null){var e={x:b.clientX-this.dragStart.x,y:b.clientY-this.dragStart.y};if(e.x!=0||e.y!=0){this.dragged=true}var a=Math.pow(2,this.zoom);var d=e.x/a;var c=e.y/a;this.moveTo(this.x-d,this.y-c);this.dragStart={x:b.clientX,y:b.clientY}}},dragMouseUp:function(a){if(this.dragStart!=null){this.dragStart=null;if(!this.dragged&&this.parameters.touchUI){this.mouseClick(a)}}},mouseDoubleClick:function(c){var a=this.browser.getElementPosition(this.container);var b={x:c.clientX-a.x-this.container.clientWidth/2,y:c.clientY-a.y-this.container.clientHeight/2};var d=Math.pow(2,this.zoom);b.x/=d;b.y/=d;this.flyTo(this.x+b.x,this.y+b.y,this.zoom+0.5)},getZoom:function(){return this.zoom},moveTo:function(a,c,b){this.stopFlying();if(a!=null||c!=null){this.setPosition(a,c,false)}if(b!=null){this.setZoom(b,false)}this.layout()},setPosition:function(a,c,b){if(a!=null){if(this.parameters.wrapX){if(a<0||a>=this.width){a=(a+this.width)%this.width}}this.x=Math.max(0,Math.min(this.width,a))}if(c!=null){if(this.parameters.wrapY){if(c<0||c>=this.height){c=(c+this.height)%this.height}}this.y=Math.max(0,Math.min(this.height,c))}if(b!=false){this.layout()}},fitZoom:function(c,a){var b=a/c;return Math.log(b)/Math.LN2},getZoomToFitValue:function(){return Math.min(this.fitZoom(this.parameters.width,this.container.clientWidth),this.fitZoom(this.parameters.height,this.container.clientHeight))},zoomToFit:function(){this.moveTo(null,null,this.getZoomToFitValue())},zoomToFitHeight:function(){this.moveTo(null,null,this.fitZoom(this.parameters.height,this.container.clientHeight))},zoomToFitWidth:function(){this.moveTo(null,null,this.fitZoom(this.parameters.width,this.container.clientWidth))},flyZoomToFitHeight:function(){this.flyTo(null,this.parameters.height/2,this.fitZoom(this.parameters.height,this.container.clientHeight))},flyZoomToFitWidth:function(){this.flyTo(this.parameters.width/2,null,this.fitZoom(this.parameters.width,this.container.clientWidth))},flyZoomToFit:function(){this.flyTo(this.parameters.width/2,this.parameters.height/2,this.getZoomToFitValue())},mouseWheelHandler:function(a){if(a>0){this.flyTo(this.x,this.y,this.getZoom()+0.5)}else{if(a<0){this.flyTo(this.x,this.y,this.getZoom()-0.5)}}},mouseWheel:function(a){var b=0;if(!a){a=window.event}if(a.wheelDelta){b=a.wheelDelta/120;if(window.opera){b=-b}}else{if(a.detail){b=-a.detail}}if(b){this.mouseWheelHandler(b)}if(a.preventDefault){a.preventDefault()}a.returnValue=false},onresize:function(){this.resize();this.layout()},getX:function(){return this.x},getY:function(){return this.y},stopFlying:function(){this.flying++},flyTo:function(i,f,l){var c=this;i=i!=null?i:this.x;f=f!=null?f:this.y;l=l!=null?l:this.zoom;var g=Math.max(0,Math.min(this.width,i));var d=Math.max(0,Math.min(this.height,f));var b=Math.min(this.maxZoom,Math.max(l,this.minZoom));this.flying++;var a=this.flying;var k=function(o,n,m){return o+(n-o)*m};var e=function(){if(c.flying==a){var m=k(c.x,g,0.5);var p=k(c.y,d,0.5);var o=k(c.zoom,b,0.5);var n=true;if(Math.abs(c.x-g)<1){m=g}else{n=false}if(Math.abs(c.y-d)<1){p=d}else{n=false}if(Math.abs(c.zoom-b)<0.02){o=b}else{n=false}c.setPosition(m,p,false);c.setZoom(o,false);c.layout();if(!n){setTimeout(e,20)}}};setTimeout(e,20)},rectVisibleAtZoomLevel:function(a,b){return Math.min(this.fitZoom(a,this.container.clientWidth),this.fitZoom(b,this.container.clientHeight))},getTouchAreaBaseSize:function(){var a=((this.container.clientWidth+this.container.clientHeight)/2)*0.2;return Math.min(a,Math.min(this.container.clientWidth,this.container.clientHeight)/6)},mouseClick:function(e){if(!this.parameters.touchUI){return}if(this.dragged){return}var b=this.browser.getElementPosition(this.container);var d={x:e.clientX-b.x-this.container.clientWidth/2,y:e.clientY-b.y-this.container.clientHeight/2};var a=this.getTouchAreaBaseSize();var g=this.getTouchAreaBaseSize();if(Math.abs(d.x)>(this.container.clientWidth/2-a)||Math.abs(d.y)>(this.container.clientHeight/2-a)){this.flyTo(this.x,this.y,this.zoom-0.5)}else{var c=this.zoom;if(Math.abs(d.x)<g&&Math.abs(d.y)<g){c+=0.5}var f=Math.pow(2,this.zoom);d.x/=f;d.y/=f;this.flyTo(this.x+d.x,this.y+d.y,c)}},showTouchUI:function(f,g){if(!f){f=2500}if(!g){g=1000}var a=this.getTouchAreaBaseSize();var n=this.getTouchAreaBaseSize();var e=this.container.clientWidth/2;var d=this.container.clientHeight/2;var o=document.createElement("div");o.style.position="absolute";o.style.zIndex="9999";o.style.opacity=0.9;o.style.width=this.container.clientWidth+"px";o.style.height=this.container.clientHeight+"px";var b=document.createElement("div");b.style.position="absolute";var m=document.createElement("div");m.style.position="relative";m.style.background="black";m.style.textAlign="center";m.style.top=(d-n)+"px";m.style.left=(e-n)+"px";m.style.width=(2*n)+"px";m.style.height=(2*n)+"px";o.appendChild(b);b.appendChild(m);m.innerHTML="<span style='display:inline-box; position:relative; vertical-align:middle; font-size: 20pt; top: 10pt; color:white'>ZOOM IN</span>";var c=document.createElement("div");c.style.position="absolute";var l=document.createElement("div");l.style.position="relative";l.style.border=a+"px solid black";l.style.top="0px";l.style.left="0px";l.style.textAlign="center";l.style.width=this.container.clientWidth+"px";l.style.height=this.container.clientHeight+"px";l.style.MozBoxSizing=l.style.boxSizing=l.style.WebkitBoxSizing="border-box";l.innerHTML="<span style='position:relative; font-size: 20pt; top: -25pt; color:white'>ZOOM OUT</span>";c.appendChild(l);o.appendChild(c);this.container.appendChild(o);var k=this;var i=0.9;var q=g/50;if(q<1){q=1}var p=function(){i=i-(0.9/q);if(i<0){k.container.removeChild(o)}else{o.style.opacity=i;setTimeout(p,50)}};setTimeout(p,f)},exitFullScreen:function(){if(this.fullScreenHandler){this.fullScreenHandler.close();this.fullScreenHandler=null;return}},fullScreen:function(a){if(this.fullScreenHandler){return}var c=document.createElement("div");c.style.position="absolute";c.style.fontSize="16pt";c.style.top="128px";c.style.width="100%";c.style.color="white";c.style.padding="16px";c.style.zIndex="9999";c.style.textAlign="center";c.style.opacity="0.75";c.innerHTML="<span style='border-radius: 16px; -moz-border-radius: 16px; padding: 16px; padding-left: 32px; padding-right: 32px; background:black'>Press Esc to exit full screen mode.</span>";var b=this;this.fullScreenHandler=new bigshot.FullScreen(this.container);this.fullScreenHandler.restoreSize=true;this.fullScreenHandler.addOnResize(function(){if(b.fullScreenHandler&&b.fullScreenHandler.isFullScreen){b.container.style.width=window.innerWidth+"px";b.container.style.height=window.innerHeight+"px"}b.onresize()});this.fullScreenHandler.addOnClose(function(){if(c.parentNode){try{div.removeChild(c)}catch(d){}}b.fullScreenHandler=null});if(a){this.fullScreenHandler.addOnClose(function(){a()})}this.fullScreenHandler.open();this.fullScreenHandler.getRootElement().appendChild(c);setTimeout(function(){var e=0.75;var d=function(){e-=0.02;if(c.parentNode){if(e<=0){try{div.removeChild(c)}catch(f){}}else{c.style.opacity=e;setTimeout(d,20)}}};setTimeout(d,20)},3500);return function(){b.fullScreenHandler.close()}},dispose:function(){this.browser.unregisterListener(window,"resize",this.onresizeHandler,false)}};bigshot.FileSystem=function(){};bigshot.FileSystem.prototype={getFilename:function(a){},getImageFilename:function(b,a,c){},setPrefix:function(a){},getDescriptor:function(){},getPosterFilename:function(){}};bigshot.setupFileSystem=function(a){if(!a.fileSystem){if(a.fileSystemType=="archive"){a.fileSystem=new bigshot.ArchiveFileSystem(a)}else{if(a.fileSystemType=="dzi"){a.fileSystem=new bigshot.DeepZoomImageFileSystem(a)}else{a.fileSystem=new bigshot.FolderFileSystem(a)}}}};bigshot.FolderFileSystem=function(a){this.prefix=null;this.suffix="";this.getDescriptor=function(){this.browser=new bigshot.Browser();var c=this.browser.createXMLHttpRequest();c.open("GET",this.getFilename("descriptor"),false);c.send(null);var d={};if(c.status==200){var e=c.responseText.split(":");for(var b=0;b<e.length;b+=2){if(e[b]=="suffix"){d[e[b]]=e[b+1]}else{d[e[b]]=parseInt(e[b+1])}}this.suffix=d.suffix;return d}else{throw new Error("Unable to find descriptor.")}};this.getPosterFilename=function(){return this.getFilename("poster"+this.suffix)};this.setPrefix=function(b){this.prefix=b};this.getPrefix=function(){if(this.prefix){return this.prefix+"/"}else{return""}};this.getFilename=function(b){return a.basePath+"/"+this.getPrefix()+b};this.getImageFilename=function(d,c,e){var b=(-e)+"/"+d+"_"+c+this.suffix;return this.getFilename(b)}};bigshot.DeepZoomImageFileSystem=function(a){this.prefix="";this.suffix="";this.DZ_NAMESPACE="http://schemas.microsoft.com/deepzoom/2009";this.fullZoomLevel=0;this.posterName="";this.parameters=a};bigshot.DeepZoomImageFileSystem.prototype={getDescriptor:function(){var e={};var b=this.parameters.dataLoader.loadXml(this.parameters.basePath+this.prefix+".xml",false);var d=b.getElementsByTagName("Image")[0];var c=b.getElementsByTagName("Size")[0];e.width=parseInt(c.getAttribute("Width"));e.height=parseInt(c.getAttribute("Height"));e.tileSize=parseInt(d.getAttribute("TileSize"));e.overlap=parseInt(d.getAttribute("Overlap"));e.suffix="."+d.getAttribute("Format");e.posterSize=e.tileSize;this.suffix=e.suffix;this.fullZoomLevel=Math.ceil(Math.log(Math.max(e.width,e.height))/Math.LN2);e.minZoom=-this.fullZoomLevel;var a=Math.ceil(Math.log(e.tileSize)/Math.LN2);this.posterName=this.getImageFilename(0,0,a-this.fullZoomLevel);return e},setPrefix:function(a){this.prefix=a},getPosterFilename:function(){return this.posterName},getFilename:function(a){return this.parameters.basePath+this.prefix+"/"+a},getImageFilename:function(d,c,e){var a=this.fullZoomLevel+e;var b=a+"/"+d+"_"+c+this.suffix;return this.getFilename(b)}};bigshot.ArchiveFileSystem=function(d){this.indexSize=0;this.offset=0;this.index={};this.prefix="";this.suffix="";this.parameters=d;var a=new bigshot.Browser();var c=a.createXMLHttpRequest();c.open("GET",this.parameters.basePath+"&start=0&length=24&type=text/plain",false);c.send(null);if(c.status==200){if(c.responseText.substring(0,7)!="BIGSHOT"){alert('"'+this.parameters.basePath+'" is not a valid bigshot file');return}this.indexSize=parseInt(c.responseText.substring(8),16);this.offset=this.indexSize+24;c.open("GET",this.parameters.basePath+"&type=text/plain&start=24&length="+this.indexSize,false);c.send(null);if(c.status==200){var e=c.responseText.split(":");for(var b=0;b<e.length;b+=3){this.index[e[b]]={start:parseInt(e[b+1])+this.offset,length:parseInt(e[b+2])}}}else{alert('The index of "'+this.parameters.basePath+'" could not be loaded: '+c.status)}}else{alert('The header of "'+this.parameters.basePath+'" could not be loaded: '+c.status)}return this};bigshot.ArchiveFileSystem.prototype={getDescriptor:function(){this.browser=new bigshot.Browser();var b=this.browser.createXMLHttpRequest();b.open("GET",this.getFilename("descriptor"),false);b.send(null);var c={};if(b.status==200){var d=b.responseText.split(":");for(var a=0;a<d.length;a+=2){if(d[a]=="suffix"){c[d[a]]=d[a+1]}else{c[d[a]]=parseInt(d[a+1])}}this.suffix=c.suffix;return c}else{throw new Error("Unable to find descriptor.")}},getPosterFilename:function(){return this.getFilename("poster"+this.suffix)},getFilename:function(a){a=this.getPrefix()+a;if(!this.index[a]&&console){console.log("Can't find "+a)}var b=this.parameters.basePath+"&start="+this.index[a].start+"&length="+this.index[a].length;if(a.substring(a.length-4)==".jpg"){b=b+"&type=image/jpeg"}else{if(a.substring(a.length-4)==".png"){b=b+"&type=image/png"}else{b=b+"&type=text/plain"}}return b},getImageFilename:function(c,b,d){var a=(-d)+"/"+c+"_"+b+this.suffix;return this.getFilename(a)},getPrefix:function(){if(this.prefix){return this.prefix+"/"}else{return""}},setPrefix:function(a){this.prefix=a}};bigshot.VRTileCache=function(){};bigshot.VRTileCache.prototype={getTexture:function(b,a,c){},purge:function(){}};bigshot.ImageVRTileCache=function(c,a,b){this.imageTileCache=new bigshot.ImageTileCache(c,a,b);this.imageTileCache.setMaxTiles(999999,999999)};bigshot.ImageVRTileCache.prototype={getTexture:function(c,b,d){var a=this.imageTileCache.getImage(c,b,d);return a},purge:function(){this.imageTileCache.resetUsed()}};bigshot.TextureTileCache=function(d,a,c,b){this.parameters=c;this.webGl=b;this.fullImage=c.dataLoader.loadImage(c.fileSystem.getPosterFilename(),a);this.maxTextureCacheSize=512;this.maxImageCacheSize=2048;this.cachedTextures={};this.cachedImages={};this.requestedImages={};this.lastOnLoadFiredAt=0;this.imageRequests=0;this.partialImageSize=c.tileSize/8;this.imageLruMap=new bigshot.LRUMap();this.textureLruMap=new bigshot.LRUMap();this.onLoaded=d;this.browser=new bigshot.Browser()};bigshot.TextureTileCache.prototype={getPartialTexture:function(b,p,e){if(this.fullImage.complete){var c=document.createElement("canvas");if(!c.width){return null}c.width=this.partialImageSize;c.height=this.partialImageSize;var o=c.getContext("2d");var q=this.parameters.posterSize/Math.max(this.parameters.width,this.parameters.height);var m=Math.floor(q*this.parameters.width);var d=Math.floor(q*this.parameters.height);var n=q*(this.parameters.tileSize-this.parameters.overlap)/Math.pow(2,e);var k=Math.floor(n*b);var i=Math.floor(n*p);var l=Math.floor(n);var f=Math.floor(n);var a=this.partialImageSize+2;var g=this.partialImageSize+2;if(k+l>m){l=m-k;a=this.partialImageSize*(l/Math.floor(n))}if(i+f>d){f=d-i;g=this.partialImageSize*(f/Math.floor(n))}o.drawImage(this.fullImage,k,i,l,f,-1,-1,a,g);return this.webGl.createImageTextureFromImage(c,this.parameters.textureMinFilter,this.parameters.textureMagFilter)}else{return null}},getTexture:function(d,c,e){var b=this.getImageKey(d,c,e);this.textureLruMap.access(b);this.imageLruMap.access(b);if(this.cachedTextures[b]){return this.cachedTextures[b]}else{if(this.cachedImages[b]){this.cachedTextures[b]=this.webGl.createImageTextureFromImage(this.cachedImages[b],this.parameters.textureMinFilter,this.parameters.textureMagFilter);return this.cachedTextures[b]}else{this.requestImage(d,c,e);var a=this.getPartialTexture(d,c,e);if(a){this.cachedTextures[b]=a}return a}}},requestImage:function(d,c,e){var a=this.getImageKey(d,c,e);if(!this.requestedImages[a]){this.imageRequests++;var b=this;this.parameters.dataLoader.loadImage(this.getImageFilename(d,c,e),function(g){if(b.cachedTextures[a]){b.webGl.gl.deleteTexture(b.cachedTextures[a])}b.cachedImages[a]=g;b.cachedTextures[a]=b.webGl.createImageTextureFromImage(g,b.parameters.textureMinFilter,b.parameters.textureMagFilter);delete b.requestedImages[a];b.imageRequests--;var f=new Date();if(b.imageRequests==0||f.getTime()>(b.lastOnLoadFiredAt+50)){b.lastOnLoadFiredAt=f.getTime();b.onLoaded()}});this.requestedImages[a]=true}},purge:function(){var a=this;this.purgeCache(this.textureLruMap,this.cachedTextures,this.maxTextureCacheSize,function(b){a.webGl.gl.deleteTexture(a.cachedTextures[b])});this.purgeCache(this.imageLruMap,this.cachedImages,this.maxImageCacheSize,function(b){})},purgeCache:function(b,c,a,e){for(var d=0;d<64;++d){if(b.getSize()>a){var f=b.leastUsed();b.remove(f);if(e){e(f)}delete c[f]}else{break}}},getImageKey:function(b,a,c){return"I"+b+"_"+a+"_"+c},getImageFilename:function(c,a,d){var b=this.parameters.fileSystem.getImageFilename(c,a,d);return b}};bigshot.VRFace=function(b,l,g,d,n,m,e){var i=this;this.owner=b;this.key=l;this.topLeft=g;this.width=d;this.u=n;this.v=m;this.updated=false;this.parameters=new Object();for(var f in this.owner.getParameters()){this.parameters[f]=this.owner.getParameters()[f]}bigshot.setupFileSystem(this.parameters);this.parameters.fileSystem.setPrefix("face_"+l);this.parameters.merge(this.parameters.fileSystem.getDescriptor(),false);this.tileCache=b.renderer.createTileCache(function(){i.updated=true;b.renderUpdated(bigshot.VRPanorama.ONRENDER_TEXTURE_UPDATE)},e,this.parameters);this.fullSize=this.parameters.width;this.overlap=this.parameters.overlap;this.tileSize=this.parameters.tileSize;this.minDivisions=0;var c=Math.log(this.fullSize-this.overlap)/Math.LN2;var a=Math.log(this.tileSize-this.overlap)/Math.LN2;this.maxDivisions=Math.floor(c-a);this.maxTesselation=this.parameters.maxTesselation>=0?this.parameters.maxTesselation:this.maxDivisions};bigshot.VRFace.prototype={browser:new bigshot.Browser(),pt3dMultAdd:function(d,b,c){return{x:d.x*b+c.x,y:d.y*b+c.y,z:d.z*b+c.z}},pt3dMult:function(b,a){return{x:b.x*a,y:b.y*a,z:b.z*a}},generateFace:function(g,e,d,b,a,c){d*=this.tileSize/(this.tileSize-this.overlap);var f=this.tileCache.getTexture(b,a,-this.maxDivisions+c);g.addQuad(this.owner.renderer.createTexturedQuad(e,this.pt3dMult(this.u,d),this.pt3dMult(this.v,d),f))},VISIBLE_NONE:0,VISIBLE_SOME:1,VISIBLE_ALL:2,pointInRect:function(b,c,a){return(b.x>=c.x&&b.y>=c.y&&b.x<a.x&&b.y<a.y)},intersectWithView:function(e){var a=0;var c=[];for(var k=0;k<e.length;++k){if(e[k]==null){a++}else{c.push(e[k])}}if(a==4){return this.VISIBLE_NONE}e=c;var g={x:e[0].x,y:e[0].y};var l={x:e[0].x,y:e[0].y};var m={x:0,y:0};var d={x:this.owner.renderer.getViewportWidth(),y:this.owner.renderer.getViewportHeight()};var b=0;for(var k=0;k<e.length;++k){g.x=Math.min(g.x,e[k].x);g.y=Math.min(g.y,e[k].y);l.x=Math.max(l.x,e[k].x);l.y=Math.max(l.y,e[k].y);if(this.pointInRect(e[k],m,d)){b++}}if(b==4){return this.VISIBLE_ALL}var n={x:Math.max(g.x,m.x),y:Math.max(g.y,m.y)};var f={x:Math.min(l.x,d.x),y:Math.min(l.y,d.y)};if(n.x<=f.x&&n.y<=f.y){return this.VISIBLE_SOME}return this.VISIBLE_NONE},screenDistance:function(b,a){if(b==null||a==null){return 0}return Math.max(Math.abs(b.x-a.x),Math.abs(b.y-a.y))},generateSubdivisionFace:function(n,r,b,c,l,g){var q=this.pt3dMultAdd(this.v,b,r);var f=this.pt3dMultAdd(this.u,b,r);var o=this.pt3dMultAdd(this.u,b,q);var e=[this.owner.renderer.transformToScreen([r.x,r.y,r.z]),this.owner.renderer.transformToScreen([f.x,f.y,f.z]),this.owner.renderer.transformToScreen([o.x,o.y,o.z]),this.owner.renderer.transformToScreen([q.x,q.y,q.z])];var s=this.intersectWithView(e);if(s==this.VISIBLE_NONE){return}var p=0;for(var k=0;k<e.length;++k){var m=(k+1)%4;p=Math.max(this.screenDistance(e[k],e[m]),p)}p*=this.owner.browser.getDevicePixelScale();if(c<this.minDivisions||((p>this.owner.maxTextureMagnification*(this.tileSize-this.overlap))&&c<this.maxDivisions&&c<this.maxTesselation)){var a=this.pt3dMultAdd({x:this.u.x+this.v.x,y:this.u.y+this.v.y,z:this.u.z+this.v.z},b/2,r);var t=this.pt3dMultAdd(this.u,b/2,r);var d=this.pt3dMultAdd(this.v,b/2,r);this.generateSubdivisionFace(n,r,b/2,c+1,l*2,g*2);this.generateSubdivisionFace(n,t,b/2,c+1,l*2+1,g*2);this.generateSubdivisionFace(n,d,b/2,c+1,l*2,g*2+1);this.generateSubdivisionFace(n,a,b/2,c+1,l*2+1,g*2+1)}else{this.generateFace(n,r,b,l,g,c)}},isUpdated:function(){return this.updated},render:function(a){this.updated=false;this.generateSubdivisionFace(a,this.topLeft,this.width,0,0,0)},endRender:function(){this.tileCache.purge()}};bigshot.webglutil={debug:false,contextNames:["webgl","experimental-webgl"],createContext0:function(a,b){var c=this.debug?WebGLDebugUtils.makeDebugContext(a.getContext(b)):a.getContext(b);return c},createContext:function(a){for(var b=0;b<this.contextNames.length;++b){try{var d=this.createContext0(a,this.contextNames[b]);if(d){return d}}catch(c){}}throw new Error("Could not initialize WebGL.")},isWebGLSupported:function(){var a=document.createElement("canvas");if(!a.width){return false}try{this.createContext(a);return true}catch(b){return false}}};bigshot.TransformStack=function(){this.mvMatrix=null;this.mvMatrixStack=[];this.reset()};bigshot.TransformStack.prototype={mvPushMatrix:function(a){if(a){this.mvMatrixStack.push(a.dup());this.mvMatrix=a.dup();return mvMatrix}else{this.mvMatrixStack.push(this.mvMatrix.dup());return mvMatrix}},mvPopMatrix:function(){if(this.mvMatrixStack.length==0){throw new Error("Invalid popMatrix!")}this.mvMatrix=this.mvMatrixStack.pop();return mvMatrix},reset:function(){this.mvMatrix=Matrix.I(4)},mvMultiply:function(a){this.mvMatrix=a.x(this.mvMatrix)},translate:function(b){var a=Matrix.Translation($V([b[0],b[1],b[2]])).ensure4x4();this.mvMultiply(a)},rotate:function(c,b){var d=c*Math.PI/180;var a=Matrix.Rotation(d,$V([b[0],b[1],b[2]])).ensure4x4();this.mvMultiply(a)},perspective:function(d,c,b,e){var a=makePerspective(d,c,b,e);this.mvMultiply(a)},matrix:function(){return this.mvMatrix}};bigshot.WebGL=function(a){this.canvas=a;this.gl=bigshot.webglutil.createContext(this.canvas);this.mvMatrix=new bigshot.TransformStack();this.pMatrix=new bigshot.TransformStack();this.shaderProgram=null;this.onresize()};bigshot.WebGL.prototype={onresize:function(){this.gl.viewportWidth=this.canvas.width;this.gl.viewportHeight=this.canvas.height},fragmentShader:"#ifdef GL_ES\n    precision highp float;\n#endif\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void) {\n    gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));\n}\n",vertexShader:"attribute vec3 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat4 uMVMatrix;\nuniform mat4 uPMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void) {\n    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);\n    vTextureCoord = aTextureCoord;\n}",createShader:function(c,a){var b=this.gl.createShader(a);this.gl.shaderSource(b,c);this.gl.compileShader(b);if(!this.gl.getShaderParameter(b,this.gl.COMPILE_STATUS)){alert(this.gl.getShaderInfoLog(b));return null}return b},createFragmentShader:function(a){return this.createShader(a,this.gl.FRAGMENT_SHADER)},createVertexShader:function(a){return this.createShader(a,this.gl.VERTEX_SHADER)},initShaders:function(){this.shaderProgram=this.gl.createProgram();this.gl.attachShader(this.shaderProgram,this.createVertexShader(this.vertexShader));this.gl.attachShader(this.shaderProgram,this.createFragmentShader(this.fragmentShader));this.gl.linkProgram(this.shaderProgram);if(!this.gl.getProgramParameter(this.shaderProgram,this.gl.LINK_STATUS)){throw new Error("Could not initialise shaders");return}this.gl.useProgram(this.shaderProgram);this.shaderProgram.vertexPositionAttribute=this.gl.getAttribLocation(this.shaderProgram,"aVertexPosition");this.gl.enableVertexAttribArray(this.shaderProgram.vertexPositionAttribute);this.shaderProgram.textureCoordAttribute=this.gl.getAttribLocation(this.shaderProgram,"aTextureCoord");this.gl.enableVertexAttribArray(this.shaderProgram.textureCoordAttribute);this.shaderProgram.pMatrixUniform=this.gl.getUniformLocation(this.shaderProgram,"uPMatrix");this.shaderProgram.mvMatrixUniform=this.gl.getUniformLocation(this.shaderProgram,"uMVMatrix");this.shaderProgram.samplerUniform=this.gl.getUniformLocation(this.shaderProgram,"uSampler")},setMatrixUniforms:function(){this.gl.uniformMatrix4fv(this.shaderProgram.pMatrixUniform,false,new Float32Array(this.pMatrix.matrix().flatten()));this.gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,false,new Float32Array(this.mvMatrix.matrix().flatten()))},createImageTextureFromImage:function(d,a,c){var b=this.gl.createTexture();this.handleImageTextureLoaded(this,b,d,a,c);return b},createImageTextureFromSource:function(e,a,d){var f=new Image();var c=this.gl.createTexture();var b=this;f.onload=function(){b.handleImageTextureLoaded(b,c,f,a,d)};f.src=e;return c},handleImageTextureLoaded:function(c,b,e,a,d){c.gl.bindTexture(c.gl.TEXTURE_2D,b);c.gl.texImage2D(c.gl.TEXTURE_2D,0,c.gl.RGBA,c.gl.RGBA,c.gl.UNSIGNED_BYTE,e);c.gl.texParameteri(c.gl.TEXTURE_2D,c.gl.TEXTURE_MAG_FILTER,d?d:c.gl.NEAREST);c.gl.texParameteri(c.gl.TEXTURE_2D,c.gl.TEXTURE_MIN_FILTER,a?a:c.gl.NEAREST);c.gl.texParameteri(c.gl.TEXTURE_2D,c.gl.TEXTURE_WRAP_S,c.gl.CLAMP_TO_EDGE);c.gl.texParameteri(c.gl.TEXTURE_2D,c.gl.TEXTURE_WRAP_T,c.gl.CLAMP_TO_EDGE);if(a==c.gl.NEAREST_MIPMAP_NEAREST||a==c.gl.LINEAR_MIPMAP_NEAREST||a==c.gl.NEAREST_MIPMAP_LINEAR||a==c.gl.LINEAR_MIPMAP_LINEAR){c.gl.generateMipmap(c.gl.TEXTURE_2D)}c.gl.bindTexture(c.gl.TEXTURE_2D,null)},transformToWorld:function(a){var b=$V([a[0],a[1],a[2],1]);var c=this.mvMatrix.matrix().x(b);return c},transformWorldToScreen:function(c){if(c.e(3)>0){return null}var a=this.pMatrix.matrix().x(c);if(Math.abs(a.e(4))<Sylvester.precision){return null}var b={x:(this.gl.viewportWidth/2)*a.e(1)/a.e(4)+this.gl.viewportWidth/2,y:-(this.gl.viewportHeight/2)*a.e(2)/a.e(4)+this.gl.viewportHeight/2};return b},transformToScreen:function(a){var b=this.transformToWorld(a);return this.transformWorldToScreen(b)}};bigshot.VRRenderer=function(){this.createTileCache=function(c,a,b){};this.createTexturedQuadScene=function(){};this.createTexturedQuad=function(d,b,a,c){};this.getViewportWidth=function(){};this.getViewportHeight=function(){};this.transformToWorld=function(a){};this.transformWorldToScreen=function(a){};this.transformToScreen=function(a){};this.beginRender=function(k,a,f,g,d,c,b,i,e){};this.endRender=function(){};this.onresize=function(){};this.resize=function(a,b){}};bigshot.CSS3DVRRenderer=function(a){this.container=a;this.canvasOrigin=document.createElement("div");this.canvasOrigin.style.WebkitTransformOrigin="0px 0px 0px";this.canvasOrigin.style.WebkitTransformStyle="preserve-3d";this.canvasOrigin.style.WebkitPerspective="600px";this.canvasOrigin.style.position="relative";this.canvasOrigin.style.left="50%";this.canvasOrigin.style.top="50%";this.container.appendChild(this.canvasOrigin);this.viewport=document.createElement("div");this.viewport.style.WebkitTransformOrigin="0px 0px 0px";this.viewport.style.WebkitTransformStyle="preserve-3d";this.canvasOrigin.appendChild(this.viewport);this.world=document.createElement("div");this.world.style.WebkitTransformOrigin="0px 0px 0px";this.world.style.WebkitTransformStyle="preserve-3d";this.viewport.appendChild(this.world);this.browser.removeAllChildren(this.world);this.view=null;this.mvMatrix=new bigshot.TransformStack();this.yaw=0;this.pitch=0;this.fov=0;this.pMatrix=new bigshot.TransformStack();this.onresize=function(){}};bigshot.CSS3DVRRenderer.prototype={browser:new bigshot.Browser(),createTileCache:function(c,a,b){return new bigshot.ImageVRTileCache(c,a,b)},createTexturedQuadScene:function(){return new bigshot.CSS3DTexturedQuadScene(this.world,128,this.view)},createTexturedQuad:function(d,b,a,c){return new bigshot.CSS3DTexturedQuad(d,b,a,c)},supportsUpdate:function(){return false},getViewportWidth:function(){return this.browser.getElementSize(this.container).w},getViewportHeight:function(){return this.browser.getElementSize(this.container).h},resize:function(a,b){if(this.container.style.width!=""){this.container.style.width=a+"px"}if(this.container.style.height!=""){this.container.style.height=b+"px"}},transformToWorld:function(a){var b=$V([a[0],a[1],a[2],1]);var c=this.mvMatrix.matrix().x(b);return c},transformWorldToScreen:function(c){if(c.e(3)>0){return null}var a=this.pMatrix.matrix().x(c);if(Math.abs(a.e(4))<Sylvester.precision){return null}var b={x:(this.getViewportWidth()/2)*a.e(1)/a.e(4)+this.getViewportWidth()/2,y:-(this.getViewportHeight()/2)*a.e(2)/a.e(4)+this.getViewportHeight()/2};return b},transformToScreen:function(a){var b=this.transformToWorld(a);return this.transformWorldToScreen(b)},beginRender:function(q,a,g,k,d,c,b,l,f){this.yaw=q;this.pitch=a;this.fov=g;var o=0.5*g*Math.PI/180;var n=this.getViewportHeight()/2;var m=n/Math.tan(o);this.mvMatrix.reset();this.mvMatrix.translate([k,d,c]);this.view={x:k,y:d,z:c};this.mvMatrix.rotate(f,[0,0,1]);this.mvMatrix.rotate(l,[1,0,0]);this.mvMatrix.rotate(b,[0,1,0]);this.mvMatrix.rotate(this.yaw,[0,1,0]);this.mvMatrix.rotate(this.pitch,[1,0,0]);this.pMatrix.reset();this.pMatrix.perspective(this.fov,this.getViewportWidth()/this.getViewportHeight(),0.1,100);this.canvasOrigin.style.WebkitPerspective=m+"px";for(var e=this.world.children.length-1;e>=0;--e){this.world.children[e].inWorld=1}this.world.style.WebkitTransform="rotate3d(1,0,0,"+(-a)+"deg) rotate3d(0,1,0,"+q+"deg) rotate3d(0,1,0,"+(b)+"deg) rotate3d(1,0,0,"+(-l)+"deg) rotate3d(0,0,1,"+(-f)+"deg) ";this.world.style.WebkitTransformStyle="preserve-3d";this.world.style.WebKitBackfaceVisibility="hidden";this.viewport.style.WebkitTransform="translateZ("+m+"px)"},endRender:function(){for(var a=this.world.children.length-1;a>=0;--a){var b=this.world.children[a];if(!b.inWorld||b.inWorld!=2){delete b.inWorld;this.world.removeChild(b)}}}};bigshot.CSS3DTexturedQuad=function(d,b,a,c){this.p=d;this.u=b;this.v=a;this.image=c};bigshot.CSS3DTexturedQuad.prototype={crossProduct:function(e,d){var c=[e[1]*d[2]-e[2]*d[1],e[2]*d[0]-e[0]*d[2],e[0]*d[1]-e[1]*d[0]];return c},vecToStr:function(a){return(a[0])+","+(a[1])+","+(a[2])},quadTransform:function(c,d,b){var a=this.crossProduct(d,b);var e="matrix3d("+this.vecToStr(d)+",0,"+this.vecToStr(b)+",0,"+this.vecToStr(a)+",0,"+this.vecToStr(c)+",1)";return e},norm:function(a){return Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z)},render:function(e,i,a){var d=i/(this.image.width-1);var g=i*1;var f=this.p;var c=this.u;var b=this.v;this.image.style.position="absolute";if(!this.image.inWorld||this.image.inWorld!=1){e.appendChild(this.image)}this.image.inWorld=2;this.image.style.WebkitTransformOrigin="0px 0px 0px";this.image.style.WebkitTransform=this.quadTransform([(f.x+a.x)*g,(-f.y+a.y)*g,(f.z+a.z)*g],[c.x*d,-c.y*d,c.z*d],[b.x*d,-b.y*d,b.z*d])}};bigshot.CSS3DTexturedQuadScene=function(b,c,a){this.quads=new Array();this.world=b;this.scale=c;this.view=a};bigshot.CSS3DTexturedQuadScene.prototype={addQuad:function(a){this.quads.push(a)},render:function(){for(var a=0;a<this.quads.length;++a){this.quads[a].render(this.world,this.scale,this.view)}}};bigshot.TexturedQuadScene=function(){};bigshot.TexturedQuadScene.prototype={addQuad:function(a){},render:function(){}};bigshot.WebGLVRRenderer=function(a){this.container=a;this.canvas=document.createElement("canvas");this.canvas.width=480;this.canvas.height=480;this.canvas.style.position="absolute";this.container.appendChild(this.canvas);this.webGl=new bigshot.WebGL(this.canvas);this.webGl.initShaders();this.webGl.gl.clearColor(0,0,0,1);this.webGl.gl.blendFunc(this.webGl.gl.ONE,this.webGl.gl.ZERO);this.webGl.gl.enable(this.webGl.gl.BLEND);this.webGl.gl.disable(this.webGl.gl.DEPTH_TEST);this.webGl.gl.clearDepth(1)};bigshot.WebGLVRRenderer.prototype={createTileCache:function(c,a,b){return new bigshot.TextureTileCache(c,a,b,this.webGl)},createTexturedQuadScene:function(){return new bigshot.WebGLTexturedQuadScene(this.webGl)},supportsUpdate:function(){return false},createTexturedQuad:function(d,b,a,c){return new bigshot.WebGLTexturedQuad(d,b,a,c)},getViewportWidth:function(){return this.webGl.gl.viewportWidth},getViewportHeight:function(){return this.webGl.gl.viewportHeight},transformToWorld:function(a){return this.webGl.transformToWorld(a)},transformToScreen:function(a){return this.webGl.transformToScreen(a)},transformWorldToScreen:function(a){return this.webGl.transformWorldToScreen(a)},beginRender:function(k,a,f,g,d,c,b,i,e){this.webGl.gl.viewport(0,0,this.webGl.gl.viewportWidth,this.webGl.gl.viewportHeight);this.webGl.pMatrix.reset();this.webGl.pMatrix.perspective(f,this.webGl.gl.viewportWidth/this.webGl.gl.viewportHeight,0.1,100);this.webGl.mvMatrix.reset();this.webGl.mvMatrix.translate([g,d,c]);this.webGl.mvMatrix.rotate(e,[0,0,1]);this.webGl.mvMatrix.rotate(i,[1,0,0]);this.webGl.mvMatrix.rotate(b,[0,1,0]);this.webGl.mvMatrix.rotate(k,[0,1,0]);this.webGl.mvMatrix.rotate(a,[1,0,0])},endRender:function(){},resize:function(a,b){this.canvas.width=a;this.canvas.height=b;if(this.container.style.width!=""){this.container.style.width=a+"px"}if(this.container.style.height!=""){this.container.style.height=b+"px"}},onresize:function(){this.webGl.onresize()}};bigshot.TexturedQuad=function(){};bigshot.WebGLTexturedQuad=function(d,b,a,c){this.p=d;this.u=b;this.v=a;this.texture=c};bigshot.WebGLTexturedQuad.prototype={render:function(e){var d=e.gl.createBuffer();e.gl.bindBuffer(e.gl.ARRAY_BUFFER,d);var b=[this.p.x,this.p.y,this.p.z,this.p.x+this.u.x,this.p.y+this.u.y,this.p.z+this.u.z,this.p.x+this.u.x+this.v.x,this.p.y+this.u.y+this.v.y,this.p.z+this.u.z+this.v.z,this.p.x+this.v.x,this.p.y+this.v.y,this.p.z+this.v.z];e.gl.bufferData(e.gl.ARRAY_BUFFER,new Float32Array(b),e.gl.STATIC_DRAW);var a=e.gl.createBuffer();e.gl.bindBuffer(e.gl.ARRAY_BUFFER,a);var f=[0,0,1,0,1,1,0,1];e.gl.bufferData(e.gl.ARRAY_BUFFER,new Float32Array(f),e.gl.STATIC_DRAW);var c=e.gl.createBuffer();e.gl.bindBuffer(e.gl.ELEMENT_ARRAY_BUFFER,c);var g=[0,2,1,0,3,2];e.gl.bufferData(e.gl.ELEMENT_ARRAY_BUFFER,new Uint16Array(g),e.gl.STATIC_DRAW);e.gl.bindBuffer(e.gl.ARRAY_BUFFER,a);e.gl.vertexAttribPointer(e.shaderProgram.textureCoordAttribute,2,e.gl.FLOAT,false,0,0);e.gl.bindBuffer(e.gl.ARRAY_BUFFER,d);e.gl.vertexAttribPointer(e.shaderProgram.vertexPositionAttribute,3,e.gl.FLOAT,false,0,0);e.gl.activeTexture(e.gl.TEXTURE0);e.gl.bindTexture(e.gl.TEXTURE_2D,this.texture);e.gl.uniform1i(e.shaderProgram.samplerUniform,0);e.gl.bindBuffer(e.gl.ELEMENT_ARRAY_BUFFER,c);e.setMatrixUniforms();e.gl.drawElements(e.gl.TRIANGLES,6,e.gl.UNSIGNED_SHORT,0);e.gl.deleteBuffer(d);e.gl.deleteBuffer(c);e.gl.deleteBuffer(a)}};bigshot.WebGLTexturedQuadScene=function(a){this.quads=new Array();this.webGl=a};bigshot.WebGLTexturedQuadScene.prototype={addQuad:function(a){this.quads.push(a)},render:function(){for(var a=0;a<this.quads.length;++a){this.quads[a].render(this.webGl)}}};bigshot.VRPanoramaParameters=function(b){this.posterSize=0;this.emptyImage=null;this.suffix=null;this.width=0;this.height=0;this.container=null;this.maxTesselation=-1;this.tileSize=0;this.overlap=0;this.basePath=null;this.fileSystemType="folder";this.fileSystem=null;this.dataLoader=new bigshot.DefaultDataLoader();this.maxTextureMagnification=1;this.textureMagFilter=null;this.textureMinFilter=null;this.minFov=2;this.maxFov=90;this.minPitch=-90;this.maxPitch=90;this.minYaw=-360;this.maxYaw=720;this.yawOffset=0;this.pitchOffset=0;this.rollOffset=0;this.onload=null;this.renderer=null;if(b){for(var a in b){this[a]=b[a]}}this.merge=function(d,e){for(var c in d){if(e||!this[c]){this[c]=d[c]}}};return this};bigshot.VRPanorama=function(d){var c=this;this.parameters=d;this.maxTextureMagnification=d.maxTextureMagnification;this.container=d.container;this.browser=new bigshot.Browser();this.dragStart=null;this.dragDistance=0;this.hotspots=[];this.transformOffsets={yaw:d.yawOffset,pitch:d.pitchOffset,roll:d.rollOffset};this.state={p:0,y:0,fov:45,tx:0,ty:0,tz:0};this.renderer=null;if(this.parameters.renderer){if(this.parameters.renderer=="css"){this.renderer=new bigshot.CSS3DVRRenderer(this.container)}else{if(this.parameters.renderer=="webgl"){this.renderer=new bigshot.WebGLVRRenderer(this.container)}else{throw new Error("Unknown renderer: "+this.parameters.renderer)}}}else{this.renderer=bigshot.webglutil.isWebGLSupported()?new bigshot.WebGLVRRenderer(this.container):new bigshot.CSS3DVRRenderer(this.container)}this.renderListeners=new Array();this.renderables=new Array();this.idleCounter=0;this.maxIdleCounter=-1;this.smoothrotatePermit=0;var f=function(g){if(g.preventDefault){g.preventDefault()}return false};this.fullScreenHandler=null;this.renderAsapPermitTaken=false;this.sizeContainer=null;var a={facesLeft:6,faceLoaded:function(){this.facesLeft--;if(this.facesLeft==0){if(c.parameters.onload){c.parameters.onload()}}}};var b=function(){a.faceLoaded()};this.vrFaces=new Array();this.vrFaces[0]=new bigshot.VRFace(this,"f",{x:-1,y:1,z:-1},2,{x:1,y:0,z:0},{x:0,y:-1,z:0},b);this.vrFaces[1]=new bigshot.VRFace(this,"b",{x:1,y:1,z:1},2,{x:-1,y:0,z:0},{x:0,y:-1,z:0},b);this.vrFaces[2]=new bigshot.VRFace(this,"l",{x:-1,y:1,z:1},2,{x:0,y:0,z:-1},{x:0,y:-1,z:0},b);this.vrFaces[3]=new bigshot.VRFace(this,"r",{x:1,y:1,z:-1},2,{x:0,y:0,z:1},{x:0,y:-1,z:0},b);this.vrFaces[4]=new bigshot.VRFace(this,"u",{x:-1,y:1,z:1},2,{x:1,y:0,z:0},{x:0,y:0,z:-1},b);this.vrFaces[5]=new bigshot.VRFace(this,"d",{x:-1,y:-1,z:-1},2,{x:1,y:0,z:0},{x:0,y:0,z:1},b);var e=function(g){if(g.clientX){return g}else{return{clientX:g.changedTouches[0].clientX,clientY:g.changedTouches[0].clientY}}};this.browser.registerListener(this.container,"mousedown",function(g){c.resetIdle();c.dragMouseDown(g);return f(g)},false);this.browser.registerListener(this.container,"mouseup",function(g){c.resetIdle();c.dragMouseUp(g);return f(g)},false);this.browser.registerListener(this.container,"mousemove",function(g){c.resetIdle();c.dragMouseMove(g);return f(g)},false);this.browser.registerListener(d.container,"gesturestart",function(g){c.gestureStart(g);return f(g)},false);this.browser.registerListener(d.container,"gesturechange",function(g){c.gestureChange(g);return f(g)},false);this.browser.registerListener(d.container,"gestureend",function(g){c.gestureEnd(g);return f(g)},false);this.browser.registerListener(d.container,"DOMMouseScroll",function(g){c.resetIdle();c.mouseWheel(g);return f(g)},false);this.browser.registerListener(d.container,"mousewheel",function(g){c.resetIdle();c.mouseWheel(g);return f(g)},false);this.browser.registerListener(d.container,"dblclick",function(g){c.mouseDoubleClick(g);return f(g)},false);this.lastTouchStartAt=-1;this.browser.registerListener(d.container,"touchstart",function(g){c.lastTouchStartAt=new Date().getTime();c.resetIdle();c.dragMouseDown(e(g));return f(g)},false);this.browser.registerListener(d.container,"touchend",function(g){c.resetIdle();c.dragMouseUp(e(g));if(c.lastTouchStartAt>new Date().getTime()-350){c.mouseDoubleClick(e(g))}c.lastTouchStartAt=-1;return f(g)},false);this.browser.registerListener(d.container,"touchmove",function(g){if(c.dragDistance>24){c.lastTouchStartAt=-1}c.resetIdle();c.dragMouseMove(e(g));return f(g)},false);this.browser.registerListener(window,"resize",this.onresizeHandler,false);this.setPitch(0);this.setYaw(0);this.setFov(45)};bigshot.VRPanorama.DRAG_GRAB="grab";bigshot.VRPanorama.DRAG_PAN="pan";bigshot.VRPanorama.ONRENDER_BEGIN=0;bigshot.VRPanorama.ONRENDER_END=1;bigshot.VRPanorama.ONRENDER_TEXTURE_UPDATE=0;bigshot.VRPanorama.prototype={addHotspot:function(a){this.hotspots.push(a)},getParameters:function(){return this.parameters},setTranslation:function(a,c,b){this.state.tx=a;this.state.ty=c;this.state.tz=b},getTranslation:function(){return{x:this.state.tx,y:this.state.ty,z:this.state.tz}},setFov:function(a){a=Math.min(this.parameters.maxFov,a);a=Math.max(this.parameters.minFov,a);this.state.fov=a},getFov:function(){return this.state.fov},screenToPolar:function(g,e){var c=this.screenToRayDelta(g,e);var f=$V([c.x,c.y,c.z,1]);f=Matrix.RotationX(this.getPitch()*Math.PI/180).ensure4x4().x(f);f=Matrix.RotationY(-this.getYaw()*Math.PI/180).ensure4x4().x(f);var m=f.e(1);var l=f.e(2);var k=f.e(3);var d=Math.sqrt(m*m+k*k);var a=Math.atan2(m,-k)*180/Math.PI;var i=Math.atan2(l,d)*180/Math.PI;var b={};b.yaw=(a+360)%360;b.pitch=i;return b},snapPitch:function(a){a=Math.min(this.parameters.maxPitch,a);a=Math.max(this.parameters.minPitch,a);return a},setPitch:function(a){this.state.p=this.snapPitch(a)},circleDistance:function(d,c){if(c>d){var b=(c-d);var a=((c-360)-d);return Math.abs(b)<Math.abs(a)?b:a}else{var b=(c-d);var a=(360-d)+c;return Math.abs(b)<Math.abs(a)?b:a}},circleSnapTo:function(d,e,c){var b=this.circleDistance(d,e);var a=this.circleDistance(d,c);return Math.abs(b)<Math.abs(a)?e:c},snapYaw:function(a){a%=360;if(a<0){a+=360}if(this.parameters.minYaw<this.parameters.maxYaw){if(a>this.parameters.maxYaw||a<this.parameters.minYaw){a=circleSnapTo(a,this.parameters.minYaw,this.parameters.maxYaw)}}else{if(a>this.parameters.minYaw){}else{if(a>this.parameters.maxYaw){a=circleSnapTo(a,this.parameters.minYaw,this.parameters.maxYaw)}else{}}}return a},setYaw:function(a){this.state.y=this.snapYaw(a)},getYaw:function(){return this.state.y},getPitch:function(){return this.state.p},dispose:function(){this.browser.unregisterListener(window,"resize",this.onresizeHandler,false)},beginRender:function(b,a){this.onrender(bigshot.VRPanorama.ONRENDER_BEGIN,b,a);this.renderer.beginRender(this.state.y,this.state.p,this.state.fov,this.state.tx,this.state.ty,this.state.tz,this.transformOffsets.yaw,this.transformOffsets.pitch,this.transformOffsets.roll)},addRenderListener:function(a){var b=new Array();b=b.concat(this.renderListeners);b.push(a);this.renderListeners=b},removeRenderListener:function(b){var c=new Array();c=c.concat(this.renderListeners);for(var a=0;a<c.length;++a){if(c[a]==b){c=c.splice(a,1);break}}this.renderListeners=c},onrender:function(d,c,b){var e=this.renderListeners;for(var a=0;a<e.length;++a){e[a](d,c,b)}},endRender:function(c,b){for(var a in this.vrFaces){this.vrFaces[a].endRender()}this.renderer.endRender();this.onrender(bigshot.VRPanorama.ONRENDER_END,c,b)},addRenderable:function(a){var b=new Array();b.concat(this.renderables);b.push(listener);this.renderables=b},removeRenderable:function(b){var c=new Array();c.concat(this.renderables);for(var a=0;a<c.length;++a){if(c[a]==listener){c=c.splice(a,1);break}}this.renderables=c},render:function(d,c){this.beginRender(d,c);var e=this.renderer.createTexturedQuadScene();for(var b in this.vrFaces){this.vrFaces[b].render(e)}for(var a=0;a<this.renderables.length;++a){this.renderables[a](this.renderer,e)}e.render();for(var a=0;a<this.hotspots.length;++a){this.hotspots[a].layout()}this.endRender(d,c)},renderUpdated:function(d,c){if(this.renderer.supportsUpdate()){this.beginRender(d,c);var e=this.renderer.createTexturedQuadScene();for(var b in this.vrFaces){if(this.vrFaces[b].isUpdated()){this.vrFaces[b].render(e)}}e.render();for(var a=0;a<this.hotspots.length;++a){this.hotspots[a].layout()}this.endRender(d,c)}else{this.render(d,c)}},dragMode:bigshot.VRPanorama.DRAG_GRAB,setDragMode:function(a){this.dragMode=a},dragMouseDown:function(a){this.dragStart=a;this.dragDistance=0},dragMouseUp:function(a){this.dragStart=null;this.smoothRotate()},dragMouseMove:function(c){if(this.dragStart!=null&&this.currentGesture==null){if(this.dragMode==bigshot.VRPanorama.DRAG_GRAB){this.smoothRotate();var d=this.state.fov/this.renderer.getViewportHeight();var b=c.clientX-this.dragStart.clientX;var a=c.clientY-this.dragStart.clientY;this.dragDistance+=b+a;this.setYaw(this.getYaw()-b*d);this.setPitch(this.getPitch()-a*d);this.renderAsap();this.dragStart=c}else{var d=0.1*this.state.fov/this.renderer.getViewportHeight();var b=c.clientX-this.dragStart.clientX;var a=c.clientY-this.dragStart.clientY;this.dragDistance=b+a;this.smoothRotate(function(){return b*d},function(){return a*d})}}},onMouseDoubleClick:function(b,a,c){this.smoothRotateToXY(a,c)},mouseDoubleClick:function(a){var b=this.browser.getElementPosition(this.container);this.onMouseDoubleClick(a,a.clientX-b.x,a.clientY-b.y)},gestureStart:function(a){this.currentGesture={startFov:this.getFov(),scale:a.scale}},gestureEnd:function(a){this.currentGesture=null},gestureChange:function(a){if(this.currentGesture){var b=this.currentGesture.startFov/a.scale;this.setFov(b);this.renderAsap()}},setMaxTextureMagnification:function(a){this.maxTextureMagnification=a},getMaxTextureMagnification:function(){return this.maxTextureMagnification},getMinFovFromViewportAndImage:function(){var a=this.renderer.getViewportHeight()/2;var f=this.vrFaces[0].parameters.height;for(var c in this.vrFaces){f=Math.min(f,this.vrFaces[c].parameters.height)}var b=this.maxTextureMagnification*f/2;var d=a/b;var e=Math.atan(d)*180/Math.PI;return e*2},screenToRay:function(a,d){var c=this.screenToRayDelta(a,d);var b=this.renderer.transformToWorld([c.x,c.y,c.z]);b=Matrix.RotationY(-this.transformOffsets.yaw*Math.PI/180).ensure4x4().x(b);b=Matrix.RotationX(-this.transformOffsets.pitch*Math.PI/180).ensure4x4().x(b);b=Matrix.RotationZ(-this.transformOffsets.roll*Math.PI/180).ensure4x4().x(b);return{x:b.e(1),y:b.e(2),z:b.e(3)}},screenToRayDelta:function(k,i){var g=this.renderer.getViewportHeight()/2;var d=this.renderer.getViewportWidth()/2;var k=(k-d);var i=(i-g);var e=Math.tan((this.state.fov/2)*Math.PI/180);var f=e*this.renderer.getViewportWidth()/this.renderer.getViewportHeight();var c=k*f/d;var b=i*e/g;var a=-1;return{x:c,y:b,z:a}},smoothRotateToXY:function(a,c){var b=this.screenToPolar(a,c);this.smoothRotateTo(this.snapYaw(b.yaw),this.snapPitch(b.pitch),this.getFov(),this.state.fov/200)},ease:function(f,e,c,a){var b=c*40;if(!a){a=c/5}var d=c/1000;var g=f-e;if(g>b){g=-c}else{if(g<-b){g=c}else{if(Math.abs(g)<a){g=-g}else{if(Math.abs(g)<d){g=0}else{g=-(c*g)/(b)}}}}return g},resetIdle:function(){this.idleCounter=0},idleTick:function(){if(this.maxIdleCounter<0){return}++this.idleCounter;if(this.idleCounter==this.maxIdleCounter){this.autoRotate()}var a=this;setTimeout(function(){a.idleTick()},1000)},autoRotateWhenIdle:function(a){this.maxIdleCounter=a;this.idleCounter=0;if(a<0){return}else{if(this.maxIdleCounter>0){var b=this;setTimeout(function(){b.idleTick()},1000)}}},autoRotate:function(){var b=this;var d=this.state.fov/400;var c=d;var a=c;this.smoothRotate(function(){var e=b.getYaw()+a;if(b.parameters.minYaw<b.parameters.maxYaw){if(e>b.parameters.maxYaw||e<b.parameters.minYaw){a=-a}}else{if(e>b.parameters.minYaw){}else{if(e>b.parameters.maxYaw){a=-a}else{}}}return a},function(){return b.ease(b.getPitch(),0,c)},function(){return b.ease(b.getFov(),45,0.1)})},smoothRotateTo:function(e,d,a,c){var b=this;this.smoothRotate(function(){var f=b.circleDistance(e,b.getYaw());return -b.ease(0,f,c)},function(){return b.ease(b.getPitch(),d,c)},function(){return b.ease(b.getFov(),a,c)})},smoothRotate:function(b,f,e){++this.smoothrotatePermit;var c=this.smoothrotatePermit;if(!f&&!b&&!e){return}var d=this;var a=function(){if(d.smoothrotatePermit==c){if(b){d.setYaw(d.getYaw()+b())}if(f){d.setPitch(d.getPitch()+f())}if(e){d.setFov(d.getFov()+e())}d.render();window.setTimeout(a,1)}};a()},onresizeHandler:function(a){this.onresize()},mouseWheel:function(a){var b=0;if(!a){a=window.event}if(a.wheelDelta){b=a.wheelDelta/120;if(window.opera){b=-b}}else{if(a.detail){b=-a.detail}}if(b){this.mouseWheelHandler(b)}if(a.preventDefault){a.preventDefault()}a.returnValue=false},mouseWheelHandler:function(c){var a=this;var b=null;if(c>0){if(this.getFov()>this.parameters.minFov){b=this.getFov()*0.9}}if(c<0){if(this.getFov()<this.parameters.maxFov){b=this.getFov()/0.9}}if(b!=null){this.smoothRotate(function(){return 0},function(){return 0},function(){return(b-a.getFov())/1.5})}},fullScreen:function(a){if(this.fullScreenHandler){return}var c=document.createElement("div");c.style.position="absolute";c.style.fontSize="16pt";c.style.top="128px";c.style.width="100%";c.style.color="white";c.style.padding="16px";c.style.zIndex="9999";c.style.textAlign="center";c.style.opacity="0.75";c.innerHTML="<span style='border-radius: 16px; -moz-border-radius: 16px; padding: 16px; padding-left: 32px; padding-right: 32px; background:black'>Press Esc to exit full screen mode.</span>";var b=this;this.fullScreenHandler=new bigshot.FullScreen(this.container);this.fullScreenHandler.restoreSize=this.sizeContainer==null;this.fullScreenHandler.addOnResize(function(){b.onresize()});this.fullScreenHandler.addOnClose(function(){if(c.parentNode){try{div.removeChild(c)}catch(d){}}b.fullScreenHandler=null});if(a){this.fullScreenHandler.addOnClose(function(){a()})}this.fullScreenHandler.open();this.fullScreenHandler.getRootElement().appendChild(c);setTimeout(function(){var e=0.75;var d=function(){e-=0.02;if(c.parentNode){if(e<=0){c.style.display="none";try{div.removeChild(c)}catch(f){}}else{c.style.opacity=e;setTimeout(d,20)}}};setTimeout(d,20)},3500);return function(){b.fullScreenHandler.close()}},onresize:function(){if(this.fullScreenHandler==null||!this.fullScreenHandler.isFullScreen){if(this.sizeContainer){var a=this.browser.getElementSize(this.sizeContainer);this.renderer.resize(a.w,a.h)}}else{this.container.style.width=window.innerWidth+"px";this.container.style.height=window.innerHeight+"px";var a=this.browser.getElementSize(this.container);this.renderer.resize(a.w,a.h)}this.renderer.onresize();this.renderAsap()},renderAsap:function(){if(!this.renderAsapPermitTaken){this.renderAsapPermitTaken=true;var a=this;setTimeout(function(){a.renderAsapPermitTaken=false;a.render()},1)}},autoResizeContainer:function(a){this.sizeContainer=a}};bigshot.VRHotspot=function(a){this.panorama=a;this.clippingStrategy=bigshot.VRHotspot.CLIP_ADJUST(a)};bigshot.VRHotspot.CLIP_FRACTION=function(b,a){return function(f){var g={x0:Math.max(f.x,0),y0:Math.max(f.y,0),x1:Math.min(f.x+f.w,b.renderer.getViewportWidth()),y1:Math.min(f.y+f.h,b.renderer.getViewportHeight())};var e=f.w*f.h;var d=(g.x1-g.x0);var c=(g.y1-g.y0);if(d>0&&c>0){var i=d*c;return(i/e)>=a}else{return false}}};bigshot.VRHotspot.CLIP_CENTER=function(a){return function(b){var d={x:b.x+b.w/2,y:b.y+b.h/2};return d.x>=0&&d.x<a.renderer.getViewportWidth()&&d.y>=0&&d.y<a.renderer.getViewportHeight()}};bigshot.VRHotspot.CLIP_ADJUST=function(a){return function(b){if(b.x<0){b.w-=-b.x;b.x=0}if(b.y<0){b.h-=-b.y;b.y=0}if(b.x+b.w>a.renderer.getViewportWidth()){b.w=a.renderer.getViewportWidth()-b.x-1}if(b.y+b.h>a.renderer.getViewportHeight()){b.h=a.renderer.getViewportHeight()-b.y-1}return b.w>0&&b.h>0}};bigshot.VRHotspot.CLIP_ZOOM=function(a,c,b){return function(d){if(d.x>=0&&d.y>=0&&(d.x+c.w)<a.renderer.getViewportWidth()&&(d.y+c.h)<a.renderer.getViewportHeight()){d.w=c.w;d.h=c.h;return true}var f=0;if(d.x<0){f=Math.max(-d.x,f)}if(d.y<0){f=Math.max(-d.y,f)}if(d.x+c.w>a.renderer.getViewportWidth()){f=Math.max(d.x+c.w-a.renderer.getViewportWidth(),f)}if(d.y+c.h>a.renderer.getViewportHeight()){f=Math.max(d.y+c.h-a.renderer.getViewportHeight(),f)}f/=a.renderer.getViewportHeight();if(f>b){return false}var e=1/(1+f);d.w=c.w*e;d.h=c.w*e;if(d.x<0){d.x=0}if(d.y<0){d.y=0}if(d.x+d.w>a.renderer.getViewportWidth()){d.x=a.renderer.getViewportWidth()-d.w}if(d.y+d.h>a.renderer.getViewportHeight()){d.y=a.renderer.getViewportHeight()-d.h}return true}};bigshot.VRHotspot.CLIP_FADE=function(a,b){return function(c){var d=Math.min(c.x,c.y,a.renderer.getViewportWidth()-(c.x+c.w),a.renderer.getViewportHeight()-(c.y+c.h));if(d<=0){return false}else{if(d<=b){c.opacity=(d/b);return true}else{c.opacity=1;return true}}}};bigshot.VRHotspot.prototype={layout:function(){},rotate:function(d,c,b){var e=d*Math.PI/180;var a=Matrix.Rotation(e,$V([c[0],c[1],c[2]])).ensure4x4();return a.x(b)},toVector:function(d,c){var a=$V([0,0,-1,1]);a=this.rotate(-c,[1,0,0],a);a=this.rotate(-d,[0,1,0],a);var b=[a.e(1),a.e(2),a.e(3)];return b},toScreen:function(b){var a=this.panorama.renderer.transformToScreen(b);return a},clip:function(a){return this.clippingStrategy(a)}};bigshot.VRPointHotspot=function(c,e,d,b,a,f){bigshot.VRHotspot.call(this,c);this.element=b;this.offsetX=a;this.offsetY=f;this.point=this.toVector(e,d)};bigshot.VRPointHotspot.prototype={layout:function(){var b=this.toScreen(this.point);var c=false;if(b!=null){var a=this.panorama.browser.getElementSize(this.element);b.w=a.w;b.h=a.h;b.x+=this.offsetX;b.y+=this.offsetY;if(this.clip(b)){this.element.style.top=(b.y)+"px";this.element.style.left=(b.x)+"px";this.element.style.width=(b.w)+"px";this.element.style.height=(b.h)+"px";if(b.opacity){this.element.style.opacity=b.opacity}this.element.style.visibility="inherit";c=true}}if(!c){this.element.style.visibility="hidden"}}};bigshot.object.extend(bigshot.VRPointHotspot,bigshot.VRHotspot);bigshot.VRRectangleHotspot=function(d,f,b,e,a,c){bigshot.VRHotspot.call(this,d);this.element=c;this.point0=this.toVector(f,b);this.point1=this.toVector(e,a)};bigshot.VRRectangleHotspot.prototype={layout:function(){var a=this.toScreen(this.point0);var d=this.toScreen(this.point1);var c=false;if(a!=null&&d!=null){var b={x:a.x,y:a.y,opacity:1,w:d.x-a.x,h:d.y-a.y};if(this.clip(b)){this.element.style.top=(b.y)+"px";this.element.style.left=(b.x)+"px";this.element.style.width=(b.w)+"px";this.element.style.height=(b.h)+"px";this.element.style.visibility="inherit";c=true}}if(!c){this.element.style.visibility="hidden"}}};bigshot.object.extend(bigshot.VRRectangleHotspot,bigshot.VRHotspot);bigshot.ImageCarouselPanoramaVRRenderer=function(a){this.browser=new bigshot.Browser();this.container=a.container;this.createTileCache=function(c,b){return null};this.createTexturedQuadScene=function(){return null};this.createTexturedQuad=function(e,c,b,d){return null};this.supportsUpdate=function(){return false};this.getViewportWidth=function(){return this.browser.getElementSize(this.container).w};this.getViewportHeight=function(){return this.browser.getElementSize(this.container).h};this.resize=function(b,c){};this.onresize=function(){};this.mvMatrix=new bigshot.TransformStack();this.transformToWorld=function(b){var c=$V([b[0],b[1],b[2],1]);var d=this.mvMatrix.matrix().x(c);return d};this.transformWorldToScreen=function(d){if(d.e(3)>0){return null}var b=this.pMatrix.matrix().x(d);if(Math.abs(b.e(4))<Sylvester.precision){return null}var c={x:(this.getViewportWidth()/2)*b.e(1)/b.e(4)+this.getViewportWidth()/2,y:-(this.getViewportHeight()/2)*b.e(2)/b.e(4)+this.getViewportHeight()/2};return c};this.transformToScreen=function(b){var c=this.transformToWorld(b);return this.transformWorldToScreen(c)};this.yaw=0;this.pitch=0;this.fov=0;this.pMatrix=new bigshot.TransformStack();this.beginRender=function(d,c,b){this.yaw=d;this.pitch=c;this.fov=b;this.mvMatrix.reset();this.mvMatrix.rotate(this.yaw,[0,1,0]);this.mvMatrix.rotate(this.pitch,[1,0,0]);this.pMatrix.reset();this.pMatrix.perspective(this.fov,this.getViewportWidth()/this.getViewportHeight(),0.1,100)};this.endRender=function(){}};bigshot.ImageCarouselPanoramaParameters=function(b){this.suffix=null;this.container=null;this.basePath=null;this.fileSystemType="folder";this.fileSystem=null;this.steps=0;if(b){for(var a in b){this[a]=b[a]}}this.merge=function(d,e){for(var c in d){if(e||!this[c]){this[c]=d[c]}}};return this};bigshot.ImageCarouselPanorama=function(e){bigshot.setupFileSystem(e);e.merge(e.fileSystem.getDescriptor(),false);this.renderer=new bigshot.ImageCarouselPanoramaVRRenderer(e);this.fileSystem=e.fileSystem;this.container=e.container;this.basePath=e.basePath;this.yaw=0;this.steps=e.steps;this.suffix=e.suffix;this.browser=new bigshot.Browser();var d=this;this.images=[];this.hotspots=[];var a=null;this.addHotspot=function(i){this.hotspots.push(i)};this.dragMouseDown=function(i){this.dragStart={clientX:i.clientX,clientY:i.clientY}};this.dragMouseMove=function(m){if(this.dragStart){var k=m.clientX-this.dragStart.clientX;var n=this.browser.getElementSize(this.container).w/(this.steps/4);var l=Math.round(k/n);var i=Math.round(l*n);this.dragStart.clientX+=i;if(l>0){this.yaw-=l;if(this.yaw<0){this.yaw%=this.steps;this.yaw+=this.steps}this.render()}else{if(l<0){this.yaw-=l;if(this.yaw>=this.steps){this.yaw%=this.steps}this.render()}}}};this.dragMouseUp=function(i){this.dragStart=null};this.render=function(){this.renderer.beginRender(this.yaw*360/this.steps,0,60);this.browser.removeAllChildren(this.innerContainer);var m=this.browser.getElementSize(this.container);var k=this.images[this.yaw];this.innerContainer.appendChild(k);k.style.position="relative";k.style.top="0px";k.style.left="0px";k.style.width=m.w+"px";k.style.height=m.h+"px";for(var l=0;l<this.hotspots.length;++l){this.hotspots[l].layout()}this.renderer.endRender()};var g=function(i){if(i.preventDefault){i.preventDefault()}return false};var f=function(i){if(i.clientX){return i}else{return{clientX:i.changedTouches[0].clientX,clientY:i.changedTouches[0].clientY}}};this.innerContainer=document.createElement("div");this.innerContainer.style.position="absolute";this.container.appendChild(this.innerContainer);this.glassPane=document.createElement("div");this.glassPane.style.position="relative";this.glassPane.style.width="100%";this.glassPane.style.height="100%";this.glassPane.style.zIndex="1";this.container.appendChild(this.glassPane);this.browser.registerListener(this.glassPane,"mousedown",function(i){d.dragMouseDown(i);return g(i)},false);this.browser.registerListener(this.glassPane,"touchstart",function(i){d.dragMouseDown(f(i));return g(i)},false);this.browser.registerListener(this.glassPane,"mouseup",function(i){d.dragMouseUp(i);return g(i)},false);this.browser.registerListener(this.glassPane,"touchend",function(i){d.dragMouseUp(f(i));return g(i)},false);this.browser.registerListener(this.glassPane,"mousemove",function(i){d.dragMouseMove(i);return g(i)},false);this.browser.registerListener(this.glassPane,"mouseout",function(i){return g(i)},false);this.browser.registerListener(this.glassPane,"touchmove",function(i){d.dragMouseMove(f(i));return g(i)},false);for(var c=0;c<this.steps;++c){var b=document.createElement("img");b.src=this.fileSystem.getFilename(c+this.suffix);this.images.push(b)}};bigshot.AdaptiveLODMonitorParameters=function(b){this.vrPanorama=null;this.targetFps=30;this.tolerance=0.3;this.rate=0.1;this.minMag=1.5;this.maxMag=16;this.hqRenderMag=1.5;this.hqRenderDelay=2000;this.hqRenderInterval=1000;if(b){for(var a in b){this[a]=b[a]}}this.merge=function(d,e){for(var c in d){if(e||!this[c]){this[c]=d[c]}}};return this};bigshot.AdaptiveLODMonitor=function(c){this.currentAdaptiveMagnification=c.vrPanorama.getMaxTextureMagnification();this.parameters=c;this.frames=0;this.samples=0;this.renderTimeTotal=0;this.renderTimeLast=0;this.samplesLast=0;this.targetTime=1000/c.targetFps;this.lowerTime=this.targetTime/(1+c.tolerance);this.upperTime=this.targetTime*(1+c.tolerance);this.startTime=0;this.lastRender=0;this.hqRender=false;this.hqMode=false;this.hqRenderWaiting=false;var b=this;var a=function(){return function(f,e,d){b.listener(f,e,d)}};return a()};bigshot.AdaptiveLODMonitor.prototype={averageRenderTime:function(){if(this.samples>0){return this.renderTimeTotal/this.samples}else{return -1}},averageRenderTimeLast:function(){if(this.samples>0){return this.renderTimeLast/this.samplesLast}else{return -1}},increaseDetail:function(){this.currentAdaptiveMagnification=Math.max(this.parameters.minMag,this.currentAdaptiveMagnification/(1+this.parameters.rate))},decreaseDetail:function(){this.currentAdaptiveMagnification=Math.min(this.parameters.maxMag,this.currentAdaptiveMagnification*(1+this.parameters.rate))},sample:function(){var b=new Date().getTime()-this.startTime;this.samples++;this.renderTimeTotal+=b;this.samplesLast++;this.renderTimeLast+=b;if(this.samplesLast>4){var a=this.renderTimeLast/this.samplesLast;if(a<this.lowerTime){this.increaseDetail()}else{if(a>this.upperTime){this.decreaseDetail()}}this.samplesLast=0;this.renderTimeLast=0}},hqRenderTick:function(){if(this.lastRender<new Date().getTime()-this.parameters.hqRenderDelay){this.hqRender=true;this.hqMode=true;this.parameters.vrPanorama.setMaxTextureMagnification(this.parameters.hqRenderMag);this.parameters.vrPanorama.render();this.hqRender=false;this.hqRenderWaiting=false}else{var a=this;setTimeout(function(){a.hqRenderTick()},this.parameters.hqRenderInterval)}},listener:function(d,c,b){if(this.hqRender){return}if(this.hqMode&&c==bigshot.VRPanorama.ONRENDER_TEXTURE_UPDATE){this.parameters.vrPanorama.setMaxTextureMagnification(this.parameters.minMag);return}else{this.hqMode=false}this.parameters.vrPanorama.setMaxTextureMagnification(this.currentAdaptiveMagnification);this.frames++;if((this.frames<20||this.frames%5==0)&&d==bigshot.VRPanorama.ONRENDER_BEGIN){this.startTime=new Date().getTime();this.lastRender=this.startTime;var a=this;setTimeout(function(){a.sample()},1);if(!this.hqRenderWaiting){this.hqRenderWaiting=true;setTimeout(function(){a.hqRenderTick()},this.parameters.hqRenderInterval)}}}}};/* 
 * flowplayer.js 3.2.4. The Flowplayer API
 * 
 * Copyright 2009 Flowplayer Oy
 * 
 * This file is part of Flowplayer.
 * 
 * Flowplayer is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Flowplayer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Flowplayer.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Date: 2010-08-25 12:48:46 +0000 (Wed, 25 Aug 2010)
 * Revision: 551 
 */
(function(){function g(o){console.log("$f.fireEvent",[].slice.call(o))}function k(q){if(!q||typeof q!="object"){return q}var o=new q.constructor();for(var p in q){if(q.hasOwnProperty(p)){o[p]=k(q[p])}}return o}function m(t,q){if(!t){return}var o,p=0,r=t.length;if(r===undefined){for(o in t){if(q.call(t[o],o,t[o])===false){break}}}else{for(var s=t[0];p<r&&q.call(s,p,s)!==false;s=t[++p]){}}return t}function c(o){return document.getElementById(o)}function i(q,p,o){if(typeof p!="object"){return q}if(q&&p){m(p,function(r,s){if(!o||typeof s!="function"){q[r]=s}})}return q}function n(s){var q=s.indexOf(".");if(q!=-1){var p=s.slice(0,q)||"*";var o=s.slice(q+1,s.length);var r=[];m(document.getElementsByTagName(p),function(){if(this.className&&this.className.indexOf(o)!=-1){r.push(this)}});return r}}function f(o){o=o||window.event;if(o.preventDefault){o.stopPropagation();o.preventDefault()}else{o.returnValue=false;o.cancelBubble=true}return false}function j(q,o,p){q[o]=q[o]||[];q[o].push(p)}function e(){return"_"+(""+Math.random()).slice(2,10)}var h=function(t,r,s){var q=this,p={},u={};q.index=r;if(typeof t=="string"){t={url:t}}i(this,t,true);m(("Begin*,Start,Pause*,Resume*,Seek*,Stop*,Finish*,LastSecond,Update,BufferFull,BufferEmpty,BufferStop").split(","),function(){var v="on"+this;if(v.indexOf("*")!=-1){v=v.slice(0,v.length-1);var w="onBefore"+v.slice(2);q[w]=function(x){j(u,w,x);return q}}q[v]=function(x){j(u,v,x);return q};if(r==-1){if(q[w]){s[w]=q[w]}if(q[v]){s[v]=q[v]}}});i(this,{onCuepoint:function(x,w){if(arguments.length==1){p.embedded=[null,x];return q}if(typeof x=="number"){x=[x]}var v=e();p[v]=[x,w];if(s.isLoaded()){s._api().fp_addCuepoints(x,r,v)}return q},update:function(w){i(q,w);if(s.isLoaded()){s._api().fp_updateClip(w,r)}var v=s.getConfig();var x=(r==-1)?v.clip:v.playlist[r];i(x,w,true)},_fireEvent:function(v,y,w,A){if(v=="onLoad"){m(p,function(B,C){if(C[0]){s._api().fp_addCuepoints(C[0],r,B)}});return false}A=A||q;if(v=="onCuepoint"){var z=p[y];if(z){return z[1].call(s,A,w)}}if(y&&"onBeforeBegin,onMetaData,onStart,onUpdate,onResume".indexOf(v)!=-1){i(A,y);if(y.metaData){if(!A.duration){A.duration=y.metaData.duration}else{A.fullDuration=y.metaData.duration}}}var x=true;m(u[v],function(){x=this.call(s,A,y,w)});return x}});if(t.onCuepoint){var o=t.onCuepoint;q.onCuepoint.apply(q,typeof o=="function"?[o]:o);delete t.onCuepoint}m(t,function(v,w){if(typeof w=="function"){j(u,v,w);delete t[v]}});if(r==-1){s.onCuepoint=this.onCuepoint}};var l=function(p,r,q,t){var o=this,s={},u=false;if(t){i(s,t)}m(r,function(v,w){if(typeof w=="function"){s[v]=w;delete r[v]}});i(this,{animate:function(y,z,x){if(!y){return o}if(typeof z=="function"){x=z;z=500}if(typeof y=="string"){var w=y;y={};y[w]=z;z=500}if(x){var v=e();s[v]=x}if(z===undefined){z=500}r=q._api().fp_animate(p,y,z,v);return o},css:function(w,x){if(x!==undefined){var v={};v[w]=x;w=v}r=q._api().fp_css(p,w);i(o,r);return o},show:function(){this.display="block";q._api().fp_showPlugin(p);return o},hide:function(){this.display="none";q._api().fp_hidePlugin(p);return o},toggle:function(){this.display=q._api().fp_togglePlugin(p);return o},fadeTo:function(y,x,w){if(typeof x=="function"){w=x;x=500}if(w){var v=e();s[v]=w}this.display=q._api().fp_fadeTo(p,y,x,v);this.opacity=y;return o},fadeIn:function(w,v){return o.fadeTo(1,w,v)},fadeOut:function(w,v){return o.fadeTo(0,w,v)},getName:function(){return p},getPlayer:function(){return q},_fireEvent:function(w,v,x){if(w=="onUpdate"){var z=q._api().fp_getPlugin(p);if(!z){return}i(o,z);delete o.methods;if(!u){m(z.methods,function(){var B=""+this;o[B]=function(){var C=[].slice.call(arguments);var D=q._api().fp_invoke(p,B,C);return D==="undefined"||D===undefined?o:D}});u=true}}var A=s[w];if(A){var y=A.apply(o,v);if(w.slice(0,1)=="_"){delete s[w]}return y}return o}})};function b(q,G,t){var w=this,v=null,D=false,u,s,F=[],y={},x={},E,r,p,C,o,A;i(w,{id:function(){return E},isLoaded:function(){return(v!==null&&v.fp_play!==undefined&&!D)},getParent:function(){return q},hide:function(H){if(H){q.style.height="0px"}if(w.isLoaded()){v.style.height="0px"}return w},show:function(){q.style.height=A+"px";if(w.isLoaded()){v.style.height=o+"px"}return w},isHidden:function(){return w.isLoaded()&&parseInt(v.style.height,10)===0},load:function(J){if(!w.isLoaded()&&w._fireEvent("onBeforeLoad")!==false){var H=function(){u=q.innerHTML;if(u&&!flashembed.isSupported(G.version)){q.innerHTML=""}if(J){J.cached=true;j(x,"onLoad",J)}flashembed(q,G,{config:t})};var I=0;m(a,function(){this.unload(function(K){if(++I==a.length){H()}})})}return w},unload:function(J){if(this.isFullscreen()&&/WebKit/i.test(navigator.userAgent)){if(J){J(false)}return w}if(u.replace(/\s/g,"")!==""){if(w._fireEvent("onBeforeUnload")===false){if(J){J(false)}return w}D=true;try{if(v){v.fp_close();w._fireEvent("onUnload")}}catch(H){}var I=function(){v=null;q.innerHTML=u;D=false;if(J){J(true)}};setTimeout(I,50)}else{if(J){J(false)}}return w},getClip:function(H){if(H===undefined){H=C}return F[H]},getCommonClip:function(){return s},getPlaylist:function(){return F},getPlugin:function(H){var J=y[H];if(!J&&w.isLoaded()){var I=w._api().fp_getPlugin(H);if(I){J=new l(H,I,w);y[H]=J}}return J},getScreen:function(){return w.getPlugin("screen")},getControls:function(){return w.getPlugin("controls")._fireEvent("onUpdate")},getLogo:function(){try{return w.getPlugin("logo")._fireEvent("onUpdate")}catch(H){}},getPlay:function(){return w.getPlugin("play")._fireEvent("onUpdate")},getConfig:function(H){return H?k(t):t},getFlashParams:function(){return G},loadPlugin:function(K,J,M,L){if(typeof M=="function"){L=M;M={}}var I=L?e():"_";w._api().fp_loadPlugin(K,J,M,I);var H={};H[I]=L;var N=new l(K,null,w,H);y[K]=N;return N},getState:function(){return w.isLoaded()?v.fp_getState():-1},play:function(I,H){var J=function(){if(I!==undefined){w._api().fp_play(I,H)}else{w._api().fp_play()}};if(w.isLoaded()){J()}else{if(D){setTimeout(function(){w.play(I,H)},50)}else{w.load(function(){J()})}}return w},getVersion:function(){var I="flowplayer.js 3.2.4";if(w.isLoaded()){var H=v.fp_getVersion();H.push(I);return H}return I},_api:function(){if(!w.isLoaded()){throw"Flowplayer "+w.id()+" not loaded when calling an API method"}return v},setClip:function(H){w.setPlaylist([H]);return w},getIndex:function(){return p},_swfHeight:function(){return v.clientHeight}});m(("Click*,Load*,Unload*,Keypress*,Volume*,Mute*,Unmute*,PlaylistReplace,ClipAdd,Fullscreen*,FullscreenExit,Error,MouseOver,MouseOut").split(","),function(){var H="on"+this;if(H.indexOf("*")!=-1){H=H.slice(0,H.length-1);var I="onBefore"+H.slice(2);w[I]=function(J){j(x,I,J);return w}}w[H]=function(J){j(x,H,J);return w}});m(("pause,resume,mute,unmute,stop,toggle,seek,getStatus,getVolume,setVolume,getTime,isPaused,isPlaying,startBuffering,stopBuffering,isFullscreen,toggleFullscreen,reset,close,setPlaylist,addClip,playFeed,setKeyboardShortcutsEnabled,isKeyboardShortcutsEnabled").split(","),function(){var H=this;w[H]=function(J,I){if(!w.isLoaded()){return w}var K=null;if(J!==undefined&&I!==undefined){K=v["fp_"+H](J,I)}else{K=(J===undefined)?v["fp_"+H]():v["fp_"+H](J)}return K==="undefined"||K===undefined?w:K}});w._fireEvent=function(Q){if(typeof Q=="string"){Q=[Q]}var R=Q[0],O=Q[1],M=Q[2],L=Q[3],K=0;if(t.debug){g(Q)}if(!w.isLoaded()&&R=="onLoad"&&O=="player"){v=v||c(r);o=w._swfHeight();m(F,function(){this._fireEvent("onLoad")});m(y,function(S,T){T._fireEvent("onUpdate")});s._fireEvent("onLoad")}if(R=="onLoad"&&O!="player"){return}if(R=="onError"){if(typeof O=="string"||(typeof O=="number"&&typeof M=="number")){O=M;M=L}}if(R=="onContextMenu"){m(t.contextMenu[O],function(S,T){T.call(w)});return}if(R=="onPluginEvent"||R=="onBeforePluginEvent"){var H=O.name||O;var I=y[H];if(I){I._fireEvent("onUpdate",O);return I._fireEvent(M,Q.slice(3))}return}if(R=="onPlaylistReplace"){F=[];var N=0;m(O,function(){F.push(new h(this,N++,w))})}if(R=="onClipAdd"){if(O.isInStream){return}O=new h(O,M,w);F.splice(M,0,O);for(K=M+1;K<F.length;K++){F[K].index++}}var P=true;if(typeof O=="number"&&O<F.length){C=O;var J=F[O];if(J){P=J._fireEvent(R,M,L)}if(!J||P!==false){P=s._fireEvent(R,M,L,J)}}m(x[R],function(){P=this.call(w,O,M);if(this.cached){x[R].splice(K,1)}if(P===false){return false}K++});return P};function B(){if($f(q)){$f(q).getParent().innerHTML="";p=$f(q).getIndex();a[p]=w}else{a.push(w);p=a.length-1}A=parseInt(q.style.height,10)||q.clientHeight;E=q.id||"fp"+e();r=G.id||E+"_api";G.id=r;t.playerId=E;if(typeof t=="string"){t={clip:{url:t}}}if(typeof t.clip=="string"){t.clip={url:t.clip}}t.clip=t.clip||{};if(q.getAttribute("href",2)&&!t.clip.url){t.clip.url=q.getAttribute("href",2)}s=new h(t.clip,-1,w);t.playlist=t.playlist||[t.clip];var I=0;m(t.playlist,function(){var K=this;if(typeof K=="object"&&K.length){K={url:""+K}}m(t.clip,function(L,M){if(M!==undefined&&K[L]===undefined&&typeof M!="function"){K[L]=M}});t.playlist[I]=K;K=new h(K,I,w);F.push(K);I++});m(t,function(K,L){if(typeof L=="function"){if(s[K]){s[K](L)}else{j(x,K,L)}delete t[K]}});m(t.plugins,function(K,L){if(L){y[K]=new l(K,L,w)}});if(!t.plugins||t.plugins.controls===undefined){y.controls=new l("controls",null,w)}y.canvas=new l("canvas",null,w);u=q.innerHTML;function J(L){var K=w.hasiPadSupport&&w.hasiPadSupport();if(/iPad|iPhone|iPod/i.test(navigator.userAgent)&&!/.flv$/i.test(F[0].url)&&!K){return true}if(!w.isLoaded()&&w._fireEvent("onBeforeClick")!==false){w.load()}return f(L)}function H(){if(u.replace(/\s/g,"")!==""){if(q.addEventListener){q.addEventListener("click",J,false)}else{if(q.attachEvent){q.attachEvent("onclick",J)}}}else{if(q.addEventListener){q.addEventListener("click",f,false)}w.load()}}setTimeout(H,0)}if(typeof q=="string"){var z=c(q);if(!z){throw"Flowplayer cannot access element: "+q}q=z;B()}else{B()}}var a=[];function d(o){this.length=o.length;this.each=function(p){m(o,p)};this.size=function(){return o.length}}window.flowplayer=window.$f=function(){var p=null;var o=arguments[0];if(!arguments.length){m(a,function(){if(this.isLoaded()){p=this;return false}});return p||a[0]}if(arguments.length==1){if(typeof o=="number"){return a[o]}else{if(o=="*"){return new d(a)}m(a,function(){if(this.id()==o.id||this.id()==o||this.getParent()==o){p=this;return false}});return p}}if(arguments.length>1){var t=arguments[1],q=(arguments.length==3)?arguments[2]:{};if(typeof t=="string"){t={src:t}}t=i({bgcolor:"#000000",version:[9,0],expressInstall:"http://static.flowplayer.org/swf/expressinstall.swf",cachebusting:true},t);if(typeof o=="string"){if(o.indexOf(".")!=-1){var s=[];m(n(o),function(){s.push(new b(this,k(t),k(q)))});return new d(s)}else{var r=c(o);return new b(r!==null?r:o,t,q)}}else{if(o){return new b(o,t,q)}}}return null};i(window.$f,{fireEvent:function(){var o=[].slice.call(arguments);var q=$f(o[0]);return q?q._fireEvent(o.slice(1)):null},addPlugin:function(o,p){b.prototype[o]=p;return $f},each:m,extend:i});if(typeof jQuery=="function"){jQuery.fn.flowplayer=function(q,p){if(!arguments.length||typeof arguments[0]=="number"){var o=[];this.each(function(){var r=$f(this);if(r){o.push(r)}});return arguments.length?o[arguments[0]]:new d(o)}return this.each(function(){$f(this,k(q),p?k(p):{})})}}})();(function(){var h=document.all,j="http://www.adobe.com/go/getflashplayer",c=typeof jQuery=="function",e=/(\d+)[^\d]+(\d+)[^\d]*(\d*)/,b={width:"100%",height:"100%",id:"_"+(""+Math.random()).slice(9),allowfullscreen:true,allowscriptaccess:"always",quality:"high",version:[3,0],onFail:null,expressInstall:null,w3c:false,cachebusting:false};if(window.attachEvent){window.attachEvent("onbeforeunload",function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){}})}function i(m,l){if(l){for(var f in l){if(l.hasOwnProperty(f)){m[f]=l[f]}}}return m}function a(f,n){var m=[];for(var l in f){if(f.hasOwnProperty(l)){m[l]=n(f[l])}}return m}window.flashembed=function(f,m,l){if(typeof f=="string"){f=document.getElementById(f.replace("#",""))}if(!f){return}if(typeof m=="string"){m={src:m}}return new d(f,i(i({},b),m),l)};var g=i(window.flashembed,{conf:b,getVersion:function(){var m,f;try{f=navigator.plugins["Shockwave Flash"].description.slice(16)}catch(o){try{m=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");f=m&&m.GetVariable("$version")}catch(n){try{m=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");f=m&&m.GetVariable("$version")}catch(l){}}}f=e.exec(f);return f?[f[1],f[3]]:[0,0]},asString:function(l){if(l===null||l===undefined){return null}var f=typeof l;if(f=="object"&&l.push){f="array"}switch(f){case"string":l=l.replace(new RegExp('(["\\\\])',"g"),"\\$1");l=l.replace(/^\s?(\d+\.?\d+)%/,"$1pct");return'"'+l+'"';case"array":return"["+a(l,function(o){return g.asString(o)}).join(",")+"]";case"function":return'"function()"';case"object":var m=[];for(var n in l){if(l.hasOwnProperty(n)){m.push('"'+n+'":'+g.asString(l[n]))}}return"{"+m.join(",")+"}"}return String(l).replace(/\s/g," ").replace(/\'/g,'"')},getHTML:function(o,l){o=i({},o);var n='<object width="'+o.width+'" height="'+o.height+'" id="'+o.id+'" name="'+o.id+'"';if(o.cachebusting){o.src+=((o.src.indexOf("?")!=-1?"&":"?")+Math.random())}if(o.w3c||!h){n+=' data="'+o.src+'" type="application/x-shockwave-flash"'}else{n+=' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'}n+=">";if(o.w3c||h){n+='<param name="movie" value="'+o.src+'" />'}o.width=o.height=o.id=o.w3c=o.src=null;o.onFail=o.version=o.expressInstall=null;for(var m in o){if(o[m]){n+='<param name="'+m+'" value="'+o[m]+'" />'}}var p="";if(l){for(var f in l){if(l[f]){var q=l[f];p+=f+"="+(/function|object/.test(typeof q)?g.asString(q):q)+"&"}}p=p.slice(0,-1);n+='<param name="flashvars" value=\''+p+"' />"}n+="</object>";return n},isSupported:function(f){return k[0]>f[0]||k[0]==f[0]&&k[1]>=f[1]}});var k=g.getVersion();function d(f,n,m){if(g.isSupported(n.version)){f.innerHTML=g.getHTML(n,m)}else{if(n.expressInstall&&g.isSupported([6,65])){f.innerHTML=g.getHTML(i(n,{src:n.expressInstall}),{MMredirectURL:location.href,MMplayerType:"PlugIn",MMdoctitle:document.title})}else{if(!f.innerHTML.replace(/\s/g,"")){f.innerHTML="<h2>Flash version "+n.version+" or greater is required</h2><h3>"+(k[0]>0?"Your version is "+k:"You have no flash plugin installed")+"</h3>"+(f.tagName=="A"?"<p>Click here to download latest version</p>":"<p>Download latest version from <a href='"+j+"'>here</a></p>");if(f.tagName=="A"){f.onclick=function(){location.href=j}}}if(n.onFail){var l=n.onFail.call(this);if(typeof l=="string"){f.innerHTML=l}}}}if(h){window[n.id]=document.getElementById(n.id)}i(this,{getRoot:function(){return f},getOptions:function(){return n},getConf:function(){return m},getApi:function(){return f.firstChild}})}if(c){jQuery.tools=jQuery.tools||{version:"3.2.4"};jQuery.tools.flashembed={conf:b};jQuery.fn.flashembed=function(l,f){return this.each(function(){$(this).data("flashembed",flashembed(this,l,f))})}}})();
// For discussion and comments, see: http://remysharp.com/2009/01/07/html5-enabling-script/
(function(){if(!/*@cc_on!@*/0)return;var e = "abbr,article,aside,audio,bb,canvas,datagrid,datalist,details,dialog,eventsource,figure,figcaption,footer,header,hgroup,mark,menu,meter,nav,output,progress,section,time,video".split(',');for(var i=0;i<e.length;i++){document.createElement(e[i])}})()

// Modernizr v1.7  www.modernizr.com
window.Modernizr=function(a,b,c){function G(){e.input=function(a){for(var b=0,c=a.length;b<c;b++)t[a[b]]=!!(a[b]in l);return t}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)l.setAttribute("type",f=a[d]),e=l.type!=="text",e&&(l.value=m,l.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&l.style.WebkitAppearance!==c?(g.appendChild(l),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(l,null).WebkitAppearance!=="textfield"&&l.offsetHeight!==0,g.removeChild(l)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=l.checkValidity&&l.checkValidity()===!1:/^color$/.test(f)?(g.appendChild(l),g.offsetWidth,e=l.value!=m,g.removeChild(l)):e=l.value!=m)),s[a[d]]=!!e;return s}("search tel url email datetime date month week time datetime-local number range color".split(" "))}function F(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+p.join(c+" ")+c).split(" ");return!!E(d,b)}function E(a,b){for(var d in a)if(k[a[d]]!==c&&(!b||b(a[d],j)))return!0}function D(a,b){return(""+a).indexOf(b)!==-1}function C(a,b){return typeof a===b}function B(a,b){return A(o.join(a+";")+(b||""))}function A(a){k.cssText=a}var d="1.7",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l=b.createElement("input"),m=":)",n=Object.prototype.toString,o=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),p="Webkit Moz O ms Khtml".split(" "),q={svg:"http://www.w3.org/2000/svg"},r={},s={},t={},u=[],v,w=function(a){var c=b.createElement("style"),d=b.createElement("div"),e;c.textContent=a+"{#modernizr{height:3px}}",h.appendChild(c),d.id="modernizr",g.appendChild(d),e=d.offsetHeight===3,c.parentNode.removeChild(c),d.parentNode.removeChild(d);return!!e},x=function(){function d(d,e){e=e||b.createElement(a[d]||"div");var f=(d="on"+d)in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=C(e[d],"function"),C(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),y=({}).hasOwnProperty,z;C(y,c)||C(y.call,c)?z=function(a,b){return b in a&&C(a.constructor.prototype[b],c)}:z=function(a,b){return y.call(a,b)},r.flexbox=function(){function c(a,b,c,d){a.style.cssText=o.join(b+":"+c+";")+(d||"")}function a(a,b,c,d){b+=":",a.style.cssText=(b+o.join(c+";"+b)).slice(0,-b.length)+(d||"")}var d=b.createElement("div"),e=b.createElement("div");a(d,"display","box","width:42px;padding:0;"),c(e,"box-flex","1","width:10px;"),d.appendChild(e),g.appendChild(d);var f=e.offsetWidth===42;d.removeChild(e),g.removeChild(d);return f},r.canvas=function(){var a=b.createElement("canvas");return a.getContext&&a.getContext("2d")},r.canvastext=function(){return e.canvas&&C(b.createElement("canvas").getContext("2d").fillText,"function")},r.webgl=function(){return!!a.WebGLRenderingContext},r.touch=function(){return"ontouchstart"in a||w("@media ("+o.join("touch-enabled),(")+"modernizr)")},r.geolocation=function(){return!!navigator.geolocation},r.postmessage=function(){return!!a.postMessage},r.websqldatabase=function(){var b=!!a.openDatabase;return b},r.indexedDB=function(){for(var b=-1,c=p.length;++b<c;){var d=p[b].toLowerCase();if(a[d+"_indexedDB"]||a[d+"IndexedDB"])return!0}return!1},r.hashchange=function(){return x("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},r.history=function(){return !!(a.history&&history.pushState)},r.draganddrop=function(){return x("dragstart")&&x("drop")},r.websockets=function(){return"WebSocket"in a},r.rgba=function(){A("background-color:rgba(150,255,150,.5)");return D(k.backgroundColor,"rgba")},r.hsla=function(){A("background-color:hsla(120,40%,100%,.5)");return D(k.backgroundColor,"rgba")||D(k.backgroundColor,"hsla")},r.multiplebgs=function(){A("background:url(//:),url(//:),red url(//:)");return(new RegExp("(url\\s*\\(.*?){3}")).test(k.background)},r.backgroundsize=function(){return F("backgroundSize")},r.borderimage=function(){return F("borderImage")},r.borderradius=function(){return F("borderRadius","",function(a){return D(a,"orderRadius")})},r.boxshadow=function(){return F("boxShadow")},r.textshadow=function(){return b.createElement("div").style.textShadow===""},r.opacity=function(){B("opacity:.55");return/^0.55$/.test(k.opacity)},r.cssanimations=function(){return F("animationName")},r.csscolumns=function(){return F("columnCount")},r.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";A((a+o.join(b+a)+o.join(c+a)).slice(0,-a.length));return D(k.backgroundImage,"gradient")},r.cssreflections=function(){return F("boxReflect")},r.csstransforms=function(){return!!E(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])},r.csstransforms3d=function(){var a=!!E(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);a&&"webkitPerspective"in g.style&&(a=w("@media ("+o.join("transform-3d),(")+"modernizr)"));return a},r.csstransitions=function(){return F("transitionProperty")},r.fontface=function(){var a,c,d=h||g,e=b.createElement("style"),f=b.implementation||{hasFeature:function(){return!1}};e.type="text/css",d.insertBefore(e,d.firstChild),a=e.sheet||e.styleSheet;var i=f.hasFeature("CSS2","")?function(b){if(!a||!b)return!1;var c=!1;try{a.insertRule(b,0),c=/src/i.test(a.cssRules[0].cssText),a.deleteRule(a.cssRules.length-1)}catch(d){}return c}:function(b){if(!a||!b)return!1;a.cssText=b;return a.cssText.length!==0&&/src/i.test(a.cssText)&&a.cssText.replace(/\r+|\n+/g,"").indexOf(b.split(" ")[0])===0};c=i('@font-face { font-family: "font"; src: url(data:,); }'),d.removeChild(e);return c},r.video=function(){var a=b.createElement("video"),c=!!a.canPlayType;if(c){c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"');var d='video/mp4; codecs="avc1.42E01E';c.h264=a.canPlayType(d+'"')||a.canPlayType(d+', mp4a.40.2"'),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"')}return c},r.audio=function(){var a=b.createElement("audio"),c=!!a.canPlayType;c&&(c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"'),c.mp3=a.canPlayType("audio/mpeg;"),c.wav=a.canPlayType('audio/wav; codecs="1"'),c.m4a=a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;"));return c},r.localstorage=function(){try{return!!localStorage.getItem}catch(a){return!1}},r.sessionstorage=function(){try{return!!sessionStorage.getItem}catch(a){return!1}},r.webWorkers=function(){return!!a.Worker},r.applicationcache=function(){return!!a.applicationCache},r.svg=function(){return!!b.createElementNS&&!!b.createElementNS(q.svg,"svg").createSVGRect},r.inlinesvg=function(){var a=b.createElement("div");a.innerHTML="<svg/>";return(a.firstChild&&a.firstChild.namespaceURI)==q.svg},r.smil=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"animate")))},r.svgclippaths=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"clipPath")))};for(var H in r)z(r,H)&&(v=H.toLowerCase(),e[v]=r[H](),u.push((e[v]?"":"no-")+v));e.input||G(),e.crosswindowmessaging=e.postmessage,e.historymanagement=e.history,e.addTest=function(a,b){a=a.toLowerCase();if(!e[a]){b=!!b(),g.className+=" "+(b?"":"no-")+a,e[a]=b;return e}},A(""),j=l=null,f&&a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="<elem></elem>";return a.childNodes.length!==1}()&&function(a,b){function p(a,b){var c=-1,d=a.length,e,f=[];while(++c<d)e=a[c],(b=e.media||b)!="screen"&&f.push(p(e.imports,b),e.cssText);return f.join("")}function o(a){var b=-1;while(++b<e)a.createElement(d[b])}var c="abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",d=c.split("|"),e=d.length,f=new RegExp("(^|\\s)("+c+")","gi"),g=new RegExp("<(/*)("+c+")","gi"),h=new RegExp("(^|[^\\n]*?\\s)("+c+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),i=b.createDocumentFragment(),j=b.documentElement,k=j.firstChild,l=b.createElement("body"),m=b.createElement("style"),n;o(b),o(i),k.insertBefore(m,k.firstChild),m.media="print",a.attachEvent("onbeforeprint",function(){var a=-1,c=p(b.styleSheets,"all"),k=[],o;n=n||b.body;while((o=h.exec(c))!=null)k.push((o[1]+o[2]+o[3]).replace(f,"$1.iepp_$2")+o[4]);m.styleSheet.cssText=k.join("\n");while(++a<e){var q=b.getElementsByTagName(d[a]),r=q.length,s=-1;while(++s<r)q[s].className.indexOf("iepp_")<0&&(q[s].className+=" iepp_"+d[a])}i.appendChild(n),j.appendChild(l),l.className=n.className,l.innerHTML=n.innerHTML.replace(g,"<$1font")}),a.attachEvent("onafterprint",function(){l.innerHTML="",j.removeChild(l),j.appendChild(n),m.styleSheet.cssText=""})}(a,b),e._enableHTML5=f,e._version=d,g.className=g.className.replace(/\bno-js\b/,"")+" js "+u.join(" ");return e}(this,this.document)

/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/
var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
function getWindowHeight () {
    if (window.innerHeight) {
        return window.innerHeight;
    }
    if (document.documentElement && document.documentElement.clientHeight) {
        return document.documentElement.clientHeight;
    }
    return 0;
}

function getPosition (element) {
    var result = {};
    if (element.ownerDocument && element.ownerDocument.documentElement && element.getBoundingClientRect) {
        var box = element.getBoundingClientRect ();
        var doc = element.ownerDocument;
        var docElem = doc.documentElement;
        
        var clientTop = docElem.clientTop || 0;
        var clientLeft = docElem.clientLeft || 0;
        result.x = box.left + (self.pageXOffset || docElem.scrollLeft) - clientLeft;
        result.y = box.top  + (self.pageYOffset || docElem.scrollTop ) - clientTop;
    } else {
        var x = 0;
        var y = 0;
        var obj = element.offsetParent;
        while (obj != null){
            x += obj.offsetLeft;
            y += obj.offsetTop;
            obj = obj.offsetParent;
        }
        result.x = x;
        result.y = y;
    }
    return result;
}

var onLoaded = new Array ();
var onResized = new Array ();

function monochromeOnLoad () {
    document.body.onorientationchange = monochromeOnOrientationChange;
    for (var n = 0; n < onLoaded.length; ++n) {
        onLoaded[n]();
    }
}

function monochromeAddOnLoad (callback) {
    onLoaded.push (callback);
}

function monochromeAddOnResize (callback) {
    onResized.push (callback);
}

function flowPlayerConfig () {
    return { 
        plugins:  { 
            controls: {             
                backgroundGradient: 'none', 
                backgroundColor: "#303030",
                bufferColor: '#111111', 
                progressColor: '#404040',             
                buttonColor: '#020202', 
                buttonOverColor: '#606060', 
                timeColor: '#c0c0c0', 
                durationColor: '#a0a0a0', 
                timeBgColor: '#020202', 
                progressGradient: 'none',
                volumeColor : '#020202',
                volumeSliderColor : '#000000',
                opacity: 0.80,
                hideDelay: 1000,
                width: '95%',  
                bottom: 5, 
                left: '50%', 
                borderRadius: 15,
                height: 24,
                autoHide: 'always',
                tooltipColor: '#020202',
                tooltipTextColor: '#a0a0a0',
                tooltips: { 
                    buttons: true, 
                    fullscreen: 'Fullscreen'
                } 
            }
        }
    };
}

function centerWindow (element, width, height, orientation) {
    if (orientation == 'vertical') {
        var pos = (height - element.clientHeight) / 2;
        if (pos > 0) {
            element.scrollTop = pos;
        }
    } else {
        var pos = (width - element.clientWidth) / 2;
        if (pos > 0) {
            element.scrollLeft = pos;
        }
    }    
}

function showBigImageMarker (x, y, w, h, text) {
    var marker = document.getElementById ("big_image_marker");
    var markerFrame = document.getElementById ("big_image_marker_frame");
    var markerText = document.getElementById ("big_image_marker_text");
    var image = document.getElementById ("big_image");
    
    if (!marker || !markerFrame || !markerText) {
        return;
    }
    
    var p = { x:0, y:0 };
    
    markerText.innerHTML = text.replace (/[ ]/g, "&#160;");
    
    var textOffset = 0;
    if (markerText.offsetWidth > w) {
        textOffset = -((markerText.offsetWidth - w) / 2);
    }
    
    marker.style.top = (p.y + y + 5) + "px";
    marker.style.left = (p.x + x + 5 + textOffset) + "px";
    markerFrame.style.left = (-textOffset) + "px";
    markerFrame.style.width = (w - 6) + "px";
    markerFrame.style.height = (h - 6) + "px";
    
    marker.style.visibility = '';
}

function hideBigImageMarker () {
    var mainDocument = document;
    if (!mainDocument.getElementById ("big_image_marker")) {
        mainDocument = document.getElementById ("big_image_iframe").contentWindow.document;
    }
    
    var marker = mainDocument.getElementById ("big_image_marker");
    if (marker) {
        marker.style.visibility = 'hidden';
    }
}

function likePage () {
    var likeButton = document.getElementById ("likeButton");
    var pressedLikeButton = document.getElementById ("pressedLikeButton");
    pressedLikeButton.style.display = 'block';
    likeButton.style.display = 'none';
    
    var label = document.URL.toString ();
    _gaq.push(['_trackEvent', 'like: ' + label, 'like', label, 1]);
}

// VR


var vrs = {};
var vrsFullScreen = {};

function monochromeAddVr (imageId, source, y0, p0, r0) {
    if (Modernizr.csstransforms3d || Modernizr.webgl) {
        var linear = null;
        if (bigshot.webglutil.isWebGLSupported ()) {
            linear = bigshot.webglutil.createContext (document.createElement ("canvas")).LINEAR;
        }
        if (!y0) {
            y0 = 0;
        }
        if (!p0) {
            p0 = 0;
        }
        if (!r0) {
            r0 = 0;
        }
        var bvr = new bigshot.VRPanorama (
            new bigshot.VRPanoramaParameters ({
                    container : document.getElementById (imageId + "_vrContainer"),
                    basePath : "/bigshot.php?file=" + source + ".bigshot&entry=",
                    fileSystemType : "dzi",
                    textureMinFilter : linear,
                    textureMagFilter : linear,
                    //maxTesselation : 1,
                    maxTextureMagnification : 1.5,
                    yawOffset : y0,
                    pitchOffset : p0,
                    rollOffset : r0
                }));
        //bvr.autoRotateWhenIdle (3);
        bvr.setDragMode (bigshot.VRPanorama.DRAG_GRAB);
        bvr.autoResizeContainer (document.getElementById (imageId + "_vrContainerSize"));
        bvr.onresize ();
        bvr.render ();
        
        vrs[imageId] = bvr;
    } else {
        var vrControls = document.getElementById (imageId + "_vrControls");
        vrControls.parentNode.removeChild (vrControls);
        
        // Set up Salado player
        
        var flashvars = {};
        flashvars.xml = source + ".xml";
        var params = {};
        params.play = "true";
        params.loop = "false";
        params.menu = "false";
        params.quality = "high";
        params.scale = "showall";
        params.wmode = "window";
        params.bgcolor = "#FFFFFF";
        params.devicefont = "false";
        params.allowfullscreen = "true";
        params.allowscriptaccess = "sameDomain";
        var attributes = {};
        swfobject.embedSWF("/SaladoPlayer.swf", imageId + "_vrContainer", "100%", "100%", "10.0.0", "flashExpressInstall.swf", flashvars, params, attributes);
    }
}

function monochromeVrFullScreen (vr) {
    if (vrsFullScreen[vr]) {
        vrsFullScreen[vr]();
    } else {
        var zi = vrs[vr];
        var vrControls = document.getElementById (vr + "_vrControls");
        var vrContainer = document.getElementById (vr + "_vrContainer");
        savedParent = vrControls.parentNode;
        
        var div = document.createElement ("div");
        div.style.position = "fixed";
        div.style.top = "0px";
        div.style.left = "50%";
        div.style.zIndex = "9999";
        
        var outer = document.createElement ("div");
        outer.className = "vrContainerOuterFullScreen";
        
        outer = div.appendChild (outer);
        vrControls = outer.appendChild (vrControls);
        div = document.body.appendChild (div);
        
        vrsFullScreen[vr] = zi.fullScreen (function () {
                delete vrsFullScreen[vr];
                savedParent.appendChild (vrControls);
                document.body.removeChild (div);
                vrContainer.style.width = "";
                vrContainer.style.height = "";
            });
    }
}

function monochromeVrZoomOut (zoomable) {
    var zi = vrs[zoomable];
    zi.setFov (Math.min (zi.getFov () * 1.2, 90));
    zi.render ();
}

function monochromeVrZoomIn (zoomable) {
    var zi = vrs[zoomable];
    zi.setFov (Math.max (zi.getFov () * 0.8, zi.getMinFovFromViewportAndImage ()));
    zi.render ();
}

function monochromeVrZoomTo (zoomable, fraction) {
    var zi = vrs[zoomable];
    var base = zi.getMinFovFromViewportAndImage ();
    var range = 90 - base;
    var newZoom = base + fraction * range;
    zi.setFov (newZoom);
    zi.render ();
}

function monochromeVrZoomToFit (zoomable) {
    var zi = vrs[zoomable];
    zi.setFov (60);
    zi.render ();
}

// ZOOMABLE

var zoomables = {};
var zoomablesFullScreen = {};

function monochromeAddZoomable (imageId, source, parameterSetup, zoomableSetup) {
    var container = document.getElementById (imageId + "_zoomContainer");
    var controls = document.getElementById (imageId + "_zoomControls");
    
    //new bigshot.Browser ().stopMouseEventBubbling (controls);
    
    var zoomable = new bigshot.Image (
        parameterSetup (
            new bigshot.ImageParameters ({
                    basePath : "/bigshot.php?file=" + source,
                    fileSystemType : "archive",
                    container : container,
                    touchUI : false
                })));
    
    zoomableSetup (zoomable);
    
    zoomable.onresize ();
    zoomable.zoomToFit ();
    
    zoomables[imageId] = zoomable;
}

function monochromeZoomableZoomOut (zoomable) {
    var zi = zoomables[zoomable];
    zi.flyTo (null, null, zi.getZoom () - 0.1);
}

function monochromeZoomableZoomIn (zoomable) {
    var zi = zoomables[zoomable];
    zi.flyTo (null, null, zi.getZoom () + 0.1);
}

function monochromeZoomableZoomTo (zoomable, fraction) {
    var zi = zoomables[zoomable];
    var newZoom = zi.getZoomToFitValue () * fraction;
    zi.flyTo (null, null, newZoom);
}

function monochromeZoomableZoomToFit (zoomable) {
    var zi = zoomables[zoomable];
    zi.flyZoomToFit ();
}

function monochromeZoomableZoomToFitWidth (zoomable) {
    var zi = zoomables[zoomable];
    zi.flyZoomToFitWidth ();
}

function monochromeZoomableZoomToFitHeight (zoomable) {
    var zi = zoomables[zoomable];
    zi.flyZoomToFitHeight ();
}

function monochromeZoomableFullScreen (zoomable) {
    var zi = zoomables[zoomable];
    
    if (zoomablesFullScreen[zoomable]) {
        zoomablesFullScreen[zoomable]();
    } else {
        var vrControls = document.getElementById (zoomable + "_zoomControls");
        var vrContainer = document.getElementById (zoomable + "_zoomContainer");
        savedParent = vrControls.parentNode;
        
        var div = document.createElement ("div");
        div.style.position = "fixed";
        div.style.top = "0px";
        div.style.left = "50%";
        div.style.zIndex = "9999";
        
        var outer = document.createElement ("div");
        outer.className = "vrContainerOuterFullScreen";
        
        outer = div.appendChild (outer);
        vrControls = outer.appendChild (vrControls);
        div = document.body.appendChild (div);
        
        zoomablesFullScreen[zoomable] = zi.fullScreen (function () {
                delete zoomablesFullScreen[zoomable];
                savedParent.appendChild (vrControls);
                document.body.removeChild (div);
                vrContainer.style.width = "";
                vrContainer.style.height = "";
            });
    }
}

// ENTRY MAP

function entryMapDistance (md1, md2) {
    return (
        Math.abs (md1.pos[0] - md2.pos[0]) +
        Math.abs (md1.pos[1] - md2.pos[1])
    );
}

var ENTRY_MAP_BASE_THRESHOLD = 0.00008;

function entryMapMerge (md, markerData, _threshold) {
    var threshold = _threshold;
    if (!threshold) {
        threshold = ENTRY_MAP_BASE_THRESHOLD;
    }
    var merged = false;
    for (var i = 0; i < markerData.length; ++i) {
        var md2 = markerData[i];
        if (entryMapDistance (md, md2) < threshold) {
            md2.images = md2.images.concat (md.images);
            md2.index = md2.index.concat (md.index);
            md2.icons = md2.icons.concat (md.icons);
            merged = true;
            break;
        }
    }
    if (!merged) {
        markerData.push ({
                pos : md.pos,
                images : md.images,
                index : md.index,
                icons : md.icons
            });
    }
}

function entryMapCreateMarker (md, basePath) {
    var icon = new GIcon (G_DEFAULT_ICON, md.icons[0]);
    icon.shadow = "map-image-shadow.png";
    if (md.images.length > 1) {
        icon.shadow = "map-image-shadow-multiple.png";
    }
    icon.iconSize = new GSize (62, 62);
    icon.iconAnchor = new GPoint (30, 61);
    icon.shadowSize = new GSize (120, 62);
    icon.infoWindowAnchor = new GPoint (30, 0);
    icon.imageMap = [ 4,4, 4,57, 26,57, 30,61, 34,57, 57,57, 57,4 ];
    
    var marker = new GMarker(new GLatLng (md.pos[0], md.pos[1]), icon);
    GEvent.addListener (marker, "click", function() {
            var text = '<div style="height: 196px; margin: 0px; margin-right: 12px; padding:0px; overflow-x:hidden; overflow-y: auto;">';
            for (var i = 0; i < md.images.length; ++i) {
                text += '<table cellspacing="0" cellpadding="0" border="0" width="196" height="196"><tr><td style="text-align:center" valign="center"><a target="_parent" href="' + basePath + '.image.' + md.index[i] + '.html"><img class="thumbnail" src="';
                text += md.images[i];
                text += '"/></a></td></tr></table>';            
            }
            text += '</div>';
            marker.openInfoWindowHtml(text, { maxWidth : 240 });
        });
    return marker;
}

function entryMapCreateEntryMarker (name, lat, lon) {
    var marker = new GMarker(new GLatLng (lat, lon));
    GEvent.addListener (marker, "click", function() {
            var text = '<div style="text-align:center; margin: 0px; margin-right: 12px; padding:0px; overflow:auto;">';
            text += '<p style="font-weight:bold;">';
            text += name;
            text += '</p>';            
            text += '</div>';
            marker.openInfoWindowHtml(text, { maxWidth : 80 * map.getSize ().width / 100 });
        });
    return marker;
}

function entryMapInitMap () {
    var map = new GMap2(document.getElementById("map"));
    map.enableDoubleClickZoom();
    map.enableContinuousZoom();
    map.addControl(new GLargeMapControl3D());
    map.addControl(new GHierarchicalMapTypeControl());
    map.addControl(new GScaleControl ());
    map.setCenter(new GLatLng(0,0), 1);
    return map;
}

function entryMapCreateAggregate (markerData, mgr, basePath, zoom, minZoom, maxZoom) {
    var aggregateMarkers = [];
    var newMarkerData = [];
    var threshold = ENTRY_MAP_BASE_THRESHOLD * (Math.pow (2, (17 - zoom)));
    for (var i = 0; i < markerData.length; ++i) {
        entryMapMerge (markerData[i], newMarkerData, threshold);
    }
    for (var i = 0; i < newMarkerData.length; ++i) {
        var md = newMarkerData[i];
        aggregateMarkers.push (entryMapCreateMarker (md, basePath));
    }
    mgr.addMarkers(aggregateMarkers, minZoom, maxZoom);
}

function entryMapCreateMap (markerData, markers, bounds, mgr, map, basePath) {
    mgr.addMarkers(markers, 0, 17);
    
    markers = [];
    
    for (var i = 0; i < markerData.length; ++i) {
        var md = markerData[i];
        markers.push (entryMapCreateMarker (md, basePath));
        bounds.extend (new GLatLng(md.pos[0], md.pos[1]));
    }
    
    mgr.addMarkers(markers, 16, 17);
    
    entryMapCreateAggregate (markerData, mgr, basePath, 15, 15, 15);
    entryMapCreateAggregate (markerData, mgr, basePath, 14, 14, 14);
    entryMapCreateAggregate (markerData, mgr, basePath, 12, 11, 13);
    entryMapCreateAggregate (markerData, mgr, basePath, 9, 8, 10);
    entryMapCreateAggregate (markerData, mgr, basePath, 8, 0, 8);
    
    map.setZoom(Math.max (map.getBoundsZoomLevel (bounds) - 1, 0));
    map.setCenter(bounds.getCenter()); 
    
    mgr.refresh ();
}

function entryMapFormatDistance (distanceInMeters) {
    if (distanceInMeters < 1200) {
        return Math.round (distanceInMeters) + "m";
    } else {
        distanceInMeters = Math.round (distanceInMeters / 100) / 10;
        return distanceInMeters + "km";
    }
}

function entryMapFormatDuration (durationInMillis) {
    durationInMillis = durationInMillis / 1000;
    var s = Math.floor (durationInMillis) % 60;
    durationInMillis = durationInMillis / 60;
    var m = Math.floor (durationInMillis) % 60;
    durationInMillis = durationInMillis / 60;
    var h = Math.floor (durationInMillis);
    
    var duration = s + "s";
    if (m > 0 || h > 0) {
        duration = m + "m" + (s < 10 ? "0" : "") + duration;
        if (h > 0) {
            duration = h + "h" + (m < 10 ? "0" : "") + duration;
        }
    }
    return duration;
}

function entryMapAddMapTrackMarkers (polyline, mgr, name, path) {
    
    var unit = polyline.distance < 1200 ? "m" : "km";
    var numVertices = polyline.line.getVertexCount ();
    
    entryMapAddMapTrackMarker (polyline.line.getVertex(0), mgr, name, "Start - 0" + unit + " - 0s");
    entryMapAddMapTrackMarker (polyline.line.getVertex(numVertices - 1), mgr, name, "End - " + entryMapFormatDistance (polyline.distance[numVertices - 1]) + " - " + entryMapFormatDuration (polyline.duration[numVertices - 1]));
    
    GEvent.addListener (polyline.line, "click", function (latLon) {
            var nearestVertex = 0;
            var nearestDistance = 6378137 * 4;
            for (var i = 1; i < numVertices; ++i) {
                var d = polyline.line.getVertex(i).distanceFrom (latLon);
                if (d < nearestDistance) {
                    nearestDistance = d;
                    nearestVertex = i;
                }
            }
            var p = polyline.line.getVertex (nearestVertex);
            var text = "<div style='overflow:auto; max-height:64px; padding-right:5pt; margin-right:12px;'>";
            text += "<p style='margin-top:0px; padding-top:0px;'>";
            {
                if (name.length > 0) {
                    text += "<b>" + name + "</b>";
                }
                var deltat = nearestVertex > 0 ? (polyline.duration[nearestVertex] - polyline.duration[nearestVertex - 1]) : 0;
                var deltad = nearestVertex > 0 ? (polyline.distance[nearestVertex] - polyline.distance[nearestVertex - 1]) : 0;
                text += "<br>" + entryMapFormatDistance (polyline.distance[nearestVertex]) + " - " + entryMapFormatDuration (polyline.duration[nearestVertex]);
                if (deltat > 0 && deltad > 0) {
                    var mps = deltad / (deltat / 1000.0);
                    var kph = mps * 3600 / 100;
                    kph = Math.round (kph) / 10;
                    text += " - " + kph + " km/h";
                }
            }
            text += "</p>";
            text += "</div>";
            map.openInfoWindowHtml(p, text, { maxWidth : 90 * (map.getSize ().width - 64) / 100 });
        });
    
    GEvent.addListener (polyline.line, "mouseover", function () {
            polyline.line.setStrokeStyle ({opacity: 0.75});
        });
    
    GEvent.addListener (polyline.line, "mouseout", function () {
            polyline.line.setStrokeStyle ({opacity: 0.5});
        });
}

function entryMapAddMapTrackMarker (position, mgr, name, waypointName, description) {
    var marker = new GMarker (position);
    GEvent.addListener (marker, "click", function() {
            var text = "<div style='overflow:auto; max-height:120px; padding-right:5pt; margin-right:12px;'>";
            {
                text += "<p style='margin-top:0px; padding-top:0px;'>";
                {
                    if (name.length > 0) {
                        text += "<b>" + name + "</b>";
                    }
                    if (waypointName && waypointName.length > 0) {
                        text += "<br>" + waypointName + "";
                    }
                }
                text += "</p>";
                
                if (description && description.length > 0) {
                    text += "<p>";
                    text += description;
                    text += "</p>";
                }
            }
            text += "</div>";
            marker.openInfoWindowHtml(text, { maxWidth : 90 * (map.getSize ().width - 64) / 100 });
        });
    mgr.addMarker (marker, 0, 17);
}

//-----------------

delayImages = {};

function addDelayLoadImage (id, image, src) {
    if (!delayImages[id]) {
        delayImages[id] = {};
    }
    delayImages[id][image] = src;
}

function loadDelayedImages (id) {
    var images = delayImages[id];
    if (images) {
        for (var k in images) {
            var img = document.getElementById (k);
            img.src = images[k];
        }
    }
}

function openMobileEntry (entry) {
    loadDelayedImages (entry);
    
    var div = document.getElementById (entry + "_body");
    div.style.display='block'; 
    
}

//---------------------

function resizeFullEntryMap (id) {
    var mf = document.getElementById (id);
    if (mf) {
        mf.style.height = Math.max (getWindowHeight () - mf.offsetTop - 52, 200) + "px";
    }
}

function monochromeOnResize () {
    resizeFullEntryMap ('bigphotomapframe'); 
    resizeFullEntryMap ('bigmapframe');
    for (var n = 0; n < onResized.length; ++n) {
        onResized[n]();
    }
}

function monochromeOnOrientationChange () {
    resizeFullEntryMap ('bigphotomapframe'); 
    resizeFullEntryMap ('bigmapframe');
    for (var n = 0; n < onResized.length; ++n) {
        onResized[n]();
    }
}

//---------------------

monochromeRecipe = function () {
    var that = this;
    
    var Ingredient = function (recipe, amount, unit, element) {
        this.recipe = recipe;
        this.amount = amount;
        this.unit = unit;
        this.element = element;
        
        this.recalculate = function (servings) {
            if (amount >= 0) {
                var newAmount = amount * servings / recipe.baseServings;
                var text = newAmount + " " + unit;
                element.innerHTML = text;
            }
        }
    };
    
    this.ingredients = [];
    this.selector = null;
    this.baseServings = 1;
    
    this.addIngredient = function (amount, unit, element) {
        var ing = new Ingredient (this, amount, unit, element);
        this.ingredients.push (ing);
    }
    
    this.setBaseServings = function (base) {
        this.baseServings = base;
    }
    
    this.setSelector = function (selector) {
        this.selector = selector;
        this.selector.onchange = function () {
            that.onchange ();
        };
        
    };
    
    this.onchange = function () {
        var newServings = parseInt (this.selector.value);
        for (var i = 0; i < this.ingredients.length; ++i) {
            this.ingredients[i].recalculate (newServings);
        }
    }
};

//---- ROLLOVERS

monochromeRollover = function (imageId, defaultSrc) {
    var that = this;
    
    this.browser = new bigshot.Browser ();
    
    this.image = document.getElementById (imageId);
    this.tabs = new Array ();
    
    this.add = function (tabId, src, imageOver) {
        var tab = document.getElementById (tabId);
        this.tabs.push (tab);
        
        var handler = function (e) {
            that.switchTo (tab, src);
        };
        this.browser.registerListener (tab, "mouseover", handler, false);
        if (imageOver) {
            this.browser.registerListener (this.image, "mouseover", handler, false);
            
            var outHandler = function (e) {
                that.switchTo (document.getElementById (imageId + "_defaultRollover"), defaultSrc);
            };
            this.browser.registerListener (this.image, "mouseout", outHandler, false);
        }
    }
    
    this.switchTo = function (tab, src) {
        this.image.src = src;
        for (var i = 0; i < this.tabs.length; ++i) {
            this.tabs[i].className = "rollover";
        }
        tab.className = "rollover_selected";
    }
    
}



