Quizzes can now be opened in a popup window. Javascript must be enabled.
authormoodler <moodler>
Thu, 16 Dec 2004 08:05:23 +0000 (08:05 +0000)
committermoodler <moodler>
Thu, 16 Dec 2004 08:05:23 +0000 (08:05 +0000)
An attempt has been made to make the popup as secure as possible by disabling
various browser capabilities through javascript.

mod/quiz/attempt.php
mod/quiz/attempt_close_js.php [new file with mode: 0644]
mod/quiz/mod.html
mod/quiz/protect_js.php [new file with mode: 0644]
mod/quiz/view.php
mod/quiz/view_js.php

index 700e4dbeb7d5794afecdc2e0bb3b8d267ea3d274..6dddfec32a69357c003128d1195c9ab1836cfeba 100644 (file)
 
 // Print the page header
 
-    $strquizzes = get_string("modulenameplural", "quiz");
-    $strquiz  = get_string("modulename", "quiz");
-
-    print_header_simple("$quiz->name", "",
+    if (!empty($quiz->popup)) {
+        print_header("$course->shortname: $quiz->name", '', '', '', '', false, '', '', false, '');
+        
+    } else {
+        $strquizzes = get_string("modulenameplural", "quiz");
+        $strquiz  = get_string("modulename", "quiz");
+        print_header_simple("$quiz->name", "",
                  "<a href=\"index.php?id=$course->id\">$strquizzes</a> ->
                   <a href=\"view.php?id=$cm->id\">$quiz->name</a> -> $strattemptnum",
                   "", "", true);
+    }
 
     echo '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>'; // for overlib
 
             print_simple_box_end();
             echo "</form>\n";
             
-            print_footer();
+            if (empty($quiz->popup)) {
+                print_footer();
+            }
             exit;
 
         } else {
                        "review.php?id=$cm->id&amp;attempt=$attempt->id", "$quiz->id", $cm->id);
         } else {
             notice(get_string("alreadysubmitted", "quiz"), "view.php?id=$cm->id");
-            print_footer($course);
+            if (empty($quiz->popup)) {
+                print_footer($course);
+            }
             exit;
         }
 
             print_heading("$strgrade: $result->grade/$quiz->grade");
         }
 
-        print_continue("view.php?id=$cm->id");
+        /// continue button - use javascript to close down child window if in popup
+        include('attempt_close_js.php');
 
         if ($quiz->feedback) {
             $quiz->shuffleanswers = false;       // Never shuffle answers in feedback
             quiz_print_quiz_questions($quiz, $questions, $result, $shuffleorder);
-            print_continue("view.php?id=$cm->id");
+            /// continue button - use javascript to close down child window if in popup
+            include('attempt_close_js.php');
         }
 
-        print_footer($course);
+        if (empty($quiz->popup)) {
+            print_footer($course);
+        }
 
         exit;
     }
 
     if (isguest()) {
         print_heading(get_string("guestsno", "quiz"));
-        print_footer($course);
+        if (empty($quiz->popup)) {
+            print_footer($course);
+        }
         exit;
     }
 
         include("jsclock.php");
     }
 
+/// Include Javascript protection for this page if required
+
+    if (!empty($quiz->popup)) {
+        include("protect_js.php");
+    }
 
 /// Print all the questions
 
         require('jstimer.php');
     }
 
-    print_footer($course);
+    if (empty($quiz->popup)) {
+        print_footer($course);
+    }
 
 ?>
diff --git a/mod/quiz/attempt_close_js.php b/mod/quiz/attempt_close_js.php
new file mode 100644 (file)
index 0000000..013ebc3
--- /dev/null
@@ -0,0 +1,25 @@
+<?php defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');?>
+
+<div align="center">
+<?php 
+if (!empty($quiz->popup)) {
+?>
+
+<script language="javascript" type="text/javascript">
+<!--
+
+document.write('<input type="button" value="<?php print_string('continue') ?>" '+
+               'onclick="javascript: window.opener.location.href=\'view.php?id=<?php echo $cm->id ?>\'; '+
+               'window.close();" />');
+// -->
+</script>
+<noscript>
+<?php print_string('closewindow'); ?>
+</noscript>
+
+<?php
+} else {
+    print_single_button("view.php", array( 'id' => $cm->id ), get_string('continue'));
+}
+?>
+</div>
index 330f05f58938f1397145da660dcf53b6c9db832d..ebb5496191ae4a1b40c23bc636a636fe1b7a0814 100644 (file)
@@ -55,6 +55,9 @@
     if (!isset($form->timelimit)) {
         $form->timelimit = 0;
     }
+    if (!isset($form->popup)) {
+        $form->popup = 0;
+    }
 ?>
 
 
      ?>
     </td>
 </tr>
-<!-- BEGIN EDIT -->
 <tr valign="top">
     <td align="right"><b><?php print_string("timelimit", "quiz") ?>:</b></td>
     <td>
     ?>
     </td>
 </tr>
-<!-- END EDIT -->
 <tr valign="top">
     <td align="right"><b><?php print_string("shufflequestions", "quiz") ?>:</b></td>
     <td>
      ?>
     </td>
 </tr>
+<tr valign="top">
+    <td align="right"><b><?php print_string("popup", "quiz") ?>:</b></td>
+    <td>
+    <?php
+        $options = array();
+        $options[0] = get_string("no");
+        $options[1] = get_string("yes");
+        choose_from_menu($options, "popup", "$form->popup", "");
+        helpbutton("popup", get_string("popup","quiz"), "quiz");
+     ?>
+    </td>
+</tr>
 <tr valign="top">
     <td align="right"><b><?php print_string("requirepassword", "quiz") ?>:</b></td>
     <td>
diff --git a/mod/quiz/protect_js.php b/mod/quiz/protect_js.php
new file mode 100644 (file)
index 0000000..df9612b
--- /dev/null
@@ -0,0 +1,36 @@
+<?php defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.'); ?>
+
+<script language="JavaScript" type="text/javascript">
+<!-- 
+
+var message = "<?php print_string('functiondisabled'); ?>";
+
+function click(e) {
+    if (document.all) {
+        if (event.button==1) {
+           return false;
+        }
+        if (event.button==2) {
+           alert(message);
+           return false;
+        }
+    }
+    if (document.layers) {
+        if (e.which > 1) {
+           alert(message);
+           return false;
+        }
+    }
+}
+if (document.layers) {
+    document.captureEvents(Event.MOUSEDOWN);
+}
+document.onmousedown=click;
+document.oncontextmenu=new Function("alert(message);return false")
+
+document.write(unescape("%3C%53%43%52%49%50%54%20%4C%41%4E%47%55%41%47%45%3D%22%4A%61%76%61%53%63%72%69%70%74%22%3E%3C%21%2D%2D%0D%0A%68%70%5F%6F%6B%3D%74%72%75%65%3B%66%75%6E%63%74%69%6F%6E%20%68%70%5F%64%30%30%28%73%29%7B%69%66%28%21%68%70%5F%6F%6B%29%72%65%74%75%72%6E%3B%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%73%29%7D%2F%2F%2D%2D%3E%3C%2F%53%43%52%49%50%54%3E"));
+
+hp_d00(unescape("%3C%53%43%52%49%50%54%20%4C%41%4E%47%55%41%47%45%3D%22%4A%61%76%61%53%63%72%69%70%74%22%3E%3C%21%2D%2D%0D%0A%66%75%6E%63%74%69%6F%6E%20%68%70%5F%6E%65%28%29%7B%72%65%74%75%72%6E%20%74%72%75%65%7D%6F%6E%65%72%72%6F%72%3D%68%70%5F%6E%65%3B%66%75%6E%63%74%69%6F%6E%20%68%70%5F%64%6E%28%61%29%7B%72%65%74%75%72%6E%20%66%61%6C%73%65%7D%3B%66%75%6E%63%74%69%6F%6E%20%68%70%5F%64%65%28%65%29%7B%72%65%74%75%72%6E%28%65%2E%74%61%72%67%65%74%2E%74%61%67%4E%61%6D%65%21%3D%6E%75%6C%6C%26%26%65%2E%74%61%72%67%65%74%2E%74%61%67%4E%61%6D%65%2E%73%65%61%72%63%68%28%27%5E%28%49%4E%50%55%54%7C%54%45%58%54%41%52%45%41%7C%42%55%54%54%4F%4E%7C%53%45%4C%45%43%54%29%24%27%29%21%3D%2D%31%29%7D%3B%66%75%6E%63%74%69%6F%6E%20%68%70%5F%6D%64%28%65%29%7B%69%66%28%65%2E%77%68%69%63%68%3D%3D%31%29%7B%77%69%6E%64%6F%77%2E%63%61%70%74%75%72%65%45%76%65%6E%74%73%28%45%76%65%6E%74%2E%4D%4F%55%53%45%4D%4F%56%45%29%3B%77%69%6E%64%6F%77%2E%6F%6E%6D%6F%75%73%65%6D%6F%76%65%3D%68%70%5F%64%6E%7D%7D%66%75%6E%63%74%69%6F%6E%20%68%70%5F%6D%75%28%65%29%7B%69%66%28%65%2E%77%68%69%63%68%3D%3D%31%29%7B%77%69%6E%64%6F%77%2E%72%65%6C%65%61%73%65%45%76%65%6E%74%73%28%45%76%65%6E%74%2E%4D%4F%55%53%45%4D%4F%56%45%29%3B%77%69%6E%64%6F%77%2E%6F%6E%6D%6F%75%73%65%6D%6F%76%65%3D%6E%75%6C%6C%7D%7D%69%66%28%6E%61%76%69%67%61%74%6F%72%2E%61%70%70%4E%61%6D%65%2E%69%6E%64%65%78%4F%66%28%27%49%6E%74%65%72%6E%65%74%20%45%78%70%6C%6F%72%65%72%27%29%3D%3D%2D%31%7C%7C%28%6E%61%76%69%67%61%74%6F%72%2E%75%73%65%72%41%67%65%6E%74%2E%69%6E%64%65%78%4F%66%28%27%4D%53%49%45%27%29%21%3D%2D%31%26%26%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%2E%6C%65%6E%67%74%68%21%3D%30%29%29%7B%69%66%28%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%29%7B%64%6F%63%75%6D%65%6E%74%2E%6F%6E%73%65%6C%65%63%74%73%74%61%72%74%3D%68%70%5F%64%6E%7D%65%6C%73%65%20%69%66%28%64%6F%63%75%6D%65%6E%74%2E%6C%61%79%65%72%73%29%7B%77%69%6E%64%6F%77%2E%63%61%70%74%75%72%65%45%76%65%6E%74%73%28%45%76%65%6E%74%2E%4D%4F%55%53%45%55%50%7C%45%76%65%6E%74%2E%4D%4F%55%53%45%44%4F%57%4E%29%3B%77%69%6E%64%6F%77%2E%6F%6E%6D%6F%75%73%65%64%6F%77%6E%3D%68%70%5F%6D%64%3B%77%69%6E%64%6F%77%2E%6F%6E%6D%6F%75%73%65%75%70%3D%68%70%5F%6D%75%7D%65%6C%73%65%20%69%66%28%64%6F%63%75%6D%65%6E%74%2E%67%65%74%45%6C%65%6D%65%6E%74%42%79%49%64%26%26%21%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%29%7B%64%6F%63%75%6D%65%6E%74%2E%6F%6E%6D%6F%75%73%65%64%6F%77%6E%3D%68%70%5F%64%65%7D%7D%69%66%28%77%69%6E%64%6F%77%2E%6C%6F%63%61%74%69%6F%6E%2E%68%72%65%66%2E%73%75%62%73%74%72%69%6E%67%28%30%2C%34%29%3D%3D%22%66%69%6C%65%22%29%77%69%6E%64%6F%77%2E%6C%6F%63%61%74%69%6F%6E%3D%22%61%62%6F%75%74%3A%62%6C%61%6E%6B%22%3B%66%75%6E%63%74%69%6F%6E%20%68%70%5F%6E%6C%73%28%29%7B%77%69%6E%64%6F%77%2E%73%74%61%74%75%73%3D%22%22%3B%73%65%74%54%69%6D%65%6F%75%74%28%22%68%70%5F%6E%6C%73%28%29%22%2C%31%30%29%7D%68%70%5F%6E%6C%73%28%29%3B%66%75%6E%63%74%69%6F%6E%20%68%70%5F%64%70%31%28%29%7B%66%6F%72%28%69%3D%30%3B%69%3C%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%2E%6C%65%6E%67%74%68%3B%69%2B%2B%29%7B%69%66%28%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%5B%69%5D%2E%73%74%79%6C%65%2E%76%69%73%69%62%69%6C%69%74%79%21%3D%22%68%69%64%64%65%6E%22%29%7B%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%5B%69%5D%2E%73%74%79%6C%65%2E%76%69%73%69%62%69%6C%69%74%79%3D%22%68%69%64%64%65%6E%22%3B%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%5B%69%5D%2E%69%64%3D%22%68%70%5F%69%64%22%7D%7D%7D%3B%66%75%6E%63%74%69%6F%6E%20%68%70%5F%64%70%32%28%29%7B%66%6F%72%28%69%3D%30%3B%69%3C%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%2E%6C%65%6E%67%74%68%3B%69%2B%2B%29%7B%69%66%28%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%5B%69%5D%2E%69%64%3D%3D%22%68%70%5F%69%64%22%29%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%5B%69%5D%2E%73%74%79%6C%65%2E%76%69%73%69%62%69%6C%69%74%79%3D%22%22%7D%7D%3B%77%69%6E%64%6F%77%2E%6F%6E%62%65%66%6F%72%65%70%72%69%6E%74%3D%68%70%5F%64%70%31%3B%77%69%6E%64%6F%77%2E%6F%6E%61%66%74%65%72%70%72%69%6E%74%3D%68%70%5F%64%70%32%3B%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%73%74%79%6C%65%20%74%79%70%65%3D%22%74%65%78%74%2F%63%73%73%22%20%6D%65%64%69%61%3D%22%70%72%69%6E%74%22%3E%3C%21%2D%2D%62%6F%64%79%7B%64%69%73%70%6C%61%79%3A%6E%6F%6E%65%7D%2D%2D%3E%3C%2F%73%74%79%6C%65%3E%27%29%3B%66%75%6E%63%74%69%6F%6E%20%68%70%5F%64%63%28%29%7B%68%70%5F%74%61%2E%63%72%65%61%74%65%54%65%78%74%52%61%6E%67%65%28%29%2E%65%78%65%63%43%6F%6D%6D%61%6E%64%28%22%43%6F%70%79%22%29%3B%73%65%74%54%69%6D%65%6F%75%74%28%22%68%70%5F%64%63%28%29%22%2C%33%30%30%29%7D%69%66%28%6E%61%76%69%67%61%74%6F%72%2E%61%70%70%4E%61%6D%65%2E%69%6E%64%65%78%4F%66%28%27%49%6E%74%65%72%6E%65%74%20%45%78%70%6C%6F%72%65%72%27%29%3D%3D%2D%31%7C%7C%28%6E%61%76%69%67%61%74%6F%72%2E%75%73%65%72%41%67%65%6E%74%2E%69%6E%64%65%78%4F%66%28%27%4D%53%49%45%27%29%21%3D%2D%31%26%26%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%2E%6C%65%6E%67%74%68%21%3D%30%29%29%7B%69%66%28%64%6F%63%75%6D%65%6E%74%2E%61%6C%6C%26%26%6E%61%76%69%67%61%74%6F%72%2E%75%73%65%72%41%67%65%6E%74%2E%69%6E%64%65%78%4F%66%28%27%4F%70%65%72%61%27%29%3D%3D%2D%31%29%7B%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%64%69%76%20%73%74%79%6C%65%3D%22%70%6F%73%69%74%69%6F%6E%3A%61%62%73%6F%6C%75%74%65%3B%6C%65%66%74%3A%2D%31%30%30%30%70%78%3B%74%6F%70%3A%2D%31%30%30%30%70%78%22%3E%3C%69%6E%70%75%74%20%74%79%70%65%3D%22%74%65%78%74%61%72%65%61%22%20%6E%61%6D%65%3D%22%68%70%5F%74%61%22%20%76%61%6C%75%65%3D%22%20%22%20%73%74%79%6C%65%3D%22%76%69%73%69%62%69%6C%69%74%79%3A%68%69%64%64%65%6E%22%3E%3C%2F%64%69%76%3E%27%29%3B%68%70%5F%64%63%28%29%7D%7D%66%75%6E%63%74%69%6F%6E%20%68%70%5F%6E%64%64%28%29%7B%72%65%74%75%72%6E%20%66%61%6C%73%65%7D%64%6F%63%75%6D%65%6E%74%2E%6F%6E%64%72%61%67%73%74%61%72%74%3D%68%70%5F%6E%64%64%3B%2F%2F%2D%2D%3E%3C%2F%53%43%52%49%50%54%3E"));
+
+//-->
+</script>
index b50f8f08bbe59db932025b08feb46182dd456276..2f44df763d68aa4d4e2c557e4545f1742db04c22 100644 (file)
                 echo "<br />";
                 echo "</p>";
                 echo "<div align=\"center\">";
-                if ($quiz->timelimit) {
-                    include("view_js.php");
-                } else {
-                    print_single_button("attempt.php", $options, get_string("attemptquiznow","quiz"));
-                }
+
+                include("view_js.php");
+
                 echo "</div>\n";
-                //echo "</p>";
             }
         } else {
             print_heading(get_string("nomoreattempts", "quiz"));
index 3f99b4fc6692724f7aa62f6b055ec731ed6193b4..46c7ae02e72a9a448b674980a79c8afcc809256c 100644 (file)
@@ -1,9 +1,19 @@
+<?php
+defined('MOODLE_INTERNAL') or die('Direct access to this script is forbidden.');
+
+$window = (!empty($quiz->popup)) ? 'quizpopup' : '_self';
+$windowoptions = ($window == '_self') ? '' : "left=0, top=0, height='+window.screen.height+', width='+window.screen.width+', channelmode=yes, fullscreen=yes, scrollbars=yes, resizeable=no, directories=no, toolbar=no, titlebar=no, location=no, status=no, menubar=no";
+
+?>
+
 <script language="javascript" type="text/javascript">
 <!--
-document.write('<form action="attempt.php" method="get"' +
-               ' onsubmit="return confirm(\'<?php echo $strconfirmstartattempt ?>\');">' +
-               '<input type="hidden" name="id" value="<?php echo $cm->id ?>" />' +
-               '<input type="submit" value="<?php print_string("attemptquiznow","quiz"); ?>" /></form>');
+document.write('<input type="button" value="<?php print_string('attemptquiznow', 'quiz') ?>" '+
+               'onclick="javascript: <?php if ($quiz->timelimit) echo "if (confirm(\\'$strconfirmstartattempt\\'))"; ?> '+
+               'window.open(\'attempt.php?id=<?php echo $cm->id ?>\', \'<?php echo $window ?>\', \'<?php echo $windowoptions ?>\'); " />');
 // -->
 </script>
-<noscript><strong><?php print_string("noscript","quiz"); ?></strong></noscript>
\ No newline at end of file
+<noscript>
+    <strong><?php print_string('noscript', 'quiz'); ?></strong>
+</noscript>
+