//
// Chipmunk defines
//

cp.v = cc.p;
cp._v = cc._p;
cp.vzero  = cp.v(0,0);

// Vector: Compatibility with Chipmunk-JS
cp.v.add = cp.vadd;
cp.v.clamp = cp.vclamp;
cp.v.cross = cp.vcross;
cp.v.dist = cp.vdist;
cp.v.distsq = cp.vdistsq;
cp.v.dot = cp.vdot;
cp.v.eql = cp.veql;
cp.v.forangle = cp.vforangle;
cp.v.len = cp.vlength;
cp.v.lengthsq = cp.vlengthsq;
cp.v.lerp = cp.vlerp;
cp.v.lerpconst = cp.vlerpconst;
cp.v.mult = cp.vmult;
cp.v.near = cp.vnear;
cp.v.neg = cp.vneg;
cp.v.normalize = cp.vnormalize;
cp.v.normalize_safe = cp.vnormalize_safe;
cp.v.perp = cp.vperp;
cp.v.project = cp.vproject;
cp.v.rotate = cp.vrotate;
cp.v.rperp = cp.vrperp;
cp.v.slerp = cp.vslerp;
cp.v.slerpconst = cp.vslerpconst;
cp.v.sub = cp.vsub;
cp.v.toangle = cp.vtoangle;
cp.v.unrotate = cp.vunrotate;



/// Initialize an offset box shaped polygon shape.
cp.BoxShape2 = function(body, box)
{
	var verts = [
		box.l, box.b,
		box.l, box.t,
		box.r, box.t,
		box.r, box.b
	];
	
	return new cp.PolyShape(body, verts, cp.vzero);
};

/// Initialize a box shaped polygon shape.
cp.BoxShape = function(body, width, height)
{
	var hw = width/2;
	var hh = height/2;
	
	return cp.BoxShape2(body, new cp.BB(-hw, -hh, hw, hh));
};


/// Initialize an static body
cp.BodyStatic = function()
{
	return new cp.Body(Infinity, Infinity);
};


// "Bounding Box" compatibility with Chipmunk-JS
cp.BB = function(l, b, r, t)
{
	return {l:l, b:b, r:r, t:t};
};

// helper function to create a BB
cp.bb = function(l, b, r, t) {
	return new cp.BB(l, b, r, t);
};


//
// Some properties
//
// "handle" needed in some cases
Object.defineProperties(cp.Base.prototype,
				{
					"handle" : {
						get : function(){
                            return this.getHandle();
                        },
                        enumerable : true,
						configurable : true
					}
				});

// Properties, for Chipmunk-JS compatibility
// Space properties
Object.defineProperties(cp.Space.prototype,
				{
					"gravity" : {
						get : function(){
                            return this.getGravity();
                        },
						set : function(newValue){
                            this.setGravity(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"iterations" : {
						get : function(){
                            return this.getIterations();
                        },
						set : function(newValue){
                            this.setIterations(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"damping" : {
						get : function(){
                            return this.getDamping();
                        },
						set : function(newValue){
                            this.setDamping(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"staticBody" : {
						get : function(){
                            return this.getStaticBody();
                        },
						enumerable : true,
						configurable : true
					},
					"idleSpeedThreshold" : {
						get : function(){
                            return this.getIdleSpeedThreshold();
                        },
						set : function(newValue){
                            this.setIdleSpeedThreshold(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"sleepTimeThreshold": {
						get : function(){
                            return this.getSleepTimeThreshold();
                        },
						set : function(newValue){
                            this.setSleepTimeThreshold(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"collisionSlop": {
						get : function(){
                            return this.getCollisionSlop();
                        },
						set : function(newValue){
                            this.setCollisionSlop(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"collisionBias": {
						get : function(){
                            return this.getCollisionBias();
                        },
						set : function(newValue){
                            this.setCollisionBias(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"collisionPersistence": {
						get : function(){
                            return this.getCollisionPersistence();
                        },
						set : function(newValue){
                            this.setCollisionPersistence(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"enableContactGraph": {
						get : function(){
                            return this.getEnableContactGraph();
                        },
						set : function(newValue){
                            this.setEnableContactGraph(newValue);
                        },
						enumerable : true,
						configurable : true
					}
				});

// Body properties
Object.defineProperties(cp.Body.prototype,
				{
					"a" : {
						get : function(){
                            return this.getAngle();
                        },
						set : function(newValue){
                            this.setAngle(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"w" : {
						get : function(){
                            return this.getAngVel();
                        },
						set : function(newValue){
                            this.setAngVel(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"p" : {
						get : function(){
                            return this.getPos();
                        },
						set : function(newValue){
                            this.setPos(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"v" : {
						get : function(){
                            return this.getVel();
                        },
						set : function(newValue){
                            this.setVel(newValue);
                        },
						enumerable : true,
						configurable : true
					},
					"i" : {
						get : function(){
                            return this.getMoment();
                        },
						set : function(newValue){
                            this.setMoment(newValue);
                        },
						enumerable : true,
						configurable : true
					}

				});