diff --git a/documentation/installation_guide.html b/documentation/installation_guide.html
index 1ee945240a..14119569f8 100755
--- a/documentation/installation_guide.html
+++ b/documentation/installation_guide.html
@@ -687,6 +687,12 @@ If you have issues with files taking a long time to download, make sure you reco
break;
}
+ location / {
+ rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
+ rewrite ^/courses/([^/]+)/index.php$ main/course_home/course_home.php?cDir=$1 last;
+ try_files $uri @rewrite;
+ }
+
location ~ \.php$ {
client_max_body_size 20M;
try_files $uri /index.php$is_args$args;
diff --git a/documentation/installation_guide_es_ES.html b/documentation/installation_guide_es_ES.html
index a724258031..da366df8fd 100755
--- a/documentation/installation_guide_es_ES.html
+++ b/documentation/installation_guide_es_ES.html
@@ -688,6 +688,12 @@ por ejemplo. El efecto debería ser inmediato.
break;
}
+ location / {
+ rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
+ rewrite ^/courses/([^/]+)/index.php$ main/course_home/course_home.php?cDir=$1 last;
+ try_files $uri @rewrite;
+ }
+
location ~ \.php$ {
client_max_body_size 20M;
try_files $uri /index.php$is_args$args;
diff --git a/documentation/installation_guide_fr_FR.html b/documentation/installation_guide_fr_FR.html
index eebfbad7ad..733673b43e 100644
--- a/documentation/installation_guide_fr_FR.html
+++ b/documentation/installation_guide_fr_FR.html
@@ -754,6 +754,12 @@ Ce sont uniquement les redirections à placer dans un bloc server{}, comme les a
break;
}
+ location / {
+ rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
+ rewrite ^/courses/([^/]+)/index.php$ main/course_home/course_home.php?cDir=$1 last;
+ try_files $uri @rewrite;
+ }
+
location ~ \.php$ {
client_max_body_size 20M;
try_files $uri /index.php$is_args$args;
diff --git a/main/exercice/admin.php b/main/exercice/admin.php
index a2f74259ac..df6672e7bb 100755
--- a/main/exercice/admin.php
+++ b/main/exercice/admin.php
@@ -344,6 +344,8 @@ $template = new Template();
$htmlHeadXtra[] = $template->fetch('default/exercise/submit.js.tpl');
$htmlHeadXtra[] = api_get_js('d3/jquery.xcolor.js');
+$htmlHeadXtra[] = '';
+
$htmlHeadXtra[] = "
+
+
+ ";
// }
}
}
@@ -4143,7 +4142,7 @@ class Exercise
Event::saveQuestionAttempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
if (isset($exerciseResultCoordinates[$questionId]) && !empty($exerciseResultCoordinates[$questionId])) {
foreach ($exerciseResultCoordinates[$questionId] as $idx => $val) {
- Event::saveExerciseAttemptHotspot($exeId, $quesId, $idx, $choice[$idx], $val, $this->id);
+ Event::saveExerciseAttemptHotspot($exeId, $quesId, $idx, $choice[$idx], $val, false, $this->id);
}
}
} else {
diff --git a/main/exercice/exercise_result.php b/main/exercice/exercise_result.php
index 40e9d333d8..b18ab12d02 100755
--- a/main/exercice/exercise_result.php
+++ b/main/exercice/exercise_result.php
@@ -75,6 +75,8 @@ $interbreadcrumb[] = array(
"name" => get_lang('Exercises'),
);
+$htmlHeadXtra[] = '';
+
if ($origin != 'learnpath') {
// So we are not in learnpath tool
Display::display_header($nameTools, get_lang('Exercise'));
diff --git a/main/exercice/exercise_show.php b/main/exercice/exercise_show.php
index 60ac94d3d2..ff259cb812 100755
--- a/main/exercice/exercise_show.php
+++ b/main/exercice/exercise_show.php
@@ -120,6 +120,8 @@ $interbreadcrumb[]= array("url" => "#","name" => get_lang('Result'));
$this_section = SECTION_COURSES;
+$htmlHeadXtra[] = '';
+
if ($origin != 'learnpath') {
Display::display_header('');
} else {
@@ -367,14 +369,25 @@ foreach ($questionList as $questionId) {
if ($show_results) {
echo '';
- echo '
- | '.
- '
- |
-
-
';
+
+ echo "
+
+ |
+
+
+ |
+
+
+
+ ";
}
} else if($answerType == HOT_SPOT_DELINEATION) {
@@ -497,14 +510,24 @@ foreach ($questionList as $questionId) {
$questionScore= Database::result($resfree,0,"marks");
$totalScore+=$questionScore;
echo '';
- echo '
- |
-
- |
-
- ';
+
+ echo "
+
+ |
+
+
+ |
+
+
+ ";
}
}
diff --git a/main/exercice/exercise_submit.php b/main/exercice/exercise_submit.php
index 7da3dc9e23..316b6f18d3 100755
--- a/main/exercice/exercise_submit.php
+++ b/main/exercice/exercise_submit.php
@@ -60,6 +60,7 @@ $htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH).'javascript/epicloc
$htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.dateformat.min.js');
$htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.epiclock.min.js');
$htmlHeadXtra[] = api_get_js('epiclock/renderers/minute/epiclock.minute.js');
+$htmlHeadXtra[] = '';
$template = new Template();
diff --git a/main/exercice/hotspot_actionscript.as.php b/main/exercice/hotspot_actionscript.as.php
index 30751fdd99..5dcc9bd582 100755
--- a/main/exercice/hotspot_actionscript.as.php
+++ b/main/exercice/hotspot_actionscript.as.php
@@ -24,11 +24,6 @@ $pictureSize = getimagesize($picturePath.'/'.$objQuestion->selectPicture());
$pictureWidth = $pictureSize[0];
$pictureHeight = $pictureSize[1];
-$courseLang = $_course['language'];
-$courseCode = $_course['sysCode'];
-$coursePath = $_course['path'];
-
-
$course_id = api_get_course_int_id();
// Query db for answers
@@ -40,39 +35,63 @@ if ($answer_type==HOT_SPOT_DELINEATION) {
WHERE c_id = $course_id AND question_id = ".intval($questionId)." ORDER BY id";
}
$result = Database::query($sql);
-// Init
-$output = "hotspot_lang=$courseLang&hotspot_image=$pictureName&hotspot_image_width=$pictureWidth&hotspot_image_height=$pictureHeight&courseCode=$coursePath";
-$i = 0;
+
+$data = [];
+$data['lang'] = [
+ 'Square' => get_lang('Square'),
+ 'Circle' => get_lang('Circle'),
+ 'Poly' => get_lang('Poly'),
+ 'HotspotStatus1' => get_lang('HotspotStatus1'),
+ 'HotspotStatus2Polygon' => get_lang('HotspotStatus2Polygon'),
+ 'HotspotStatus2Other' => get_lang('HotspotStatus2Other'),
+ 'HotspotStatus3' => get_lang('HotspotStatus3'),
+ 'HotspotShowUserPoints' => get_lang('HotspotShowUserPoints'),
+ 'ShowHotspots' => get_lang('ShowHotspots'),
+ 'Triesleft' => get_lang('Triesleft'),
+ 'HotspotExerciseFinished' => get_lang('HotspotExerciseFinished'),
+ 'NextAnswer' => get_lang('NextAnswer'),
+ 'Delineation' => get_lang('Delineation'),
+ 'CloseDelineation' => get_lang('CloseDelineation'),
+ 'Oar' => get_lang('oar')
+];
+$data['image'] = $objQuestion->selectPicturePath();
+$data['image_width'] = $pictureWidth;
+$data['image_height'] = $pictureHeight;
+$data['courseCode'] = $_course['path'];
+$data['hotspots'] = [];
+
$nmbrTries = 0;
while ($hotspot = Database::fetch_assoc($result))
{
- $output .= "&hotspot_".$hotspot['id']."=true";
- $output .= "&hotspot_".$hotspot['id']."_answer=".str_replace('&','{amp}',$hotspot['answer']);
+ $hotSpot = [];
+ $hotSpot['id'] = $hotspot['id'];
+ $hotSpot['answer'] = $hotspot['answer'];
+
// Square or rectancle
if ($hotspot['hotspot_type'] == 'square' )
{
- $output .= "&hotspot_".$hotspot['id']."_type=square";
+ $hotSpot['type'] = 'square';
}
// Circle or ovale
if ($hotspot['hotspot_type'] == 'circle')
{
- $output .= "&hotspot_".$hotspot['id']."_type=circle";
+ $hotSpot['type'] = 'circle';
}
// Polygon
if ($hotspot['hotspot_type'] == 'poly')
{
- $output .= "&hotspot_".$hotspot['id']."_type=poly";
+ $hotSpot['type'] = 'poly';
}
// Delineation
if ($hotspot['hotspot_type'] == 'delineation')
{
- $output .= "&hotspot_".$hotspot['id']."_type=delineation";
+ $hotSpot['type'] = 'delineation';
}
// No error
if ($hotspot['hotspot_type'] == 'noerror')
{
- $output .= "&hotspot_".$hotspot['id']."_type=noerror";
+ $hotSpot['type'] = 'noerror';
}
// This is a good answer, count + 1 for nmbr of clicks
@@ -80,14 +99,15 @@ while ($hotspot = Database::fetch_assoc($result))
{
$nmbrTries++;
}
- $output .= "&hotspot_".$hotspot['id']."_coord=".$hotspot['hotspot_coordinates']."";
- $i++;
-}
-// Generate empty
-$i++;
-for ($i; $i <= 12; $i++) {
- $output .= "&hotspot_".$i."=false";
+ $hotSpot['coord'] = $hotspot['hotspot_coordinates'];
+
+ $data['hotspots'][] = $hotSpot;
}
-// Output
-echo $output."&nmbrTries=".$nmbrTries."&done=done";
+
+$data['nmbrTries'] = $nmbrTries;
+$data['done'] = 'done';
+
+header('Content-Type: application/json');
+
+echo json_encode($data);
diff --git a/main/exercice/hotspot_actionscript_admin.as.php b/main/exercice/hotspot_actionscript_admin.as.php
index e712f45137..9e70c88854 100755
--- a/main/exercice/hotspot_actionscript_admin.as.php
+++ b/main/exercice/hotspot_actionscript_admin.as.php
@@ -21,12 +21,15 @@ $pictureSize = getimagesize($picturePath.'/'.$objQuestion->selectPicture());
$pictureWidth = $pictureSize[0];
$pictureHeight = $pictureSize[1];
-$courseLang = $_course['language'];
-$courseCode = $_course['code'];
-$coursePath = $_course['path'];
+$data = [];
+$data['hotspot_lang'] = $_course['language'];
+$data['hotspot_image'] = $pictureName;
+$data['hotspot_image_width'] = $pictureWidth;
+$data['hotspot_image_height'] = $pictureHeight;
+$data['courseCode'] = $_course['path'];
+$data['hotspots'] = [];
// Init
-$output = "hotspot_lang=$courseLang&hotspot_image=$pictureName&hotspot_image_width=$pictureWidth&hotspot_image_height=$pictureHeight&courseCode=$coursePath";
$i = 0;
$nmbrTries = 0;
$answer_type = $objQuestion->type;
@@ -35,28 +38,29 @@ $answers = $_SESSION['tmp_answers'];
$nbrAnswers = count($answers['answer']);
for ($i=1;$i <= $nbrAnswers; $i++) {
- $output .= "&hotspot_".$i."=true";
- $output .= "&hotspot_".$i."_answer=".$answers['answer'][$i];
+ $hotSpot = [];
+ $hotSpot['answer']= $answers['answer'][$i];
if ($answer_type == HOT_SPOT_DELINEATION) {
if ($i==1) {
- $output .= "&hotspot_".$i."_type=delineation";
- } else
- {$output .= "&hotspot_".$i."_type=oar";}
+ $hotSpot['type'] = 'delineation';
+ } else {
+ $hotSpot['type'] = 'oar';
+ }
} else {
// Square or rectancle
if ($answers['hotspot_type'][$i] == 'square') {
- $output .= "&hotspot_".$i."_type=square";
+ $hotSpot['type'] = 'square';
}
// Circle or ovale
if ($answers['hotspot_type'][$i] == 'circle') {
- $output .= "&hotspot_".$i."_type=circle";
+ $hotSpot['type'] = 'circle';
}
// Polygon
if ($answers['hotspot_type'][$i] == 'poly') {
- $output .= "&hotspot_".$i."_type=poly";
+ $hotSpot['type'] = 'poly';
}
/*// Delineation
if ($answers['hotspot_type'][$i] == 'delineation')
@@ -70,14 +74,14 @@ for ($i=1;$i <= $nbrAnswers; $i++) {
$nmbrTries++;
}
- $output .= "&hotspot_".$i."_coord=".$answers['hotspot_coordinates'][$i]."";
-}
-
-// Generate empty
-$i++;
-for ($i; $i <= 12; $i++) {
- $output .= "&hotspot_".$i."=false";
+ $hotSpot['coord'] = $answers['hotspot_coordinates'][$i];
+ $data['hotspots'][] = $hotSpot;
}
// Output
-echo $output."&nmbrTries=".$nmbrTries."&done=done";
+$data['nmbrTries'] = $nmbrTries;
+$data['done'] = 'done';
+
+header('Content-Type: application/json');
+
+echo json_encode($data);
diff --git a/main/exercice/hotspot_admin.inc.php b/main/exercice/hotspot_admin.inc.php
index 1e09ab4798..70eea77e73 100755
--- a/main/exercice/hotspot_admin.inc.php
+++ b/main/exercice/hotspot_admin.inc.php
@@ -585,12 +585,11 @@ if ($modifyAnswers) {
-
-
-
-
-
+
+
+
+
| |
* |
@@ -614,6 +613,8 @@ if ($modifyAnswers) {
* |
+
+
">
-
+
|
@@ -864,15 +865,16 @@ if ($modifyAnswers) {
?>
|
|
-
+
|
-
+
|
'TestProposedAnswer'
+ 'ToolbarSet' => 'TestProposedAnswer',
+ 'cols-size' => [0, 12, 0]
);
$form->addHtmlEditor('comment[' . $i . ']', null, false, false, $config);
$renderer = $form->defaultRenderer();
@@ -886,8 +888,7 @@ if ($modifyAnswers) {
$form->setDefaults(array('comment[' . $i . ']' => $commentValue));
$return = $form->return_form();
?>
- |
- |
+ |
-
+
-
+
@@ -1004,38 +1005,31 @@ if ($modifyAnswers) {
|
+
- |
-
-
- |
-
- |
-
-
+
+
+
+
0) {
echo str_repeat(' ', 0) . '$modifyAnswers was set - end' . "
\n";
diff --git a/main/exercice/hotspot_answers.as.php b/main/exercice/hotspot_answers.as.php
index 3c39a09c4a..6e704b67d8 100755
--- a/main/exercice/hotspot_answers.as.php
+++ b/main/exercice/hotspot_answers.as.php
@@ -13,7 +13,6 @@ include('../inc/global.inc.php');
// Set vars
$questionId = intval($_GET['modifyAnswers']);
$exe_id = intval($_GET['exe_id']);
-$from_db = isset($_GET['from_db']) ? $_GET['from_db'] : 0;
$objQuestion = Question :: read($questionId);
$TBL_ANSWERS = Database::get_course_table(TABLE_QUIZ_ANSWER);
$documentPath = api_get_path(SYS_COURSE_PATH).$_course['path'].'/document';
@@ -24,10 +23,6 @@ $pictureSize = getimagesize($picturePath.'/'.$objQuestion->selectPicture());
$pictureWidth = $pictureSize[0];
$pictureHeight = $pictureSize[1];
-$courseLang = $_course['language'];
-$course_code = Database::escape_string($_course['id']);
-
-$coursePath = $_course['path'];
$answer_type = $objQuestion->selectType();
$course_id = api_get_course_int_id();
@@ -42,64 +37,79 @@ if ($answer_type == HOT_SPOT_DELINEATION) {
}
$result = Database::query($sql);
// Init
-$output = "hotspot_lang=$courseLang&hotspot_image=$pictureName&hotspot_image_width=$pictureWidth&hotspot_image_height=$pictureHeight&courseCode=$coursePath";
-$i = 0;
+$data['lang'] = [
+ 'Square' => get_lang('Square'),
+ 'Circle' => get_lang('Circle'),
+ 'Poly' => get_lang('Poly'),
+ 'HotspotStatus1' => get_lang('HotspotStatus1'),
+ 'HotspotStatus2Polygon' => get_lang('HotspotStatus2Polygon'),
+ 'HotspotStatus2Other' => get_lang('HotspotStatus2Other'),
+ 'HotspotStatus3' => get_lang('HotspotStatus3'),
+ 'HotspotShowUserPoints' => get_lang('HotspotShowUserPoints'),
+ 'ShowHotspots' => get_lang('ShowHotspots'),
+ 'Triesleft' => get_lang('Triesleft'),
+ 'HotspotExerciseFinished' => get_lang('HotspotExerciseFinished'),
+ 'NextAnswer' => get_lang('NextAnswer'),
+ 'Delineation' => get_lang('Delineation'),
+ 'CloseDelineation' => get_lang('CloseDelineation'),
+ 'Oar' => get_lang('oar')
+];
+$data['image'] = $objQuestion->selectPicturePath();
+$data['image_width'] = $pictureWidth;
+$data['image_height'] = $pictureHeight;
+$data['courseCode'] = $_course['path'];
+$data['hotspots'] = [];
while ($hotspot = Database::fetch_array($result)) {
- $output .= "&hotspot_".$hotspot['id']."=true";
+ $hotSpot = [];
+ $hotSpot['id'] = $hotspot['id'];
+
// Square or rectancle
if ($hotspot['hotspot_type'] == 'square' ) {
- $output .= "&hotspot_".$hotspot['id']."_type=square";
+ $hotSpot['type'] = 'square';
}
// Circle or ovale
if ($hotspot['hotspot_type'] == 'circle') {
- $output .= "&hotspot_".$hotspot['id']."_type=circle";
+ $hotSpot['type'] = 'circle';
}
// Polygon
if ($hotspot['hotspot_type'] == 'poly') {
- $output .= "&hotspot_".$hotspot['id']."_type=poly";
+ $hotSpot['type'] = 'poly';
}
// Delineation
if ($hotspot['hotspot_type'] == 'delineation') {
- $output .= "&hotspot_".$hotspot['id']."_type=delineation";
+ $hotSpot['type'] = 'delineation';
}
// oar
if ($hotspot['hotspot_type'] == 'oar') {
- $output .= "&hotspot_".$hotspot['id']."_type=delineation";
+ $hotSpot['type'] = 'delineation';
}
- $output .= "&hotspot_".$hotspot['id']."_coord=".$hotspot['hotspot_coordinates']."";
- $i++;
-}
-// Generate empty (the maximum number of points is 12 - it is said so in the user interface)
-$i++;
-for ($i; $i <= 12; $i++) {
- $output .= "&hotspot_".$i."=false";
+ $hotSpot['coord'] = $hotspot['hotspot_coordinates'];
+
+ $data['hotspots'][] = $hotSpot;
}
+$data['answers'] = [];
-// Get clicks
-if(isset($_SESSION['exerciseResultCoordinates']) && $from_db==0) {
- foreach ($_SESSION['exerciseResultCoordinates'][$questionId] as $coordinate) {
- $output2 .= $coordinate."|";
- }
-} else {
- // get it from db
- $tbl_track_e_hotspot = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
- $sql = "SELECT hotspot_coordinate
- FROM $tbl_track_e_hotspot
- WHERE hotspot_question_id = $questionId AND
- c_id = $course_id AND
- hotspot_exe_id = $exe_id
- ORDER by hotspot_id";
- $rs = @Database::query($sql); // don't output error because we are in Flash execution.
- while($row = Database :: fetch_array($rs)) {
- $output2 .= $row['hotspot_coordinate']."|";
- }
+$tbl_track_e_hotspot = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
+$sql = "SELECT hotspot_coordinate
+ FROM $tbl_track_e_hotspot
+ WHERE hotspot_question_id = $questionId AND
+ c_id = $course_id AND
+ hotspot_exe_id = $exe_id
+ ORDER by hotspot_id";
+$rs = Database::query($sql); // don't output error because we are in Flash execution.
+
+while($row = Database :: fetch_array($rs, 'ASSOC')) {
+ $data['answers'][] = $row['hotspot_coordinate'];
}
-$output .= "&p_hotspot_answers=".api_substr($output2,0,-1)."&done=done";
-$explode = explode('&', $output);
-echo $output;
+
+$data['done'] = 'done';
+
+header('Content-Type: application/json');
+
+echo json_encode($data);
diff --git a/main/exercice/question.class.php b/main/exercice/question.class.php
index f229a8af62..b56631a39d 100755
--- a/main/exercice/question.class.php
+++ b/main/exercice/question.class.php
@@ -908,7 +908,7 @@ abstract class Question
];
$id = Database::insert($TBL_ANSWERS, $params);
if ($id) {
- $sql = "UPDATE $TBL_ANSWERS SET id = id_auto WHERE id_auto = $id";
+ $sql = "UPDATE $TBL_ANSWERS SET id = iid, id_auto = iid WHERE iid = $id";
Database::query($sql);
}
}
@@ -931,7 +931,7 @@ abstract class Question
$id = Database::insert($TBL_ANSWERS, $params);
if ($id) {
- $sql = "UPDATE $TBL_ANSWERS SET id = id_auto WHERE id_auto = $id";
+ $sql = "UPDATE $TBL_ANSWERS SET id = iid, id_auto = iid WHERE iid = $id";
Database::query($sql);
}
}
diff --git a/main/exercice/result.php b/main/exercice/result.php
index 95471191ff..351e5054a0 100755
--- a/main/exercice/result.php
+++ b/main/exercice/result.php
@@ -53,6 +53,8 @@ if (!$is_allowedToEdit) {
}
}
+$htmlHeadXtra[] = '';
+
if ($show_headers) {
$interbreadcrumb[] = array(
"url" => "exercise.php?".api_get_cidreq(),
diff --git a/main/inc/lib/events.lib.php b/main/inc/lib/events.lib.php
index ea1c2f1d09..d68f21da6c 100644
--- a/main/inc/lib/events.lib.php
+++ b/main/inc/lib/events.lib.php
@@ -613,17 +613,19 @@ class Event
)));
} else {
- $sql = "INSERT INTO $tbl_track_e_hotspot (hotspot_course_code, hotspot_user_id, c_id, hotspot_exe_id, hotspot_question_id, hotspot_answer_id, hotspot_correct, hotspot_coordinate)
- VALUES (
- '".api_get_course_id()."',
- ".api_get_user_id()."',".
- " ".api_get_course_int_id().", ".
- " '".Database :: escape_string($exe_id)."', ".
- " '".Database :: escape_string($question_id)."',".
- " '".Database :: escape_string($answer_id)."',".
- " '".Database :: escape_string($correct)."',".
- " '".Database :: escape_string($coords)."')";
- return $result = Database::query($sql);
+ return Database::insert(
+ $tbl_track_e_hotspot,
+ [
+ 'hotspot_course_code' => api_get_course_id(),
+ 'hotspot_user_id' => api_get_user_id(),
+ 'c_id' => api_get_course_int_id(),
+ 'hotspot_exe_id' => $exe_id,
+ 'hotspot_question_id' => $question_id,
+ 'hotspot_answer_id' => $answer_id,
+ 'hotspot_correct' => $correct,
+ 'hotspot_coordinate' => $coords
+ ]
+ );
}
}
diff --git a/main/inc/lib/exercise.lib.php b/main/inc/lib/exercise.lib.php
index e860fbf23c..e8c27b286d 100644
--- a/main/inc/lib/exercise.lib.php
+++ b/main/inc/lib/exercise.lib.php
@@ -1129,25 +1129,31 @@ HTML;
);
}
- // display answers of hotpost order by id
- $answer_list = '' . get_lang(
- 'HotspotZones'
- ) . '';
- if (!empty($answers_hotspot)) {
- ksort($answers_hotspot);
- foreach ($answers_hotspot as $key => $value) {
- $answer_list .= '- ' . $key . '.- ' . $value . '
';
+ $answerList = '';
+
+ if ($answerType != HOT_SPOT_DELINEATION) {
+ $answerList = '
+
+
+
+ ';
+
+ if (!empty($answers_hotspot)) {
+ ksort($answers_hotspot);
+
+ $countAnswers = 1;
+
+ foreach ($answers_hotspot as $value) {
+ $answerList .= "{$countAnswers} - {$value}
";
+
+ $countAnswers++;
+ }
}
- }
- $answer_list .= '
';
- if ($answerType == HOT_SPOT_DELINEATION) {
- $answer_list = '';
- $swf_file = 'hotspot_delineation_user';
- $swf_height = 405;
- } else {
- $swf_file = 'hotspot_user';
- $swf_height = 436;
+ $answerList .= '
+
+
+ ';
}
if (!$only_questions) {
@@ -1156,153 +1162,37 @@ HTML;
echo '' . $current_item . '. ' . $questionName . '
';
}
//@todo I need to the get the feedback type
- echo '';
- echo '
-
- | ';
- echo $questionDescription;
- echo ' |
';
+ echo <<
+
+ $questionDescription
+
+HOTSPOT;
}
$canClick = isset($_GET['editQuestion']) ? '0' : (isset($_GET['modifyAnswers']) ? '0' : '1');
- $s .= '
-
-
-
-
- ';
- $s .= '
|
-
- |
- ' . $answer_list . ' |
-
- |
';
- echo $s;
- echo '
';
+ $s .= <<
+
+
+
+
+ $answerList
+
+HOTSPOT;
+ echo <<
+
+HOTSPOT;
}
return $nbrAnswers;
}
diff --git a/main/inc/lib/exercise_show_functions.lib.php b/main/inc/lib/exercise_show_functions.lib.php
index 6c32d83959..ae6a16da32 100755
--- a/main/inc/lib/exercise_show_functions.lib.php
+++ b/main/inc/lib/exercise_show_functions.lib.php
@@ -184,16 +184,13 @@ class ExerciseShowFunctions
?>
- |
-
+ |
+
+ |
+
+
|
-
+ |
|
-
+ |
'.nl2br($answerComment).'';
@@ -210,7 +207,7 @@ class ExerciseShowFunctions
?>
|
- |
+ |
\n\
+ \n\
+ \n\
+ \n\
+ \n\
+ \n\
+ ';
+
+ $(this.el).find('select').val(this.selectedValue);
+
+ var selectShapeEvent = function (e) {
+ switch (this.value) {
+ case 'square':
+ //no break
+ case 'ellipse':
+ //no break
+ case 'polygon':
+ currentShapeType = this.value;
+ currentHotSpotIndex = self.hotSpotIndex;
+ break;
+
+ default:
+ break;
+ }
+ };
+
+ $(this.el).on('click', selectShapeEvent);
+ $(this.el).find('select').on('change', selectShapeEvent);
+
+ return this.el;
+ };
+
+ var colors = [
+ '66, 113, 181',
+ '254, 142, 22',
+ '69, 199, 240',
+ '188, 214, 49',
+ '214, 49, 115',
+ '215, 215, 215',
+ '144, 175, 221',
+ '174, 134, 64',
+ '79, 146, 66',
+ '244, 235, 36',
+ '237, 32, 36',
+ '59, 59, 59',
+ '247, 189, 226'
+ ];
+
+ var getPointOnImage = function (x, y) {
+ var pointerPosition = {
+ left: x + window.scrollX,
+ top: y + window.scrollY
+ },
+ canvasOffset = {
+ x: canvas.getBoundingClientRect().x + window.scrollX,
+ y: canvas.getBoundingClientRect().y + window.scrollY
+ };
+
+ return {
+ x: Math.round(pointerPosition.left - canvasOffset.x),
+ y: Math.round(pointerPosition.top - canvasOffset.y)
+ };
+ };
+
+ var startCanvas = function () {
+ var newHotSpotEl = null,
+ pressingShift = false;
+
+ document.addEventListener('keydown', function (e) {
+ if (e.keyCode === 16) {
+ pressingShift = true;
+ }
+ }, false);
+ document.addEventListener('keyup', function (e) {
+ if (e.keyCode === 16) {
+ pressingShift = false;
+ }
+ }, false);
+
+ canvas.addEventListener('click', function (e) {
+ e.preventDefault();
+ }, false);
+
+ container.addEventListener('dragstart', function (e) {
+ e.preventDefault();
+ }, false);
+ container.addEventListener('click', function (e) {
+ if (shapes.length >= colors.length) {
+ return;
+ }
+
+ newHotSpotEl = draw(newHotSpotEl, e.clientX, e.clientY, pressingShift);
+
+ if (!newHotSpotEl) {
+ updateValues();
+ }
+ }, false);
+ };
+
+ var draw = function (hotSpotEl, x, y, isPressingShift) {
+ var pointerPosition = getPointOnImage(x, y),
+ hotSpot = null;
+
+ if (!hotSpotEl) {
+ switch (currentShapeType) {
+ case 'square':
+ //no break
+ case 'ellipse':
+ if (currentShapeType === 'ellipse') {
+ hotSpot = new HotSpotEllipse();
+ hotSpotEl = new EllipseEl(hotSpot, colors[currentHotSpotIndex]);
+ } else {
+ hotSpot = new HotSpotSquare();
+ hotSpotEl = new SquareEl(hotSpot, colors[currentHotSpotIndex]);
+ }
+
+ hotSpot.setStartPoint(pointerPosition.x, pointerPosition.y);
+ break;
+
+ case 'polygon':
+ hotSpot = new HotSpotPolygon();
+ hotSpotEl = new PolygonEl(hotSpot, colors[currentHotSpotIndex]);
+
+ hotSpot.addPoint(pointerPosition.x, pointerPosition.y);
+ break;
+ }
+
+ shapes[currentHotSpotIndex].remove();
+ shapes.splice(currentHotSpotIndex, 1, hotSpotEl);
+
+ canvas.appendChild(hotSpotEl.render());
+
+ return hotSpotEl;
+ }
+
+ switch (currentShapeType) {
+ case 'square':
+ //no break
+ case 'ellipse':
+ hotSpotEl.hotspot.setEndPoint(pointerPosition.x, pointerPosition.y);
+ hotSpotEl.render();
+
+ hotSpotEl = null;
+ break;
+
+ case 'polygon':
+ $(container).find('#hotspot-alert').text('Keed pressed the SHIFT key and click the image to close the polygon');
+
+ hotSpotEl.hotspot.addPoint(pointerPosition.x, pointerPosition.y);
+ hotSpotEl.render();
+
+ if (isPressingShift) {
+ hotSpotEl = null;
+ $(container).find('#hotspot-alert').text('');
+ }
+ break;
+ }
+
+ return hotSpotEl;
+ };
+
+ var updateValues = function () {
+ var currentHotSpotEl = shapes[currentHotSpotIndex];
+
+ if (currentHotSpotIndex === undefined) {
+ return;
+ }
+
+ if (currentHotSpotEl.hotspot instanceof HotSpotSquare) {
+ $('[name="hotspot_type[' + (currentHotSpotIndex + 1) + ']"]').val('square');
+ } else if (currentHotSpotEl.hotspot instanceof HotSpotEllipse) {
+ $('[name="hotspot_type[' + (currentHotSpotIndex + 1) + ']"]').val('circle');
+ } else if (currentHotSpotEl.hotspot instanceof HotSpotPolygon) {
+ $('[name="hotspot_type[' + (currentHotSpotIndex + 1) + ']"]').val('poly');
+ }
+
+ $('[name="hotspot_coordinates[' + (currentHotSpotIndex + 1) + ']"]').val(
+ currentHotSpotEl.hotspot.encode()
+ );
+ };
+
+ var loadHotSpots = function (hotSpotList) {
+ hotSpotList.forEach(function (hotSpotData, index) {
+ var hotSpot = null,
+ hotSpotEl = null,
+ color = colors[shapes.length];
+
+ switch (hotSpotData.type) {
+ case 'square':
+ hotSpot = new HotSpotSquare();
+ hotSpotEl = new SquareEl(hotSpot, color);
+
+ var coords = hotSpotData.coord.split('|'),
+ position = coords[0].split(';'),
+ x = parseInt(position[0]),
+ y = parseInt(position[1]),
+ width = parseInt(coords[1]),
+ height = parseInt(coords[2]);
+
+ hotSpot.setStartPoint(x, y);
+ hotSpot.setEndPoint(x + width, y + height);
+ break;
+ case 'circle':
+ hotSpot = new HotSpotEllipse();
+ hotSpotEl = new EllipseEl(hotSpot, color);
+
+ var coords = hotSpotData.coord.split('|'),
+ position = coords[0].split(';'),
+ x = parseInt(position[0] - coords[1]),
+ y = parseInt(position[1] - coords[2]),
+ width = parseInt(coords[1]) * 2,
+ height = parseInt(coords[2]) * 2;
+
+ hotSpot.setStartPoint(x, y);
+ hotSpot.setEndPoint(x + width, y + height);
+ break;
+
+ case 'poly':
+ hotSpot = new HotSpotPolygon();
+ hotSpotEl = new PolygonEl(hotSpot, color);
+
+ hotSpotData.coord.split('|').forEach(function (point) {
+ var exis = point.split(';');
+
+ hotSpot.addPoint(exis[0], exis[1]);
+ });
+ break;
+ }
+
+ if (hotSpotEl) {
+ var hotSpotSelector = new HotSpotSelectorEl(color, index, hotSpotData.type);
+
+ selectors.appendChild(hotSpotSelector.render());
+ canvas.appendChild(hotSpotEl.render());
+ shapes.push(hotSpotEl);
+ }
+ });
+ };
+
+ var container, canvas, selectors, currentShapeType, currentHotSpotIndex, shapes = [];
+
+ return {
+ init: function (questionId, imageSrc) {
+ if (!questionId || !imageSrc) {
+ return;
+ }
+
+ selectors = document.querySelector('#hotspot-selectors');
+ container = document.querySelector('#hotspot-container');
+ canvas = document.querySelector('#hotspot-container svg');
+ currentShapeType = 'square';
+
+ var xhrImage = new $.Deferred();
+
+ var image = new Image();
+ image.onload = function () {
+ xhrImage.resolve(this);
+ };
+ image.onerror = function () {
+ xhrImage.reject();
+ };
+ image.src = imageSrc;
+
+ var xhrHotSpots = $.get('/main/exercice/hotspot_actionscript_admin.as.php', {
+ modifyAnswers: parseInt(questionId)
+ });
+
+ $.when.apply($, [xhrImage, xhrHotSpots]).done(function (imageRequest, hotSpotsRequest) {
+ var imageSvg = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ imageSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', imageRequest.src);
+ imageSvg.setAttribute('width', imageRequest.width);
+ imageSvg.setAttribute('height', imageRequest.height);
+
+ container.style.width = imageRequest.width + 'px';
+ canvas.setAttribute('viewBox', '0 0 ' + imageRequest.width + ' ' + imageRequest.height);
+ canvas.appendChild(imageSvg);
+
+ loadHotSpots(hotSpotsRequest[0].hotspots);
+ startCanvas();
+ });
+ }
+ };
+})();
diff --git a/main/plugin/hotspot2/js/hotspot_solution.js b/main/plugin/hotspot2/js/hotspot_solution.js
new file mode 100755
index 0000000000..fd3a657053
--- /dev/null
+++ b/main/plugin/hotspot2/js/hotspot_solution.js
@@ -0,0 +1,231 @@
+var HotSpotSolution = (function () {
+ var Answer = function () {
+ this.x = 0;
+ this.y = 0;
+ };
+
+ var HotSpot = function () {
+ this.id = 0;
+ this.name = '';
+ };
+
+ var Square = function () {
+ HotSpot.call(this);
+
+ this.x = 0,
+ this.y = 0,
+ this.width = 0,
+ this.height = 0;
+ };
+ Square.prototype = Object.create(HotSpot.prototype);
+
+ var Ellipse = function () {
+ HotSpot.call(this);
+
+ this.centerX = 0;
+ this.centerY = 0;
+ this.radiusX = 0;
+ this.radiusY = 0;
+ };
+ Ellipse.prototype = Object.create(HotSpot.prototype);
+
+ var Polygon = function () {
+ HotSpot.call(this);
+
+ this.points = [];
+ };
+ Polygon.prototype = Object.create(HotSpot.prototype);
+
+ var config, lang, hotSpots = [], answers = [];
+
+ var CanvasSVG = function (image) {
+ var imageSvg = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ imageSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', image.src);
+ imageSvg.setAttribute('width', image.width);
+ imageSvg.setAttribute('height', image.height);
+
+ this.el = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
+ this.el.setAttribute('version', '1.1');
+ this.el.setAttribute('viewBox', '0 0 ' + image.width + ' ' + image.height);
+ this.el.appendChild(imageSvg);
+ };
+ CanvasSVG.prototype.addHotSpot = function (hotSpot) {
+ var hotSpotSVG = null;
+
+ if (hotSpot instanceof Square) {
+ hotSpotSVG = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
+ hotSpotSVG.setAttribute('x', hotSpot.x);
+ hotSpotSVG.setAttribute('y', hotSpot.y);
+ hotSpotSVG.setAttribute('width', hotSpot.width);
+ hotSpotSVG.setAttribute('height', hotSpot.height);
+ } else if (hotSpot instanceof Ellipse) {
+ hotSpotSVG = document.createElementNS('http://www.w3.org/2000/svg', 'ellipse');
+ hotSpotSVG.setAttribute('cx', hotSpot.centerX);
+ hotSpotSVG.setAttribute('cy', hotSpot.centerY);
+ hotSpotSVG.setAttribute('rx', hotSpot.radiusX);
+ hotSpotSVG.setAttribute('ry', hotSpot.radiusY);
+ } else if (hotSpot instanceof Polygon) {
+ var pointsPaired = [];
+
+ hotSpot.points.forEach(function (point) {
+ pointsPaired.push(point.join(','));
+ });
+
+ hotSpotSVG = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
+ hotSpotSVG.setAttribute(
+ 'points',
+ pointsPaired.join(' ')
+ );
+ }
+
+ if (!hotSpotSVG) {
+ return;
+ }
+
+ var color = colors[hotSpots.length - 1];
+
+ hotSpotSVG.setAttribute('stroke-width', 2);
+ hotSpotSVG.setAttribute('stroke', 'rgb(' + color + ')');
+ hotSpotSVG.setAttribute('fill', 'rgba(' + color + ', 0.75)');
+
+ this.el.appendChild(hotSpotSVG);
+ };
+ CanvasSVG.prototype.addAnswer = function (answer) {
+ var pointSVG = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
+ pointSVG.setAttribute('cx', answer.x);
+ pointSVG.setAttribute('cy', answer.y);
+ pointSVG.setAttribute('r', 15);
+ pointSVG.setAttribute('fill', '#00677C');
+
+ var textSVG = document.createElementNS('http://www.w3.org/2000/svg', 'text');
+ textSVG.setAttribute('x', answer.x);
+ textSVG.setAttribute('y', answer.y);
+ textSVG.setAttribute('dy', 5);
+ textSVG.setAttribute('font-family', 'sans-serif');
+ textSVG.setAttribute('text-anchor', 'middle');
+ textSVG.setAttribute('fill', 'white');
+ textSVG.textContent = answers.length;
+
+ this.el.appendChild(pointSVG);
+ this.el.appendChild(textSVG);
+ };
+
+ var decodeHotSpot = function (hotSpotInfo) {
+ var hotSpot = null,
+ coords = hotSpotInfo.coord.split('|');
+
+ switch (hotSpotInfo.type) {
+ case 'square':
+ var position = coords[0].split(';');
+
+ hotSpot = new Square();
+ hotSpot.x = parseInt(position[0]);
+ hotSpot.y = parseInt(position[1]);
+ hotSpot.width = parseInt(coords[1]);
+ hotSpot.height = parseInt(coords[2]);
+ break;
+ case 'circle':
+ var center = coords[0].split(';');
+
+ hotSpot = new Ellipse();
+ hotSpot.centerX = parseInt(center[0]);
+ hotSpot.centerY = parseInt(center[1]);
+ hotSpot.radiusX = parseInt(coords[1]);
+ hotSpot.radiusY = parseInt(coords[2]);
+ break;
+ case 'poly':
+ hotSpot = new Polygon();
+
+ coords.forEach(function (pairedCoord) {
+ var coord = pairedCoord.split(';');
+
+ hotSpot.points.push([
+ parseInt(coord[0]),
+ parseInt(coord[1])
+ ]);
+ });
+ break;
+ }
+
+ return hotSpot;
+ };
+
+ var decodeAnswer = function (answerInfo) {
+ var answer = null,
+ coords = answerInfo.split(';');
+
+ answer = new Answer();
+ answer.x = coords[0];
+ answer.y = coords[1];
+
+ return answer;
+ };
+
+ var colors = [
+ '66, 113, 181',
+ '254, 142, 22',
+ '69, 199, 240',
+ '188, 214, 49',
+ '214, 49, 115',
+ '215, 215, 215',
+ '144, 175, 221',
+ '174, 134, 64',
+ '79, 146, 66',
+ '244, 235, 36',
+ '237, 32, 36',
+ '59, 59, 59'
+ ];
+
+ var startAnswer = function (hotSpotAnswerInfo) {
+ var image = new Image();
+ image.onload = function () {
+ var canvasSVG = new CanvasSVG(this);
+
+ hotSpotAnswerInfo.hotspots.forEach(function (hotSpotInfo) {
+ var hotSpot = decodeHotSpot(hotSpotInfo);
+
+ if (!hotSpot) {
+ return;
+ }
+
+ hotSpots.push(hotSpot);
+ canvasSVG.addHotSpot(hotSpot);
+ });
+
+ hotSpotAnswerInfo.answers.forEach(function (answerInfo) {
+ var answer = decodeAnswer(answerInfo);
+
+ answers.push(answer);
+ canvasSVG.addAnswer(answer);
+ });
+
+ $(config.selector)
+ .css('width', this.width)
+ .append(canvasSVG.el);
+ };
+ image.src = hotSpotAnswerInfo.image;
+
+ lang = hotSpotAnswerInfo.lang;
+ };
+
+ return {
+ init: function (settings) {
+ config = $.extend({
+ questionId: 0,
+ exerciseId: 0,
+ selector: ''
+ }, settings);
+
+ if (!config.questionId || !config.selector) {
+ return;
+ }
+
+ var xhrHotSpotAnswers = $.getJSON('/main/exercice/hotspot_answers.as.php', {
+ modifyAnswers: parseInt(config.questionId),
+ exe_id: parseInt(config.exerciseId)
+ });
+
+ $.when(xhrHotSpotAnswers).done(startAnswer);
+ }
+ };
+})();
\ No newline at end of file
diff --git a/main/plugin/hotspot2/js/hotspot_user.js b/main/plugin/hotspot2/js/hotspot_user.js
new file mode 100755
index 0000000000..1f1072b112
--- /dev/null
+++ b/main/plugin/hotspot2/js/hotspot_user.js
@@ -0,0 +1,270 @@
+var HotSpotUser = (function () {
+ var Answer = function () {
+ this.x = 0;
+ this.y = 0;
+ };
+
+ var HotSpot = function () {
+ this.id = 0;
+ this.name = '';
+ };
+ HotSpot.prototype.checkPoint = function (x, y) {
+ return false;
+ };
+
+ var Square = function () {
+ HotSpot.call(this);
+
+ this.x = 0,
+ this.y = 0,
+ this.width = 0,
+ this.height = 0;
+ };
+ Square.prototype = Object.create(HotSpot.prototype);
+ Square.prototype.checkPoint = function (x, y) {
+ var left = this.x,
+ right = this.x + this.width,
+ top = this.y,
+ bottom = this.y + this.height;
+
+ var xIsValid = x >= left && x <= right,
+ yIsValid = y >= top && y <= bottom;
+
+ return xIsValid && yIsValid;
+ };
+
+ var Ellipse = function () {
+ HotSpot.call(this);
+
+ this.centerX = 0;
+ this.centerY = 0;
+ this.radiusX = 0;
+ this.radiusY = 0;
+ };
+ Ellipse.prototype = Object.create(HotSpot.prototype);
+ Ellipse.prototype.checkPoint = function (x, y) {
+ var dX = x - this.centerX,
+ dY = y - this.centerY;
+
+ return Math.pow(dX, 2) / Math.pow(this.radiusX, 2) + Math.pow(dY, 2) / Math.pow(this.radiusY, 2) <= 1;
+ };
+
+ var Polygon = function () {
+ HotSpot.call(this);
+
+ this.points = [];
+ };
+ Polygon.prototype = Object.create(HotSpot.prototype);
+ Polygon.prototype.checkPoint = function (x, y) {
+ var isInside = false;
+
+ for (var i = 0, j = this.points.length - 1; i < this.points.length; j = i++) {
+ var xi = this.points[i][0],
+ yi = this.points[i][1],
+ xj = this.points[j][0],
+ yj = this.points[j][1];
+
+ var intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
+
+ if (intersect) {
+ isInside = !isInside;
+ }
+ }
+
+ return isInside;
+ };
+
+ var CanvasSVG = function (image) {
+ var imageSvg = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ imageSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', image.src);
+ imageSvg.setAttribute('width', image.width);
+ imageSvg.setAttribute('height', image.height);
+
+ this.el = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
+ this.el.setAttribute('version', '1.1');
+ this.el.setAttribute('viewBox', '0 0 ' + image.width + ' ' + image.height);
+ this.el.appendChild(imageSvg);
+
+ this.messagesEl = document.createElement('div');
+ };
+ CanvasSVG.prototype.setEvents = function () {
+ var self = this;
+
+ var getPointOnImage = function (x, y) {
+ var pointerPosition = {
+ left: x + window.scrollX,
+ top: y + window.scrollY
+ },
+ canvasOffset = {
+ x: self.el.getBoundingClientRect().x + window.scrollX,
+ y: self.el.getBoundingClientRect().y + window.scrollY
+ };
+
+ return {
+ x: Math.round(pointerPosition.left - canvasOffset.x),
+ y: Math.round(pointerPosition.top - canvasOffset.y)
+ };
+ };
+
+ this.el.addEventListener('dragstart', function (e) {
+ e.preventDefault();
+ }, false);
+ this.el.addEventListener('click', function (e) {
+ e.preventDefault();
+
+ if (answers.length >= hotSpots.length) {
+ return;
+ }
+
+ var point = getPointOnImage(e.clientX, e.clientY);
+
+ var answer = new Answer();
+ answer.x = point.x;
+ answer.y = point.y;
+
+ answers.push(answer);
+ self.addAnswer(answer);
+
+ if (answers.length === hotSpots.length) {
+ console.log(lang);
+ self.messagesEl.textContent = lang.HotspotExerciseFinished;
+
+ return;
+ }
+
+ self.messagesEl.textContent = lang.NextAnswer + ' ' + hotSpots[answers.length].name;
+ });
+ };
+ CanvasSVG.prototype.addAnswer = function (answer) {
+ var pointSVG = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
+ pointSVG.setAttribute('cx', answer.x);
+ pointSVG.setAttribute('cy', answer.y);
+ pointSVG.setAttribute('r', 15);
+ pointSVG.setAttribute('fill', '#00677C');
+
+ var textSVG = document.createElementNS('http://www.w3.org/2000/svg', 'text');
+ textSVG.setAttribute('x', answer.x);
+ textSVG.setAttribute('y', answer.y);
+ textSVG.setAttribute('dy', 5);
+ textSVG.setAttribute('font-family', 'sans-serif');
+ textSVG.setAttribute('text-anchor', 'middle');
+ textSVG.setAttribute('fill', 'white');
+ textSVG.textContent = answers.length;
+
+ this.el.appendChild(pointSVG);
+ this.el.appendChild(textSVG);
+
+ var hotSpot = hotSpots[answers.length - 1];
+
+ var hotspotTxt = document.createElement('input');
+ hotspotTxt.type = 'hidden';
+ hotspotTxt.name = 'hotspot[' + config.questionId + '][' + hotSpot.id + ']';
+ hotspotTxt.value = [answer.x, answer.y].join(';');
+
+ var choiceTxt = document.createElement('input');
+ choiceTxt.type = 'hidden';
+ choiceTxt.name = 'choice[' + config.questionId + '][' + hotSpot.id + ']';
+ choiceTxt.value = hotSpot.checkPoint(answer.x, answer.y) ? 1 : 0;
+
+ this.el.parentNode.appendChild(hotspotTxt);
+ this.el.parentNode.appendChild(choiceTxt);
+ };
+ CanvasSVG.prototype.startMessagesPanel = function () {
+ this.messagesEl.textContent = lang.NextAnswer + ' ' + hotSpots[0].name;
+
+ this.el.parentNode.parentNode.appendChild(this.messagesEl);
+ };
+
+ var decodeHotSpot = function (hotSpotInfo) {
+ var hotSpot = null,
+ coords = hotSpotInfo.coord.split('|');
+
+ switch (hotSpotInfo.type) {
+ case 'square':
+ var position = coords[0].split(';');
+
+ hotSpot = new Square();
+ hotSpot.x = parseInt(position[0]);
+ hotSpot.y = parseInt(position[1]);
+ hotSpot.width = parseInt(coords[1]);
+ hotSpot.height = parseInt(coords[2]);
+ break;
+ case 'circle':
+ var center = coords[0].split(';');
+
+ hotSpot = new Ellipse();
+ hotSpot.centerX = parseInt(center[0]);
+ hotSpot.centerY = parseInt(center[1]);
+ hotSpot.radiusX = parseInt(coords[1]);
+ hotSpot.radiusY = parseInt(coords[2]);
+ break;
+ case 'poly':
+ hotSpot = new Polygon();
+
+ coords.forEach(function (pairedCoord) {
+ var coord = pairedCoord.split(';');
+
+ hotSpot.points.push([
+ parseInt(coord[0]),
+ parseInt(coord[1])
+ ]);
+ });
+ break;
+ }
+
+ if (hotSpot) {
+ hotSpot.id = parseInt(hotSpotInfo.id);
+ hotSpot.name = hotSpotInfo.answer;
+ }
+
+ return hotSpot;
+ };
+
+ var config, lang, hotSpots = [], answers = [];
+
+ var startQuestion = function (hotSpotQuestionInfo) {
+ var image = new Image();
+ image.onload = function () {
+ var canvasSVG = new CanvasSVG(this);
+
+ hotSpotQuestionInfo.hotspots.forEach(function (hotSpotInfo) {
+ var hotSpot = decodeHotSpot(hotSpotInfo);
+
+ if (!hotSpot) {
+ return;
+ }
+
+ hotSpots.push(hotSpot);
+ });
+
+ $(config.selector)
+ .css('width', this.width)
+ .append(canvasSVG.el);
+
+ canvasSVG.setEvents();
+ canvasSVG.startMessagesPanel();
+ };
+ image.src = hotSpotQuestionInfo.image;
+
+ lang = hotSpotQuestionInfo.lang;
+ };
+
+ return {
+ init: function (settings) {
+ config = $.extend({
+ questionId: 0,
+ selector: ''
+ }, settings);
+
+ if (!config.questionId || !config.selector) {
+ return;
+ }
+
+ var xhrHotSpotQuestion = $.getJSON('/main/exercice/hotspot_actionscript.as.php', {
+ modifyAnswers: parseInt(config.questionId)
+ });
+
+ $.when(xhrHotSpotQuestion).done(startQuestion);
+ }
+ };
+})();
diff --git a/src/Chamilo/CoreBundle/Component/Editor/CkEditor/Toolbar/TestProposedAnswer.php b/src/Chamilo/CoreBundle/Component/Editor/CkEditor/Toolbar/TestProposedAnswer.php
index eeae353bc2..d0c4a9c0d1 100644
--- a/src/Chamilo/CoreBundle/Component/Editor/CkEditor/Toolbar/TestProposedAnswer.php
+++ b/src/Chamilo/CoreBundle/Component/Editor/CkEditor/Toolbar/TestProposedAnswer.php
@@ -16,32 +16,8 @@ class TestProposedAnswer extends Basic
*/
public function getConfig()
{
- $config['toolbarGroups'] = array(
- array('name' => 'document'),
- array(
- 'name' => 'clipboard',
- 'groups' => array('clipboard', 'undo',)
- ),
- array(
- 'name' => 'basicstyles',
- 'groups' => array('basicstyles', 'cleanup',)
- ),
- array(
- 'name' => 'paragraph',
- 'groups' => array('list', 'indent', 'blocks', 'align')
- ),
- array('name' => 'links'),
- array('name' => 'insert'),
- '/',
- array('name' => 'styles'),
- array('name' => 'colors'),
- array('name' => 'mode'),
- array('name' => 'others')
- );
-
$config['toolbarCanCollapse'] = true;
$config['toolbarStartupExpanded'] = false;
- $config['extraPlugins'] = $this->getPluginsToString();
//$config['width'] = '100';
//$config['height'] = '200';
if (api_get_setting('more_buttons_maximized_mode') != 'true') {
@@ -54,54 +30,13 @@ class TestProposedAnswer extends Basic
return $config;
}
- /**
- * @return array
- */
- public function getConditionalPlugins()
- {
- $plugins = array();
- if (api_get_setting('show_glossary_in_documents') == 'ismanual') {
- $plugins[] = 'glossary';
- }
-
- return $plugins;
- }
-
/**
* Get the toolbar configuration when CKEditor is maximized
* @return array
*/
protected function getMaximizedToolbar()
{
- return [
- ['NewPage', 'Templates', '-', 'Preview', 'Print'],
- ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord'],
- ['Undo', 'Redo', '-', 'SelectAll', 'Find', '-', 'RemoveFormat'],
- ['Link', 'Unlink', 'Anchor', 'Glossary'],
- [
- 'Image',
- 'Mapping',
- 'Video',
- 'Flash',
- 'Youtube',
- 'Oembed',
- 'Audio',
- 'leaflet',
- 'Smiley',
- 'SpecialChar',
- 'Asciimath',
- 'Asciisvg'
- ],
- '/',
- ['Table', '-', 'CreateDiv'],
- ['BulletedList', 'NumberedList', 'HorizontalRule', '-', 'Outdent', 'Indent', 'Blockquote'],
- ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
- ['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript', '-', 'TextColor', 'BGColor'],
- [api_get_setting('allow_spellcheck') == 'true' ? 'Scayt' : ''],
- ['Styles', 'Format', 'Font', 'FontSize'],
- ['PageBreak', 'ShowBlocks', 'Source'],
- ['Toolbarswitch'],
- ];
+ return $this->getNormalToolbar();
}
/**
@@ -111,18 +46,9 @@ class TestProposedAnswer extends Basic
protected function getNormalToolbar()
{
return [
- [
- 'Maximize',
- 'Bold',
- 'Image',
- 'Link',
- 'PasteFromWord',
- 'Audio',
- 'Table',
- 'Subscript',
- 'Superscript',
- 'Source'
- ]
+ ['Bold', 'Subscript', 'Superscript'],
+ ['Image', 'Link', 'Audio', 'Table', 'PasteFromWord'],
+ ['Maximize', 'Source'],
];
}
@@ -132,14 +58,6 @@ class TestProposedAnswer extends Basic
*/
protected function getMinimizedToolbar()
{
- return [
- ['Templates'],
- ['PasteFromWord'],
- ['Link'],
- ['Image', 'Video', 'Flash', 'Audio', 'Asciimath', 'Asciisvg'],
- ['Table'],
- ['Bold'],
- ['Source', 'Toolbarswitch']
- ];
+ return $this->getNormalToolbar();
}
}