hotpot_showtimes)) {
set_config("hotpot_showtimes", 0);
}
if (!isset($CFG->hotpot_excelencodings)) {
set_config("hotpot_excelencodings", "");
}
//////////////////////////////////
/// CONSTANTS and GLOBAL VARIABLES
$CFG->hotpotroot = "$CFG->dirroot/mod/hotpot";
$CFG->hotpottemplate = "$CFG->hotpotroot/template";
if (!empty($_SERVER['HTTP_USER_AGENT'])) {
$CFG->hotpotismobile = preg_match('/Alcatel|ATTWS|DoCoMo|Doris|Hutc3G|J-PHONE|Java|KDDI|KGT|LGE|MOT|Nokia|portalmmm|ReqwirelessWeb|SAGEM|SHARP|SIE-|SonyEricsson|Teleport|UP\.Browser|UPG1|Wapagsim/', $_SERVER['HTTP_USER_AGENT']);
} else {
$CFG->hotpotismobile = false;
}
define("HOTPOT_JS", "$CFG->wwwroot/mod/hotpot/hotpot-full.js");
define("HOTPOT_NO", "0");
define("HOTPOT_YES", "1");
define ("HOTPOT_TEXTSOURCE_QUIZ", "0");
define ("HOTPOT_TEXTSOURCE_FILENAME", "1");
define ("HOTPOT_TEXTSOURCE_FILEPATH", "2");
define ("HOTPOT_TEXTSOURCE_SPECIFIC", "3");
define("HOTPOT_LOCATION_COURSEFILES", "0");
define("HOTPOT_LOCATION_SITEFILES", "1");
$HOTPOT_LOCATION = array (
HOTPOT_LOCATION_COURSEFILES => get_string("coursefiles"),
HOTPOT_LOCATION_SITEFILES => get_string("sitefiles"),
);
define("HOTPOT_OUTPUTFORMAT_BEST", "1");
define("HOTPOT_OUTPUTFORMAT_V3", "10");
define("HOTPOT_OUTPUTFORMAT_V4", "11");
define("HOTPOT_OUTPUTFORMAT_V5", "12");
define("HOTPOT_OUTPUTFORMAT_V5_PLUS", "13");
define("HOTPOT_OUTPUTFORMAT_V6", "14");
define("HOTPOT_OUTPUTFORMAT_V6_PLUS", "15");
define("HOTPOT_OUTPUTFORMAT_FLASH", "20");
define("HOTPOT_OUTPUTFORMAT_MOBILE", "30");
$HOTPOT_OUTPUTFORMAT = array (
HOTPOT_OUTPUTFORMAT_BEST => get_string("outputformat_best", "hotpot"),
HOTPOT_OUTPUTFORMAT_V6_PLUS => get_string("outputformat_v6_plus", "hotpot"),
HOTPOT_OUTPUTFORMAT_V6 => get_string("outputformat_v6", "hotpot"),
HOTPOT_OUTPUTFORMAT_V5_PLUS => get_string("outputformat_v5_plus", "hotpot"),
HOTPOT_OUTPUTFORMAT_V5 => get_string("outputformat_v5", "hotpot"),
HOTPOT_OUTPUTFORMAT_V4 => get_string("outputformat_v4", "hotpot"),
HOTPOT_OUTPUTFORMAT_V3 => get_string("outputformat_v3", "hotpot"),
HOTPOT_OUTPUTFORMAT_FLASH => get_string("outputformat_flash", "hotpot"),
HOTPOT_OUTPUTFORMAT_MOBILE => get_string("outputformat_mobile", "hotpot"),
);
$HOTPOT_OUTPUTFORMAT_DIR = array (
HOTPOT_OUTPUTFORMAT_V6_PLUS => 'v6',
HOTPOT_OUTPUTFORMAT_V6 => 'v6',
HOTPOT_OUTPUTFORMAT_V5_PLUS => 'v5',
HOTPOT_OUTPUTFORMAT_V5 => 'v5',
HOTPOT_OUTPUTFORMAT_V4 => 'v4',
HOTPOT_OUTPUTFORMAT_V3 => 'v3',
HOTPOT_OUTPUTFORMAT_FLASH => 'flash',
HOTPOT_OUTPUTFORMAT_MOBILE => 'mobile',
);
foreach ($HOTPOT_OUTPUTFORMAT_DIR as $format=>$dir) {
if (is_file("$CFG->hotpottemplate/$dir.php") && is_dir("$CFG->hotpottemplate/$dir")) {
// do nothing ($format is available)
} else {
// $format is not available, so remove it
unset($HOTPOT_OUTPUTFORMAT[$format]);
unset($HOTPOT_OUTPUTFORMAT_DIR[$format]);
}
}
define("HOTPOT_NAVIGATION_BAR", "1");
define("HOTPOT_NAVIGATION_FRAME", "2");
define("HOTPOT_NAVIGATION_IFRAME", "3");
define("HOTPOT_NAVIGATION_BUTTONS", "4");
define("HOTPOT_NAVIGATION_GIVEUP", "5");
define("HOTPOT_NAVIGATION_NONE", "6");
$HOTPOT_NAVIGATION = array (
HOTPOT_NAVIGATION_BAR => get_string("navigation_bar", "hotpot"),
HOTPOT_NAVIGATION_FRAME => get_string("navigation_frame", "hotpot"),
HOTPOT_NAVIGATION_IFRAME => get_string("navigation_iframe", "hotpot"),
HOTPOT_NAVIGATION_BUTTONS => get_string("navigation_buttons", "hotpot"),
HOTPOT_NAVIGATION_GIVEUP => get_string("navigation_give_up", "hotpot"),
HOTPOT_NAVIGATION_NONE => get_string("navigation_none", "hotpot"),
);
define("HOTPOT_JCB", "1");
define("HOTPOT_JCLOZE", "2");
define("HOTPOT_JCROSS", "3");
define("HOTPOT_JMATCH", "4");
define("HOTPOT_JMIX", "5");
define("HOTPOT_JQUIZ", "6");
define("HOTPOT_TEXTOYS_RHUBARB", "7");
define("HOTPOT_TEXTOYS_SEQUITUR", "8");
$HOTPOT_QUIZTYPE = array(
HOTPOT_JCB => 'JCB',
HOTPOT_JCLOZE => 'JCloze',
HOTPOT_JCROSS => 'JCross',
HOTPOT_JMATCH => 'JMatch',
HOTPOT_JMIX => 'JMix',
HOTPOT_JQUIZ => 'JQuiz',
HOTPOT_TEXTOYS_RHUBARB => 'Rhubarb',
HOTPOT_TEXTOYS_SEQUITUR => 'Sequitur'
);
define("HOTPOT_JQUIZ_MULTICHOICE", "1");
define("HOTPOT_JQUIZ_SHORTANSWER", "2");
define("HOTPOT_JQUIZ_HYBRID", "3");
define("HOTPOT_JQUIZ_MULTISELECT", "4");
define("HOTPOT_GRADEMETHOD_HIGHEST", "1");
define("HOTPOT_GRADEMETHOD_AVERAGE", "2");
define("HOTPOT_GRADEMETHOD_FIRST", "3");
define("HOTPOT_GRADEMETHOD_LAST", "4");
$HOTPOT_GRADEMETHOD = array (
HOTPOT_GRADEMETHOD_HIGHEST => get_string("gradehighest", "quiz"),
HOTPOT_GRADEMETHOD_AVERAGE => get_string("gradeaverage", "quiz"),
HOTPOT_GRADEMETHOD_FIRST => get_string("attemptfirst", "quiz"),
HOTPOT_GRADEMETHOD_LAST => get_string("attemptlast", "quiz"),
);
define("HOTPOT_STATUS_INPROGRESS", "1");
define("HOTPOT_STATUS_TIMEDOUT", "2");
define("HOTPOT_STATUS_ABANDONED", "3");
define("HOTPOT_STATUS_COMPLETED", "4");
$HOTPOT_STATUS = array (
HOTPOT_STATUS_INPROGRESS => get_string("inprogress", "hotpot"),
HOTPOT_STATUS_TIMEDOUT => get_string("timedout", "hotpot"),
HOTPOT_STATUS_ABANDONED => get_string("abandoned", "hotpot"),
HOTPOT_STATUS_COMPLETED => get_string("completed", "hotpot"),
);
define("HOTPOT_FEEDBACK_NONE", "0");
define("HOTPOT_FEEDBACK_WEBPAGE", "1");
define("HOTPOT_FEEDBACK_FORMMAIL", "2");
define("HOTPOT_FEEDBACK_MOODLEFORUM", "3");
define("HOTPOT_FEEDBACK_MOODLEMESSAGING", "4");
$HOTPOT_FEEDBACK = array (
HOTPOT_FEEDBACK_NONE => get_string("feedbacknone", "hotpot"),
HOTPOT_FEEDBACK_WEBPAGE => get_string("feedbackwebpage", "hotpot"),
HOTPOT_FEEDBACK_FORMMAIL => get_string("feedbackformmail", "hotpot"),
HOTPOT_FEEDBACK_MOODLEFORUM => get_string("feedbackmoodleforum", "hotpot"),
HOTPOT_FEEDBACK_MOODLEMESSAGING => get_string("feedbackmoodlemessaging", "hotpot"),
);
if (empty($CFG->messaging)) { // Moodle 1.4 (and less)
unset($HOTPOT_FEEDBACK[HOTPOT_FEEDBACK_MOODLEMESSAGING]);
}
define("HOTPOT_DISPLAYNEXT_QUIZ", "0");
define("HOTPOT_DISPLAYNEXT_COURSE", "1");
define("HOTPOT_DISPLAYNEXT_INDEX", "2");
/**
* If start and end date for the quiz are more than this many seconds apart
* they will be represented by two separate events in the calendar
*/
define("HOTPOT_MAX_EVENT_LENGTH", "432000"); // 5 days maximum
//////////////////////////////////
/// CORE FUNCTIONS
// possible return values:
// false:
// display moderr.html (if exists) OR "Could not update" and return to couse view
// string:
// display as error message and return to course view
// true (or non-zero number):
// continue to $hotpot->redirect (if set) OR hotpot/view.php (to displsay quiz)
// $hotpot is an object containing the values of the form in mod.html
// i.e. all the fields in the 'hotpot' table, plus the following:
// $hotpot->course : an id in the 'course' table
// $hotpot->coursemodule : an id in the 'course_modules' table
// $hotpot->section : an id in the 'course_sections' table
// $hotpot->module : an id in the 'modules' table
// $hotpot->modulename : always 'hotpot'
// $hotpot->instance : an id in the 'hotpot' table
// $hotpot->mode : 'add' or 'update'
// $hotpot->sesskey : unique string required for Moodle's session management
function hotpot_add_instance(&$hotpot) {
if (hotpot_set_form_values($hotpot)) {
if ($result = insert_record('hotpot', $hotpot)) {
$hotpot->id = $result;
hotpot_update_events($hotpot);
hotpot_grade_item_update(stripslashes_recursive($hotpot));
}
} else {
$result= false;
}
return $result;
}
function hotpot_update_instance(&$hotpot) {
if (hotpot_set_form_values($hotpot)) {
$hotpot->id = $hotpot->instance;
if ($result = update_record('hotpot', $hotpot)) {
hotpot_update_events($hotpot);
//hotpot_grade_item_update(stripslashes_recursive($hotpot));
hotpot_update_grades(stripslashes_recursive($hotpot));
}
} else {
$result= false;
}
return $result;
}
function hotpot_update_events($hotpot) {
// remove any previous calendar events for this hotpot
delete_records('event', 'modulename', 'hotpot', 'instance', $hotpot->id);
$event = new stdClass();
$event->description = addslashes($hotpot->summary);
$event->courseid = $hotpot->course;
$event->groupid = 0;
$event->userid = 0;
$event->modulename = 'hotpot';
$event->instance = $hotpot->id;
$event->timestart = $hotpot->timeopen;
if ($cm = get_coursemodule_from_id('hotpot', $hotpot->id)) {
$event->visible = hotpot_is_visible($cm);
} else {
$event->visible = 1;
}
if ($hotpot->timeclose && $hotpot->timeopen) {
// we have both a start and an end date
$event->eventtype = 'open';
$event->timeduration = ($hotpot->timeclose - $hotpot->timeopen);
if ($event->timeduration > HOTPOT_MAX_EVENT_LENGTH) { /// Long durations create two events
$event->name = addslashes($hotpot->name).' ('.get_string('hotpotopens', 'hotpot').')';
$event->timeduration = 0;
add_event($event);
$event->timestart = $hotpot->timeclose;
$event->eventtype = 'close';
$event->name = addslashes($hotpot->name).' ('.get_string('hotpotcloses', 'hotpot').')';
unset($event->id);
add_event($event);
} else { // single event with duration
$event->name = $hotpot->name;
add_event($event);
}
} elseif ($hotpot->timeopen) { // only an open date
$event->name = addslashes($hotpot->name).' ('.get_string('hotpotopens', 'hotpot').')';
$event->eventtype = 'open';
$event->timeduration = 0;
add_event($event);
} elseif ($hotpot->timeclose) { // only a closing date
$event->name = addslashes($hotpot->name).' ('.get_string('hotpotcloses', 'hotpot').')';
$event->timestart = $hotpot->timeclose;
$event->eventtype = 'close';
$event->timeduration = 0;
add_event($event);
}
}
function hotpot_set_form_values(&$hotpot) {
$ok = true;
$hotpot->errors = array(); // these will be reported by moderr.html
if (empty($hotpot->reference)) {
$ok = false;
$hotpot->errors['reference']= get_string('error_nofilename', 'hotpot');
}
if (empty($hotpot->studentfeedbackurl) || $hotpot->studentfeedbackurl=='http://') {
$hotpot->studentfeedbackurl = '';
switch ($hotpot->studentfeedback) {
case HOTPOT_FEEDBACK_WEBPAGE:
$ok = false;
$hotpot->errors['studentfeedbackurl']= get_string('error_nofeedbackurlwebpage', 'hotpot');
break;
case HOTPOT_FEEDBACK_FORMMAIL:
$ok = false;
$hotpot->errors['studentfeedbackurl']= get_string('error_nofeedbackurlformmail', 'hotpot');
break;
}
}
$time = time();
$hotpot->timecreated = $time;
$hotpot->timemodified = $time;
if (empty($hotpot->mode)) {
// moodle 1.9 (from mod_form.lib)
if ($hotpot->add) {
$hotpot->mode = 'add';
} else if ($hotpot->update) {
$hotpot->mode = 'update';
} else {
$hotpot->mode = '';
}
}
if ($hotpot->quizchain==HOTPOT_YES) {
switch ($hotpot->mode) {
case 'add':
$ok = hotpot_add_chain($hotpot);
break;
case 'update':
$ok = hotpot_update_chain($hotpot);
break;
}
} else { // $hotpot->quizchain==HOTPOT_NO
hotpot_set_name_summary_reference($hotpot);
}
if (isset($hotpot->displaynext)) {
switch ($hotpot->displaynext) {
// N.B. redirection only works for Moodle 1.5+
case HOTPOT_DISPLAYNEXT_COURSE:
$hotpot->redirect = true;
$hotpot->redirecturl = "view.php?id=$hotpot->course";
break;
case HOTPOT_DISPLAYNEXT_INDEX:
$hotpot->redirect = true;
$hotpot->redirecturl = "../mod/hotpot/index.php?id=$hotpot->course";
break;
default:
// use Moodle default action (i.e. go on to display the hotpot quiz)
}
} else {
$hotpot->displaynext = HOTPOT_DISPLAYNEXT_QUIZ;
}
// if ($ok && $hotpot->setdefaults) {
if ($ok) {
set_user_preference('hotpot_timeopen', $hotpot->timeopen);
set_user_preference('hotpot_timeclose', $hotpot->timeclose);
set_user_preference('hotpot_navigation', $hotpot->navigation);
set_user_preference('hotpot_outputformat', $hotpot->outputformat);
set_user_preference('hotpot_studentfeedback', $hotpot->studentfeedback);
set_user_preference('hotpot_studentfeedbackurl', $hotpot->studentfeedbackurl);
set_user_preference('hotpot_forceplugins', $hotpot->forceplugins);
set_user_preference('hotpot_shownextquiz', $hotpot->shownextquiz);
set_user_preference('hotpot_review', $hotpot->review);
set_user_preference('hotpot_grade', $hotpot->grade);
set_user_preference('hotpot_grademethod', $hotpot->grademethod);
set_user_preference('hotpot_attempts', $hotpot->attempts);
set_user_preference('hotpot_subnet', $hotpot->subnet);
set_user_preference('hotpot_displaynext', $hotpot->displaynext);
if ($hotpot->mode=='add') {
set_user_preference('hotpot_quizchain', $hotpot->quizchain);
set_user_preference('hotpot_namesource', $hotpot->namesource);
set_user_preference('hotpot_summarysource', $hotpot->summarysource);
}
}
return $ok;
}
function hotpot_get_chain(&$cm) {
// get details of course_modules in this section
$course_module_ids = get_field('course_sections', 'sequence', 'id', $cm->section);
if (empty($course_module_ids)) {
$hotpot_modules = array();
} else {
$hotpot_modules = get_records_select('course_modules', "id IN ($course_module_ids) AND module=$cm->module");
if (empty($hotpot_modules)) {
$hotpot_modules = array();
}
}
// get ids of hotpot modules in this section
$ids = array();
foreach ($hotpot_modules as $hotpot_module) {
$ids[] = $hotpot_module->instance;
}
// get details of hotpots in this section
if (empty($ids)) {
$hotpots = array();
} else {
$hotpots = get_records_list('hotpot', 'id', implode(',', $ids));
}
$found = false;
$chain = array();
// loop through course_modules in this section
$ids = explode(',', $course_module_ids);
foreach ($ids as $id) {
// check this course_module is a hotpot activity
if (isset($hotpot_modules[$id])) {
// store details of this course module and hotpot activity
$hotpot_id = $hotpot_modules[$id]->instance;
$chain[$id] = &$hotpot_modules[$id];
$chain[$id]->hotpot = &$hotpots[$hotpot_id];
// set $found, if this is the course module we're looking for
if (isset($cm->coursemodule)) {
if ($id==$cm->coursemodule) {
$found = true;
}
} else {
if ($id==$cm->id) {
$found = true;
}
}
// is this the end of a chain
if (empty($hotpots[$hotpot_id]->shownextquiz)) {
if ($found) {
break; // out of loop
} else {
// restart chain (target cm has not been found yet)
$chain = array();
}
}
}
} // end foreach $ids
return $found ? $chain : false;
}
function hotpot_is_visible(&$cm) {
global $CFG, $COURSE;
// check grouping
$modulecontext = get_context_instance(CONTEXT_MODULE, $cm->id);
if (empty($CFG->enablegroupings) || empty($cm->groupmembersonly) || has_capability('moodle/site:accessallgroups', $modulecontext)) {
// groupings not applicable
} else if (!isguestuser() && groups_has_membership($cm)) {
// user is in one of the groups in the allowed grouping
} else {
// user is not in the required grouping and does not have sufficiently privileges to view this hotpot activity
return false;
}
// check if user can view hidden activities
if (isset($COURSE->context)) {
$coursecontext = &$COURSE->context;
} else {
$coursecontext = get_context_instance(CONTEXT_COURSE, $cm->course);
}
if (has_capability('moodle/course:viewhiddenactivities', $coursecontext)) {
return true; // user can view hidden activities
}
if (!isset($cm->sectionvisible)) {
if (! $section = get_record('course_sections', 'id', $cm->section)) {
error('Course module record contains invalid section');
}
$cm->sectionvisible = $section->visible;
}
if (empty($cm->sectionvisible)) {
$visible = HOTPOT_NO;
} else {
$visible = HOTPOT_YES;
if (empty($cm->visible)) {
if ($chain = hotpot_get_chain($cm)) {
$startofchain = array_shift($chain);
$visible = $startofchain->visible;
}
}
}
return $visible;
}
function hotpot_add_chain(&$hotpot) {
/// add a chain of hotpot actiivities
global $CFG, $course;
$ok = true;
$hotpot->names = array();
$hotpot->summaries = array();
$hotpot->references = array();
$xml_quiz = new hotpot_xml_quiz($hotpot, false, false, false, false, false);
if (isset($xml_quiz->error)) {
$hotpot->errors['reference'] = $xml_quiz->error;
$ok = false;
} else if (is_dir($xml_quiz->filepath)) {
// get list of hotpot files in this folder
if ($dh = @opendir($xml_quiz->filepath)) {
while (false !== ($file = @readdir($dh))) {
if (preg_match('/\.(jbc|jcl|jcw|jmt|jmx|jqz|htm|html)$/', $file)) {
$hotpot->references[] = "$xml_quiz->reference/$file";
}
}
closedir($dh);
// get titles
foreach ($hotpot->references as $i=>$reference) {
$filepath = $xml_quiz->fileroot.'/'.$reference;
hotpot_get_titles_and_next_ex($hotpot, $filepath);
$hotpot->names[$i] = $hotpot->exercisetitle;
$hotpot->summaries[$i] = $hotpot->exercisesubtitle;
}
} else {
$ok = false;
$hotpot->errors['reference'] = get_string('error_couldnotopenfolder', 'hotpot', $hotpot->reference);
}
} else if (is_file($xml_quiz->filepath)) {
$filerootlength = strlen($xml_quiz->fileroot) + 1;
while ($xml_quiz->filepath) {
hotpot_get_titles_and_next_ex($hotpot, $xml_quiz->filepath, true);
$hotpot->names[] = $hotpot->exercisetitle;
$hotpot->summaries[] = $hotpot->exercisesubtitle;
$hotpot->references[] = substr($xml_quiz->filepath, $filerootlength);
if ($hotpot->nextexercise) {
$filepath = $xml_quiz->fileroot.'/'.$xml_quiz->filesubdir.$hotpot->nextexercise;
// check file is not already in chain
$reference = substr($filepath, $filerootlength);
if (in_array($reference, $hotpot->references)) {
$filepath = '';
}
} else {
$filepath = '';
}
if ($filepath && file_exists($filepath) && is_file($filepath) && is_readable($filepath)) {
$xml_quiz->filepath = $filepath;
} else {
$xml_quiz->filepath = false; // finish while loop
}
} // end while
} else {
$ok = false;
$hotpot->errors['reference'] = get_string('error_notfileorfolder', 'hotpot', $hotpot->reference);
}
if (empty($hotpot->references) && empty($hotpot->errors['reference'])) {
$ok = false;
$hotpot->errors['reference'] = get_string('error_noquizzesfound', 'hotpot', $hotpot->reference);
}
if ($ok) {
$hotpot->visible = HOTPOT_YES;
if (trim($hotpot->name)=='') {
$hotpot->name = get_string("modulename", $hotpot->modulename);
}
$hotpot->specificname = $hotpot->name;
$hotpot->specificsummary = $hotpot->summary;
// add all except last activity in chain
$i_max = count($hotpot->references)-1;
for ($i=0; $i<$i_max; $i++) {
hotpot_set_name_summary_reference($hotpot, $i);
$hotpot->reference = addslashes($hotpot->reference);
if (!$hotpot->instance = insert_record("hotpot", $hotpot)) {
error("Could not add a new instance of $hotpot->modulename", "view.php?id=$hotpot->course");
}
// store (hotpot table) id of start of chain
if ($i==0) {
$hotpot->startofchain = $hotpot->instance;
}
if (isset($course->groupmode)) {
$hotpot->groupmode = $course->groupmode;
}
if (! $hotpot->coursemodule = add_course_module($hotpot)) {
error("Could not add a new course module");
}
if (! $sectionid = add_mod_to_section($hotpot) ) {
error("Could not add the new course module to that section");
}
if (! set_field("course_modules", "section", $sectionid, "id", $hotpot->coursemodule)) {
error("Could not update the course module with the correct section");
}
add_to_log($hotpot->course, "course", "add mod",
"../mod/$hotpot->modulename/view.php?id=$hotpot->coursemodule",
"$hotpot->modulename $hotpot->instance"
);
add_to_log($hotpot->course, $hotpot->modulename, "add",
"view.php?id=$hotpot->coursemodule",
"$hotpot->instance", $hotpot->coursemodule
);
// hide tail of chain
if ($hotpot->shownextquiz==HOTPOT_YES) {
$hotpot->visible = HOTPOT_NO;
}
} // end for ($hotpot->references)
// settings for final activity in chain
hotpot_set_name_summary_reference($hotpot, $i);
$hotpot->reference = addslashes($hotpot->references[$i]);
$hotpot->shownextquiz = HOTPOT_NO;
if (isset($hotpot->startofchain)) {
// redirection only works for Moodle 1.5+
$hotpot->redirect = true;
$hotpot->redirecturl = "$CFG->wwwroot/mod/hotpot/view.php?hp=$hotpot->startofchain";
}
} // end if $ok
return $ok;
}
function hotpot_set_name_summary_reference(&$hotpot, $chain_index=NULL) {
$xml_quiz = NULL;
$textfields = array('name', 'summary');
foreach ($textfields as $textfield) {
$textsource = $textfield.'source';
// are we adding a chain?
if (isset($chain_index)) {
switch ($hotpot->$textsource) {
case HOTPOT_TEXTSOURCE_QUIZ:
if ($textfield=='name') {
$hotpot->exercisetitle = $hotpot->names[$chain_index];
} else if ($textfield=='summary') {
$hotpot->exercisesubtitle = $hotpot->summaries[$chain_index];
}
break;
case HOTPOT_TEXTSOURCE_SPECIFIC:
$specifictext = 'specific'.$textfield;
if (empty($hotpot->$specifictext) && trim($hotpot->$specifictext)=='') {
$hotpot->$textfield = '';
} else {
$hotpot->$textfield = $hotpot->$specifictext.' ('.($chain_index+1).')';
}
break;
}
$hotpot->reference = $hotpot->references[$chain_index];
}
if ($hotpot->$textsource==HOTPOT_TEXTSOURCE_QUIZ) {
if (empty($xml_quiz) && !isset($chain_index)) {
$xml_quiz = new hotpot_xml_quiz($hotpot, false, false, false, false, false);
hotpot_get_titles_and_next_ex($hotpot, $xml_quiz->filepath);
}
if ($textfield=='name') {
$hotpot->$textfield = addslashes($hotpot->exercisetitle);
} else if ($textfield=='summary') {
$hotpot->$textfield = addslashes($hotpot->exercisesubtitle);
}
}
switch ($hotpot->$textsource) {
case HOTPOT_TEXTSOURCE_FILENAME:
$hotpot->$textfield = basename($hotpot->reference);
break;
case HOTPOT_TEXTSOURCE_FILEPATH:
$hotpot->$textfield = '';
// continue to next lines
default:
if (empty($hotpot->$textfield)) {
$hotpot->$textfield = str_replace('/', ' ', $hotpot->reference);
}
} // end switch
} // end foreach
}
function hotpot_get_titles_and_next_ex(&$hotpot, $filepath, $get_next=false) {
$hotpot->exercisetitle = '';
$hotpot->exercisesubtitle = '';
$hotpot->nextexercise = '';
// read the quiz file source
if ($source = file_get_contents($filepath)) {
$next = '';
$title = '';
$subtitle = '';
if (preg_match('|\.html?$|', $filepath)) {
// html file
if (preg_match('|
]*class="ExerciseTitle"[^>]*>(.*?)
|is', $source, $matches)) {
$title = trim(strip_tags($matches[1]));
}
if (empty($title)) {
if (preg_match('|]*>(.*?)|is', $source, $matches)) {
$title = trim(strip_tags($matches[1]));
}
}
if (preg_match('|]*class="ExerciseSubtitle"[^>]*>(.*?)
|is', $source, $matches)) {
$subtitle = trim(strip_tags($matches[1]));
}
if ($get_next) {
if (preg_match('|]*class="NavButtonBar"[^>]*>(.*?)
|is', $source, $matches)) {
$navbuttonbar = $matches[1];
if (preg_match_all('|