Hi can you please help me my balls get pushed away abrubtly when colliding sometimes,im keeping my velocities less than my ball radiuses so it can not be that i have done loads of experimentation but no joy.  (cr=0.4;  mass=1;) 

please check my following code written in flash cs3 thankyou in advance.

for (var i1:uint=0;i1<BALLTOTAL-1;i1++) {
    for (var i2:uint=i1+1;i2<BALLTOTALL;i2++) {

        var dx:Number=cararray[i1].x-cararray[i2].x,
            dy:Number=cararray[i1].y-cararray[i2].y,
  d:Number=Math.sqrt(dx*dx+dy*dy),
r1:Number=19,
r2:Number=r1;

        if (d<=(r1+r2)) {

            // component of velocity in the direction (dx,dy)
          var vp1:Number=cararray[i1].velx*dx/d+cararray[i1].vely*dy/d,
                vp2:Number=cararray[i2].velx*dx/d+cararray[i2].vely*dy/d, // << corrected this line >>
    dt:Number=(r1+r2-d)/(vp1+vp2);

            // move back
          cararray[i1].x-=cararray[i1].velx*dt;
          cararray[i1].y-=cararray[i1].vely*dt;
          cararray[i2].x-=cararray[i2].velx*dt;
          cararray[i2].y-=cararray[i2].vely*dt;

          dx=cararray[i1].x-cararray[i2].x;
          dy=cararray[i1].y-cararray[i2].y;
            d=Math.sqrt(dx*dx+dy*dy);

          // unit vector in the direction of the collision         
          var ax:Number=dx/d , ay:Number=dy/d;
 
          // projection of the velocities
          var va1:Number=( cararray[i1].velx*ax+cararray[i1].vely*ay),
                vb1:Number=(-cararray[i1].velx*ay+cararray[i1].vely*ax),
  va2:Number=( cararray[i2].velx*ax+cararray[i2].vely*ay),
  vb2:Number=(-cararray[i2].velx*ay+cararray[i2].vely*ax);

          // new velocities after collisions 
          var vap1:Number=va1+(1+cr)*(va2-va1)/(1+cararray[i1].mass/cararray[i2].mass),
          vap2:Number=va2+(1+cr)*(va1-va2)/(1+cararray[i2].mass/cararray[i1].mass);

          // undo the projections (new velocities after collision)
          cararray[i1].velx=vap1*ax-vb1*ay;
          cararray[i1].vely=vap1*ay+vb1*ax;
          cararray[i2].velx=vap2*ax-vb2*ay;
          cararray[i2].vely=vap2*ay+vb2*ax;

          // move forward
          cararray[i1].x+=cararray[i1].velx*dt;
          cararray[i1].y+=cararray[i1].vely*dt;
          cararray[i2].x+=cararray[i2].velx*dt;
          cararray[i2].y+=cararray[i2].vely*dt;
      }
  }
}