1<?php
2
3/* Copyright (c) 1998-2011 ILIAS open source, Extended GPL, see docs/LICENSE */
4
5require_once("./Services/COPage/classes/class.ilPageContentGUI.php");
6require_once("./Services/COPage/classes/class.ilPCInteractiveImage.php");
7include_once("./Services/COPage/classes/class.ilMediaAliasItem.php");
8
9/**
10 * User interface class for interactive images
11 *
12 * @author Alex Killing <alex.killing@gmx.de>
13 * @version $Id$
14 *
15 * @ilCtrl_Calls ilPCInteractiveImageGUI: ilPCIIMTriggerEditorGUI
16 *
17 * @ingroup ServicesCOPage
18 */
19class ilPCInteractiveImageGUI extends ilPageContentGUI
20{
21    /**
22     * @var ilTabsGUI
23     */
24    protected $tabs;
25
26    /**
27     * @var ilToolbarGUI
28     */
29    protected $toolbar;
30
31    public function __construct($a_pg_obj, $a_content_obj, $a_hier_id = 0, $a_pc_id = "")
32    {
33        global $DIC;
34
35        $this->tpl = $DIC["tpl"];
36        $this->lng = $DIC->language();
37        $this->tabs = $DIC->tabs();
38        $this->ctrl = $DIC->ctrl();
39        $this->toolbar = $DIC->toolbar();
40        parent::__construct($a_pg_obj, $a_content_obj, $a_hier_id, $a_pc_id);
41    }
42
43    /**
44    * execute command
45    */
46    public function executeCommand()
47    {
48        $tpl = $this->tpl;
49        $lng = $this->lng;
50        $ilTabs = $this->tabs;
51
52
53        //		$this->getCharacteristicsOfCurrentStyle("media_cont");	// scorm-2004
54
55        // get next class that processes or forwards current command
56        $next_class = $this->ctrl->getNextClass($this);
57
58        // get current command
59        $cmd = $this->ctrl->getCmd();
60
61        if (is_object($this->content_obj)) {
62            $tpl->setTitleIcon(ilUtil::getImagePath("icon_mob.svg"));
63            $this->getTabs($this->tabs_gui);
64
65        /*			$mob = $this->content_obj->getMediaObject();
66                    if (is_object($mob))
67                    {
68                        $tpl->setVariable("HEADER", $lng->txt("mob").": ".
69                            $this->content_obj->getMediaObject()->getTitle());
70                        $mob_gui = new ilObjMediaObjectGUI("", $this->content_obj->getMediaObject()->getId(),false, false);
71                        $mob_gui->setBackTitle($this->page_back_title);
72                        $mob_gui->setEnabledMapAreas($this->getEnabledMapAreas());
73                        $mob_gui->getTabs($this->tabs_gui);
74                    }*/
75        } else {
76        }
77
78        switch ($next_class) {
79            // trigger editor
80            case "ilpciimtriggereditorgui":
81                require_once("./Services/COPage/classes/class.ilPCIIMTriggerEditorGUI.php");
82                $ilTabs->setTabActive("triggers");
83                $image_map_edit = new ilPCIIMTriggerEditorGUI(
84                    $this->content_obj,
85                    $this->pg_obj
86                );
87                $ret = $this->ctrl->forwardCommand($image_map_edit);
88                if ($ret != "") {
89                    $tpl->setContent($ret);
90                }
91                break;
92
93            default:
94                $ret = $this->$cmd();
95                break;
96        }
97
98        return $ret;
99    }
100
101    /**
102     * Add tabs to ilTabsGUI object
103     *
104     * @param	object		$tab_gui		ilTabsGUI object
105     * @param	boolean		$a_create		new creation true/false
106     */
107    public function getTabs(&$tab_gui, $a_create = false, $a_change_obj_ref = false)
108    {
109        $ilCtrl = $this->ctrl;
110        $ilTabs = $this->tabs;
111        $lng = $this->lng;
112
113        if (!$a_create) {
114            $ilTabs->setBackTarget(
115                $lng->txt("pg"),
116                $ilCtrl->getParentReturn($this)
117                );
118
119            $ilTabs->addTab(
120                "triggers",
121                $lng->txt("cont_active_areas"),
122                $ilCtrl->getLinkTargetByClass("ilpciimtriggereditorgui", "editMapAreas")
123                );
124
125            $ilTabs->addTab(
126                "list_overlays",
127                $lng->txt("cont_overlay_images"),
128                $ilCtrl->getLinkTarget($this, "listOverlayImages")
129                );
130
131            $ilTabs->addTab(
132                "content_popups",
133                $lng->txt("cont_content_popups"),
134                $ilCtrl->getLinkTarget($this, "listContentPopups")
135                );
136
137            $ilTabs->addTab(
138                "edit_base_image",
139                $lng->txt("cont_base_image") . " & " . $lng->txt("cont_caption"),
140                $ilCtrl->getLinkTarget($this, "editBaseImage")
141                );
142        }
143    }
144
145    /**
146     * Insert new media object form.
147     */
148    public function insert($a_post_cmd = "edpost", $a_submit_cmd = "create_mob", $a_input_error = false)
149    {
150        $ilTabs = $this->tabs;
151        $tpl = $this->tpl;
152        $ilCtrl = $this->ctrl;
153        $lng = $this->lng;
154
155        ilUtil::sendInfo($lng->txt("cont_iim_create_info"));
156
157        //		$this->getTabs($ilTabs, true);
158        //		$ilTabs->setSubTabActive("cont_new_mob");
159
160        if ($a_input_error) {
161            $form = $this->form;
162        } else {
163            $form = $this->initForm("create");
164        }
165        $form->setFormAction($ilCtrl->getFormAction($this));
166
167        $this->displayValidationError();
168
169        $tpl->setContent($form->getHTML());
170    }
171
172    /**
173     * Edit
174     */
175    public function edit()
176    {
177        $tpl = $this->tpl;
178        $ilCtrl = $this->ctrl;
179
180        $ilCtrl->redirectByClass(array("ilpcinteractiveimagegui", "ilpciimtriggereditorgui"), "editMapAreas");
181        //$tpl->setContent("hh");
182    }
183
184    /**
185     * Edit base image
186     *
187     * @param
188     * @return
189     */
190    public function editBaseImage($a_form = null)
191    {
192        $tpl = $this->tpl;
193        $ilTabs = $this->tabs;
194        $lng = $this->lng;
195
196        $ilTabs->activateTab("edit_base_image");
197
198        $form = $this->initForm();
199        $tpl->setContent($form->getHTML());
200    }
201
202
203    /**
204     * Init creation/base image form.
205     *
206     * @param        int        $a_mode        Edit Mode
207     */
208    public function initForm($a_mode = "edit")
209    {
210        $lng = $this->lng;
211        $ilCtrl = $this->ctrl;
212
213        include_once("Services/Form/classes/class.ilPropertyFormGUI.php");
214        $form = new ilPropertyFormGUI();
215
216        // image file
217        $fi = new ilImageFileInputGUI($lng->txt("cont_file"), "image_file");
218        $fi->setAllowDeletion(false);
219        if ($a_mode == "edit") {
220            $fi->setImage($this->content_obj->getBaseThumbnailTarget());
221        }
222        $form->addItem($fi);
223
224        if ($a_mode == "edit") {
225            // caption
226            $ti = new ilTextInputGUI($this->lng->txt("cont_caption"), "caption");
227            $ti->setMaxLength(200);
228            $ti->setSize(50);
229            $form->addItem($ti);
230        }
231
232        // save and cancel commands
233        if ($a_mode == "create") {
234            $form->setTitle($lng->txt("cont_ed_insert_iim"));
235            $form->addCommandButton("create_iim", $lng->txt("save"));
236            $form->addCommandButton("cancelCreate", $lng->txt("cancel"));
237        } else {
238            // get caption
239            $std_alias_item = new ilMediaAliasItem(
240                $this->dom,
241                $this->getHierId(),
242                "Standard",
243                $this->content_obj->getPcId(),
244                "InteractiveImage"
245            );
246            $ti->setValue($std_alias_item->getCaption());
247
248            $form->setTitle($lng->txt("cont_edit_base_image"));
249            $form->addCommandButton("update", $lng->txt("save"));
250        }
251
252        $form->setFormAction($ilCtrl->getFormAction($this));
253
254        return $form;
255    }
256
257    /**
258     * Create new content element
259     */
260    public function create()
261    {
262        $ilCtrl = $this->ctrl;
263        $lng = $this->lng;
264
265        $this->content_obj = new ilPCInteractiveImage($this->getPage());
266        $this->content_obj->createMediaObject();
267        $media_obj = $this->content_obj->getMediaObject();
268        $media_obj->setTitle($_FILES['image_file']['name']);
269        $media_obj->create();
270        $mob_dir = ilObjMediaObject::_getDirectory($media_obj->getId());
271        //		$media_obj->setStandardType("File");
272        $media_obj->createDirectory();
273        $media_item = new ilMediaItem();
274        $media_obj->addMediaItem($media_item);
275        $media_item->setPurpose("Standard");
276
277        $file = $mob_dir . "/" . $_FILES['image_file']['name'];
278        ilUtil::moveUploadedFile(
279            $_FILES['image_file']['tmp_name'],
280            $_FILES['image_file']['name'],
281            $file
282        );
283
284        // get mime type
285        $format = ilObjMediaObject::getMimeType($file);
286        $location = $_FILES['image_file']['name'];
287
288        // set real meta and object data
289        $media_item->setFormat($format);
290        $media_item->setLocation($location);
291        $media_item->setLocationType("LocalFile");
292
293        ilUtil::renameExecutables($mob_dir);
294        $media_obj->update();
295
296        $this->content_obj->createAlias($this->pg_obj, $this->hier_id, $this->pc_id);
297        $this->updated = $this->pg_obj->update();
298        if ($this->updated === true) {
299            $this->pg_obj->stripHierIDs();
300            $this->pg_obj->addHierIDs();
301            $ilCtrl->setParameter($this, "hier_id", $this->content_obj->readHierId());
302            $ilCtrl->setParameter($this, "pc_id", $this->content_obj->readPCId());
303            $this->content_obj->setHierId($this->content_obj->readHierId());
304            $this->setHierId($this->content_obj->readHierId());
305            $this->content_obj->setPCId($this->content_obj->readPCId());
306            ilUtil::sendSuccess($lng->txt("cont_saved_interactive_image"), true);
307            $this->ctrl->redirectByClass("ilpcinteractiveimagegui", "edit");
308
309        //$this->ctrl->returnToParent($this, "jump".$this->hier_id);
310        } else {
311            $this->insert();
312        }
313    }
314
315    /**
316     * Update (base image)
317     */
318    public function update()
319    {
320        $ilCtrl = $this->ctrl;
321        $lng = $this->lng;
322
323        $mob = $this->content_obj->getMediaObject();
324        $mob_dir = ilObjMediaObject::_getDirectory($mob->getId());
325        $std_item = $mob->getMediaItem("Standard");
326        $location = $_FILES['image_file']['name'];
327
328        if ($location != "" && is_file($_FILES['image_file']['tmp_name'])) {
329            $file = $mob_dir . "/" . $_FILES['image_file']['name'];
330            ilUtil::moveUploadedFile(
331                $_FILES['image_file']['tmp_name'],
332                $_FILES['image_file']['name'],
333                $file
334            );
335
336            // get mime type
337            $format = ilObjMediaObject::getMimeType($file);
338            $location = $_FILES['image_file']['name'];
339            $std_item->setFormat($format);
340            $std_item->setLocation($location);
341            $std_item->setLocationType("LocalFile");
342            $mob->setDescription($format);
343            $mob->update();
344        }
345
346        // set caption
347        $std_alias_item = new ilMediaAliasItem(
348            $this->dom,
349            $this->getHierId(),
350            "Standard",
351            $this->content_obj->getPcId(),
352            "InteractiveImage"
353        );
354        $std_alias_item->setCaption(ilUtil::stripSlashes($_POST["caption"]));
355        $_SESSION["il_pg_error"] = $this->pg_obj->update();
356        ilUtil::sendSuccess($lng->txt("msg_obj_modified"), true);
357
358        $ilCtrl->redirectByClass("ilpcinteractiveimagegui", "editBaseImage");
359    }
360
361
362    /**
363     * Align media object to center
364     */
365    public function centerAlign()
366    {
367        $std_alias_item = new ilMediaAliasItem(
368            $this->dom,
369            $this->getHierId(),
370            "Standard",
371            $this->content_obj->getPcId(),
372            "InteractiveImage"
373        );
374        $std_alias_item->setHorizontalAlign("Center");
375        $_SESSION["il_pg_error"] = $this->pg_obj->update();
376        $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
377    }
378
379    /**
380     * align media object to left
381     */
382    public function leftAlign()
383    {
384        $std_alias_item = new ilMediaAliasItem(
385            $this->dom,
386            $this->getHierId(),
387            "Standard",
388            $this->content_obj->getPcId(),
389            "InteractiveImage"
390        );
391        $std_alias_item->setHorizontalAlign("Left");
392        $_SESSION["il_pg_error"] = $this->pg_obj->update();
393        $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
394    }
395
396    /**
397     * align media object to right
398     */
399    public function rightAlign()
400    {
401        $std_alias_item = new ilMediaAliasItem(
402            $this->dom,
403            $this->getHierId(),
404            "Standard",
405            $this->content_obj->getPcId(),
406            "InteractiveImage"
407        );
408        $std_alias_item->setHorizontalAlign("Right");
409        $_SESSION["il_pg_error"] = $this->pg_obj->update();
410        $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
411    }
412
413    /**
414     * align media object to left, floating text
415     */
416    public function leftFloatAlign()
417    {
418        $std_alias_item = new ilMediaAliasItem(
419            $this->dom,
420            $this->getHierId(),
421            "Standard",
422            $this->content_obj->getPcId(),
423            "InteractiveImage"
424        );
425        $std_alias_item->setHorizontalAlign("LeftFloat");
426        $_SESSION["il_pg_error"] = $this->pg_obj->update();
427        $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
428    }
429
430    /**
431     * align media object to right, floating text
432     */
433    public function rightFloatAlign()
434    {
435        $std_alias_item = new ilMediaAliasItem(
436            $this->dom,
437            $this->getHierId(),
438            "Standard",
439            $this->content_obj->getPcId(),
440            "InteractiveImage"
441        );
442        $std_alias_item->setHorizontalAlign("RightFloat");
443        $_SESSION["il_pg_error"] = $this->pg_obj->update();
444        $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
445    }
446
447    ////
448    //// Overlay Images
449    ////
450
451    /**
452     * List overlay images
453     *
454     * @param
455     * @return
456     */
457    public function listOverlayImages()
458    {
459        $tpl = $this->tpl;
460        $ilToolbar = $this->toolbar;
461        $ilCtrl = $this->ctrl;
462        $ilTabs = $this->tabs;
463        $lng = $this->lng;
464
465        ilUtil::sendInfo($lng->txt("cont_iim_overlay_info"));
466
467        $ilTabs->setTabActive("list_overlays");
468
469        $ilToolbar->addButton(
470            $lng->txt("cont_add_images"),
471            $ilCtrl->getLinkTarget($this, "addOverlayImages")
472        );
473
474        include_once("./Services/COPage/classes/class.ilPCIIMOverlaysTableGUI.php");
475        $tab = new ilPCIIMOverlaysTableGUI(
476            $this,
477            "listOverlayImages",
478            $this->content_obj->getMediaObject()
479        );
480        $tpl->setContent($tab->getHTML());
481    }
482
483    /**
484     * Add overlay images
485     */
486    public function addOverlayImages($a_form = null)
487    {
488        $tpl = $this->tpl;
489
490        if ($a_form) {
491            $form = $a_form;
492        } else {
493            $form = $this->initAddOverlaysForm();
494        }
495
496        $tpl->setContent($form->getHTML());
497    }
498
499    /**
500     * Init add overlays form
501     *
502     * @param
503     * @return
504     */
505    public function initAddOverlaysForm()
506    {
507        $lng = $this->lng;
508        $ilCtrl = $this->ctrl;
509        $ilTabs = $this->tabs;
510
511        $ilTabs->setTabActive("list_overlays");
512
513        include_once("Services/Form/classes/class.ilPropertyFormGUI.php");
514        $form = new ilPropertyFormGUI();
515        $form->setTitle($lng->txt("cont_add_images"));
516        $form->setFormAction($ilCtrl->getFormAction($this));
517
518        // file input
519        include_once("./Services/Form/classes/class.ilFileWizardInputGUI.php");
520        $fi = new ilFileWizardInputGUI($lng->txt("file"), "ovfile");
521        $fi->setSuffixes(array("gif", "jpeg", "jpg", "png"));
522        $fi->setFilenames(array(0 => ''));
523        $fi->setRequired(true);
524        $form->addItem($fi);
525
526        $form->addCommandButton("uploadOverlayImages", $lng->txt("upload"));
527        $form->addCommandButton("listOverlayImages", $lng->txt("cancel"));
528
529        return $form;
530    }
531
532
533    /**
534     * Upload overlay images
535     *
536     * @param
537     * @return
538     */
539    public function uploadOverlayImages()
540    {
541        $lng = $this->lng;
542        $ilCtrl = $this->ctrl;
543
544        $form = $this->initAddOverlaysForm();
545        if ($form->checkInput()) {
546            if (is_array($_FILES["ovfile"]["name"])) {
547                foreach ($_FILES["ovfile"]["name"] as $k => $v) {
548                    $name = $_FILES["ovfile"]["name"][$k];
549                    $mime = $_FILES["ovfile"]["type"][$k];
550                    $tmp_name = $_FILES["ovfile"]["tmp_name"][$k];
551                    $size = $_FILES["ovfile"]["size"][$k];
552
553                    $this->content_obj->getMediaObject()->uploadAdditionalFile(
554                        $name,
555                        $tmp_name,
556                        "overlays"
557                    );
558                    $piname = pathinfo($name);
559                    $this->content_obj->getMediaObject()->makeThumbnail(
560                        "overlays/" . $name,
561                        basename($name, "." . $piname['extension']) . ".png"
562                    );
563                }
564            }
565            ilUtil::sendSuccess($lng->txt("msg_obj_modified"));
566            $ilCtrl->redirect($this, "listOverlayImages");
567        } else {
568            $form->setValuesByPost();
569            $this->addOverlayImages($form);
570        }
571    }
572
573    /**
574    * Confirm overlay deletion
575    */
576    public function confirmDeleteOverlays()
577    {
578        $ilCtrl = $this->ctrl;
579        $tpl = $this->tpl;
580        $lng = $this->lng;
581        $ilTabs = $this->tabs;
582
583        $ilTabs->setTabActive("list_overlays");
584
585        if (!is_array($_POST["file"]) || count($_POST["file"]) == 0) {
586            ilUtil::sendFailure($lng->txt("no_checkbox"), true);
587            $ilCtrl->redirect($this, "listOverlayImages");
588        } else {
589            include_once("./Services/Utilities/classes/class.ilConfirmationGUI.php");
590            $cgui = new ilConfirmationGUI();
591            $cgui->setFormAction($ilCtrl->getFormAction($this));
592            $cgui->setHeaderText($lng->txt("cont_really_delete_overlays"));
593            $cgui->setCancel($lng->txt("cancel"), "listOverlayImages");
594            $cgui->setConfirm($lng->txt("delete"), "deleteOverlays");
595
596            foreach ($_POST["file"] as $i => $d) {
597                $cgui->addItem("file[]", $i, $i);
598            }
599
600            $tpl->setContent($cgui->getHTML());
601        }
602    }
603
604    /**
605     * Delete overlays
606     */
607    public function deleteOverlays()
608    {
609        $ilCtrl = $this->ctrl;
610        $lng = $this->lng;
611
612        if (is_array($_POST["file"]) && count($_POST["file"]) != 0) {
613            foreach ($_POST["file"] as $f) {
614                $f = str_replace("..", "", ilUtil::stripSlashes($f));
615                $this->content_obj->getMediaObject()
616                    ->removeAdditionalFile("overlays/" . $f);
617            }
618
619            ilUtil::sendSuccess($lng->txt("cont_overlays_have_been_deleted"), true);
620        }
621        $ilCtrl->redirect($this, "listOverlayImages");
622    }
623
624
625    ////
626    //// Content Popups
627    ////
628
629    /**
630     * List content popups
631     */
632    public function listContentPopups()
633    {
634        $tpl = $this->tpl;
635        $ilToolbar = $this->toolbar;
636        $ilCtrl = $this->ctrl;
637        $ilTabs = $this->tabs;
638        $lng = $this->lng;
639
640        ilUtil::sendInfo($lng->txt("cont_iim_content_popups_info"));
641
642        $ilTabs->setTabActive("content_popups");
643
644        $ilToolbar->addButton(
645            $lng->txt("cont_add_popup"),
646            $ilCtrl->getLinkTarget($this, "addPopup")
647        );
648
649        include_once("./Services/COPage/classes/class.ilPCIIMPopupTableGUI.php");
650        $tab = new ilPCIIMPopupTableGUI(
651            $this,
652            "listContentPopups",
653            $this->content_obj
654        );
655        $tpl->setContent($tab->getHTML());
656    }
657
658    /**
659     * Add popup
660     *
661     * @param
662     * @return
663     */
664    public function addPopup()
665    {
666        $ilCtrl = $this->ctrl;
667        $lng = $this->lng;
668
669        $this->content_obj->addContentPopup();
670        $this->pg_obj->update();
671        ilUtil::sendSuccess($lng->txt("msg_obj_modified"), true);
672        $ilCtrl->redirect($this, "listContentPopups");
673    }
674
675    /**
676     * Save popups
677     */
678    public function savePopups()
679    {
680        $ilCtrl = $this->ctrl;
681        $lng = $this->lng;
682
683        if (is_array($_POST["title"])) {
684            $titles = ilUtil::stripSlashesArray($_POST["title"]);
685            $this->content_obj->savePopUps($titles);
686            $this->pg_obj->update();
687            ilUtil::sendSuccess($lng->txt("msg_obj_modified"), true);
688        }
689        $ilCtrl->redirect($this, "listContentPopups");
690    }
691
692    /**
693     * Confirm popup deletion
694     */
695    public function confirmPopupDeletion()
696    {
697        $ilCtrl = $this->ctrl;
698        $tpl = $this->tpl;
699        $lng = $this->lng;
700        $ilTabs = $this->tabs;
701
702        $ilTabs->setTabActive("content_popups");
703
704        if (!is_array($_POST["tid"]) || count($_POST["tid"]) == 0) {
705            ilUtil::sendFailure($lng->txt("no_checkbox"), true);
706            $ilCtrl->redirect($this, "listContentPopups");
707        } else {
708            include_once("./Services/Utilities/classes/class.ilConfirmationGUI.php");
709            $cgui = new ilConfirmationGUI();
710            $cgui->setFormAction($ilCtrl->getFormAction($this));
711            $cgui->setHeaderText($lng->txt("cont_really_delete_popups"));
712            $cgui->setCancel($lng->txt("cancel"), "listContentPopups");
713            $cgui->setConfirm($lng->txt("delete"), "deletePopups");
714
715            foreach ($_POST["tid"] as $i => $d) {
716                $cgui->addItem("tid[]", $i, $_POST["title"][$i]);
717            }
718
719            $tpl->setContent($cgui->getHTML());
720        }
721    }
722
723    /**
724     * Delete popups
725     *
726     * @param
727     * @return
728     */
729    public function deletePopups()
730    {
731        $lng = $this->lng;
732        $ilCtrl = $this->ctrl;
733
734        if (is_array($_POST["tid"]) && count($_POST["tid"]) != 0) {
735            foreach ($_POST["tid"] as $id) {
736                $id = explode(":", $id);
737                $this->content_obj->deletePopup($id[0], $id[1]);
738            }
739            $this->pg_obj->update();
740            ilUtil::sendSuccess($lng->txt("cont_popups_have_been_deleted"), true);
741        }
742        $ilCtrl->redirect($this, "listContentPopups");
743    }
744}
745