1<?php
2/*
3    +-----------------------------------------------------------------------------+
4    | ILIAS open source                                                           |
5    +-----------------------------------------------------------------------------+
6    | Copyright (c) 1998-2001 ILIAS open source, University of Cologne            |
7    |                                                                             |
8    | This program is free software; you can redistribute it and/or               |
9    | modify it under the terms of the GNU General Public License                 |
10    | as published by the Free Software Foundation; either version 2              |
11    | of the License, or (at your option) any later version.                      |
12    |                                                                             |
13    | This program is distributed in the hope that it will be useful,             |
14    | but WITHOUT ANY WARRANTY; without even the implied warranty of              |
15    | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               |
16    | GNU General Public License for more details.                                |
17    |                                                                             |
18    | You should have received a copy of the GNU General Public License           |
19    | along with this program; if not, write to the Free Software                 |
20    | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. |
21    +-----------------------------------------------------------------------------+
22*/
23
24define("QT_UNKNOWN", "unknown");
25define("QT_KPRIM_CHOICE", "assKprimChoice");
26define("QT_LONG_MENU", "assLongMenu");
27define("QT_MULTIPLE_CHOICE_SR", "assSingleChoice");
28define("QT_MULTIPLE_CHOICE_MR", "assMultipleChoice");
29define("QT_CLOZE", "assClozeTest");
30define("QT_ERRORTEXT", "assErrorText");
31define("QT_MATCHING", "assMatchingQuestion");
32define("QT_ORDERING", "assOrderingQuestion");
33define("QT_ORDERING_HORIZONTAL", "assOrderingHorizontal");
34define("QT_IMAGEMAP", "assImagemapQuestion");
35define("QT_JAVAAPPLET", "assJavaApplet");
36define("QT_FLASHAPPLET", "assFlashApplet");
37define("QT_TEXT", "assTextQuestion");
38define("QT_FILEUPLOAD", "assFileUpload");
39define("QT_NUMERIC", "assNumeric");
40define("QT_FORMULA", "assFormulaQuestion");
41define("QT_TEXTSUBSET", "assTextSubset");
42
43/**
44* QTI item class
45*
46* @author Helmut Schottmüller <hschottm@gmx.de>
47* @version $Id$
48*
49* @package assessment
50*/
51class ilQTIItem
52{
53    public $ident;
54    public $title;
55    public $maxattempts;
56    public $label;
57    public $xmllang;
58
59    public $comment;
60    public $ilias_version;
61    public $author;
62    public $questiontype;
63    public $duration;
64    public $questiontext;
65    public $resprocessing;
66    public $itemfeedback;
67    public $presentation;
68    public $presentationitem;
69    public $suggested_solutions;
70    public $itemmetadata;
71
72    protected $iliasSourceVersion;
73    protected $iliasSourceNic;
74
75    public function __construct()
76    {
77        $this->response = array();
78        $this->resprocessing = array();
79        $this->itemfeedback = array();
80        $this->presentation = null;
81        $this->presentationitem = array();
82        $this->suggested_solutions = array();
83        $this->itemmetadata = array();
84
85        $this->iliasSourceVersion = null;
86        $this->iliasSourceNic = null;
87    }
88
89    public function setIdent($a_ident)
90    {
91        $this->ident = $a_ident;
92    }
93
94    public function getIdent()
95    {
96        return $this->ident;
97    }
98
99    public function setTitle($a_title)
100    {
101        $this->title = $a_title;
102    }
103
104    public function getTitle()
105    {
106        return $this->title;
107    }
108
109    public function setComment($a_comment)
110    {
111        if (preg_match("/(.*?)\=(.*)/", $a_comment, $matches)) {
112            // special comments written by ILIAS
113            switch ($matches[1]) {
114                case "ILIAS Version":
115                    $this->ilias_version = $matches[2];
116                    return;
117                    break;
118                case "Questiontype":
119                    $this->questiontype = $matches[2];
120                    return;
121                    break;
122                case "Author":
123                    $this->author = $matches[2];
124                    return;
125                    break;
126            }
127        }
128        $this->comment = $a_comment;
129    }
130
131    public function getComment()
132    {
133        return $this->comment;
134    }
135
136    public function setDuration($a_duration)
137    {
138        if (preg_match("/P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S/", $a_duration, $matches)) {
139            $this->duration = array(
140                "h" => $matches[4],
141                "m" => $matches[5],
142                "s" => $matches[6]
143            );
144        }
145    }
146
147    public function getDuration()
148    {
149        return $this->duration;
150    }
151
152    public function setQuestiontext($a_questiontext)
153    {
154        $this->questiontext = $a_questiontext;
155    }
156
157    public function getQuestiontext()
158    {
159        return $this->questiontext;
160    }
161
162    public function addResprocessing($a_resprocessing)
163    {
164        array_push($this->resprocessing, $a_resprocessing);
165    }
166
167    public function addItemfeedback($a_itemfeedback)
168    {
169        array_push($this->itemfeedback, $a_itemfeedback);
170    }
171
172    public function setMaxattempts($a_maxattempts)
173    {
174        $this->maxattempts = $a_maxattempts;
175    }
176
177    public function getMaxattempts()
178    {
179        return $this->maxattempts;
180    }
181
182    public function setLabel($a_label)
183    {
184        $this->label = $a_label;
185    }
186
187    public function getLabel()
188    {
189        return $this->label;
190    }
191
192    public function setXmllang($a_xmllang)
193    {
194        $this->xmllang = $a_xmllang;
195    }
196
197    public function getXmllang()
198    {
199        return $this->xmllang;
200    }
201
202    public function setPresentation($a_presentation)
203    {
204        $this->presentation = $a_presentation;
205    }
206
207    public function getPresentation()
208    {
209        return $this->presentation;
210    }
211
212    public function collectResponses()
213    {
214        $result = array();
215        if ($this->presentation != null) {
216        }
217    }
218
219    public function setQuestiontype($a_questiontype)
220    {
221        $this->questiontype = $a_questiontype;
222    }
223
224    public function getQuestiontype()
225    {
226        return $this->questiontype;
227    }
228
229    public function addPresentationitem($a_presentationitem)
230    {
231        array_push($this->presentationitem, $a_presentationitem);
232    }
233
234    public function determineQuestionType()
235    {
236        switch ($this->questiontype) {
237            case "ORDERING QUESTION":
238                return QT_ORDERING;
239            case "KPRIM CHOICE QUESTION":
240                return QT_KPRIM_CHOICE;
241            case "LONG MENU QUESTION":
242                return QT_LONG_MENU;
243            case "SINGLE CHOICE QUESTION":
244                return QT_MULTIPLE_CHOICE_SR;
245            case "MULTIPLE CHOICE QUESTION":
246                break;
247            case "MATCHING QUESTION":
248                return QT_MATCHING;
249            case "CLOZE QUESTION":
250                return QT_CLOZE;
251            case "IMAGE MAP QUESTION":
252                return QT_IMAGEMAP;
253            case "JAVA APPLET QUESTION":
254                return QT_JAVAAPPLET;
255            case "TEXT QUESTION":
256                return QT_TEXT;
257            case "NUMERIC QUESTION":
258                return QT_NUMERIC;
259            case "TEXTSUBSET QUESTION":
260                return QT_TEXTSUBSET;
261        }
262        if (!$this->presentation) {
263            return QT_UNKNOWN;
264        }
265        foreach ($this->presentation->order as $entry) {
266            switch ($entry["type"]) {
267                case "response":
268                    $response = $this->presentation->response[$entry["index"]];
269                    switch ($response->getResponsetype()) {
270                        case RT_RESPONSE_LID:
271                            switch ($response->getRCardinality()) {
272                                case R_CARDINALITY_ORDERED:
273                                    return QT_ORDERING;
274                                    break;
275                                case R_CARDINALITY_SINGLE:
276                                    return QT_MULTIPLE_CHOICE_SR;
277                                    break;
278                                case R_CARDINALITY_MULTIPLE:
279                                    return QT_MULTIPLE_CHOICE_MR;
280                                    break;
281                            }
282                            break;
283                        case RT_RESPONSE_XY:
284                            return QT_IMAGEMAP;
285                            break;
286                        case RT_RESPONSE_STR:
287                            switch ($response->getRCardinality()) {
288                                case R_CARDINALITY_ORDERED:
289                                    return QT_TEXT;
290                                    break;
291                                case R_CARDINALITY_SINGLE:
292                                    return QT_CLOZE;
293                                    break;
294                            }
295                            break;
296                        case RT_RESPONSE_GRP:
297                            return QT_MATCHING;
298                            break;
299                        default:
300                            break;
301                    }
302                    break;
303                case "material":
304                    $material = $this->presentation->material[$entry["index"]];
305                    if (is_array($material->matapplet) && count($material->matapplet) > 0) {
306                        return QT_JAVAAPPLET;
307                    }
308                    break;
309            }
310        }
311        if (strlen($this->questiontype) == 0) {
312            return QT_UNKNOWN;
313        } else {
314            return $this->questiontype;
315        }
316    }
317
318    public function setAuthor($a_author)
319    {
320        $this->author = $a_author;
321    }
322
323    public function getAuthor()
324    {
325        return $this->author;
326    }
327
328    /**
329     * @return string
330     */
331    public function getIliasSourceVersion()
332    {
333        return $this->iliasSourceVersion;
334    }
335
336    /**
337     * @param string $iliasSourceVersion
338     */
339    public function setIliasSourceVersion($iliasSourceVersion)
340    {
341        $this->iliasSourceVersion = $iliasSourceVersion;
342    }
343
344    /**
345     * @return null
346     */
347    public function getIliasSourceNic()
348    {
349        return $this->iliasSourceNic;
350    }
351
352    /**
353     * @param null $iliasSourceNic
354     */
355    public function setIliasSourceNic($iliasSourceNic)
356    {
357        $this->iliasSourceNic = $iliasSourceNic;
358    }
359
360    public function addSuggestedSolution($a_solution, $a_gap_index)
361    {
362        array_push($this->suggested_solutions, array("solution" => $a_solution, "gap_index" => $a_gap_index));
363    }
364
365    public function addMetadata($a_metadata)
366    {
367        array_push($this->itemmetadata, $a_metadata);
368    }
369
370    public function getMetadata()
371    {
372        return $this->itemmetadata;
373    }
374
375    public function getMetadataEntry($a_label)
376    {
377        foreach ($this->itemmetadata as $metadata) {
378            if (strcmp($metadata["label"], $a_label) == 0) {
379                return $metadata["entry"];
380            }
381        }
382        return null;
383    }
384}
385