Manipulate[
(*by Nasser M. Abbasi, June,17,2014*)
tick;
Module[{data,eq,y,t,pos,vel,sol,graph},
data=rugo[-3,0,-3,y0-massThickness];
graph=makeGraph[currentTime,y0,massThickness,L1,data,False];

If[(runningState=="RUNNING"||runningState=="STEP"),

eq=(m y''[t]+c y'[t]+k (y[t]-L0)== -m g);
sol=NDSolve[{eq,y[0]==y0,y'[0]==v0},{y,y'},{t,0,deltT}];
{pos,vel}={y,y'}/.First@sol;
currentTime=currentTime+deltT;
y0=pos[deltT];
v0=vel[deltT];
If[(y0-massThickness)<(L1+0.25),
v0=-v0;
graph=makeGraph[currentTime,y0,massThickness,L1,data,True]
]
];
If[currentTime>999.9,currentTime=0];
If[runningState=="RUNNING",
tick=Not[tick]
];
graph
],

Grid[{
{"damping",
Manipulator[Dynamic[c,{c=#,currentTime=0,v0=0,y0=L0}&],{0,1,0.01},ImageSize->Small],Style[Dynamic@padIt2[c,{3,2}],11]
},
{"stiffness",
Manipulator[Dynamic[k,{k=#,currentTime=0,v0=0,y0=L0}&],{1,100,0.01},ImageSize->Small],Style[Dynamic@padIt2[k,{5,2}],11]
},
{"mass",
Manipulator[Dynamic[m,{m=#,currentTime=0,v0=0,y0=L0}&],{1,10,0.01},ImageSize->Small],Style[Dynamic@padIt2[m,{4,2}],11]
},
{Text@Style["slow",11],
Manipulator[Dynamic[deltT,{deltT=#}&],{0.001,.1,0.001},ImageSize->Small,ContinuousAction->False],Text@Style["fast",11]
},
{Grid[{
{
Button[Style["run",12],{runningState="RUNNING";tick=Not[tick]},ImageSize->{55,35}],
Button[Style["step",12],{runningState="STEP";tick=Not[tick]},ImageSize->{55,35}],
Button[Style["stop",12],{runningState="STOP";currentTime=0,v0=0,y0=L0},ImageSize->{55,35}]
}
}
]
}
}
],
{{wasHit,False},None},
{{y0,10},None},
{{v0,0},None},
{{m,8},None},
{{k,26},None},
{{c,0},None},
{{runningState,"STOP"},None},
{{currentTime,0},None},
{{deltT,0.01},None},
{{tick,True},None},
TrackedSymbols:>{tick},
Initialization:>
(
g=9.8; L0=10;massThickness=0.5;L1=2.5;

makeGraph[currentTime_,y0_,massThickness_,L1_,data_,hit_]:=Module[{splash},

splash=If[hit,
{Red,Text[Style["Bang!!",16],{5,L1+0.6}]},Sequence@@{}
];
Grid[{
{ Row[{"Time ",padIt2[currentTime,{5,2}]}]},
{
Graphics[
{
{EdgeForm[Black],LightGray,Rectangle[{-4,y0-massThickness},{4,y0+massThickness}]},
Line[{{2,0},{2,1},{2.5,1},{2.5,1.5}}],
Line[{{2,1},{1.5,1},{1.5,1.5}}],
Line[{{1.6,1.2},{2.4,1.2}}],
Line[{{1.6,1.3},{2.4,1.3}}],
Line[{{2,1.3},{2,y0-massThickness}}],
{EdgeForm[Black],Red,Rectangle[{2.5,L1},{5,L1+0.25}]},
splash,

{Thick,Line[{{-6,0},{6,0}}]},
Line[data]
},PlotRange->{{-5,5.5},{-1,11}},Axes->False,ImageSize->300,ImagePadding->5
]}
}
]
];

(*definitions used for parameter checking*)
integerStrictPositive=(IntegerQ[#]&&#>0&);
integerPositive=(IntegerQ[#]&&#≥0&);numericStrictPositive=(Element[#,Reals]&&#>0&);numericPositive=(Element[#,Reals]&&#≥0&);numericStrictNegative=(Element[#,Reals]&&#<0&);numericNegative=(Element[#,Reals]&&#≤0&);
bool=(Element[#,Booleans]&);
numeric=(Element[#,Reals]&);
integer=(Element[#,Integers]&);
padIt1[v_?numeric,f_List]:=AccountingForm[Chop[v],f,NumberSigns->{"-","+"},NumberPadding->{"0","0"},SignPadding->True];padIt2[v_?numeric,f_List]:=AccountingForm[Chop[v],f,NumberSigns->{"",""},NumberPadding->{"0","0"},SignPadding->True];padIt2[v_?numeric,f_Integer]:=AccountingForm[Chop[v],f,NumberSigns->{"",""},NumberPadding->{"0","0"},SignPadding->True];

rugo[xkezd_,ykezd_,xveg_,yveg_]:=Module[{step=20,szel=1(*spring width*),hx,hy,veghossz=0.3,hossz,dh,i},{hx=xveg-xkezd;
hy=yveg-ykezd;
hossz=Sqrt[hx^2+hy^2];
dh=(hossz-2*veghossz)/step;
{xkezd,ykezd}}~Join~{{xkezd+hx*(dh+veghossz)/hossz,ykezd+hy*(dh+veghossz)/hossz}}~Join~Table[If[OddQ[i],{xkezd+hx*(i*dh+veghossz)/hossz+hy*szel/hossz,ykezd+hy*(i*dh+veghossz)/hossz-hx*szel/hossz},{xkezd+hx*(i*dh+veghossz)/hossz-hy*szel/hossz,ykezd+hy*(i*dh+veghossz)/hossz+hx*szel/hossz}],{i,2,(step-2)}]~Join~{{xkezd+hx*((step-1)*dh+veghossz)/hossz,ykezd+hy*((step-1)*dh+veghossz)/hossz}}~Join~{{xveg,yveg}}
]
)
]