var Vector3D = Class.create();

Vector3D.prototype = {
	x: null, y: null, z: null,
	sx: null, sy: null, sz: null,
	userData: null,
	
	dx: null, dy: null, dz: null,
	tx: null, ty: null, tz: null,
	oll: null,
	
	initialize: function(a, b, c){
		this.x = a;
		this.y = b;
		this.z = c;
	},
	
	copy: function(v){
		this.x = v.x;
		this.y = v.y;
		this.z = v.z;
	},
	
	add: function(v){
		this.x += v.x;
		this.y += v.y;
		this.z += v.z;
	},
	
	sub: function(v){
		this.x -= v.x;
		this.y -= v.y;
		this.z -= v.z;
	},
	
	cross: function(v){
		this.tx = this.x;
		this.ty = this.y;
		this.tz = this.z;
		
		this.x = this.ty * v.z - this.tz * v.y;
		this.y = this.tz * v.x - this.tx * v.z;
		this.z = this.tx * v.y - this.ty * v.x;
	},
	
	multiply: function(s){
		this.x *= s;
		this.y *= s;
		this.z *= s;
	},
	
	distanceTo: function(v){
		this.dx = this.x - v.x;
		this.dy = this.y - v.y;
		this.dz = this.z - v.z;
		
		return Math.sqrt(this.dx * this.dx + this.dy * this.dy + this.dz * this.dz);
	},
	
	distanceToSquared: function(v){
		this.dx = this.x - v.x;
		this.dy = this.y - v.y;
		this.dz = this.z - v.z;
		
		return this.dx * this.dx + this.dy * this.dy + this.dz * this.dz;
	},
	
	length: function(){
		return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
	},
	
	lengthSq: function(){
		return this.x * this.x + this.y * this.y + this.z * this.z;
	},
	
	negate: function(){
		this.x = -this.x;
		this.y = -this.y;
		this.z = -this.z;
	},
	
	normalize: function(){
		if (this.length() > 0)
			this.ool = 1.0 / this.length();
		else
			this.ool = 0;
			
		this.x *= this.ool;
		this.y *= this.ool;
		this.z *= this.ool;
		return this;
	},
	
	dot: function(v){
		return this.x * v.x + this.y * v.y + this.z * v.z;
	},
	
	clone: function(){
		return new Vector3D(this.x, this.y, this.z);
	},
	
	toString: function(){
		return '(' + this.x + ', ' + this.y + ', ' + this.z + ')';
	}
	
}

Vector3D.add = function(a, b)
{
	return new Vector3D( a.x + b.x, a.y + b.y, a.z + b.z );
}

Vector3D.sub = function(a, b)
{
	return new Vector3D( a.x - b.x, a.y - b.y, a.z - b.z );
}		

Vector3D.multiply = function(a, s)
{
	return new Vector3D( a.x * s, a.y * s, a.z * s );
}

Vector3D.cross = function(a, b)
{
	return new Vector3D( a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x );
}

Vector3D.dot = function(a, b)
{
	return a.x * b.x + a.y * b.y + a.z * b.z;
}