[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 5667 Revision 6021
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.10 2008/05/05 17:24:31 gage Exp $ 4# $CVSHeader: pg/lib/Applet.pm,v 1.17 2009/02/19 16:35:26 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.
99use MIME::Base64 qw( encode_base64 decode_base64); 99use MIME::Base64 qw( encode_base64 decode_base64);
100 100
101 101
102=head2 Default javaScript functions placed in header 102=head2 Default javaScript functions placed in header
103 103
104=pod
105
104These functions are automatically defined for use for 106These functions are automatically defined for use for
105any javaScript placed in the text of a PG question. 107any javaScript placed in the text of a PG question.
106 108
107 getApplet(appletName) -- finds the applet path in the DOM 109 getApplet(appletName) -- finds the applet path in the DOM
108 110
109 submitAction() -- calls the submit action of the applets 111 submitAction() -- calls the submit action of the applets
110
111 112
112 initializeAction() -- calls the initialize action of the applets 113 initializeWWquestion() -- calls the initialize action of the applets
113 114
114 getQE(name) -- gets an HTML element of the question by name 115 getQE(name) -- gets an HTML element of the question by name
115 or by id. Be sure to keep all names and ids 116 or by id. Be sure to keep all names and ids
116 unique within a given PG question. 117 unique within a given PG question.
117 118
118 getQuestionElement(name) -- long form of getQE(name) 119 getQuestionElement(name) -- long form of getQE(name)
119 120
120 listQuestionElements() -- for discovering the names of inputs in the 121 listQuestionElements() -- for discovering the names of inputs in the
121 PG question. An alert dialog will list all 122 PG question. An alert dialog will list all
122 of the elements. 123 of the elements.
123 Usage: Place this at the END of the question, 124 Usage: Place this at the END of the question, just before END_DOCUMENT():
124 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
129
130 ----------------------------------------------------------------------------
131
132
133 List of accessor methods made available by the FlashApplet class:
134 Usage: $current_value = $applet->method(new_value or empty)
135 These can also be set when creating the class -- for exampe:
136 $applet = new FlashApplet(
137 # can be replaced by $applet =FlashApplet() when using AppletObjects.pl
138 codebase => findAppletCodebase("$appletName.swf"),
139 appletName => $appletName,
140 appletId => $appletName,
141 submitActionAlias => 'checkAnswer',
142 );
128 143
129 list of accessor methods format: current_value = $self->method(new_value or empty)
130 144
131 appletId for simplicity and reliability appletId and appletName are always the same 145 appletId for simplicity and reliability appletId and appletName are always the same
132 appletName 146 appletName
133
134 archive the name of the .jar file containing the applet code 147 archive the name of the .jar file containing the applet code
135 code the name of the applet code in the .jar archive 148 code the name of the applet code in the .jar archive
136 codebase a prefix url used to find the archive and the applet itself 149 codebase a prefix url used to find the archive and the applet itself
137 150
138 height rectangle alloted in the html page for displaying the applet 151 height rectangle alloted in the html page for displaying the applet
139 width 152
140
141 params an anonymous array containing name/value pairs 153 params an anonymous array containing name/value pairs
142 to configure the applet [name =>'value, ...] 154 to configure the applet [name =>'value, ...]
143 155
144 header stores the text to be added to the header section of the html page 156 header stores the text to be added to the header section of the html page
145 object stores the text which places the applet on the html page 157 object stores the text which places the applet on the html page
146 158
147 debug in debug mode several alerts mark progress through the procedure of calling the applet 159 debug in debug mode several alerts mark progress through the procedure of calling the applet
148 160
149 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
150 change as it is used. When stored in hidden answer fields 162 change as it is used. When stored in hidden answer fields
151 it is usually stored in base64 encoded format. 163 it is usually stored in base64 encoded format.
152 base64_config base64 encode version of the contents of config 164 base64_config base64 encode version of the contents of config
153 165
154 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
155 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>
156 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.
157 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
158 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
159 when revisiting the question the applet 176 when revisiting the question the applet will be restored to the same state it was left in when the question was last
160 will be restored to the same state it was left in when the question was last
161 viewed. 177 viewed.
162 178
163 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.
164 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>
165 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.
166 The state is passed in plain text in xml format with outer tags: <xml>....</xml> 182 The state is passed in plain text in xml format with outer tags: <xml>....</xml>
167 183
168 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.
169 185
170 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
171 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
172 .pg question is pressed. 188 .pg question is pressed.
189 answerBox -- name of answer box to return answer to: default defaultAnswerBox
190 getAnswer -- (formerly sendData) get student answer from applet and place in answerBox
191 returnFieldName -- (deprecated) synonmym for answerBox
173 192
174 returnFieldName
175
176
177
178
179 193
180=cut 194=cut
181 195
196=head4 More details
182 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.
183 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
184 253
185sub new { 254sub new {
186 my $class = shift; 255 my $class = shift;
187 my $self = { 256 my $self = {
188 appletName =>'', 257 appletName =>'',
190 codebase=>'', 259 codebase=>'',
191# appletId =>'', #always use identical applet Id's and applet Names 260# appletId =>'', #always use identical applet Id's and applet Names
192 params =>undef, 261 params =>undef,
193 width => 550, 262 width => 550,
194 height => 400, 263 height => 400,
264 bgcolor => "#869ca7",
195 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.
196 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.)
197 getStateAlias => 'getXML', 269 getStateAlias => 'getXML',
198 setStateAlias => 'setXML', 270 setStateAlias => 'setXML',
199 configAlias => 'config', 271 configAlias => '',
272 getConfigAlias => 'getConfig',
273 setConfigAlias => 'setConfig',
200 initializeActionAlias => 'setXML', 274 initializeActionAlias => 'setXML',
201 submitActionAlias => 'getXML', 275 submitActionAlias => 'getXML',
202 returnFieldName => 'receivedField', 276 submitActionScript => '', # script executed on submitting the WW question
277 answerBox => 'answerBox',
203 headerText => DEFAULT_HEADER_TEXT(), 278 headerText => DEFAULT_HEADER_TEXT(),
204 objectText => '', 279 objectText => '',
205 debug => 0, 280 debug => 0,
206 @_, 281 @_,
207 }; 282 };
208 bless $self, $class; 283 bless $self, $class;
209 $self->state('<xml></xml>'); 284 $self->initialState('<xml></xml>');
285 if ($self->{configAlias}) { # backward compatibility
286 warn "use setConfigAlias instead of configAlias";
287 $self->{configAlias}='';
288 }
210 $self->config('<xml></xml>'); 289 $self->config('<xml></xml>');
211 return $self; 290 return $self;
212} 291}
213 292
214sub header { 293sub header {
250sub submitActionAlias { 329sub submitActionAlias {
251 my $self = shift; 330 my $self = shift;
252 $self->{submitActionAlias} = shift ||$self->{submitActionAlias}; # replace the current contents if non-empty 331 $self->{submitActionAlias} = shift ||$self->{submitActionAlias}; # replace the current contents if non-empty
253 $self->{submitActionAlias}; 332 $self->{submitActionAlias};
254} 333}
334sub submitActionScript {
335 my $self = shift;
336 $self->{submitActionScript} = shift ||$self->{submitActionScript}; # replace the current contents if non-empty
337 $self->{submitActionScript};
338}
255sub getStateAlias { 339sub getStateAlias {
256 my $self = shift; 340 my $self = shift;
257 $self->{getStateAlias} = shift ||$self->{getStateAlias}; # replace the current contents if non-empty 341 $self->{getStateAlias} = shift ||$self->{getStateAlias}; # replace the current contents if non-empty
258 $self->{getStateAlias}; 342 $self->{getStateAlias};
259} 343}
263 $self->{setStateAlias} = shift ||$self->{setStateAlias}; # replace the current contents if non-empty 347 $self->{setStateAlias} = shift ||$self->{setStateAlias}; # replace the current contents if non-empty
264 $self->{setStateAlias}; 348 $self->{setStateAlias};
265} 349}
266sub configAlias { 350sub configAlias {
267 my $self = shift; 351 my $self = shift;
268 $self->{configAlias} = shift ||$self->{configAlias}; # replace the current contents if non-empty 352 $self->{setConfigAlias} = shift ||$self->{setConfigAlias}; # replace the current contents if non-empty
269 $self->{configAlias}; 353 $self->{setConfigAlias};
270} 354}
271sub returnFieldName { 355sub setConfigAlias {
272 my $self = shift; 356 my $self = shift;
273 $self->{returnFieldName} = shift ||$self->{returnFieldName}; # replace the current contents if non-empty 357 $self->{setConfigAlias} = shift ||$self->{setConfigAlias}; # replace the current contents if non-empty
274 $self->{returnFieldName}; 358 $self->{setConfigAlias};
359}
360sub getConfigAlias {
361 my $self = shift;
362 $self->{getConfigAlias} = shift ||$self->{getConfigAlias}; # replace the current contents if non-empty
363 $self->{getConfigAlias};
364}
365
366sub answerBoxName {
367 my $self = shift;
368 $self->{answerBox} = shift ||$self->{answerBox}; # replace the current contents if non-empty
369 $self->{answerBox};
275} 370}
276sub codebase { 371sub codebase {
277 my $self = shift; 372 my $self = shift;
278 $self->{codebase} = shift ||$self->{codebase}; # replace the current codebase if non-empty 373 $self->{codebase} = shift ||$self->{codebase}; # replace the current codebase if non-empty
279 $self->{codebase}; 374 $self->{codebase};
290} 385}
291sub width { 386sub width {
292 my $self = shift; 387 my $self = shift;
293 $self->{width} = shift ||$self->{width}; # replace the current width if non-empty 388 $self->{width} = shift ||$self->{width}; # replace the current width if non-empty
294 $self->{width}; 389 $self->{width};
390}
391sub bgcolor {
392 my $self = shift;
393 $self->{bgcolor} = shift ||$self->{bgcolor}; # replace the current background color if non-empty
394 $self->{bgcolor};
295} 395}
296sub archive { 396sub archive {
297 my $self = shift; 397 my $self = shift;
298 $self->{archive} = shift ||$self->{archive}; # replace the current archive if non-empty 398 $self->{archive} = shift ||$self->{archive}; # replace the current archive if non-empty
299 $self->{archive}; 399 $self->{archive};
310 $self->{debug}; 410 $self->{debug};
311} 411}
312sub appletId { 412sub appletId {
313 appletName(@_); 413 appletName(@_);
314} 414}
415
416sub initialState {
417 my $self = shift;
418 my $str = shift;
419 $self->{initialState} = $str ||$self->{initialState}; # replace the current string if non-empty
420 $self->{initialState};
421}
422
423sub config {
424 my $self = shift;
425 my $str = shift;
426 $self->{base64_config} = encode_base64($str) || $self->{base64_config}; # replace the current string if non-empty
427 $self->{base64_config} =~ s/\n//g;
428 decode_base64($self->{base64_config});
429}
430#######################
431# soon to be deprecated?
432#######################
315sub state { 433sub state {
316 my $self = shift; 434 my $self = shift;
317 my $str = shift; 435 my $str = shift;
318 $self->{base64_state} = encode_base64($str) ||$self->{base64_state}; # replace the current string if non-empty 436 $self->{base64_state} = encode_base64($str) ||$self->{base64_state}; # replace the current string if non-empty
319 $self->{base64_state} =~ s/\n//g; 437 $self->{base64_state} =~ s/\n//g;
320 decode_base64($self->{base64_state}); 438 decode_base64($self->{base64_state});
321} 439}
322
323sub base64_state{ 440sub base64_state{
324 my $self = shift; 441 my $self = shift;
325 $self->{base64_state} = shift ||$self->{base64_state}; # replace the current string if non-empty 442 $self->{base64_state} = shift ||$self->{base64_state}; # replace the current string if non-empty
326 $self->{base64_state}; 443 $self->{base64_state};
327} 444}
328sub config { 445
329 my $self = shift;
330 my $str = shift;
331 $self->{base64_config} = encode_base64($str) || $self->{base64_config}; # replace the current string if non-empty
332 $self->{base64_config} =~ s/\n//g;
333 decode_base64($self->{base64_config});
334}
335sub base64_config { 446sub base64_config {
336 my $self = shift; 447 my $self = shift;
337 $self->{base64_config} = shift ||$self->{base64_config}; # replace the current string if non-empty 448 $self->{base64_config} = shift ||$self->{base64_config}; # replace the current string if non-empty
338 $self->{base64_config} =$self->{base64_config}; 449 $self->{base64_config} =$self->{base64_config};
339 $self->{base64_config}; 450 $self->{base64_config};
340} 451}
452
453sub returnFieldName {
454 my $self = shift;
455 warn "use answerBoxName instead of returnFieldName";
456}
457sub answerBox {
458 my $self = shift;
459 warn "use answerBoxName instead of AnswerBox";
460}
461#########################
341#FIXME 462#FIXME
342# need to be able to adjust header material 463# need to be able to adjust header material
343 464
344sub insertHeader { 465sub insertHeader {
345 my $self = shift; 466 my $self = shift;
467
346 my $codebase = $self->codebase; 468 my $codebase = $self->codebase;
347 my $appletId = $self->appletId; 469 my $appletId = $self->appletId;
348 my $appletName = $self->appletName; 470 my $appletName = $self->appletName;
349 my $base64_initialState = $self->base64_state; 471 my $base64_initialState = $self->base64_state;
350 my $initializeAction = $self->initializeActionAlias; 472 my $initializeAction = $self->initializeActionAlias;
351 my $submitAction = $self->submitActionAlias; 473 my $submitActionAlias = $self->submitActionAlias;
474 my $submitActionScript = $self->submitActionScript;
352 my $setState = $self->setStateAlias; 475 my $setStateAlias = $self->setStateAlias;
353 my $getState = $self->getStateAlias; 476 my $getStateAlias = $self->getStateAlias;
477
354 my $config = $self->configAlias; 478 my $setConfigAlias = $self->setConfigAlias;
479 my $getConfigAlias = $self->getConfigAlias;
355 my $base64_config = $self->base64_config; 480 my $base64_config = $self->base64_config;
356 my $debugMode = ($self->debug) ? "1": "0"; 481 my $debugMode = ($self->debug) ? "1": "0";
357 my $returnFieldName = $self->{returnFieldName}; 482 my $returnFieldName = $self->{returnFieldName};
358# my $encodeStateQ = ($self->debug)?'' : "state = Base64.encode(state);"; # in debug mode base64 encoding is not used. 483 my $answerBox = $self->{answerBox};
359# my $decodeStateQ = "if (!state.match(/<XML>*/i) ) {state = Base64.decode(state)}"; # decode if <XML> is not present
360 my $headerText = $self->header(); 484 my $headerText = $self->header();
485
486
487 $submitActionScript =~ s/"/\\"/g; # escape quotes for ActionScript
488 # other variables should not have quotes.
489
490 $submitActionScript =~ s/\n/ /g; # replace returns with spaces -- returns in the wrong spot can cause trouble with javaScript
491 $submitActionScript =~ s/\r/ /g; # replace returns with spaces -- returns can cause trouble
361 492
362 $headerText =~ s/(\$\w+)/$1/gee; # interpolate variables p17 of Cookbook 493 $headerText =~ s/(\$\w+)/$1/gee; # interpolate variables p17 of Cookbook
363 494
364 return $headerText; 495 return $headerText;
365 496
373 my $appletId = $self->{appletName}; 504 my $appletId = $self->{appletName};
374 my $appletName = $self->{appletName}; 505 my $appletName = $self->{appletName};
375 my $archive = $self->{archive}; 506 my $archive = $self->{archive};
376 my $width = $self->{width}; 507 my $width = $self->{width};
377 my $height = $self->{height}; 508 my $height = $self->{height};
509 my $applet_bgcolor = $self->{bgcolor};
378 my $javaParameters = ''; 510 my $javaParameters = '';
379 my $flashParameters = ''; 511 my $flashParameters = '';
380 my %param_hash = %{$self->params()}; 512 my %param_hash = %{$self->params()};
381 foreach my $key (keys %param_hash) { 513 foreach my $key (keys %param_hash) {
382 $javaParameters .= qq!<param name ="$key" value = "$param_hash{$key}">\n!; 514 $javaParameters .= qq!<param name ="$key" value = "$param_hash{$key}">\n!;
387 519
388 $objectText = $self->{objectText}; 520 $objectText = $self->{objectText};
389 $objectText =~ s/(\$\w+)/$1/gee; 521 $objectText =~ s/(\$\w+)/$1/gee;
390 return $objectText; 522 return $objectText;
391} 523}
392sub initialize { 524# sub initialize {
393 my $self = shift; 525# my $self = shift;
394 return q{ 526# return q{
395 <script> 527# <script>
396 initializeAction(); 528# initializeAllApplets();
397 // this should really be done in the <body> tag 529# // this should really be done in the <body> tag
398 </script> 530# </script>
399 }; 531# };
400 532#
401} 533# }
402######################################################## 534########################################################
403# HEADER material for one flash or java applet 535# HEADER material for one flash or java applet
404######################################################## 536########################################################
405 537
406use constant DEFAULT_HEADER_TEXT =><<'END_HEADER_SCRIPT'; 538use constant DEFAULT_HEADER_TEXT =><<'END_HEADER_SCRIPT';
407 539 <script src="/webwork2_files/js/Base64.js" language="javascript">
540 </script>
541 <script src="/webwork2_files/js/ww_applet_support.js" language="javascript">
542 //upload functions stored in /opt/webwork/webwork2/htdocs/js ...
543
544 </script>
408 <script language="JavaScript"> 545 <script language="JavaScript">
409 546
410 // set debug mode for this applet 547 // set debug mode for this applet
411 set_debug($debugMode); 548 set_debug($debugMode);
412 549
413 ////////////////////////////////////////////////////////// 550 //////////////////////////////////////////////////////////
414 //CONFIGURATIONS 551 //TEST code
415 // 552 //
416 // configurations are "permanent" 553 //
417 ////////////////////////////////////////////////////////// 554 //////////////////////////////////////////////////////////
555
556 ww_applet_list["$appletName"] = new ww_applet("$appletName");
418 557
419 applet_config_list["$appletName"] = function() {
420 debug_add("applet_config_list:\n attempt to configure $appletName . $config ( $base64_config ) if config function is defined: "
421 );
422 try {
423 if (( typeof(getApplet("$appletName").$config) == "function" ) ) {
424 debug_add("CONFIGURE $appletName");
425 getApplet("$appletName").$config(Base64.decode("$base64_config"));
426 }
427 } catch(e) {
428 alert("Error executing configuration command $config for $appletName: " + e );
429 }
430 }
431 ////////////////////////////////////////////////////////////
432 //
433 //STATE:
434 // state can vary as the applet is manipulated -- it is reset from the questions _state values
435 //
436 //////////////////////////////////////////////////////////
437 558
438 applet_setState_list["$appletName"] = function(state) { 559 ww_applet_list["$appletName"].code = "$code";
439 debug_add("Begin setState for applet $appletName"); 560 ww_applet_list["$appletName"].codebase = "$codebase";
440 debug_add("Obtain state from $appletName"+"_state"); 561 ww_applet_list["$appletName"].appletID = "$appletID";
441 state = state || getQE("$appletName"+"_state").value; 562 ww_applet_list["$appletName"].base64_state = "$base64_initializationState";
442 if ( base64Q(state) ) { 563 ww_applet_list["$appletName"].base64_config = "$base64_config";
443 state=Base64.decode(state); 564 ww_applet_list["$appletName"].getStateAlias = "$getStateAlias";
444 } 565 ww_applet_list["$appletName"].setStateAlias = "$setStateAlias";
445 if (state.match(/<xml/i) || state.match(/<?xml/i) ) { // if state starts with <?xml 566 ww_applet_list["$appletName"].setConfigAlias = "$setConfigAlias";
446 567 ww_applet_list["$appletName"].getConfigAlias = "$getConfigAlias";
447 debug_add("applet_setState_list: \n set (decoded) state for $appletName to " + 568 ww_applet_list["$appletName"].initializeActionAlias = "$initializeAction";
448 state +"\nfunction type is " +typeof(getApplet("$appletName").$setState) 569 ww_applet_list["$appletName"].submitActionAlias = "$submitActionAlias";
449 ); 570 ww_applet_list["$appletName"].submitActionScript = "$submitActionScript";
450 try { 571 ww_applet_list["$appletName"].answerBox = "$answerBox";
451 if (( typeof(getApplet("$appletName").$setState) =="function" ) ) { 572 ww_applet_list["$appletName"].debug = "$debugMode";
452 debug_add("setState for $appletName");
453 getApplet("$appletName").$setState( state );
454 }
455 } catch(e) {
456 alert("Error in setting state of $appletName using command $setState : " + e );
457 }
458 } else if (debug) {
459 alert("new state was empty string or did not begin with <xml-- state was not reset");
460 }
461 };
462 applet_getState_list["$appletName"] = function () {
463 debug_add("get current state for applet $appletName and store it in $appletName"+"_state");
464 var applet = getApplet("$appletName");
465 try {
466 if (( typeof(applet.$getState) == "function" ) ) { // there may be no state function
467 state = applet.$getState(); // get state in xml format
468 }
469
470 if (!debug) {state = Base64.encode(state) }; // replace state by encoded version unless in debug mode
471 debug_add("state is "+state); // this should still be in plain text
472 getQE("$appletName"+"_state").value = state; //place state in input item (debug: textarea, otherwise: hidden)
473 } catch (e) {
474 alert("Error in getting state for $appletName " + e );
475 }
476 };
477
478 ////////////////////////////////////////////////////////////
479 //
480 //INITIALIZE
481 //
482 ////////////////////////////////////////////////////////////
483
484 573
485 applet_checkLoaded_list["$appletName"] = function() { // this function returns 0 unless:
486 // applet has already been flagged as ready in applet_isReady_list
487 // applet.config is defined (or alias for .config)
488 // applet.setState is defined
489 // applet.isActive is defined
490 // applet reported that it is loaded by calling loadQ()
491 var ready = 0;
492 var applet = getApplet("$appletName");
493 if (!debug && applet_isReady_list["$appletName"]) {return(1)}; // memorize readiness in non-debug mode
494 if ( typeof(applet.$config) == "function") {
495 debug_add( "applet.config is " + typeof(applet.$config) );
496 ready = 1;
497 }
498 if( typeof(applet.$getState) == "function") {
499 debug_add( "applet.getState is " + typeof(applet.$getState) );
500 ready =1;
501 }
502 if (typeof(applet.isActive) == "function" && applet.isActive ) {
503 debug_add( "applet.isActive is " + typeof(applet.isActive) );
504 ready =1;
505 }
506 if (typeof(applet_reportsLoaded_list["$appletName"]) !="undefined" && applet_reportsLoaded_list["$appletName"] != 0 ) {
507 debug_add( "applet reports that it is loaded " + applet_reportsLoaded_list["$appletName"] );
508 ready =1;
509 }
510 applet_isReady_list["$appletName"]= ready;
511 return(ready);
512 }
513
514 applet_initializeAction_list["$appletName"] = function (state) {
515 applet_setState_list["$appletName"](state);
516 };
517
518 applet_submitAction_list["$appletName"] = function () {
519 if (! applet_isReady_list["$appletName"] ) {
520 alert("$appletName is not ready");
521 }
522 applet_getState_list["$appletName"]();
523 //getQE("$returnFieldName").value = getApplet("$appletName").sendData(); //FIXME -- not needed in general?
524 };
525 </script> 574 </script>
526 575
527END_HEADER_SCRIPT 576END_HEADER_SCRIPT
528 577
529package FlashApplet; 578package FlashApplet;
530@ISA = qw(Applet); 579@ISA = qw(Applet);
531 580
532 581
582=head2 Insertion HTML code for FlashApplet
533 583
534=pod 584=pod
535 585
536The secret to making this applet work with IE in addition to normal browsers 586The secret to making this applet work with IE in addition to normal browsers
537is the addition of the C(<form></form>) construct just before the object. 587is the addition of the C(<form></form>) construct just before the object.
550 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 600 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
551 id="$appletName" width="500" height="375" 601 id="$appletName" width="500" height="375"
552 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"> 602 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
553 <param name="movie" value="$codebase/$appletName.swf" /> 603 <param name="movie" value="$codebase/$appletName.swf" />
554 <param name="quality" value="high" /> 604 <param name="quality" value="high" />
555 <param name="bgcolor" value="#869ca7" /> 605 <param name="bgcolor" value="$applet_bgcolor" />
556 <param name="allowScriptAccess" value="sameDomain" /> 606 <param name="allowScriptAccess" value="sameDomain" />
557 <embed src="$codebase/$appletName.swf" quality="high" bgcolor="#869ca7" 607 <embed src="$codebase/$appletName.swf" quality="high" bgcolor="$applet_bgcolor"
558 width="$width" height="$height" name="$appletName" align="middle" id="$appletName" 608 width="$width" height="$height" name="$appletName" align="middle" id="$appletName"
559 play="true" loop="false" quality="high" allowScriptAccess="sameDomain" 609 play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
560 type="application/x-shockwave-flash" 610 type="application/x-shockwave-flash"
561 pluginspage="http://www.macromedia.com/go/getflashplayer"> 611 pluginspage="http://www.macromedia.com/go/getflashplayer">
562 </embed> 612 </embed>
572 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 622 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
573 id="$appletName" width="500" height="375" 623 id="$appletName" width="500" height="375"
574 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"> 624 codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
575 <param name="movie" value="$codebase/$appletName.swf" /> 625 <param name="movie" value="$codebase/$appletName.swf" />
576 <param name="quality" value="high" /> 626 <param name="quality" value="high" />
577 <param name="bgcolor" value="#869ca7" /> 627 <param name="bgcolor" value="$applet_bgcolor" />
578 <param name="allowScriptAccess" value="sameDomain" /> 628 <param name="allowScriptAccess" value="sameDomain" />
579 <param name="FlashVars" value="$flashParameters"/> 629 <param name="FlashVars" value="$flashParameters"/>
580 <embed src="$codebase/$appletName.swf" quality="high" bgcolor="#869ca7" 630 <embed src="$codebase/$appletName.swf" quality="high" bgcolor="$applet_bgcolor"
581 width="$width" height="$height" name="$appletName" align="middle" id="$appletName" 631 width="$width" height="$height" name="$appletName" align="middle" id="$appletName"
582 play="true" loop="false" quality="high" allowScriptAccess="sameDomain" 632 play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
583 type="application/x-shockwave-flash" 633 type="application/x-shockwave-flash"
584 pluginspage="http://www.macromedia.com/go/getflashplayer" 634 pluginspage="http://www.macromedia.com/go/getflashplayer"
585 FlashVars="$flashParameters"> 635 FlashVars="$flashParameters">
598 648
599 649
600package JavaApplet; 650package JavaApplet;
601@ISA = qw(Applet); 651@ISA = qw(Applet);
602 652
603 653=head2 Insertion HTML code for JavaApplet
604 654
605=pod 655=pod
606 656
607The secret to making this applet work with IE in addition to normal browsers 657The secret to making this applet work with IE in addition to normal browsers
608is the addition of the C(<form></form>) construct just before the object. 658is the addition of the C(<form></form>) construct just before the object.
642 archive = "$archive" 692 archive = "$archive"
643 name = "$appletName" 693 name = "$appletName"
644 id = "$appletName" 694 id = "$appletName"
645 width = "$width" 695 width = "$width"
646 height = "$height" 696 height = "$height"
697 bgcolor = "$applet_bgcolor"
647 MAYSCRIPT 698 MAYSCRIPT
648 > 699 >
649 $javaParameters 700 $javaParameters
650 701
651 Sorry, the Applet could not be started. Please make sure that 702 Sorry, the Applet could not be started. Please make sure that

Legend:
Removed from v.5667  
changed lines
  Added in v.6021

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9