function BCarouselSelectionMath(items) {
    this.classname = "BCarouselSelectionMath";
    this.items = items;
    this.rot = new Array(this.items.length);
    this.proj = new Array(this.items.length);
    for (var i=0; i<this.items.length; i++) {
	this.rot[i] = {x:0,y:0,z:0};
	this.proj[i] = {x:0,y:0,z:0};
    }
    this.doSet();
    this.sin = new Array(360);
    this.cos = new Array(360);
    for (var i=0;i<360;i++) {
	var angle=i*(Math.PI/180.0);
	this.sin[i] = Math.sin(angle);
	this.cos[i] = Math.cos(angle);
    }
}

BCarouselSelectionMath.prototype.add = function() {
    this.rot.push({x:0,y:0,z:0});
    this.proj.push({x:0,y:0,z:0});
    this.distribute();
}
BCarouselSelectionMath.prototype.remove = function() {
    this.rot.pop();
    this.proj.pop();
    this.distribute();
}

BCarouselSelectionMath.prototype.distribute = function() {
    var x=0;
    var z=0;
    var angle = 360.0/this.items.length;
    for (var i=0;i<this.items.length;i++) {
	this.items[i].angle = Math.round(i*angle);
	this.items[i].pos.x = 200*this.cos[this.items[i].angle];
	this.items[i].pos.z = 200*this.sin[this.items[i].angle];
    }
}

BCarouselSelectionMath.prototype.doSet = function() {
    //BGlobal.logger.info(this.classname+".set()");
    for (var i=0; i<this.items.length; i++) {
	this.rot[i].x = this.items[i].pos.x;
	this.rot[i].y = this.items[i].pos.y;
	this.rot[i].z = this.items[i].pos.z;
    }
}

BCarouselSelectionMath.prototype.rotateX = function(a) {
    //BGlobal.logger.info(this.classname+".rotateY("+a+")");
    var sa = this.sin[a];
    var ca = this.cos[a];
    for (var i=0; i<this.rot.length; i++) {
	var y1=this.rot[i].y*ca;
	var z1=this.rot[i].z*sa;
	var y2=this.rot[i].y*sa;
	var z2=this.rot[i].z*ca;
	this.rot[i].x = this.rot[i].x;
	this.rot[i].y = y1-z1;
	this.rot[i].z = y2+z2;
    }
}

BCarouselSelectionMath.prototype.rotateY = function(a) {
    //BGlobal.logger.info(this.classname+".rotateY("+a+")");
    var sa = this.sin[a];
    var ca = this.cos[a];
    for (var i=0; i<this.rot.length; i++) {
	var x1=this.rot[i].x*ca;
	var z1=this.rot[i].z*sa;
	var x2=this.rot[i].x*sa;
	var z2=this.rot[i].z*ca;
	this.rot[i].x = x1+z1;
	this.rot[i].y = this.rot[i].y;
	this.rot[i].z = z2-x2;
    }
}

BCarouselSelectionMath.prototype.rotateZ = function(a) {
    //BGlobal.logger.info(this.classname+".rotateZ("+a+")");
    var sa = this.sin[a];
    var ca = this.cos[a];
    for (var i=0; i<this.rot.length; i++) {
	var x1 = this.rot[i].x*ca;
	var y1 = this.rot[i].y*sa;
	var x2 = this.rot[i].x*sa;
	var y2 = this.rot[i].y*ca;
	this.rot[i].x = x1-y1;
	this.rot[i].y = x2+y2;
	this.rot[i].z = this.rot[i].z;
    }
}
/*
BCarouselSelectionMath.prototype.doProj = function() {
    //BGlobal.logger.info(this.classname+".proj()");
	for (var i=0; i<this.rot.length; i++) {
		this.proj[i].x = Math.round(this.rot[i].x)+200;
		this.proj[i].y = Math.round(this.rot[i].y)+200;
		this.proj[i].z = Math.round(this.rot[i].z)+5000;
	}
}
*/
BCarouselSelectionMath.prototype.doProj = function(dist,zoom,dx,dy) {
    //BGlobal.logger.info(this.classname+".proj()");
    for (var i=0; i<this.rot.length; i++) {
	var w = this.rot[i].z/dist+1.0;
	this.proj[i].x = Math.round(zoom*this.rot[i].x/w)+dx;
	this.proj[i].y = -Math.round(zoom*this.rot[i].y/w)+dy;
	this.proj[i].z = dist-Math.round(this.rot[i].z);
    }
}

BCarouselSelectionMath.prototype.orderZ = function() {
  this.proj.sort(comparePointsZ);
}

function comparePointsZ(p1,p2) {
  return p2.z-p1.z;
}

