Subversion Repositories wimsdev

Rev

Rev 7582 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. !default num_svg_images=1
  2. !default xsize = 300
  3. !default ysize = 300
  4. !default num_x = 10
  5. !default num_y = 10
  6. !default svg_click_colors = #ff0000,#0000ff,#00ff00
  7. !default svg_bg_color = #ffffff
  8. !default svg_interactive = 1
  9. !default fill_opacity = 1
  10. !default stroke_opacity = 0.8
  11. !default svg_linewidth = 1
  12. !default stroke_color = grey
  13. !! set of coordinates in Quadrant I (fig_x:fig_y) fig_x --> 0...num_x fig_y -->0...num_y with colors from fig_color array
  14. !! fig_x = '1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5'                                                    
  15. !! fig_y = '1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5'
  16. !! all data will be mapped to integer 5.9 -> 5 !!
  17. !! this image will be protected from user clicks
  18. !default fig_x = null
  19. !default fig_y = null
  20. !default fig_color = #FF0000
  21. !! optional add objects: circle(s), line(s) or polyline; all coordinates are in px; not in 'QI grid'
  22. !! these objects are static; can not be (re)moved and will not be read by read_svg()
  23. !! circle (x,y,r in px) is js.array: 9 elements per circle ['xc_1','yc_1','r_1','linewidth_1','strokecolor_1','strokeopacity_1','filled_1','fillcolor_1','fillopacity_1',...]
  24. !! line is (x,y in px) array: 7 elements per line [ 'x1_1','y1_1','x2_1','y2_1','linewidth_1','strokecolor_1','strokeopacity_1']
  25. !! poly : just one poly allowed 6 elements and x/y pairs in px ['linewidth','strokecolor','strokeopacity','filled','fillcolor',fillopacity','x_1','y_1',...,'x_n','y_n']
  26.  
  27. <script>
  28.    "use strict";
  29.    var descr_list="$description";
  30.    var description = make_description(descr_list,30);
  31.    
  32.    function dontknow(){
  33.         var reply = new Array()
  34.         reply[0] = read_svg();
  35.         for( var p = 1 ; p <= $inputs; p++){
  36.             reply[p] = "?";
  37.         }
  38.         myConfirm('$dontknow',reply,'$wims_ref_name','$session','$module','$counter','$nok_send_color');
  39.         return;
  40.    }
  41.    
  42.    function sendanswer(){
  43.         var reply = new Array();
  44.         reply[0] = read_svg();
  45.         var p = 0;
  46.         if( document.getElementById('myinput0')){
  47.             while( document.getElementById('myinput'+p) ){
  48.                 reply[p+1] = document.getElementById('myinput'+p).value;
  49.                 p++;
  50.             }
  51.         }
  52.        myConfirm('$send ?',reply,'$wims_ref_name','$session','$module','$counter','$ok_send_color');
  53.         return;
  54.    }
  55.  
  56. !if $wims_user=supervisor
  57.    function putanswer(){
  58.    !set wims_answer = !words2items $(answer$n)
  59.    !set num_answers = !itemcnt $wims_answer
  60.        var answer = make_description("$wims_answer",$num_answers);
  61.         for(var p=0;p<answer.length;p++){
  62.             document.getElementById('myinput'+p).value = answer[p];
  63.         }
  64.    }
  65. !endif
  66.    
  67.    function color2hex(color_array){
  68.         var rgb2txt = {"aliceblue": "#f0f8ff", "antiquewhite": "#faebd7", "aqua": "#00ffff", "aquamarine": "#7fffd4", "azure": "#f0ffff", "beige": "#f5f5dc", "bisque": "#ffe4c4", "black": "#000000", "blanchedalmond": "#ffebcd", "blue": "#0000ff", "blueviolet": "#8a2be2", "brown": "#a52a2a", "burlywood": "#deb887", "cadetblue": "#5f9ea0", "chartreuse": "#7fff00", "chocolate": "#d2691e", "coral": "#ff7f50", "cornflowerblue": "#6495ed", "cornsilk": "#fff8dc", "crimson": "#dc143c", "cyan": "#00ffff", "darkblue": "#00008b", "darkcyan": "#008b8b", "darkgoldenrod": "#b8860b", "darkgray": "#a9a9a9", "darkgreen": "#006400", "darkkhaki": "#bdb76b", "darkmagenta": "#8b008b", "darkolivegreen": "#556b2f", "darkorange": "#ff8c00", "darkorchid": "#9932cc", "darkred": "#8b0000", "darksalmon": "#e9967a", "darkseagreen": "#8fbc8f", "darkslateblue": "#483d8b", "darkslategray": "#2f4f4f", "darkturquoise": "#00ced1", "darkviolet": "#9400d3", "deeppink": "#ff1493", "deepskyblue": "#00bfff", "dimgray": "#696969", "dodgerblue": "#1e90ff", "firebrick": "#b22222", "floralwhite": "#fffaf0", "forestgreen": "#228b22", "fuchsia": "#ff00ff", "gainsboro": "#dcdcdc", "ghostwhite": "#f8f8ff", "gold": "#ffd700", "goldenrod": "#daa520", "gray": "#808080", "green": "#008000", "greenyellow": "#adff2f", "honeydew": "#f0fff0", "hotpink": "#ff69b4", "indianred ": "#cd5c5c", "indigo ": "#4b0082", "ivory": "#fffff0", "khaki": "#f0e68c", "lavender": "#e6e6fa", "lavenderblush": "#fff0f5", "lawngreen": "#7cfc00", "lemonchiffon": "#fffacd", "lightblue": "#add8e6", "lightcoral": "#f08080", "lightcyan": "#e0ffff", "lightgoldenrodyellow": "#fafad2", "lightgrey": "#d3d3d3", "lightgreen": "#90ee90", "lightpink": "#ffb6c1", "lightsalmon": "#ffa07a", "lightseagreen": "#20b2aa", "lightskyblue": "#87cefa", "lightslategray": "#778899", "lightsteelblue": "#b0c4de", "lightyellow": "#ffffe0", "lime": "#00ff00", "limegreen": "#32cd32", "linen": "#faf0e6", "magenta": "#ff00ff", "maroon": "#800000", "mediumaquamarine": "#66cdaa", "mediumblue": "#0000cd", "mediumorchid": "#ba55d3", "mediumpurple": "#9370d8", "mediumseagreen": "#3cb371", "mediumslateblue": "#7b68ee", "mediumspringgreen": "#00fa9a", "mediumturquoise": "#48d1cc", "mediumvioletred": "#c71585", "midnightblue": "#191970", "mintcream": "#f5fffa", "mistyrose": "#ffe4e1", "moccasin": "#ffe4b5", "navajowhite": "#ffdead", "navy": "#000080", "oldlace": "#fdf5e6", "olive": "#808000", "olivedrab": "#6b8e23", "orange": "#ffa500", "orangered": "#ff4500", "orchid": "#da70d6", "palegoldenrod": "#eee8aa", "palegreen": "#98fb98", "paleturquoise": "#afeeee", "palevioletred": "#d87093", "papayawhip": "#ffefd5", "peachpuff": "#ffdab9", "peru": "#cd853f", "pink": "#ffc0cb", "plum": "#dda0dd", "powderblue": "#b0e0e6", "purple": "#800080", "red": "#ff0000", "rosybrown": "#bc8f8f", "royalblue": "#4169e1", "saddlebrown": "#8b4513", "salmon": "#fa8072", "sandybrown": "#f4a460", "seagreen": "#2e8b57", "seashell": "#fff5ee", "sienna": "#a0522d", "silver": "#c0c0c0", "skyblue": "#87ceeb", "slateblue": "#6a5acd", "slategray": "#708090", "snow": "#fffafa", "springgreen": "#00ff7f", "steelblue": "#4682b4", "tan": "#d2b48c", "teal": "#008080", "thistle": "#d8bfd8", "tomato": "#ff6347", "turquoise": "#40e0d0", "violet": "#ee82ee", "wheat": "#f5deb3", "white": "#ffffff", "whitesmoke": "#f5f5f5", "yellow": "#ffff00", "yellowgreen": "#9acd32", "darkgrey": "#a9a9a9", "darkslategrey": "#2f4f4f", "dimgrey": "#696969", "grey": "#808080", "lightgray": "#d3d3d3", "lightslategrey": "#778899", "slategrey": "#708090"};
  69.         var lx = color_array.length;
  70.         for(var i = 0 ; i < lx ; i++ ){
  71.             if( rgb2txt[color_array[i].toLowerCase()] !== undefined ){
  72.                 color_array[i] = rgb2txt[color_array[i].toLowerCase()];
  73.             }
  74.         }    
  75.         return color_array;
  76.    }
  77.  
  78.    function svg_mouse(action,myid,img){
  79.         try{action.preventDefault;action.stopPropagation();} catch(e){}
  80.         if( action.which != 1 ){ img.coloridx++;}
  81.         if( img.coloridx >= img.svg_click_colors.length ){ img.coloridx = 0; }
  82.         try{
  83.             var obj = document.getElementById(myid);
  84.             obj.setAttributeNS(null,"fill",img.svg_click_colors[img.coloridx]);
  85.         }catch(e){setAlarm(e);}
  86.    }
  87.  
  88.    function svg_image(id,xsize,ysize,num_x,num_y,svg_click_colors,svg_bg_color,svg_interactive,fig_x,fig_y,fig_color,fill_opacity,stroke_opacity,svg_linewidth,stroke_color,circle,line,polyline){
  89.         this.circle = circle || null;
  90.         this.line = line || null;
  91.         this.polyline = polyline || null;
  92.         this.svg_id = 'wims_svg'+id || 'wims_svg0';
  93.         this.xsize = xsize || 300;
  94.        this.ysize = ysize || 300;
  95.        this.num_x = num_x || 10;
  96.        this.num_y = num_y || 10;
  97.        this.w = this.xsize / this.num_x;
  98.        this.h = this.ysize / this.num_y;
  99.        this.svg_click_colors = color2hex(svg_click_colors.split(',')) || ['#FF0000','#0000FF'];
  100.        this.svg_bg_color = svg_bg_color.toString() || '#0000FF';
  101.         this.svg_click_colors[this.svg_click_colors.length] = this.svg_bg_color; /* add bgcolor to click array */
  102.         this.svg_interactive = svg_interactive || 1;
  103.         this.fig_x = fig_x || null; /* integer array of x-coordinates of unchangable rects */
  104.         this.fig_y = fig_y || null; /* integer array of y-coordinates of unchangable rects */
  105.         if(this.fig_x != null){
  106.             this.fig_x = (this.fig_x).split(',').map(function(i){return parseInt(i, 10);});
  107.             this.fig_y = (this.fig_y).split(',').map(function(i){return parseInt(i, 10);});
  108.         }
  109.         this.fig_color = color2hex(fig_color.split(',')) || ['#FFFFFF']; /* color array of prefined object */
  110.         this.fill_opacity = fill_opacity || 1;
  111.         this.stroke_opacity = stroke_opacity || 1;
  112.         this.svg_linewidth = svg_linewidth || 1;
  113.         this.stroke_color = stroke_color || '#FFFFFF'; /* color of the grid lines */
  114.         this.coloridx = 0;
  115.         var wims_svg = document.getElementById(this.svg_id);
  116.         var data = (wims_svg.getAttribute("viewBox")).split(' ');
  117.         var sizex = data[2] - data[0];
  118.         var sizey = data[3] - data[1];
  119.         var idx=0;
  120.         var rect_id;
  121.         var found = 0;
  122.         var lx = 0;
  123.         if(this.fig_x != null){
  124.             lx = (this.fig_x).length;
  125.             if( lx != (this.fig_y).length ){ alert("mismatch between \"fig_x\" and \"fig_y\" !" );}
  126.             var lc = (this.fig_color).length
  127.             if( lx > lc ){
  128.                 for(var p = lc; p < lx ; p++){
  129.                     this.fig_color[p] = this.fig_color[0]; /* use the first color in array repetitively if needed  */
  130.                 }
  131.             }
  132.         }
  133.         for(var y = 0 ; y < this.num_y ; y++){
  134.             for(var x = 0 ; x < this.num_x ; x++){
  135.                 var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
  136.                 rect_id = this.svg_id+"_"+idx;
  137.                 rect.setAttributeNS(null,"width",this.w);
  138.                 rect.setAttributeNS(null,"height",this.h);
  139.                 rect.setAttributeNS(null,"stroke-width",this.svg_linewidth);
  140.                 rect.setAttributeNS(null,"id",rect_id);
  141.                 rect.setAttributeNS(null,"x",x*this.w);
  142.                 rect.setAttributeNS(null,"y",y*this.h);
  143.                 rect.setAttributeNS(null,"stroke",this.stroke_color);
  144.                 rect.setAttributeNS(null,"stroke-opacity",this.stroke_opacity);
  145.                 rect.setAttributeNS(null,"fill-opacity",this.fill_opacity);
  146.                 found = 0;
  147.                 if( this.fig_x != null){ /* create proctected squares from arrays fig_x / fig_y */
  148.                     for(var fx = 0; fx < lx && found == 0 ; fx++){
  149.                         if(this.fig_x[fx] == x+1 && this.fig_y[fx] == this.num_y - y ){ /* data all in Quadrant I ... */
  150.                             rect.setAttributeNS(null,"fill",this.fig_color[fx]);
  151.                             found = 1;
  152.                         }
  153.                     }
  154.                 }
  155.                 if( found == 0 ){
  156.                     rect.setAttributeNS(null,"fill",this.svg_bg_color );
  157. !!                  if("waiting" == "$status" || this.svg_interactive == 1 ){
  158.                     if(this.svg_interactive == 1 ){
  159.                         (function(rect_id){
  160.                             rect.addEventListener("mousedown", function(action){
  161.                             svg_mouse(action,rect_id,eval('image'+id));}, false);
  162.                         }(rect_id));
  163.                     }
  164.                 }
  165.                 wims_svg.appendChild(rect);
  166.                 idx++;
  167.             }
  168.         }
  169.  
  170.         if(this.circle != null){
  171.             /*
  172.                 circle (x,y,r in px) is js.array: 9 elements per circle  
  173.                 ['xc_1','yc_1','r_1','linewidth_1','strokecolor_1','strokeopacity_1','filled_1','fillcolor_1','fillopacity_1',...]
  174.             */
  175.             var len = (this.circle).length;
  176.             for(var p = 0 ; p < len; p = p + 9){
  177.                 var circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
  178.                 circle.setAttributeNS(null,"cx",this.circle[p]);
  179.                 circle.setAttributeNS(null,"cy",this.circle[p+1]);
  180.                 circle.setAttributeNS(null,"r",this.circle[p+2]);
  181.                 circle.setAttributeNS(null,"stroke-width",this.circle[p+3]);
  182.                 circle.setAttributeNS(null,"stroke",this.circle[p+4]);
  183.                 circle.setAttributeNS(null,"stroke-opacity",this.circle[p+5]);
  184.                 if( this.circle[p+6] == 1 ){
  185.                     circle.setAttributeNS(null,"fill",this.circle[p+7]);
  186.                     circle.setAttributeNS(null,"fill-opacity",this.circle[p+8]);
  187.                 }
  188.                 wims_svg.appendChild(circle);
  189.             }
  190.         }
  191.         if(this.line != null){
  192.             /*
  193.                 line is (x,y in px) array: 7 elements per line
  194.                 [ 'x1_1','y1_1','x2_1','y2_1','linewidth_1','strokecolor_1','strokeopacity_1']
  195.             */
  196.             var len = (this.line).length;
  197.             for(var p = 0 ; p < len; p = p + 7){
  198.                 var line = document.createElementNS("http://www.w3.org/2000/svg", "line");
  199.                 line.setAttributeNS(null,"x1",this.line[p]);
  200.                 line.setAttributeNS(null,"y1",this.line[p+1]);
  201.                 line.setAttributeNS(null,"x2",this.line[p+2]);
  202.                 line.setAttributeNS(null,"y2",this.line[p+3]);
  203.                 line.setAttributeNS(null,"stroke-width",this.line[p+4]);
  204.                 line.setAttributeNS(null,"stroke",this.line[p+5]);
  205.                 line.setAttributeNS(null,"stroke-opacity",this.line[p+6]);
  206.                 wims_svg.appendChild(line);
  207.             }
  208.         }
  209.         if(this.polyline != null){
  210.             /*
  211.                 poly : just one poly allowed 6 elements and x/y pairs in px  
  212.                 ['linewidth','strokecolor','strokeopacity','filled','fillcolor',fillopacity','x_1','y_1',...,'x_n','y_n']
  213.             */
  214.             var len = (this.polyline).length;
  215.             var points = (this.polyline).splice(6,len);
  216.             var polyline = document.createElementNS("http://www.w3.org/2000/svg", "polyline");
  217.             polyline.setAttributeNS(null,"stroke-width",this.polyline[0]);
  218.             polyline.setAttributeNS(null,"stroke",this.polyline[1]);
  219.             polyline.setAttributeNS(null,"stroke-opacity",this.polyline[2]);
  220.             polyline.setAttributeNS(null,"points",points);
  221.             if(this.polyline[3] == 1 ){
  222.                 polyline.setAttributeNS(null,"fill",this.polyline[4]);
  223.                 polyline.setAttributeNS(null,"fill-opacity",this.polyline[5]);
  224.             }
  225.             wims_svg.appendChild(polyline);
  226.         }
  227.     }
  228. /* read all svg_images e.g. num_svg_images */
  229. !if $roosterapplet=0
  230.     function read_svg(){
  231.         /* clicktile.jar ; vervanging ReadXY();*/
  232.         var total_reply = new Array($num_svg_images);
  233.         for(var img=0; img<$num_svg_images;img++){
  234.             if( document.getElementById("wims_svg"+img).interactive == 1 ){ /* only read interactive svg images*/
  235.                 var idx = 0;
  236.                 var tmp_idx = 0;
  237.                 tmp_reply=new Array();
  238.                 var svgimg = eval('image'+img);
  239.                 while( document.getElementById("wims_svg"+img+"_"+idx)){
  240.                     obj = document.getElementById("wims_svg"+img+"_"+idx);
  241.                     color = obj.getAttributeNS(null,"fill");
  242.                     if( color != svgimg.svg_bg_color ){/* e.g. colour is changed */
  243.                         tmp_reply[tmp_idx] = obj.getAttributeNS(null,"x") / this.w+","+obj.getAttributeNS(null,"y") / this.h;
  244.                         tmp_idx++;
  245.                     }
  246.                     idx++;
  247.                 }
  248.                 total_reply[img]=tmp_reply+"\n";
  249.             }
  250.         }
  251.     }
  252. !else
  253.     function read_svg(){
  254.         /* rooster.jar vervanging String S=total_aantal+","+onveranderd_aantal+","+veranderd_aantal+","+omtrek_van_geklikte_ruitjes;*/
  255.         var total_reply = new Array($num_svg_images);
  256.         for(var img=0; img<$num_svg_images;img++){
  257.             var svgimg = eval('image'+img);
  258.             var x;var y;var click_reply=new Array(4);var obj;var color;var myid;
  259.             var xc = new Array();var yc = new Array();var cc = new Array();
  260.             var idx = 0;
  261.             var width = svgimg.xsize / svgimg.num_x;
  262.             var height = svgimg.ysize / svgimg.num_y
  263.             click_reply[1] = 0; /* unchanged */
  264.             click_reply[2] = 0; /* changed */
  265.             click_reply[3] = 0; /* total perimeter of changed rects */
  266.             while( document.getElementById("wims_svg"+img+"_"+idx)){
  267.                 obj = document.getElementById("wims_svg"+img+"_"+idx);
  268.                 x = obj.getAttributeNS(null,"x");
  269.                 y = obj.getAttributeNS(null,"y");
  270.                 xc[idx] = x/width;
  271.                 yc[idx] = y/height;
  272.                 color = obj.getAttributeNS(null,"fill");
  273.                 if( color != svgimg.svg_bg_color ){/* e.g. colour is changed */
  274.                     click_reply[2] = click_reply[2]+1;cc[idx] = 1;
  275.                 }
  276.                 else
  277.                 {
  278.                     click_reply[1]=click_reply[1]+1;cc[idx] = 0;
  279.                 }
  280.                 idx++;
  281.             }
  282.             click_reply[0] = idx; /* sum */
  283.             /* correct perimetre if size of rectangle != 1x1 */
  284.             var fx;var fy;if( width < height ){ fx = 1 ; fy = height / width;} else { fx = width / height;fy = 1; }
  285.             click_reply[3] = click_reply[2] * (2*fy + 2*fx);/* max perimetre */
  286.             if( click_reply[2] > 1 ){
  287.                 for( var i=0 ; i < idx ; i++){
  288.                     if( cc[i] == 1 ){ /* clicked */
  289.                         for( var p=0; p < idx ; p++){ /* look for neighbours */
  290.                             if( cc[p] == 1 && p != i){ /* do not count the same rect */
  291.                                 if( xc[i] == xc[p] && yc[i] == yc[p] - 1 ){ click_reply[3] = click_reply[3] - fx;}
  292.                                 else
  293.                                 if( xc[i] == xc[p] && yc[i] == yc[p] + 1 ){ click_reply[3] = click_reply[3] - fx;}
  294.                                 else
  295.                                 if( xc[i] == xc[p] - 1 && yc[i] == yc[p] ){ click_reply[3] = click_reply[3] - fy;}
  296.                                 else
  297.                                 if( xc[i] == xc[p] + 1 && yc[i] == yc[p] ){ click_reply[3] = click_reply[3] - fy;}
  298.                             }
  299.                         }
  300.                     }
  301.                 }
  302.             }
  303.             total_reply[img] = click_reply+"\n";
  304.         }
  305.         return total_reply;
  306.     }
  307.     !endif
  308. !endif
  309. </script>
  310.  
  311.  
  312. <table id="exercise" class="exercise" >
  313.     <tr>
  314.     <td class="exercise_m">
  315.     !if $(question$n) != $empty
  316.      $(question$n)
  317.     !endif
  318.     !if $exotext != $empty
  319.      <br />
  320.      $exotext
  321.     !endif
  322.     !if $inputs > 0
  323.      <table class="exercise">
  324.       !for p=1 to $inputs
  325.        <tr>
  326.         <td class="exercise_c">
  327.          $(description[$p])
  328.          </td>
  329.          <td class="exercise_c">
  330.           &nbsp;$m_rightarrow&nbsp;
  331.          </td>
  332.          <td class="exercise_c">
  333.           <input class="schaersvoorde_input" size="$cols" type="text" id="myinput$[$p-1]" value="" />&nbsp;$(ex$p)
  334.          </td>
  335.         </tr>
  336.       !next p
  337.      </table>
  338.     !endif
  339.     </td>
  340.     !if $make_tr=1
  341.     </tr>
  342.     <tr>
  343.     !endif
  344.     !for id=0 to $[$num_svg_images-1]
  345.     !! id = wims_svg$id
  346.     <td class="exercise_c" id="svg_td$id" >
  347.         <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" id="wims_svg$id" width="$xsize" height="$ysize" viewBox="0 0 $xsize $ysize" >
  348.             <g id="svg_transform$id" transform="scale(1)" >
  349.                 <image preserveAspectRatio="none" xlink:href="$svg_bgimage" x="0" y="0" height="100%" width="100%"></image>
  350.                 <script>
  351.                     !! var image$id = new svg_image($id,$xsize,$ysize,$num_x,$num_y,$svg_click_colors,$svg_bg_color,$svg_interactive,$fig_x,$fig_y,$fig_color,$fill_opacity,$stroke_opacity,$svg_linewidth,$stroke_color,$circle,$line,$polyline);
  352.                     var image$id = new svg_image('$id','$xsize','$ysize','$num_x','$num_y','$svg_click_colors','$svg_bg_color','$svg_interactive','$fig_x','$fig_y','$fig_color','$fill_opacity','$stroke_opacity','$svg_linewidth','$stroke_color');
  353.                 </script>
  354.             </g>
  355.         </svg>
  356.     </td>
  357.     !next id
  358.     </tr>
  359. </table>
  360. <div id="send_buttons" class="embedded_central">
  361.     <input type="button" id="schaersvoorde_ok_button" onclick="javascript:sendanswer();" value="$send" />
  362.     <input type="button" id="schaersvoorde_nok_button" onclick="javascript:dontknow();"  value="$dontknow" />
  363.     !if $wims_user=supervisor
  364.         <input type="button" id="schaersvoorde_extra_button" onclick="javascript:putanswer();" value="$wims_firstname $wims_lastname" />
  365.     !endif
  366. </div>
  367.  
  368. !exit
  369.