// _collidr class
function _collidr(o){
    var opts=o?o:{};
    var colcomb=opts.objs.pairs(true);

    if(colcomb.length>1){
        var tmpid=opts.id;
        for(var i=0,j=colcomb.length;i<j;i++){
            var tmp={};
            tmp=opts;
            tmp.objs=colcomb[i];
            tmp.id=tmpid+parseInt(_randomseed(10000),10);
            _collidr(tmp);
        }
    }else{
      opts.freq=!falsey(opts.freq)?opts.freq:5;
      var clsn=null;
      var o=opts.objs[0];
      var b=opts.objs[1];
	  var _collisionID=opts.id;
  
        _pollr.addpoll({tst:function(){
                clsn=_collide(o,b);
                return clsn.hit;
            },
            tf:function(){
                opts.oncollision(clsn);
                if(opts.successdelay)_pollr.delaypoll(_collisionID,opts.successdelay);
            },
            ff:function(){
                if(opts.onNocollision)opts.onNocollision(clsn);
                if(opts.failuredelay)_pollr.delaypoll(opts.id,opts.failuredelay);
            },
        id:opts.id,f:opts.freq});
    }
    return _pollr.pollobj(opts.id);
}

// get unique pairs
Array.prototype.pairs=function(deep, x, a){
  x=!(falsey(x))?x:0;
  a=a?a:[];
    if(x==this.length-1 || (deep && x==1))return a;
      for(var i=x+1,j=this.length;i<j;i++){
          a.push([this[x],this[i]]);
      }

return this.pairs(deep, ++x, a);
};

var _physys =  function(){

    var objks=[];
    return {
        objs:objks,
		frameres:10,
        addmatter:function(o){
            this.objs.push(_physobj(o));
            this.objs[this.objs.length-1].init();
        },
        reframe:function(){
            for(var a=0,b=this.objs.length;a<b;a++){
                this.objs[a].update();
            }
        },
		fps:function(f){
			this.frameres=f;
		},
        start:function(){
          sysClock.addtask({id:"physx",task:function(){
                    _physys.reframe();
              },fps:this.frameres});
        }

    };
}();

function _physobj(o){
    o = o || {};
    return {
        options:o,
        refpnt:o.refpnt||"",
        motion:{ivel:0, dvel:0, vel:0, oacc:0, acc:0, disp:0, time:0},
        attr:{mass:1, collidable:true, t3dobj:true },
		setenv:{invertx:false,inverty:true,invertz:false},
        spatial:{
			x:o.xcoor
            ,y:o.ycoor
            ,z:0
            ,xold:0
            ,yold:0
            ,zold:0
            ,dx:0
			,dy:0
			,dz:0
			,t:new _timestamp(),
            told:0,
            dt:0
        },
        init:function(){
            _updateobject(this,this.options);
        },
        update:function(){
        var x1,x2,y1,y2,dx,dy;

          var mc=_Event.mousecoords;
          x2 = this.xcoor();
          y2 = this.ycoor();

          var sptl=this.spatial;

          var t1,t2,dt;
          dt=sptl.t.elapsed();
          sptl.t= new _timestamp();

          x1= sptl.xold;
          y1= sptl.yold;

          dx=(x2-x1)*(this.setenv.invertx?-1:1);
          dy=(y2-y1)*(this.setenv.inverty?-1:1);
		  
		  var slope=(y2-y1)/(x1-x2);
			slope=_mathround(slope,3);
		  
          var dist=_mathround(_dist2d(dx,dy),3);

          this.spatial.xold=x2;
          this.spatial.yold=y2;
		  
		  this.motion.dvel=this.motion.vel;
		  var vel=_mathround((1000/dt)*dist,3);
		  this.motion.vel=vel;
		  
		  var dvel=(vel-this.motion.dvel)/dt;
			dvel=_mathround(dvel,3);
		  
          var codeblk="";
          codeblk+=" $ "+this.refpnt+"<br/>";
          codeblk+=x2+" / "+y2;
            codeblk+="<br />dx: "+dx+" / dy: "+dy;
            codeblk+="<br />dt: "+dt+" / m: "+slope;
            codeblk+="<br />distance: "+dist;
            codeblk+="<br />velocity: "+vel+" ";
            codeblk+="<br />acceleration: "+dvel+" ";

          $('f1').html(codeblk);

        }
    };
};