[system] / trunk / pg / lib / Applet.pm Repository:
ViewVC logotype

Diff of /trunk/pg/lib/Applet.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 5944 Revision 6023
1################################################################################ 1################################################################################
2# WeBWorK Online Homework Delivery System 2# WeBWorK Online Homework Delivery System
3# Copyright 2000-2007 The WeBWorK Project, http://openwebwork.sf.net/ 3# Copyright 2000-2007 The WeBWorK Project, http://openwebwork.sf.net/
4# $CVSHeader: pg/lib/Applet.pm,v 1.12 2008/05/22 19:15:59 gage Exp $ 4# $CVSHeader: pg/lib/Applet.pm,v 1.18 2009/03/10 12:10:36 gage Exp $
5# 5#
6# This program is free software; you can redistribute it and/or modify it under 6# This program is free software; you can redistribute it and/or modify it under
7# the terms of either: (a) the GNU General Public License as published by the 7# the terms of either: (a) the GNU General Public License as published by the
8# Free Software Foundation; either version 2, or (at your option) any later 8# Free Software Foundation; either version 2, or (at your option) any later
9# version, or (b) the "Artistic License" which comes with this package. 9# version, or (b) the "Artistic License" which comes with this package.
108 108
109 getApplet(appletName) -- finds the applet path in the DOM 109 getApplet(appletName) -- finds the applet path in the DOM
110 110
111 submitAction() -- calls the submit action of the applets 111 submitAction() -- calls the submit action of the applets
112 112
113 initializeAction() -- calls the initialize action of the applets 113 initializeWWquestion() -- calls the initialize action of the applets
114 114
115 getQE(name) -- gets an HTML element of the question by name 115 getQE(name) -- gets an HTML element of the question by name
116 or by id. Be sure to keep all names and ids 116 or by id. Be sure to keep all names and ids
117 unique within a given PG question. 117 unique within a given PG question.
118 118
124 Usage: Place this at the END of the question, just before END_DOCUMENT(): 124 Usage: Place this at the END of the question, just before END_DOCUMENT():
125 125
126 TEXT(qq!<script> listQuestionElements() </script>!); 126 TEXT(qq!<script> listQuestionElements() </script>!);
127 ENDDOCUMENT(); 127 ENDDOCUMENT();
128 to obtain a list of all of the HTML elements in the question 128 to obtain a list of all of the HTML elements in the question
129 129
130 ----------------------------------------------------------------------------
131
132
130 List of accessor methods made available by the FlashApplet class: 133 List of accessor methods made available by the FlashApplet class:
131 Usage: $current_value = $applet->method(new_value or empty) 134 Usage: $current_value = $applet->method(new_value or empty)
132 These can also be set when creating the class -- for exampe: 135 These can also be set when creating the class -- for exampe:
133 $applet = new FlashApplet( 136 $applet = new FlashApplet(
134 # can be replaced by $applet =FlashApplet() when using AppletObjects.pl 137 # can be replaced by $applet =FlashApplet() when using AppletObjects.pl
158 config configuration are those customizable attributes of the applet which don't 161 config configuration are those customizable attributes of the applet which don't
159 change as it is used. When stored in hidden answer fields 162 change as it is used. When stored in hidden answer fields
160 it is usually stored in base64 encoded format. 163 it is usually stored in base64 encoded format.
161 base64_config base64 encode version of the contents of config 164 base64_config base64 encode version of the contents of config
162 165
163 configAlias (default: config ) names the applet command called with the contents of $self->config 166 configAlias (default: setConfig ) names the applet command called with the contents of $self->config
164 to configure the applet. The parameters are passed to the applet in plain text using <xml> 167 to configure the applet. The parameters are passed to the applet in plain text using <xml>
165 The outer tags must be <xml> ..... </xml> 168 The outer tags must be <xml> ..... </xml>
169 setConfigAlias (default: setConfig) -- a synonym for configAlias
170 getConfigAlias (default: getConfig) -- retrieves the configuration from the applet. This is used
171 mainly for debugging. In principal the configuration remains the same for a given instance
172 of the applet -- i.e. for the homework question for a single student. The state however
173 will change depending on the interactions between the student and the applet.
166 state state consists of those customizable attributes of the applet which change 174 initialState the state consists of those customizable attributes of the applet which change
167 as the applet is used. It is stored by the calling .pg question so that 175 as the applet is used by the student. It is stored by the calling .pg question so that
168 when revisiting the question the applet
169 will be restored to the same state it was left in when the question was last 176 when revisiting the question the applet will be restored to the same state it was left in when the question was last
170 viewed. 177 viewed.
171 178
172 getStateAlias (default: getState) alias for command called to read the current state of the applet. 179 getStateAlias (default: getState) alias for command called to read the current state of the applet.
173 The state is passed in plain text xml format with outer tags: <xml>....</xml> 180 The state is passed in plain text xml format with outer tags: <xml>....</xml>
174 setStateAlias (default: setState) alias for the command called to reset the state of the applet. 181 setStateAlias (default: setState) alias for the command called to reset the state of the applet.
177 base64_state returns the base64 encoded version of the state stored in the applet object. 184 base64_state returns the base64 encoded version of the state stored in the applet object.
178 185
179 initializeActionAlias -- (default: initializeAction) the name of the javaScript subroutine called to initialize the applet (some overlap with config/ and setState 186 initializeActionAlias -- (default: initializeAction) the name of the javaScript subroutine called to initialize the applet (some overlap with config/ and setState
180 submitActionAlias -- (default: submitAction)the name of the javaScript subroutine called when the submit button of the 187 submitActionAlias -- (default: submitAction)the name of the javaScript subroutine called when the submit button of the
181 .pg question is pressed. 188 .pg question is pressed.
182 189 answerBox -- name of answer box to return answer to: default defaultAnswerBox
183 returnFieldName 190 getAnswer -- (formerly sendData) get student answer from applet and place in answerBox
191 returnFieldName -- (deprecated) synonmym for answerBox
184 192
185 193
186=cut 194=cut
187 195
196=head4 More details
188 197
198There are three different "images" of the applet. The first is the java or flash applet itself. The object that actually does the work.
199The second is a perl image of the applet -- henceforth the perlApplet -- which is configured in the .pg file and allows a WeBWorK question
200to communicate with the applet. The third image is a javaScript image of the applet -- henceforth the jsApplet which is a mirror of the perlApplet
201but is available to the javaScript code setup and executed in the virtual HTML page defined by the .pg file of the WeBWorK question. One can think of
202the jsApplet as a runtime version of the perlApplet since it can be accessed and modified after the virtual HTML page has been created by
203the PG rendering process.
189 204
205The perlApplet is initialized by $newApplet = new flashApplet( appletName=>'myApplet',..... ); The jsApplet is automatically defined in
206ww_applet_list["myApplet"] by copying the instance variables of $newApplet to a corresponding javaScript object. So $newApplet->{appletName}
207corresponds to ww_applet_list["myApplet"].appletName. (This paragraph is not yet fully implemented :-().
208
209Currently all messages read by the applet are xml text. If some of the code needs to be printed in the HTML header than it is converted
210to a base64 constant and then converted back to text form when it is read by an javaScript subroutine.
211
212=cut
213
214=head4 Requirements for applets
215
216The following methods are desirable in an applet that preserves state in a WW question. None of them are required.
217
218 setState(str) (default: setXML)
219 -- set the current state of the applet from an xml string
220 -- should be able to accept an empty string or a string of
221 the form <XML>.....</XML> without creating errors
222 -- can be designed to receive other forms of input if it is
223 coordinated with the WW question.
224 getState() (default: getXML)
225 -- return the current state of the applet in an xml string.
226 -- an empty string or a string of the form <XML>.....</XML>
227 are the standard responses.
228 -- can be designed to return other strings if it is
229 coordinated with the WW question.
230 setConfig(str) (default: setConfig)
231 -- If the applet allows configuration this configures the applet
232 from an xml string
233 -- should be able to accept an empty string or a string of the
234 form <XML>.....</XML> without creating errors
235 -- can be designed to receive other forms of input if it is
236 coordinated with the WW question.
237 getConfig (default: getConfig)
238 -- This returns a string defining the configuration of the
239 applet in an xml string
240 -- an empty string or a string of the form <XML>.....</XML>
241 are the standard responses.
242 -- can be designed to return other strings if it is
243 coordinated with the WW question.
244 -- this method is used for debugging to ensure that
245 the configuration was set as expected.
246 getAnswer (default: getAnswer)
247 -- Returns a string (usually NOT xml) which is the
248 response that the student is submitting to answer
249 the WW question.
250
251
252=cut
190 253
191sub new { 254sub new {
192 my $class = shift; 255 my $class = shift;
193 my $self = { 256 my $self = {
194 appletName =>'', 257 appletName =>'',
196 codebase=>'', 259 codebase=>'',
197# appletId =>'', #always use identical applet Id's and applet Names 260# appletId =>'', #always use identical applet Id's and applet Names
198 params =>undef, 261 params =>undef,
199 width => 550, 262 width => 550,
200 height => 400, 263 height => 400,
264 bgcolor => "#869ca7",
201 base64_state => undef, # this is an state to use for initializing the first occurence of the question. 265 base64_state => undef, # this is a state to use for initializing the first occurence of the question.
202 base64_config => undef, # this is the initial (and final?) configuration 266 base64_config => undef, # this is the initial (and final?) configuration
267# configuration => '', # configuration defining the applet
268 initialState => '', # initial state. (I'm considering storing everything as ascii and converting on the fly to base64 when needed.)
203 getStateAlias => 'getXML', 269 getStateAlias => 'getXML',
204 setStateAlias => 'setXML', 270 setStateAlias => 'setXML',
271 configAlias => '', # deprecated
205 configAlias => 'config', 272 getConfigAlias => 'getConfig',
273 setConfigAlias => 'setConfig',
206 initializeActionAlias => 'setXML', 274 initializeActionAlias => 'setXML',
207 submitActionAlias => 'getXML', 275 submitActionAlias => 'getXML',
208 returnFieldName => 'receivedField', 276 submitActionScript => '', # script executed on submitting the WW question
277 answerBoxAlias => 'answerBox',
278 answerBox => '', # deprecated
279 returnFieldName => '', # deprecated
209 headerText => DEFAULT_HEADER_TEXT(), 280 headerText => DEFAULT_HEADER_TEXT(),
210 objectText => '', 281 objectText => '',
211 debug => 0, 282 debug => 0,
212 @_, 283 @_,
213 }; 284 };
214 bless $self, $class; 285 bless $self, $class;
215 $self->state('<xml></xml>'); 286 $self->initialState('<xml></xml>');
287 if ($self->{returnFieldName}) or $self->{answerBox} ) { # backward compatibility
288 warn "use answerBoxAlias instead of returnFieldName or answerBox";
289 $self->{answerBox}='';
290 $self->{returnFieldName}='';
291 }
292 if ($self->{configAlias}) { # backward compatibility
293 warn "use setConfigAlias instead of configAlias";
294 $self->{configAlias}='';
295 }
216 $self->config('<xml></xml>'); 296 $self->config('<xml></xml>');
217 return $self; 297 return $self;
218} 298}
219 299
220sub header { 300sub header {
256sub submitActionAlias { 336sub submitActionAlias {
257 my $self = shift; 337 my $self = shift;
258 $self->{submitActionAlias} = shift ||$self->{submitActionAlias}; # replace the current contents if non-empty 338 $self->{submitActionAlias} = shift ||$self->{submitActionAlias}; # replace the current contents if non-empty
259 $self->{submitActionAlias}; 339 $self->{submitActionAlias};
260} 340}
341sub submitActionScript {
342 my $self = shift;
343 $self->{submitActionScript} = shift ||$self->{submitActionScript}; # replace the current contents if non-empty
344 $self->{submitActionScript};
345}
261sub getStateAlias { 346sub getStateAlias {
262 my $self = shift; 347 my $self = shift;
263 $self->{getStateAlias} = shift ||$self->{getStateAlias}; # replace the current contents if non-empty 348 $self->{getStateAlias} = shift ||$self->{getStateAlias}; # replace the current contents if non-empty
264 $self->{getStateAlias}; 349 $self->{getStateAlias};
265} 350}
269 $self->{setStateAlias} = shift ||$self->{setStateAlias}; # replace the current contents if non-empty 354 $self->{setStateAlias} = shift ||$self->{setStateAlias}; # replace the current contents if non-empty
270 $self->{setStateAlias}; 355 $self->{setStateAlias};
271} 356}
272sub configAlias { 357sub configAlias {
273 my $self = shift; 358 my $self = shift;
274 $self->{configAlias} = shift ||$self->{configAlias}; # replace the current contents if non-empty 359 $self->{setConfigAlias} = shift ||$self->{setConfigAlias}; # replace the current contents if non-empty
275 $self->{configAlias}; 360 $self->{setConfigAlias};
276} 361}
277sub returnFieldName { 362sub setConfigAlias {
278 my $self = shift; 363 my $self = shift;
279 $self->{returnFieldName} = shift ||$self->{returnFieldName}; # replace the current contents if non-empty 364 $self->{setConfigAlias} = shift ||$self->{setConfigAlias}; # replace the current contents if non-empty
280 $self->{returnFieldName}; 365 $self->{setConfigAlias};
366}
367sub getConfigAlias {
368 my $self = shift;
369 $self->{getConfigAlias} = shift ||$self->{getConfigAlias}; # replace the current contents if non-empty
370 $self->{getConfigAlias};
371}
372
373sub answerBoxName {
374 my $self = shift;
375 $self->{answerBox} = shift ||$self->{answerBox}; # replace the current contents if non-empty
376 $self->{answerBox};
281} 377}
282sub codebase { 378sub codebase {
283 my $self = shift; 379 my $self = shift;
284 $self->{codebase} = shift ||$self->{codebase}; # replace the current codebase if non-empty 380 $self->{codebase} = shift ||$self->{codebase}; # replace the current codebase if non-empty
285 $self->{codebase}; 381 $self->{codebase};
296} 392}
297sub width { 393sub width {
298 my $self = shift; 394 my $self = shift;
299 $self->{width} = shift ||$self->{width}; # replace the current width if non-empty 395 $self->{width} = shift ||$self->{width}; # replace the current width if non-empty
300 $self->{width}; 396 $self->{width};
397}
398sub bgcolor {
399 my $self = shift;
400 $self->{bgcolor} = shift ||$self->{bgcolor}; # replace the current background color if non-empty
401 $self->{bgcolor};
301} 402}
302sub archive { 403sub archive {
303 my $self = shift; 404 my $self = shift;
304 $self->{archive} = shift ||$self->{archive}; # replace the current archive if non-empty 405 $self->{archive} = shift ||$self->{archive}; # replace the current archive if non-empty
305 $self->{archive}; 406 $self->{archive};
316 $self->{debug}; 417 $self->{debug};
317} 418}
318sub appletId { 419sub appletId {
319 appletName(@_); 420 appletName(@_);
320} 421}
422
423sub initialState {
424 my $self = shift;
425 my $str = shift;
426 $self->{initialState} = $str ||$self->{initialState}; # replace the current string if non-empty
427 $self->{initialState};
428}
429
430sub config {
431 my $self = shift;
432 my $str = shift;
433 $self->{base64_config} = encode_base64($str) || $self->{base64_config}; # replace the current string if non-empty
434 $self->{base64_config} =~ s/\n//g;
435 decode_base64($self->{base64_config});
436}
437#######################
438# soon to be deprecated?
439#######################
321sub state { 440sub state {
322 my $self = shift; 441 my $self = shift;
323 my $str = shift; 442 my $str = shift;
324 $self->{base64_state} = encode_base64($str) ||$self->{base64_state}; # replace the current string if non-empty 443 $self->{base64_state} = encode_base64($str) ||$self->{base64_state}; # replace the current string if non-empty
325 $self->{base64_state} =~ s/\n//g; 444 $self->{base64_state} =~ s/\n//g;
326 decode_base64($self->{base64_state}); 445 decode_base64($self->{base64_state});
327} 446}
328
329sub base64_state{ 447sub base64_state{
330 my $self = shift; 448 my $self = shift;
331 $self->{base64_state} = shift ||$self->{base64_state}; # replace the current string if non-empty 449 $self->{base64_state} = shift ||$self->{base64_state}; # replace the current string if non-empty
332 $self->{base64_state}; 450 $self->{base64_state};
333} 451}
334sub config { 452
335 my $self = shift;
336 my $str = shift;
337 $self->{base64_config} = encode_base64($str) || $self->{base64_config}; # replace the current string if non-empty
338 $self->{base64_config} =~ s/\n//g;
339 decode_base64($self->{base64_config});
340}
341sub base64_config { 453sub base64_config {
342 my $self = shift; 454 my $self = shift;
343 $self->{base64_config} = shift ||$self->{base64_config}; # replace the current string if non-empty 455 $self->{base64_config} = shift ||$self->{base64_config}; # replace the current string if non-empty
344 $self->{base64_config} =$self->{base64_config}; 456 $self->{base64_config} =$self->{base64_config};
345 $self->{base64_config}; 457 $self->{base64_config};
346} 458}
459
460sub returnFieldName {
461 my $self = shift;
462 warn "use answerBoxName instead of returnFieldName";
463}
464sub answerBox {
465 my $self = shift;
466 warn "use answerBoxName instead of AnswerBox";
467}
468#########################
347#FIXME 469#FIXME
348# need to be able to adjust header material 470# need to be able to adjust header material
349 471
350sub insertHeader { 472sub insertHeader {
351 my $self = shift; 473 my $self = shift;
474
352 my $codebase = $self->codebase; 475 my $codebase = $self->codebase;
353 my $appletId = $self->appletId; 476 my $appletId = $self->appletId;
354 my $appletName = $self->appletName; 477 my $appletName = $self->appletName;
355 my $base64_initialState = $self->base64_state; 478 my $base64_initialState = $self->base64_state;
356 my $initializeAction = $self->initializeActionAlias; 479 my $initializeAction = $self->initializeActionAlias;
357 my $submitAction = $self->submitActionAlias; 480 my $submitActionAlias = $self->submitActionAlias;
481 my $submitActionScript = $self->submitActionScript;
358 my $setState = $self->setStateAlias; 482 my $setStateAlias = $self->setStateAlias;
359 my $getState = $self->getStateAlias; 483 my $getStateAlias = $self->getStateAlias;
484
360 my $config = $self->configAlias; 485 my $setConfigAlias = $self->setConfigAlias;
486 my $getConfigAlias = $self->getConfigAlias;
361 my $base64_config = $self->base64_config; 487 my $base64_config = $self->base64_config;
362 my $debugMode = ($self->debug) ? "1": "0"; 488 my $debugMode = ($self->debug) ? "1": "0";
363 my $returnFieldName = $self->{returnFieldName}; 489 my $returnFieldName = $self->{returnFieldName};
364# my $encodeStateQ = ($self->debug)?'' : "state = Base64.encode(state);"; # in debug mode base64 encoding is not used. 490 my $answerBox = $self->{answerBox};
365# my $decodeStateQ = "if (!state.match(/<XML>*/i) ) {state = Base64.decode(state)}"; # decode if <XML> is not present
366 my $headerText = $self->header(); 491 my $headerText = $self->header();
492
493
494 $submitActionScript =~ s/"/\\"/g; # escape quotes for ActionScript
495 # other variables should not have quotes.
496
497 $submitActionScript =~ s/\n/ /g; # replace returns with spaces -- returns in the wrong spot can cause trouble with javaScript
498 $submitActionScript =~ s/\r/ /g; # replace returns with spaces -- returns can cause trouble
367 499
368 $headerText =~ s/(\$\w+)/$1/gee; # interpolate variables p17 of Cookbook 500 $headerText =~ s/(\$\w+)/$1/gee; # interpolate variables p17 of Cookbook
369 501
370 return $headerText; 502 return $headerText;
371 503
379 my $appletId = $self->{appletName}; 511 my $appletId = $self->{appletName};
380 my $appletName = $self->{appletName}; 512 my $appletName = $self->{appletName};
381 my $archive = $self->{archive}; 513 my $archive = $self->{archive};
382 my $width = $self->{width}; 514 my $width = $self->{width};
383 my $height = $self->{height}; 515 my $height = $self->{height};
516 my $applet_bgcolor = $self->{bgcolor};
384 my $javaParameters = ''; 517 my $javaParameters = '';
385 my $flashParameters = ''; 518 my $flashParameters = '';
386 my %param_hash = %{$self->params()}; 519 my %param_hash = %{$self->params()};
387 foreach my $key (keys %param_hash) { 520 foreach my $key (keys %param_hash) {
388 $javaParameters .= qq!<param name ="$key" value = "$param_hash{$key}">\n!; 521 $javaParameters .= qq!<param name ="$key" value = "$param_hash{$key}">\n!;
393 526
394 $objectText = $self->{objectText}; 527 $objectText = $self->{objectText};
395 $objectText =~ s/(\$\w+)/$1/gee; 528 $objectText =~ s/(\$\w+)/$1/gee;
396 return $objectText; 529 return $objectText;
397} 530}
398sub initialize { 531# sub initialize {
399 my $self = shift; 532# my $self = shift;
400 return q{ 533# return q{
401 <script> 534# <script>
402 initializeAction(); 535# initializeAllApplets();
403 // this should really be done in the <body> tag 536# // this should really be done in the <body> tag
404 </script> 537# </script>
405 }; 538# };
406 539#
407} 540# }
408######################################################## 541########################################################
409# HEADER material for one flash or java applet 542# HEADER material for one flash or java applet
410######################################################## 543########################################################
411 544
412use constant DEFAULT_HEADER_TEXT =><<'END_HEADER_SCRIPT'; 545use constant DEFAULT_HEADER_TEXT =><<'END_HEADER_SCRIPT';
413 546 <script src="/webwork2_files/js/Base64.js" language="javascript">
547 </script>
548 <script src="/webwork2_files/js/ww_applet_support.js" language="javascript">
549 //upload functions stored in /opt/webwork/webwork2/htdocs/js ...
550
551 </script>
414 <script language="JavaScript"> 552 <script language="JavaScript">
415 553
416 // set debug mode for this applet 554 // set debug mode for this applet
417 set_debug($debugMode); 555 set_debug($debugMode);
418 556
419 ////////////////////////////////////////////////////////// 557 //////////////////////////////////////////////////////////
420 //CONFIGURATIONS 558 //TEST code
421 // 559 //
422 // configurations are "permanent" 560 //
423 ////////////////////////////////////////////////////////// 561 //////////////////////////////////////////////////////////
562
563 ww_applet_list["$appletName"] = new ww_applet("$appletName");
424 564
425 applet_config_list["$appletName"] = function() {
426 debug_add("applet_config_list:\n attempt to configure $appletName . $config ( $base64_config ) if config function is defined: "
427 );
428 try {
429 if (( typeof(getApplet("$appletName").$config) == "function" ) ) {
430 debug_add("CONFIGURE $appletName");
431 getApplet("$appletName").$config(Base64.decode("$base64_config"));
432 }
433 } catch(e) {
434 alert("Error executing configuration command $config for $appletName: " + e );
435 }
436 }
437 ////////////////////////////////////////////////////////////
438 //
439 //STATE:
440 // state can vary as the applet is manipulated -- it is reset from the questions _state values
441 //
442 //////////////////////////////////////////////////////////
443 565
444 applet_setState_list["$appletName"] = function(state) { 566 ww_applet_list["$appletName"].code = "$code";
445 debug_add("Begin setState for applet $appletName"); 567 ww_applet_list["$appletName"].codebase = "$codebase";
446 debug_add("Obtain state from $appletName"+"_state"); 568 ww_applet_list["$appletName"].appletID = "$appletID";
447 state = state || getQE("$appletName"+"_state").value; 569 ww_applet_list["$appletName"].base64_state = "$base64_initializationState";
448 if ( base64Q(state) ) { 570 ww_applet_list["$appletName"].base64_config = "$base64_config";
449 state=Base64.decode(state); 571 ww_applet_list["$appletName"].getStateAlias = "$getStateAlias";
450 } 572 ww_applet_list["$appletName"].setStateAlias = "$setStateAlias";
451 if (state.match(/<xml/i) || state.match(/<?xml/i) ) { // if state starts with <?xml 573 ww_applet_list["$appletName"].setConfigAlias = "$setConfigAlias";
452 574 ww_applet_list["$appletName"].getConfigAlias = "$getConfigAlias";
453 debug_add("applet_setState_list: \n set (decoded) state for $appletName to " + 575 ww_applet_list["$appletName"].initializeActionAlias = "$initializeAction";
454 state +"\nfunction type is " +typeof(getApplet("$appletName").$setState) 576 ww_applet_list["$appletName"].submitActionAlias = "$submitActionAlias";
455 ); 577 ww_applet_list["$appletName"].submitActionScript = "$submitActionScript";
456 try { 578 ww_applet_list["$appletName"].answerBox = "$answerBox";
457 if (( typeof(getApplet("$appletName").$setState) =="function" ) ) { 579 ww_applet_list["$appletName"].debug = "$debugMode";
458 debug_add("setState for $appletName");
459 getApplet("$appletName").$setState( state );
460 }
461 } catch(e) {
462 alert("Error in setting state of $appletName using command $setState : " + e );
463 }
464 } else if (debug) {
465 alert("new state was empty string or did not begin with <xml-- state was not reset");
466 }
467 };
468 applet_getState_list["$appletName"] = function () {
469 debug_add("get current state for applet $appletName and store it in $appletName"+"_state");
470 var applet = getApplet("$appletName");
471 try {
472 if (( typeof(applet.$getState) == "function" ) ) { // there may be no state function
473 state = applet.$getState(); // get state in xml format
474 debug_add("state has type " + typeof(state));
475 state = String(state); // geogebra returned an object type instead of a string type
476 debug_add("state converted to type " + typeof(state));
477 }
478
479 if (!debug) {
480 state = Base64.encode(state);
481 }; // replace state by encoded version unless in debug mode
482 580
483 debug_add("state is "+state); // this should still be in plain text
484 getQE("$appletName"+"_state").value = state; //place state in input item (debug: textarea, otherwise: hidden)
485 } catch (e) {
486 alert("Error in getting state for $appletName " + e );
487 }
488 };
489
490 ////////////////////////////////////////////////////////////
491 //
492 //INITIALIZE
493 //
494 ////////////////////////////////////////////////////////////
495
496
497 applet_checkLoaded_list["$appletName"] = function() { // this function returns 0 unless:
498 // applet has already been flagged as ready in applet_isReady_list
499 // applet.config is defined (or alias for .config)
500 // applet.setState is defined
501 // applet.isActive is defined
502 // applet reported that it is loaded by calling loadQ()
503 var ready = 0;
504 var applet = getApplet("$appletName");
505 if (!debug && applet_isReady_list["$appletName"]) {return(1)}; // memorize readiness in non-debug mode
506 if ( typeof(applet.$config) == "function") {
507 debug_add( "applet.config is " + typeof(applet.$config) );
508 ready = 1;
509 }
510 if( typeof(applet.$getState) == "function") {
511 debug_add( "applet.getState is " + typeof(applet.$getState) );
512 ready =1;
513 }
514 if (typeof(applet.isActive) == "function" && applet.isActive ) {
515 debug_add( "applet.isActive is " + typeof(applet.isActive) );
516 ready =1;
517 }
518 if (typeof(applet_reportsLoaded_list["$appletName"]) !="undefined" && applet_reportsLoaded_list["$appletName"] != 0 ) {
519 debug_add( "applet reports that it is loaded " + applet_reportsLoaded_list["$appletName"] );
520 ready =1;
521 }
522 applet_isReady_list["$appletName"]= ready;
523 return(ready);
524 }
525
526 applet_initializeAction_list["$appletName"] = function (state) {
527 applet_setState_list["$appletName"](state);
528 };
529
530 applet_submitAction_list["$appletName"] = function () {
531 if (! applet_isReady_list["$appletName"] ) {
532 alert("$appletName is not ready");
533 }
534 applet_getState_list["$appletName"]();
535 //getQE("$returnFieldName").value = getApplet("$appletName").sendData(); //FIXME -- not needed in general?
536 };
537 </script> 581 </script>
538 582
539END_HEADER_SCRIPT 583END_HEADER_SCRIPT
540 584
541package FlashApplet; 585package FlashApplet;
563 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 607 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
564 id="$appletName" width="500" height="375" 608 id="$appletName" width="500" height="375"
565 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"> 609 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
566 <param name="movie" value="$codebase/$appletName.swf" /> 610 <param name="movie" value="$codebase/$appletName.swf" />
567 <param name="quality" value="high" /> 611 <param name="quality" value="high" />
568 <param name="bgcolor" value="#869ca7" /> 612 <param name="bgcolor" value="$applet_bgcolor" />
569 <param name="allowScriptAccess" value="sameDomain" /> 613 <param name="allowScriptAccess" value="sameDomain" />
570 <embed src="$codebase/$appletName.swf" quality="high" bgcolor="#869ca7" 614 <embed src="$codebase/$appletName.swf" quality="high" bgcolor="$applet_bgcolor"
571 width="$width" height="$height" name="$appletName" align="middle" id="$appletName" 615 width="$width" height="$height" name="$appletName" align="middle" id="$appletName"
572 play="true" loop="false" quality="high" allowScriptAccess="sameDomain" 616 play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
573 type="application/x-shockwave-flash" 617 type="application/x-shockwave-flash"
574 pluginspage="http://www.macromedia.com/go/getflashplayer"> 618 pluginspage="http://www.macromedia.com/go/getflashplayer">
575 </embed> 619 </embed>
585 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 629 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
586 id="$appletName" width="500" height="375" 630 id="$appletName" width="500" height="375"
587 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"> 631 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
588 <param name="movie" value="$codebase/$appletName.swf" /> 632 <param name="movie" value="$codebase/$appletName.swf" />
589 <param name="quality" value="high" /> 633 <param name="quality" value="high" />
590 <param name="bgcolor" value="#869ca7" /> 634 <param name="bgcolor" value="$applet_bgcolor" />
591 <param name="allowScriptAccess" value="sameDomain" /> 635 <param name="allowScriptAccess" value="sameDomain" />
592 <param name="FlashVars" value="$flashParameters"/> 636 <param name="FlashVars" value="$flashParameters"/>
593 <embed src="$codebase/$appletName.swf" quality="high" bgcolor="#869ca7" 637 <embed src="$codebase/$appletName.swf" quality="high" bgcolor="$applet_bgcolor"
594 width="$width" height="$height" name="$appletName" align="middle" id="$appletName" 638 width="$width" height="$height" name="$appletName" align="middle" id="$appletName"
595 play="true" loop="false" quality="high" allowScriptAccess="sameDomain" 639 play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
596 type="application/x-shockwave-flash" 640 type="application/x-shockwave-flash"
597 pluginspage="http://www.macromedia.com/go/getflashplayer" 641 pluginspage="http://www.macromedia.com/go/getflashplayer"
598 FlashVars="$flashParameters"> 642 FlashVars="$flashParameters">
655 archive = "$archive" 699 archive = "$archive"
656 name = "$appletName" 700 name = "$appletName"
657 id = "$appletName" 701 id = "$appletName"
658 width = "$width" 702 width = "$width"
659 height = "$height" 703 height = "$height"
704 bgcolor = "$applet_bgcolor"
660 MAYSCRIPT 705 MAYSCRIPT
661 > 706 >
662 $javaParameters 707 $javaParameters
663 708
664 Sorry, the Applet could not be started. Please make sure that 709 Sorry, the Applet could not be started. Please make sure that

Legend:
Removed from v.5944  
changed lines
  Added in v.6023

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9