!if $wims_read_parm!=slib_header
!goto proc
!endif
slib_title=Draw with jsxgraph of a solution of a differential system.
slib_parms=8\
,f1\
,f2\
400,size\
-10,xmin\
10,xmax\
-10,ymin\
10,ymax\
red,color

slib_author=Bernadette, Perrin-Riou
slib_out=draw in jsxgraph of a solution of x'(t)=f1(t,x,y) , y'(t)=f2(t,x,y) 
slib_comment=the jsxgraph programm comes from an example on the site of jsxgraph.
slib_example= x-y, x+y,400,-10,10,-10,10,green\
 1, (y+2)*(y-1),600,0,20,-10,10,green\
 x-y+sin(t), x+y,400,-10,10,-10,10,green\
 1,t,600,0,20,-10,10,green
!exit

:proc
!reset slib_size slib_out slib_number slib_script
!distribute items $wims_read_parm into slib_f1, slib_f2,slib_size,slib_xmin,slib_xmax,slib_ymax,slib_ymin,slib_color,slib_number
!default slib_size=400
!default slib_xmin=-10
!default slib_xmax=10
!default slib_ymin=-10
!default slib_ymax=10
!default slib_number=!randint 10000,30000
slib_script=var brd$slib_number = JXG.JSXGraph.initBoard('jsxbox$slib_number', {axis:true, boundingbox:[$slib_xmin,$slib_ymin,$slib_xmax,$slib_ymax]});\
var N$slib_number = brd$slib_number.create('slider',[[$slib_xmin+1,$[$slib_ymin*0.9]],[$slib_xmax,$[$slib_ymin*0.9]],[0,10,$slib_xmax]], {name:'N'});\
var P1$slib_number = brd$slib_number.create('point',[1,1], {name:'(x_0,y_0)'});\
\
function doIt$slib_number() {\
  var txt1 = JXG.GeonextParser.geonext2JS('$slib_f1');\
  var txt2 = JXG.GeonextParser.geonext2JS('$slib_f2');\
  f$slib_number = new Function('t', 'yy', 'var x = yy[0], y = yy[1];  var z1 = ' + txt1 + '; var z2 = ' + txt2 + '; return [z1,z2];');\
  brd$slib_number.update();\
}\
\
function ode$slib_number() {\
   return JXG.Math.Numerics.rungeKutta('heun', [P1$slib_number.X(),P1$slib_number.Y()], [P1$slib_number.X(), P1$slib_number.X()+N$slib_number.Value()], $slib_size, f$slib_number);\
}\
var g1$slib_number = brd$slib_number.create('curve', [[0],[0]], {strokeColor:'$slib_color', strokeWidth:2, name:'x', withLabel:false});\
g1$slib_number.updateDataArray = function() {\
    var data = ode$slib_number();\
    var h = N$slib_number.Value()/$(slib_size);\
    this.dataX = [];\
    this.dataY = [];\
    for(var i=0; i<data.length; i++) {\
        this.dataX[i] = data[i][0];\
        this.dataY[i] = data[i][1];\
    }\
};\
doIt$slib_number();\

!readproc slib/geo2D/jsxgraph jsxbox$slib_number, $slib_size x $slib_size, $slib_script
