function Metrics(){}Vector=Metrics.Vector=function(a,c,b){this.x=isNaN(a)?0:a.valueOf();this.y=isNaN(c)?0:c.valueOf();this.z=isNaN(b)?0:b.valueOf()};Metrics.Vector.prototype.clone=function(){return new Metrics.Vector(this.x,this.y,this.z)};Metrics.Vector.prototype.add=function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;return this};Metrics.Vector.add=function(b,a){return new Metrics.Vector(b.x+a.x,b.y+a.y,b.z+a.z)};Metrics.Vector.prototype.subtract=function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;return this};Metrics.Vector.subtract=function(b,a){return new Metrics.Vector(b.x-a.x,b.y-a.y,b.z-a.z)};Metrics.Vector.prototype.scale=function(a){this.x*=a;this.y*=a;this.z*=a;return this};Metrics.Vector.scale=function(a,b){return new Metrics.Vector(a.x*b,a.y*b,a.z*b)};Metrics.Vector.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)};Metrics.Vector.prototype.isZero=function(){return this.length<1e-11};Metrics.Vector.prototype.normalize=function(){var a=this.x*this.x+this.y*this.y+this.z*this.z;if(a&&Math.abs(a-1)>0.01){a=Math.sqrt(a);this.x/=a;this.y/=a;this.z/=a}return this};Metrics.Vector.normalize=function(a){return(new Metrics.Vector(a.x,a.y,a.z)).normalize()};Metrics.Vector.dotProduct=function(b,a){return b.x*a.x+b.y*a.y+b.z*a.z};Metrics.Vector.crossProduct=function(b,a){return new Metrics.Vector(b.y*a.z-b.z*a.y,b.z*a.x-b.x*a.z,b.x*a.y-b.y*a.x)};Metrics.Vector.project=function(c,b){var a=Metrics.Vector.dotProduct(b,b);if(a){return Metrics.Vector.scale(b,Metrics.Vector.dotProduct(c,b)/a)}return new Metrics.Vector()};Metrics.Vector.component=function(b,a){return Metrics.Vector.dotProduct(b,Metrics.Vector.normalize(a))};Metrics.Vector.perpendicular=function(b,a){return Metrics.Vector.subtract(b,Metrics.Vector.project(b,a))};Metrics.Vector.rotate=function(a,e,c){var b=Math.cos(e);var d=Math.sin(e);switch(c){case"x":return new Metrics.Vector(a.x,a.y*b+a.z*d,a.z*b-a.y*d);case"y":return new Metrics.Vector(a.x*b+a.z*d,a.y,a.z*b-a.x*d);default:return new Metrics.Vector(a.x*b+a.y*d,a.y*b-a.x*d,a.z)}};Metrics.Vector.prototype.toString=function(){return"("+this.x+", "+this.y+", "+this.z+")"};Orientation=Metrics.Orientation=function(){this.right=new Metrics.Vector(1,0,0);this.up=new Metrics.Vector(0,1,0);this.forward=new Metrics.Vector(0,0,1)};Metrics.Orientation.prototype.clone=function(){var a=new Metrics.Orientation();a.right=this.right.clone();a.up=this.up.clone();a.forward=this.forward.clone();return a};Metrics.Orientation.prototype.translateVector=function(b){var a=this.right.x*b.x+this.up.x*b.y+this.forward.x*b.z,f=this.right.y*b.x+this.up.y*b.y+this.forward.y*b.z,e=this.right.z*b.x+this.up.z*b.y+this.forward.z*b.z;if(isNaN(a)||isNaN(f)||isNaN(e)){var d=[];for(var c in b){d[d.length]=c}alert(b)}return new Metrics.Vector(a,f,e)};Metrics.Orientation.prototype.rotate=function(b,a){this.right=Metrics.Vector.rotate(this.right,b,a).normalize();this.up=Metrics.Vector.rotate(this.up,b,a).normalize();this.forward=Metrics.Vector.rotate(this.forward,b,a).normalize()};Metrics.Orientation.prototype.rotateFrom=function(d,c){d=d.normalize();c=c.normalize();axis=Vector.crossProduct(d,c);var b=Vector.subtract(d,c).length();if(b<0.0001){return false}axis.normalize();var e=(Math.PI-Math.atan2(axis.y,axis.z));axis=Vector.rotate(axis,e,"x");var f=(Math.PI-Math.atan2(axis.x,axis.z));var a=Math.acos((2-b*b)/2);this.rotate(e,"x");this.rotate(f,"y");this.rotate(a/1.4,"z");this.rotate(-f,"y");this.rotate(-e,"x");return true};Metrics.Orientation.prototype.toString=function(){return"("+this.right+", "+this.up+", "+this.forward+")"};Quat=Metrics.Quat=function(b,a,d,c){if(arguments.length==4){this.w=b;this.x=a;this.y=d;this.z=c}else{this.w=1;this.x=0;this.y=0;this.z=0}};Metrics.Quat.prototype.clone=function(){return new Metrics.Quat(this.w,this.x,this.y,this.z)};Metrics.Quat.prototype.normalize=function(){var a=this.w*this.w+this.x*this.x+this.y*this.y+this.z*this.z;if(Math.abs(a-1)>0.001){a=Math.sqrt(a);this.w/=a;this.x/=a;this.y/=a;this.z/=a}};Metrics.Quat.prototype.translateVector=function(h){var a=2*this.x*this.x;var f=2*this.y*this.y;var c=2*this.z*this.z;var b=2*this.x*this.w;var j=2*this.x*this.y;var i=2*this.x*this.z;var g=2*this.y*this.w;var e=2*this.y*this.z;var d=2*this.z*this.w;return new Metrics.Vector(h.x*(1-f-c)+h.y*(j+d)+h.z*(i-g),h.x*(j-d)+h.y*(1-a-c)+h.z*(e+b),h.x*(i+g)+h.y*(e-b)+h.z*(1-a-f))};Metrics.Quat.multiply=function(b,c){var a=new Quat(b.w*c.w-b.x*c.x-b.y*c.y-b.z*c.z,b.w*c.x+b.x*c.w+b.y*c.z-b.z*c.y,b.w*c.y-b.x*c.z+b.y*c.w+b.z*c.x,b.w*c.z+b.x*c.y-b.y*c.x+b.z*c.w);a.normalize();return a};Metrics.Quat.fromAxisRotation=function(b,c){var a=Math.sin(c/2);return new Metrics.Quat(Math.cos(c/2),b.x*a,b.y*a,b.z*a)};Metrics.Quat.rotate=function(a,b,c){return Metrics.Quat.multiply(Metrics.Quat.fromAxisRotation(b,c),a)};Rectangle=Metrics.Rectangle=function(b,a){this.pos=b.clone();this.dims=a.clone()};Metrics.Rectangle.prototype.clone=function(){return new Metrics.Rectangle(this.pos,this.dims)};Metrics.Rectangle.prototype.getPos=function(){return this.pos.clone()};Metrics.Rectangle.prototype.getDims=function(){return this.dims.clone()};Metrics.Rectangle.prototype.getTopLeft=function(){return this.pos.clone()};Metrics.Rectangle.prototype.getTopRight=function(){return new Metrics.Vector(this.pos.x+this.dims.x-1,this.pos.y)};Metrics.Rectangle.prototype.getBottomLeft=function(){return new Metrics.Vector(this.pos.x,this.pos.y+this.dims.y-1)};Metrics.Rectangle.prototype.getBottomRight=function(){return new Metrics.Vector(this.pos.x+this.dims.x-1,this.pos.y+this.dims.y-1)};Metrics.Rectangle.prototype.overlaps=function(a){return(this.pos.x+this.dims.x>a.pos.x)&&(this.pos.y+this.dims.y>a.pos.y)&&(a.pos.x+a.dims.x>this.pos.x)&&(a.pos.y+a.dims.y>this.pos.y)};Metrics.Rectangle.prototype.containsPoint=function(a){return a.x>=this.pos.x&&a.x+this.pos.x<this.dims.x&&a.y>=this.pos.y&&a.y+this.pos.y<this.dims.y};Metrics.Rectangle.prototype.containsRect=function(a){return a.pos.x>=this.pos.x&&a.pos.x+a.dims.x<=this.pos.x+this.dims.x&&a.pos.y>=this.pos.y&&a.pos.y+a.dims.y<=this.pos.y+this.dims.y};Metrics.Rectangle.prototype.clipPoint=function(b){var a=b.clone();if(a.x<this.pos.x){a.x=this.pos.x}else{if(a.x>=this.pos.x+this.dims.x){a.x=this.pos.x+this.dims.x-1}}if(a.y<this.pos.y){a.y=this.pos.y}else{if(a.y>=this.pos.y+this.dims.y){a.y=this.pos.y+this.dims.y-1}}return a};Metrics.Rectangle.prototype.clipRect=function(d){var a=Math.max(this.pos.x,d.pos.x);var e=Math.max(this.pos.y,d.pos.y);var b=Math.min(this.pos.x+this.dims.x,d.pos.x+d.dims.x)-a;var c=Math.min(this.pos.y+this.dims.y,d.pos.y+d.dims.y)-e;if(b>0&&c>0){return new Rectangle(new Vector(a,e),new Vector(b,c))}else{return null}};Metrics.Rectangle.prototype.toString=function(){return this.pos+", "+this.dims};Metrics.getViewportWidth=function(a){a=a||self;if(a.innerWidth){return a.innerWidth}if(a.document.documentElement&&a.document.documentElement.clientWidth){return Math.min(a.document.documentElement.clientWidth,a.document.body.clientWidth)}return a.document.body.clientWidth};Metrics.getViewportHeight=function(a){a=a||self;if(a.innerHeight){return a.innerHeight}if(a.document.documentElement&&a.document.documentElement.clientHeight){return Math.min(a.document.documentElement.clientHeight,a.document.body.clientHeight)}return a.document.body.clientHeight};Metrics.getViewportDims=function(c){c=c||self;var b,a;if(c.innerWidth){b=c.innerWidth;a=c.innerHeight}else{if(c.document.documentElement&&c.document.documentElement.clientWidth){if(c.document.documentElement.clientWidth<c.document.body.clientWidth){b=c.document.documentElement.clientWidth;a=c.document.documentElement.clientHeight}else{b=c.document.body.clientWidth;a=c.document.body.clientHeight}}else{b=c.document.body.clientWidth;a=c.document.body.clientHeight}}return new Metrics.Vector(b,a)};Metrics.getViewportTop=function(a){a=a||self;if(a.pageYOffset!==undefined){return a.pageYOffset}if(a.document.documentElement&&a.document.documentElement.scrollTop){return a.document.documentElement.scrollTop}return a.document.body.scrollTop};Metrics.getViewportLeft=function(a){a=a||self;if(a.pageXOffset!==undefined){return a.pageXOffset}if(a.document.documentElement&&a.document.documentElement.scrollLeft){return a.document.documentElement.scrollLeft}return a.document.body.scrollLeft};Metrics.getViewportPos=function(b){b=b||self;var a,c;if(b.pageYOffset!==undefined){a=b.pageXOffset;c=b.pageYOffset}else{if(b.document.documentElement&&b.document.documentElement.scrollTop){a=b.document.documentElement.scrollLeft;c=b.document.documentElement.scrollTop}else{a=b.document.body.scrollLeft;c=b.document.body.scrollTop}}return new Metrics.Vector(a,c)};Metrics.getViewportRect=function(a){return new Metrics.Rectangle(Metrics.getViewportPos(a),Metrics.getViewportDims(a))};Metrics.getDocumentWidth=function(a){a=a||self;return Math.max(a.document.body.scrollWidth,a.document.offsetWidth)};Metrics.getDocumentHeight=function(a){a=a||self;return Math.max(a.document.body.scrollHeight,a.document.offsetHeight)};Metrics.getDocumentDims=function(c){c=c||self;var b,a;if(c.document.body.scrollHeight>c.document.body.offsetHeight){b=c.document.body.scrollWidth;a=c.document.body.scrollHeight}else{b=c.document.body.offsetWidth;a=c.document.body.offsetHeight}return new Metrics.Vector(b,a)};Metrics.getWidth=function(a){if(a.offsetWidth!==undefined){return a.offsetWidth}else{if(a.clientWidth!==undefined){return a.clientWidth}else{if(a.width!==undefined){return a.width}else{throw"Metrics.getWidth doesn't work in this browser"}}}};Metrics.getHeight=function(a){if(a.offsetHeight!==undefined){return a.offsetHeight}else{if(a.clientHeight!==undefined){return a.clientHeight}else{if(a.height!==undefined){return a.height}else{throw"Metrics.getHeight doesn't work in this browser"}}}};Metrics.getDims=function(c){var b,a;if(c.offsetWidth!==undefined){b=c.offsetWidth;a=c.offsetHeight}else{if(c.clientWidth!==undefined){b=c.clientWidth;a=c.clientHeight}else{if(c.width!==undefined){b=c.width;a=c.height}else{throw"Metrics.getDims doesn't work in this browser"}}}return new Metrics.Vector(b,a)};Metrics.setDims=function(b,c){b.style.width=c.x+"px";b.style.height=c.y+"px";var a=Vector.subtract(c,Metrics.getDims(b));if(!a.isZero()){c=Vector.add(c,a);b.style.width=c.x+"px";b.style.height=c.y+"px"}};Metrics.getInnerWidth=function(a){if(a.clientWidth!==undefined){return a.clientWidth}else{if(a.width!==undefined){return a.width}else{throw"Metrics.getInnerWidth doesn't work in this browser"}}};Metrics.getInnerHeight=function(a){if(a.clientHeight!==undefined){return a.clientHeight}else{if(a.height!==undefined){return a.height}else{throw"Metrics.getInnerHeight doesn't work in this browser"}}};Metrics.getInnerDims=function(c){var b,a;if(c.clientWidth!==undefined){b=c.clientWidth;a=c.clientHeight}else{if(c.width!==undefined){b=c.width;a=c.height}else{throw"Metrics.getInnerDims doesn't work in this browser"}}return new Metrics.Vector(b,a)};Metrics.getOffsetLeft=function(a){return a.offsetLeft};Metrics.getOffsetTop=function(a){return a.offsetTop};Metrics.getOffsetPos=function(a){return new Metrics.Vector(a.offsetLeft,a.offsetTop)};Metrics.getOffsetRect=function(a){return new Metrics.Rectangle(Metrics.getOffsetPos(a),Metrics.getDims(a))};Metrics.setOffsetPos=function(a,b){a.style.left=b.x+"px";a.style.top=b.y+"px"};Metrics.setOffsetRect=function(b,a){Metrics.setOffsetPos(b,a.pos);Metrics.setDims(b,a.dims)};Metrics.getLeft=function(b){var a=0;do{a+=b.offsetLeft;b=b.offsetParent}while(b);return a};Metrics.getTop=function(a){var b=0;do{b+=a.offsetTop;a=a.offsetParent}while(a);return b};Metrics.getPos=function(b){var a=0;var c=0;do{a+=b.offsetLeft;c+=b.offsetTop;b=b.offsetParent}while(b);return new Metrics.Vector(a,c)};Metrics.getRect=function(a){return new Metrics.Rectangle(Metrics.getPos(a),Metrics.getDims(a))};Metrics.setPos=function(a,c){if(a.offsetParent){var b=Vector.subtract(c,Metrics.getPos(a.offsetParent));Metrics.setOffsetPos(a,b)}else{Metrics.setOffsetPos(a,c)}};Metrics.setRect=function(b,a){Metrics.setPos(b,a.pos);Metrics.setDims(b,a.dims)};
