dokeos-exercise
[ class tree: dokeos-exercise ] [ index: dokeos-exercise ] [ all elements ]

Source for file exercice_submit.php

Documentation is available at exercice_submit.php

  1. <?php
  2. /*
  3.     DOKEOS - elearning and course management software
  4.  
  5.     For a full list of contributors, see documentation/credits.html
  6.  
  7.     This program is free software; you can redistribute it and/or
  8.     modify it under the terms of the GNU General Public License
  9.     as published by the Free Software Foundation; either version 2
  10.     of the License, or (at your option) any later version.
  11.     See "documentation/licence.html" more details.
  12.  
  13.     Contact:
  14.         Dokeos
  15.         Rue du Corbeau, 108
  16.         B-1030 Brussels - Belgium
  17.         info@dokeos.com
  18. */
  19. /**
  20. *    Exercise submission
  21. *     This script allows to run an exercise. According to the exercise type, questions
  22. *     can be on an unique page, or one per page with a Next button.
  23. *
  24. *     One exercise may contain different types of answers (unique or multiple selection,
  25. *     matching, fill in blanks, free answer, hot-spot).
  26. *
  27. *     Questions are selected randomly or not.
  28. *
  29. *     When the user has answered all questions and clicks on the button "Ok",
  30. *     it goes to exercise_result.php
  31. *
  32. *     Notice : This script is also used to show a question before modifying it by
  33. *     the administrator
  34. *    @package dokeos.exercise
  35. *     @author Olivier Brouckaert
  36. *     @version $Id: exercice_submit.php 15412 2008-05-26 13:56:24Z elixir_inter $
  37. */
  38.  
  39.  
  40. include('exercise.class.php');
  41. include('question.class.php');
  42. include('answer.class.php');
  43.  
  44. include('exercise.lib.php');
  45.  
  46. // debug var. Set to 0 to hide all debug display. Set to 1 to display debug messages.
  47. $debug 0;
  48.  
  49. // answer types
  50. define('UNIQUE_ANSWER',        1);
  51. define('MULTIPLE_ANSWER',    2);
  52. define('FILL_IN_BLANKS',    3);
  53. define('MATCHING',            4);
  54. define('FREE_ANSWER',         5);
  55. define('HOT_SPOT',             6);
  56. define('HOT_SPOT_ORDER',     7);
  57.  
  58. // name of the language file that needs to be included
  59. $language_file='exercice';
  60.  
  61. include_once('../inc/global.inc.php');
  62. $this_section=SECTION_COURSES;
  63.  
  64. /* ------------    ACCESS RIGHTS ------------ */
  65. // notice for unauthorized people.
  66.  
  67. include_once(api_get_path(LIBRARY_PATH).'text.lib.php');
  68.  
  69. $is_allowedToEdit=api_is_allowed_to_edit();
  70.  
  71. $TBL_EXERCICE_QUESTION Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
  72. $TBL_EXERCICES         Database::get_course_table(TABLE_QUIZ_TEST);
  73. $TBL_QUESTIONS         Database::get_course_table(TABLE_QUIZ_QUESTION);
  74. $TBL_REPONSES          Database::get_course_table(TABLE_QUIZ_ANSWER);
  75.  
  76. // general parameters passed via POST/GET
  77.  
  78. if empty $origin ) ) {
  79.     $origin $_REQUEST['origin'];
  80. }
  81. if empty $learnpath_id ) ) {
  82.     $learnpath_id       Database::escape_string($_REQUEST['learnpath_id']);
  83. }
  84. if empty $learnpath_item_id ) ) {
  85.     $learnpath_item_id  Database::escape_string($_REQUEST['learnpath_item_id']);
  86. }
  87. if empty $formSent ) ) {
  88.     $formSent       $_REQUEST['formSent'];
  89. }
  90. if empty $exerciseResult ) ) {
  91.     $exerciseResult $_REQUEST['exerciseResult'];
  92. }
  93.  
  94. if empty $exerciseResultCoordinates ) ) {
  95.     $exerciseResultCoordinates $_REQUEST['exerciseResultCoordinates'];
  96. }
  97.  
  98. if empty $exerciseType ) ) {
  99.     $exerciseType $_REQUEST['exerciseType'];
  100. }
  101. if empty $exerciseId ) ) {
  102.     $exerciseId intval($_REQUEST['exerciseId']);
  103. }
  104. if empty $choice ) ) {
  105.     $choice $_REQUEST['choice'];
  106. }
  107. if empty $questionNum ) ) {
  108.     $questionNum    Database::escape_string($_REQUEST['questionNum']);
  109. }
  110. if empty $nbrQuestions ) ) {
  111.     $nbrQuestions   Database::escape_string($_REQUEST['nbrQuestions']);
  112. }
  113. if empty ($buttonCancel) ) {
  114.     $buttonCancel     $_REQUEST['buttonCancel'];
  115. }
  116. $error '';
  117.  
  118. // if the user has clicked on the "Cancel" button
  119. if($buttonCancel)
  120. {
  121.     // returns to the exercise list
  122.     header("Location: exercice.php?origin=$origin&learnpath_id=$learnpath_id&learnpath_item_id=$learnpath_item_id");
  123.     exit();
  124. }
  125.  
  126. if ($origin=='builder'{
  127.     /*******************************/
  128.     /* Clears the exercise session */
  129.     /*******************************/
  130.     if(isset($_SESSION['objExercise']))        api_session_unregister('objExercise');    unset($objExercise)}
  131.     if(isset($_SESSION['objQuestion']))        api_session_unregister('objQuestion');    unset($objQuestion)}
  132.     if(isset($_SESSION['objAnswer']))        api_session_unregister('objAnswer');        unset($objAnswer);   }
  133.     if(isset($_SESSION['questionList']))    api_session_unregister('questionList');    unset($questionList)}
  134.     if(isset($_SESSION['exerciseResult']))    api_session_unregister('exerciseResult');    unset($exerciseResult)}
  135.     if(isset($_SESSION['exerciseResultCoordinates']))    api_session_unregister('exerciseResultCoordinates');    unset($exerciseResultCoordinates)}
  136. }
  137.  
  138. // if the user has submitted the form
  139. if($formSent)
  140. {
  141.     if($debug>0){echo str_repeat('&nbsp;',0).'$formSent was set'."<br />\n";}
  142.  
  143.     // initializing
  144.     if(!is_array($exerciseResult))
  145.     {
  146.         $exerciseResult=array();
  147.         $exerciseResultCoordinates=array();
  148.     }
  149.  
  150.     // if the user has answered at least one question
  151.     if(is_array($choice))
  152.     {
  153.         if($debug>0){echo str_repeat('&nbsp;',0).'$choice is an array'."<br />\n";}
  154.  
  155.         if($exerciseType == 1)
  156.         {
  157.             // $exerciseResult receives the content of the form.
  158.             // Each choice of the student is stored into the array $choice
  159.             $exerciseResult=$choice;
  160.  
  161.             if (isset($_POST['hotspot']))
  162.             {
  163.                 $exerciseResultCoordinates $_POST['hotspot'];
  164.             }
  165.         }
  166.         else
  167.         {
  168.             // gets the question ID from $choice. It is the key of the array
  169.             list($key)=array_keys($choice);
  170.  
  171.             // if the user didn't already answer this question
  172.             if(!isset($exerciseResult[$key]))
  173.             {
  174.                 // stores the user answer into the array
  175.                 $exerciseResult[$key]=$choice[$key];
  176.  
  177.                 if (isset($_POST['hotspot']))
  178.                 {
  179.                     $exerciseResultCoordinates[$key$_POST['hotspot'][$key];
  180.                 }
  181.             }
  182.         }
  183.         if($debug>0){echo str_repeat('&nbsp;',0).'$choice is an array - end'."<br />\n";}
  184.     }
  185.  
  186.     // the script "exercise_result.php" will take the variable $exerciseResult from the session
  187.     api_session_register('exerciseResult');
  188.     api_session_register('exerciseResultCoordinates');
  189.  
  190.     // if it is the last question (only for a sequential exercise)
  191.     if($exerciseType == || $questionNum >= $nbrQuestions)
  192.     {
  193.         if($debug>0){echo str_repeat('&nbsp;',0).'Redirecting to exercise_result.php - Remove debug option to let this happen'."<br />\n";}
  194.          // goes to the script that will show the result of the exercise
  195.         header("Location: exercise_result.php?origin=$origin&learnpath_id=$learnpath_id&learnpath_item_id=$learnpath_item_id");
  196.         exit();
  197.     }
  198.     if($debug>0){echo str_repeat('&nbsp;',0).'$formSent was set - end'."<br />\n";}
  199. }
  200.  
  201. // if the object is not in the session
  202. if(!isset($_SESSION['objExercise']|| $origin == 'learnpath' || $_SESSION['objExercise']->id != $_REQUEST['exerciseId'])
  203. {
  204.     if($debug>0){echo str_repeat('&nbsp;',0).'$_SESSION[objExercise] was unset'."<br />\n";}
  205.     // construction of Exercise
  206.     $objExercise=new Exercise();
  207.     unset($_SESSION['questionList']);
  208.  
  209.     // if the specified exercise doesn't exist or is disabled
  210.     if(!$objExercise->read($exerciseId|| (!$objExercise->selectStatus(&& !$is_allowedToEdit && ($origin != 'learnpath') ))
  211.     {
  212.         unset($objExercise);
  213.         $error get_lang('ExerciseNotFound');
  214.         //die(get_lang('ExerciseNotFound'));
  215.     }
  216.     else
  217.     {
  218.         // saves the object into the session
  219.         api_session_register('objExercise');
  220.         if($debug>0){echo str_repeat('&nbsp;',0).'$_SESSION[objExercise] was unset - set now - end'."<br />\n";}
  221.     }
  222. }
  223.  
  224. if(!isset($objExcercise&& isset($_SESSION['objExercise'])){
  225.     $objExercise $_SESSION['objExercise'];
  226. }
  227. if(!is_object($objExercise))
  228. {
  229.     header('Location: exercice.php');
  230.     exit();
  231. }
  232.  
  233. $exerciseTitle=$objExercise->selectTitle();
  234. $exerciseDescription=$objExercise->selectDescription();
  235. $exerciseDescription=stripslashes($exerciseDescription);
  236. $exerciseSound=$objExercise->selectSound();
  237. $randomQuestions=$objExercise->isRandom();
  238. $exerciseType=$objExercise->selectType();
  239.  
  240. if(!isset($_SESSION['questionList']|| $origin == 'learnpath')
  241. {
  242.     if($debug>0){echo str_repeat('&nbsp;',0).'$_SESSION[questionList] was unset'."<br />\n";}
  243.     // selects the list of question ID
  244.     $questionList ($randomQuestions?$objExercise->selectRandomList():$objExercise->selectQuestionList());
  245.     // saves the question list into the session
  246.     api_session_register('questionList');
  247.     if($debug>0){echo str_repeat('&nbsp;',0).'$_SESSION[questionList] was unset - set now - end'."<br />\n";}
  248. }
  249. if(!isset($objExcercise&& isset($_SESSION['objExercise'])){
  250.     $questionList $_SESSION['questionList'];
  251. }
  252.  
  253. $nbrQuestions=sizeof($questionList);
  254.  
  255. // if questionNum comes from POST and not from GET
  256. if(!$questionNum || $_POST['questionNum'])
  257. {
  258.     // only used for sequential exercises (see $exerciseType)
  259.     if(!$questionNum)
  260.     {
  261.         $questionNum=1;
  262.     }
  263.     else
  264.     {
  265.         $questionNum++;
  266.     }
  267. }
  268.  
  269. //$nameTools=get_lang('Exercice');
  270.  
  271. $interbreadcrumb[]=array("url" => "exercice.php","name" => get_lang('Exercices'));
  272. $interbreadcrumb[]=array("url" => "#","name" => $exerciseTitle);
  273.  
  274. if ($origin != 'learnpath'//so we are not in learnpath tool
  275.  
  276. $htmlHeadXtra["<script type=\"text/javascript\" src=\"../plugin/hotspot/JavaScriptFlashGateway.js\"></script>
  277.                     <script src=\"../plugin/hotspot/hotspot.js\" type=\"text/javascript\"></script>
  278.                     <script language=\"JavaScript\" type=\"text/javascript\">
  279.                     <!--
  280.                     // -----------------------------------------------------------------------------
  281.                     // Globals
  282.                     // Major version of Flash required
  283.                     var requiredMajorVersion = 7;
  284.                     // Minor version of Flash required
  285.                     var requiredMinorVersion = 0;
  286.                     // Minor version of Flash required
  287.                     var requiredRevision = 0;
  288.                     // the version of javascript supported
  289.                     var jsVersion = 1.0;
  290.                     // -----------------------------------------------------------------------------
  291.                     // -->
  292.                     </script>
  293.                     <script language=\"VBScript\" type=\"text/vbscript\">
  294.                     <!-- // Visual basic helper required to detect Flash Player ActiveX control version information
  295.                     Function VBGetSwfVer(i)
  296.                       on error resume next
  297.                       Dim swControl, swVersion
  298.                       swVersion = 0
  299.  
  300.                       set swControl = CreateObject(\"ShockwaveFlash.ShockwaveFlash.\" + CStr(i))
  301.                       if (IsObject(swControl)) then
  302.                         swVersion = swControl.GetVariable(\"\$version\")
  303.                       end if
  304.                       VBGetSwfVer = swVersion
  305.                     End Function
  306.                     // -->
  307.                     </script>
  308.  
  309.                     <script language=\"JavaScript1.1\" type=\"text/javascript\">
  310.                     <!-- // Detect Client Browser type
  311.                     var isIE  = (navigator.appVersion.indexOf(\"MSIE\") != -1) ? true : false;
  312.                     var isWin = (navigator.appVersion.toLowerCase().indexOf(\"win\") != -1) ? true : false;
  313.                     var isOpera = (navigator.userAgent.indexOf(\"Opera\") != -1) ? true : false;
  314.                     jsVersion = 1.1;
  315.                     // JavaScript helper required to detect Flash Player PlugIn version information
  316.                     function JSGetSwfVer(i){
  317.                         // NS/Opera version >= 3 check for Flash plugin in plugin array
  318.                         if (navigator.plugins != null && navigator.plugins.length > 0) {
  319.                             if (navigator.plugins[\"Shockwave Flash 2.0\"] || navigator.plugins[\"Shockwave Flash\"]) {
  320.                                 var swVer2 = navigator.plugins[\"Shockwave Flash 2.0\"] ? \" 2.0\" : \"\";
  321.                                   var flashDescription = navigator.plugins[\"Shockwave Flash\" + swVer2].description;
  322.                                 descArray = flashDescription.split(\" \");
  323.                                 tempArrayMajor = descArray[2].split(\".\");
  324.                                 versionMajor = tempArrayMajor[0];
  325.                                 versionMinor = tempArrayMajor[1];
  326.                                 if ( descArray[3] != \"\" ) {
  327.                                     tempArrayMinor = descArray[3].split(\"r\");
  328.                                 } else {
  329.                                     tempArrayMinor = descArray[4].split(\"r\");
  330.                                 }
  331.                                   versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
  332.                                 flashVer = versionMajor + \".\" + versionMinor + \".\" + versionRevision;
  333.                               } else {
  334.                                 flashVer = -1;
  335.                             }
  336.                         }
  337.                         // MSN/WebTV 2.6 supports Flash 4
  338.                         else if (navigator.userAgent.toLowerCase().indexOf(\"webtv/2.6\") != -1) flashVer = 4;
  339.                         // WebTV 2.5 supports Flash 3
  340.                         else if (navigator.userAgent.toLowerCase().indexOf(\"webtv/2.5\") != -1) flashVer = 3;
  341.                         // older WebTV supports Flash 2
  342.                         else if (navigator.userAgent.toLowerCase().indexOf(\"webtv\") != -1) flashVer = 2;
  343.                         // Can't detect in all other cases
  344.                         else {
  345.  
  346.                             flashVer = -1;
  347.                         }
  348.                         return flashVer;
  349.                     }
  350.                     // When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
  351.                     function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
  352.                     {
  353.                          reqVer = parseFloat(reqMajorVer + \".\" + reqRevision);
  354.                            // loop backwards through the versions until we find the newest version
  355.                         for (i=25;i>0;i--) {
  356.                             if (isIE && isWin && !isOpera) {
  357.                                 versionStr = VBGetSwfVer(i);
  358.                             } else {
  359.                                 versionStr = JSGetSwfVer(i);
  360.                             }
  361.                             if (versionStr == -1 ) {
  362.                                 return false;
  363.                             } else if (versionStr != 0) {
  364.                                 if(isIE && isWin && !isOpera) {
  365.                                     tempArray         = versionStr.split(\" \");
  366.                                     tempString        = tempArray[1];
  367.                                     versionArray      = tempString .split(\",\");
  368.                                 } else {
  369.                                     versionArray      = versionStr.split(\".\");
  370.                                 }
  371.                                 versionMajor      = versionArray[0];
  372.                                 versionMinor      = versionArray[1];
  373.                                 versionRevision   = versionArray[2];
  374.  
  375.                                 versionString     = versionMajor + \".\" + versionRevision;   // 7.0r24 == 7.24
  376.                                 versionNum        = parseFloat(versionString);
  377.                                 // is the major.revision >= requested major.revision AND the minor version >= requested minor
  378.                                 if ( (versionMajor > reqMajorVer) && (versionNum >= reqVer) ) {
  379.                                     return true;
  380.                                 } else {
  381.                                     return ((versionNum >= reqVer && versionMinor >= reqMinorVer) ? true : false );
  382.                                 }
  383.                             }
  384.                         }
  385.                     }
  386.                     // -->
  387.                     </script>";
  388.     Display::display_header($nameTools,"Exercise");
  389. }
  390. else
  391. {
  392.     if(empty($charset))
  393.     {
  394.         $charset 'ISO-8859-15';
  395.     }
  396.     header('Content-Type: text/html; charset='$charset);
  397.  
  398.     @$document_language Database::get_language_isocode($language_interface);
  399.     if(empty($document_language))
  400.     {
  401.       //if there was no valid iso-code, use the english one
  402.       $document_language 'en';
  403.     }
  404.  
  405.     /*
  406.      * HTML HEADER
  407.      */
  408.  
  409. ?>
  410. <!DOCTYPE html
  411.      PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  412.      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  413. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $document_language?>" lang="<?php echo $document_language?>">
  414. <head>
  415. <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $charset?>" />
  416. </head>
  417.  
  418. <body>
  419. <link rel="stylesheet" type="text/css" href="<?php echo api_get_path(WEB_CODE_PATH).'css/'.api_get_setting('stylesheets').'/frames.css'?>" />
  420.  
  421. <?php
  422. }
  423.  
  424.  $exerciseTitle=api_parse_tex($exerciseTitle);
  425.  
  426. echo "<h3>".$exerciseTitle."</h3>";
  427.  
  428. if(!empty($error))
  429. {
  430.     Display::display_error_message($error,false);
  431. }
  432. else
  433. {
  434.  
  435.     if(!empty($exerciseSound))
  436.     {
  437.         echo "<a href=\"../document/download.php?doc_url=%2Faudio%2F".$exerciseSound."\" target=\"_blank\">",
  438.             "<img src=\"../img/sound.gif\" border=\"0\" align=\"absmiddle\" alt=",get_lang('Sound')."\" /></a>";
  439.     }
  440.     
  441.     
  442.     // Get number of hotspot questions for javascript validation
  443.     $number_of_hotspot_questions 0;
  444.     $onsubmit '';
  445.     $i=0;
  446.     
  447.     foreach($questionList as $questionId)
  448.     {
  449.         $i++;
  450.         $objQuestionTmp Question :: read($questionId);
  451.     
  452.         // for sequential exercises
  453.         if($exerciseType == 2)
  454.         {
  455.             // if it is not the right question, goes to the next loop iteration
  456.             if($questionNum != $i)
  457.             {
  458.                 continue;
  459.             }
  460.             else
  461.             {
  462.                 if ($objQuestionTmp->selectType(== HOT_SPOT)
  463.                 {
  464.                     $number_of_hotspot_questions++;
  465.                 }
  466.                 break;
  467.             }
  468.         }
  469.         else
  470.         {
  471.             if ($objQuestionTmp->selectType(== HOT_SPOT)
  472.             {
  473.                 $number_of_hotspot_questions++;
  474.             }
  475.         }
  476.     }
  477.     
  478.     if($number_of_hotspot_questions 0)
  479.     {
  480.         $onsubmit "onsubmit=\"return validateFlashVar('".$number_of_hotspot_questions."', '".get_lang('HotspotValidateError1')."', '".get_lang('HotspotValidateError2')."');\"";
  481.     }
  482.     $s="<p>$exerciseDescription</p>";
  483.     
  484.     if($origin == 'learnpath' && $exerciseType==2){
  485.         $s2 "&exerciseId=".$exerciseId;
  486.     }
  487.     $s.=" <form method='post' action='".api_get_self()."?autocomplete=off".$s2."' name='frm_exercise' $onsubmit>
  488.      <input type='hidden' name='formSent' value='1' />
  489.      <input type='hidden' name='exerciseType' value='".$exerciseType."' />
  490.      <input type='hidden' name='questionNum' value='".$questionNum."' />
  491.      <input type='hidden' name='nbrQuestions' value='".$nbrQuestions."' />
  492.      <input type='hidden' name='origin' value='".$origin."' />
  493.      <input type='hidden' name='learnpath_id' value='".$learnpath_id."' />
  494.      <input type='hidden' name='learnpath_item_id' value='".$learnpath_item_id."' />
  495.     <table width='100%' border='0' cellpadding='1' cellspacing='0'>
  496.      <tr>
  497.       <td>
  498.       <table width='100%' cellpadding='3' cellspacing='0' border='0'>";
  499.     echo $s;
  500.     
  501.     $i=0;
  502.     
  503.     foreach($questionList as $questionId)
  504.     {
  505.         $i++;
  506.     
  507.         // for sequential exercises
  508.         if($exerciseType == 2)
  509.         {
  510.             // if it is not the right question, goes to the next loop iteration
  511.             if($questionNum != $i)
  512.             {
  513.                 continue;
  514.             }
  515.             else
  516.             {
  517.                 // if the user has already answered this question
  518.                 if(isset($exerciseResult[$questionId]))
  519.                 {
  520.                     // construction of the Question object
  521.                     $objQuestionTmp Question::read($questionId);
  522.     
  523.                     $questionName=$objQuestionTmp->selectTitle();
  524.     
  525.                     // destruction of the Question object
  526.                     unset($objQuestionTmp);
  527.     
  528.                     echo '<tr><td>'.get_lang('AlreadyAnswered').' &quot;'.$questionName.'&quot;</td></tr>';
  529.     
  530.                     break;
  531.                 }
  532.             }
  533.         }
  534.     
  535.         $s="<tr>
  536.          <td width='3%' bgcolor='#e6e6e6'><img src=\"".api_get_path(WEB_IMG_PATH)."test.gif\" align=\"absmiddle\"></td>
  537.          <td valign='middle' bgcolor='#e6e6e6'>
  538.             ".get_lang('Question')." ";
  539.         $s.=$i.' : ';
  540.         if($exerciseType == 2$s.=' / '.$nbrQuestions;
  541.     
  542.         echo $s;
  543.     
  544.         // shows the question and its answers
  545.         showQuestion($questionIdfalse$origin);
  546.     
  547.         // for sequential exercises
  548.         if($exerciseType == 2)
  549.         {
  550.             // quits the loop
  551.             break;
  552.         }
  553.     }    // end foreach()
  554.     
  555.     $s="</table>
  556.       </td>
  557.      </tr>
  558.      <tr>
  559.       <td>
  560.          <!-- <input type='submit' name='buttonCancel' value=".get_lang('Cancel')." />
  561.        &nbsp;&nbsp; //-->
  562.          <input type='submit' name='submit' value='";
  563.     
  564.       if ($exerciseType == || $nbrQuestions == $questionNum
  565.       {
  566.         $s.=get_lang('ValidateAnswer')
  567.       }
  568.       else
  569.       {
  570.         $s.=get_lang('Next').' &gt;';
  571.       }
  572.       //$s.='\'&gt;';
  573.       $s.= '\' />';
  574.       $s.="</td></tr></form></table>";
  575.     
  576.     $b=2;
  577.     echo $s;
  578. }
  579.  
  580. if ($origin != 'learnpath'//so we are not in learnpath tool
  581. ?>

Documentation generated on Thu, 12 Jun 2008 13:24:48 -0500 by phpDocumentor 1.4.1