Parent Directory
|
Revision Log
print warning if the javaScript file is not available.
1 ################################################################################ 2 # WeBWorK Online Homework Delivery System 3 # Copyright © 2000-2007 The WeBWorK Project, http://openwebwork.sf.net/ 4 # $CVSHeader: pg/macros/AppletObjects.pl,v 1.13 2009/02/07 22:27:29 gage Exp $ 5 # 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 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. 10 # 11 # This program is distributed in the hope that it will be useful, but WITHOUT 12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the 14 # Artistic License for more details. 15 ################################################################################ 16 17 =head1 NAME 18 19 AppletObjects.pl - Macro-based front end for the Applet.pm module. 20 21 22 =head1 DESCRIPTION 23 24 This subroutines in this 25 file provide mechanisms to insert Flash applets (and Java applets) 26 into a WeBWorK problem. 27 28 29 =head1 SEE ALSO 30 31 L<Applets.pm>. 32 33 =cut 34 35 ######################################################################### 36 # 37 # Add basic functionality to the header of the question 38 # 39 # don't reload this file 40 ######################################################################### 41 42 sub _AppletObjects_init { 43 44 45 main::HEADER_TEXT(<<'END_HEADER_TEXT'); 46 <script language="javascript">AC_FL_RunContent = 0;</script> 47 <script src="/webwork2_files/applets/AC_RunActiveContent.js" language="javascript"> 48 </script> 49 <script src="/webwork2_files/js/Base64.js" language="javascript"> 50 </script> 51 <script src="/webwork2_files/js/ww_applet_support.js"> 52 //upload functions stored in /opt/webwork/webwork2/htdocs/js ... 53 </script> 54 if (!( typeof(set_debug) == "function") ) { 55 alert("Can't find the function set_debug. Is the file ww_applet_support.js in /webwork2/htdocs/js"); 56 } 57 END_HEADER_TEXT 58 59 }; 60 61 =head3 62 FlashApplet 63 64 Useage: $applet = FlashApplet(); 65 66 =cut 67 68 sub FlashApplet { 69 return new FlashApplet(@_); 70 71 } 72 73 sub JavaApplet { 74 return new JavaApplet(@_); 75 76 } 77 78 package Applet; 79 80 81 82 =head2 Methods 83 84 =cut 85 86 ## this method is defined in this file 87 ## because the main subroutines HEADER_TEXT and MODES are 88 ## not available to the module FlashApplet when that file 89 ## is compiled (at the time the apache child process is first initialized) 90 91 =head3 insertAll 92 93 Useage: TEXT( $applet->insertAll() ); 94 \{ $applet->insertAll() \} (used within BEGIN_TEXT/END_TEXT blocks) 95 96 =cut 97 98 =pod 99 100 Inserts applet at this point in the HTML code. (In TeX mode a message "Applet" is written.) This method 101 also adds the applets header material into the header portion of the HTML page. It effectively inserts 102 the outputs of both C<$applet-E<gt>insertHeader> and C<$applet-E<gt>insertObject> (defined in L<Applet.pm> ) 103 in the appropriate places. 104 105 Note: This method is defined here rather than in Applet.pl because it 106 requires access to the RECORD_FORM_LABEL subroutine 107 and to the routine accessing the stored values of the answers. These are defined in main::. 108 109 =cut 110 111 sub insertAll { ## inserts both header text and object text 112 my $self = shift; 113 my %options = @_; 114 $self->debug( (defined($options{debug}) and $options{debug}==1) ? 1 : 0 ); 115 my $reset_button = $options{reset_button} || 0; 116 # prepare html code for storing state 117 my $appletName = $self->appletName; 118 my $appletStateName = "${appletName}_state"; 119 my $getState = $self->getStateAlias; 120 my $setState = $self->setStateAlias; 121 my $base64_initialState = $self->base64_state; 122 main::RECORD_FORM_LABEL($appletStateName); #this insures that they'll be saved from one invocation to the next 123 #main::RECORD_FORM_LABEL("previous_$appletStateName"); 124 my $answer_value = ''; 125 126 if ( defined( ${$main::inputs_ref}{$appletStateName} ) and ${$main::inputs_ref}{$appletStateName} =~ /\S/ ) { 127 $answer_value = ${$main::inputs_ref}{$appletStateName}; 128 } elsif ( defined( $main::rh_sticky_answers->{$appletStateName} ) ) { 129 warn "type of sticky answers is ", ref( $main::rh_sticky_answers->{$appletStateName} ); 130 $answer_value = shift( @{ $main::rh_sticky_answers->{$appletStateName} }); 131 } 132 $answer_value =~ tr/\\$@`//d; #`## make sure student answers can not be interpolated by e.g. EV3 133 $answer_value =~ s/\s+/ /g; ## remove excessive whitespace from student answer 134 ####### 135 # insert a hidden variable to hold the applet's state (debug =>1 makes it visible for debugging and provides debugging buttons) 136 ####### 137 my $base_64_encoded_answer_value; 138 my $decoded_answer_value; 139 if ( $answer_value =~/<XML|<?xml/i) { 140 $base_64_encoded_answer_value = encode_base64($answer_value); 141 $decoded_answer_value = $answer_value; 142 } else { 143 $decoded_answer_value = decode_base64($answer_value); 144 if ( $decoded_answer_value =~/<XML|<?xml/i) { # great, we've decoded the answer to obtain an xml string 145 $base_64_encoded_answer_value = $answer_value; 146 } else { #WTF?? apparently we don't have XML tags 147 $answer_value = "<xml>$answer_value</xml>"; 148 $base_64_encoded_answer_value = encode_base64($answer_value); 149 $decoded_answer_value = $answer_value; 150 } 151 } 152 $base_64_encoded_answer_value =~ s/\r|\n//g; # get rid of line returns 153 # debug version of the applet state answerBox and controls 154 my $debug_input_element = qq!\n<textarea rows="4" cols="80" 155 name = "$appletStateName">$decoded_answer_value</textarea><br/> 156 <input type="button" value="$getState" 157 onClick="debugText=''; 158 ww_applet_list['$appletName'].getState(); 159 alert(debugText);" 160 > 161 <input type="button" value="$setState" 162 onClick="debugText=''; 163 ww_applet_list['$appletName'].setState(); 164 alert(debugText);" 165 > 166 !; 167 my $state_input_element = ($self->debug == 1) ? $debug_input_element : 168 qq!\n<input type="hidden" name = "$appletStateName" value ="$base_64_encoded_answer_value">!; 169 my $reset_button_str = ($reset_button) ? 170 qq!<br/><input type='button' value='set applet state empty' onClick="setEmptyState('$appletName')"> 171 <input type="button" value="reinitialize applet" onClick="getQE('$appletStateName').value='$base64_initialState'"/>! 172 : '' 173 ; 174 # always base64 encode the hidden answer value to prevent problems with quotes. 175 # 176 $state_storage_html_code = 177 $reset_button_str. 178 $state_input_element. 179 qq!<input type="hidden" name="previous_$appletStateName" value = "$base_64_encoded_answer_value">!; 180 $state_storage_html_code = qq!<input type="hidden" name="previous_$appletStateName" value = "$base_64_encoded_answer_value">! 181 . $reset_button_str 182 . $state_input_element 183 ; 184 ####### 185 # insert header material 186 ####### 187 main::HEADER_TEXT($self->insertHeader()); 188 return main::MODES(TeX=>' {\bf applet } ', HTML=>$self->insertObject.$main::BR.$state_storage_html_code); 189 } 190 191 =head3 Example problem 192 193 194 =cut 195 196 197 198 =pod 199 200 201 DOCUMENT(); 202 203 # Load whatever macros you need for the problem 204 loadMacros("PG.pl", 205 "PGbasicmacros.pl", 206 "PGchoicemacros.pl", 207 "PGanswermacros.pl", 208 "AppletObjects.pl", 209 "MathObjects.pl", 210 "source.pl" 211 ); 212 213 ## Do NOT show partial correct answers 214 $showPartialCorrectAnswers = 0; 215 216 217 218 ################################### 219 # Create link to applet 220 ################################### 221 222 $applet = FlashApplet(); 223 my $appletName = "ExternalInterface"; 224 $applet->codebase(findAppletCodebase("$appletName.swf")); 225 $applet->appletName($appletName); 226 $applet->appletId($appletName); 227 228 # findAppletCodebase looks for the applet in a list 229 # of locations specified in global.conf 230 231 ################################### 232 # Add additional javaScript functions to header section of HTML to 233 # communicate with the "ExternalInterface" applet. 234 ################################### 235 236 $applet->header(<<'END_HEADER'); 237 <script type="text/javascript" src="https://devel.webwork.rochester.edu:8002/webwork2_files/js/BrowserSniffer.js"> 238 </script> 239 240 241 <script language="JavaScript"> 242 function getBrowser() { 243 //alert("look for sniffer"); 244 var sniffer = new BrowserSniffer(); 245 //alert("found sniffer" +sniffer); 246 return sniffer; 247 } 248 249 function updateStatus(sMessage) { 250 getQE("playbackStatus").value = sMessage; 251 } 252 253 function newColor() { 254 255 getApplet("ExternalInterface").updateColor(Math.round(Math.random() * 0xFFFFFF)); 256 } 257 258 </script> 259 END_HEADER 260 261 ################################### 262 # Configure applet 263 ################################### 264 265 # not used here. Allows for uploading an xml string for the applet 266 267 268 269 270 ################################### 271 # write the text for the problem 272 ################################### 273 274 TEXT(beginproblem()); 275 276 277 278 BEGIN_TEXT 279 \{ $applet->insertAll() \} 280 $PAR 281 282 The Flash object operates above this line. The box and button below this line are part of 283 the WeBWorK problem. They communicate with the Flash object. 284 $HR 285 Status <input type="text" id="playbackStatus" value="started" /><br /> 286 Color <input type="button" value="new color" name="newColorButton" onClick="newColor()" /> 287 $PAR $HR 288 This flash applet was created by Barbara Kaskosz. 289 290 END_TEXT 291 292 ENDDOCUMENT(); 293 294 295 296 297 =cut
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |