PageSourceSearch

https://ta-tum.com/js/modules/teacher/classroom/TeacherClassroom.js

js ta-tum.com collected 2026-09-24 11:29:05 UTC 80,332 bytes, 1,590 lines download raw bytes

1/**
2 * Module Teacher Classroom (Classroom Projects) 
3 * Funcionalidad principal: mostrar los projectos de la clase y realizar operaciones con ellos
4 * @description Modelo/Vista/Controlador para clase del profesor
5 * @author Alejandro Micheloud
6 */
7
8var TeacherClassroom = function (sco) {
9    var scope = sco;
10    var _this = this;
11    var builded = false;
12    var classroom_guid = null;
13    var classroom = null;
14    var last_changestatus_operation = null;
15    var ModalProject = null;
16    var ModalArchivedProject = null;
17    var ModalImprimibles = null;
18    var ModalEpisodes = null;
19    var project_edition = null;
20    var mStudents = null,
21        mBooks = null,
22        mBookStudents = null,
23        mGradebook = null,
24        mGlobalEduca = null;
25    var ModalClassroomSelector = null;
26    var ModalTeacherClassroomSelector = null;
27    var haveTwoOrMoreClassrooms = false;
28    var selectedProjectGuid = null;
29    var fromProjectGuid = null;
30
31    /**
32     * Se invoca cuando el módulo recibe foco
33     * @returns {undefined}
34     */
35    function show(section) {
36        console.log("TeacherClassroom:show(" + section + ");");
37        classroom_guid = mTeacherHome.getClassroomGuid();
38        var first_load = false;
39        if (!builded) {
40            first_load = true;
41            build(function () {
42                showTab(section);
43            });
44            scope = scope.find(".d-teacher-classrooms");
45        } else {
46            showTab(section);
47        }
48        mTeacherHome.getLibraryProjectModule().setCurrentClassroomGUID(classroom_guid);
49        //mTeacherHome.getLibraryProjectModule().setCurrentBackTo(null);
50
51        if (section === "projects" || first_load)
52            getClassroom();
53
54        scope.show();
55        $(window).scrollTop(0);
56    }
57
58    /**
59     * Show loading
60     * @returns {undefined}
61     */
62    function showLoading() {
63        scope.find(".d-teacher-classrooms .d-card-projects").html(getHtmlLoader());
64    }
65
66    /**
67     * Hide loading
68     * @returns {undefined}
69     */
70    function hideLoading() {
71        scope.find(".d-teacher-classrooms .d-card-projects .d-loader").remove();
72    }
73
74    // pasar a un solo request que obtenga, info de clase + proyectos de clase
75    function getClassroom() {
76        console.log("TeacherClassroom:getClassroom()");
77        //if (classroom_guid === null)
78        classroom_guid = mTeacherHome.getClassroomGuid();
79        showLoading();
80        $(".m-home.d-teacher .d-classroom-info").hide();
81        mCom.ajax("classroom/" + classroom_guid, "GET", "", function (data, status) {
82            console.log("addSchool() result");
83            if (status === "success") {
84                classroom = data;
85                mTeacherHome.setCurrentClassroom(classroom);
86                renderClassroom();
87            }
88        }, function (err, status, msg) {
89            mToast.toast(lang.classroom_get_error, 3000);
90        });
91    }
92
93    function switchEnabledMessage() {
94        mDiscover.showLoading();
95
96        var data = {};
97        data.classroom_guid = mTeacherHome.getCurrentClassroom().guid;
98        data.is_enabled_message = scope.find(".d-header-link-left input").is(":checked") ? 1 : 0;
99        mCom.ajax("classroom/set-enabled-message", "PUT", data, function (data, status) {
100            console.log("addSchool() result");
101            if (data.is_enabled_message === 1) {
102                mToast.toast(lang.classroom_messages_chk_changeto_enabled);
103            } else {
104                mToast.toast(lang.classroom_messages_chk_changeto_disabled);
105            }
106            mDiscover.hideLoading();
107        }, function (err, status, msg) {
108            mToast.toast(lang.classroom_messages_chk_changeto_fail, 3000);
109            mDiscover.hideLoading();
110        });
111
112    }
113
114    function renderClassroom() {
115
116        // set config enabled message
117        scope.find(".d-header-link-left input").prop("checked", mTeacherHome.getCurrentClassroom().is_enabled_message === 1);
118
119        // render header info of classroom
120        if (!$(".m-home.d-teacher .d-classroom-info").hasClass("hide")) {
121            $(".m-home.d-teacher .d-classroom-info .icon").show();
122            $(".m-home.d-teacher .d-classroom-info").show();
123        }
124
125        // set episode info
126        $(".d-module.m-home.d-teacher").removeClass("episode1 episode2");
127        $(".d-module.m-home.d-teacher").addClass(mTeacherHome.getCurrentClassroom().episode_guid);
128        $(".header .image-top .btn.video .d-label").html(lang["view_video_" + mTeacherHome.getCurrentClassroom().episode_status]);
129        $(".header .image-top .episode-name").html(lang["admin_classroom_episodes_" + mTeacherHome.getCurrentClassroom().episode_guid + "_name"]);
130        $(".header .image-top .episode-title").html(lang["admin_classroom_episodes_" + mTeacherHome.getCurrentClassroom().episode_guid + "_title"]);
131
132
133        getProjects();
134    }
135
136    function getProjects() {
137
138        scope.find(".d-card-projects-bg-glass").hide();
139        scope.find(".d-card-projects").html(getHtmlLoader());
140
141        mCom.ajax("classroom/projects/" + classroom_guid, "GET", "", function (data, status) {
142            console.log("getProjects() result");
143            if (status === "success") {
144                renderProjects(data.projects);
145                if (data.archived_amount > 0) {
146                    scope.find(".d-tab-content.projects .d-header-link").show();
147                } else {
148                    scope.find(".d-tab-content.projects .d-header-link").hide();
149                }
150            }
151        }, function (err, status, msg) {
152            mToast.toast(lang.classroom_projects_get_error, 3000);
153        });
154    }
155
156    function changeStatusProject(project, new_status) {
157        showLoading();
158        console.log("changeStatusProject()");
159        console.log(project);
160
161        var data = {};
162        data.guid = project.guid;
163        data.new_status = new_status;
164        data.classroom_guid = mTeacherHome.getClassroomGuid();
165        last_changestatus_operation = new_status;
166
167        mCom.ajax("project/changestatus", "PUT", data, function (data, status) {
168            console.log("changeStatusProject() result");
169            if (status === "success") {
170                getProjects();
171                mTeacherHome.refreshClassrooms();
172            }
173        }, function (err, status, msg) {
174            mToast.toast(lang.classroom_projects_changestatus_error, 3000);
175        });
176
177    }
178
179    function saveProjectInfo() {
180        var data = {};
181        //console.log(project_edition);
182        data.guid = project_edition.project_guid;
183        data.title = $("#modal-container .d-classroom-project-form #d-classroom-project-form_title").val();
184        data.description = $("#modal-container .d-classroom-project-form #d-classroom-project-form_description").val();
185        console.log("saveProjectInfo()");
186        console.log(data);
187        mDiscover.showLoading();
188
189        mCom.ajax("project/save-info", "PUT", data, function (data, status) {
190            mDiscover.hideLoading();
191
192            mToast.toast(lang.classroom_projects_project_info_save_successful, 3000);
193            ModalProject.hide();
194            mTeacherHome.refreshClassrooms();
195            mTeacherHome.getTeacherClassromProjectModule().reset();
196            if (status === "success")
197                getProjects();
198        }, function (err, status, msg) {
199            mDiscover.hideLoading();
200            mToast.toast(lang.classroom_projects_project_info_save_error, 3000);
201        });
202    }
203    function hideDropdowns() {
204        scope.find(".d-card .dropdown").hide();
205    }
206
207    function showChangeState($card) {
208        $card.find(".d-change-status").toggle();
209        if ($card.is(":visible")) {
210            scope.find(".d-card-projects-bg-glass").show().off("click").on("click", function () {
211                scope.find(".d-card.project .d-change-status").hide();
212                scope.find(".d-card-projects-bg-glass").hide();
213            });
214        }
215    }
216
217    function shareProject(_fromProjectGuid) {
218        fromProjectGuid = _fromProjectGuid
219        mDiscover.showLoading();
220        mCom.ajax("school-teachers-classrooms", "GET", {}, function (data, status) {
221            mDiscover.hideLoading();
222            console.log(data);
223            if (data.length === 0) {
224                mToast.toast(lang.classroom_project_share_empty_teachers, 3000);
225                return;
226            }
227            renderTeacherClassrooms(data);
228            ModalTeacherClassroomSelector.show();
229        }, function (err, status, msg) {
230            mToast.toast(lang.school_get_error, 3000);
231            mDiscover.hideLoading();
232        });
233    }
234
235    function shareDo(toClassroomGuids) {
236        console.log(`fromProjectGuid: ${fromProjectGuid} toClassroomGuids[0]: ${toClassroomGuids[0]}`);
237        mDiscover.showLoading();
238        mCom.ajax("classroom/project/duplicate-project", "POST", {
239            classroom_project_guid: fromProjectGuid,
240            to_classroom_guids: toClassroomGuids,
241            templateName: (lang.classroom_project_share_project_name || "Copia de {PROJECT_NAME}")
242        }, function (data, status) {
243            mDiscover.hideLoading();
244            if (status === "success") {
245                mToast.toast((lang.classroom_project_share_successful || "El caso se ha duplicado correctamente"), 3000);
246                mDiscover.openInfo(lang.classroom_project_share_disclamer_title, lang.classroom_project_share_disclamer_message);
247            }
248
249        }, function (err, status, msg) {
250            mToast.toast((lang.classroom_project_duplicate_error || "Ocurrió un problema al duplicar"), 3000);
251            mDiscover.hideLoading();
252        });
253    }
254
255    function duplicateProject(projectGuid) {
256        selectedProjectGuid = projectGuid;
257        ModalClassroomSelector.show();
258        getClassrooms();
259    }
260    function renderTeacherClassrooms(teachers) {
261        getModalSelectTeacherClassroom().find(".d-content").html('');
262        for (var i = 0; i < teachers.length; i++) {
263            const teacher = teachers[i];
264            getModalSelectTeacherClassroom().find(".d-content").append(getHtmlTeacherClassroomItem(teacher));
265        }
266        getModalSelectTeacherClassroom().find(".d-content .teacher-toogle").click(function () {
267            if ($(this).hasClass("active")) {
268                $(this).removeClass("active");
269                $(this).closest(".d-teacher").removeClass("active").find(".classrooms").hide();
270            } else {
271                $(this).addClass("active");
272                $(this).closest(".d-teacher").addClass("active").find(".classrooms").show();
273            }
274        });
275        getModalSelectTeacherClassroom().find(".d-content input[type='checkbox']").on("change", function () {
276            var checkbox = $(this);
277            if (checkbox.is(":checked")) {
278                getModalSelectTeacherClassroom().find(".d-content input[type='checkbox']").prop("checked", false);
279                checkbox.prop("checked", true);
280            } 
281        });
282    }
283    function duplicateProjectsDo(classroomGuids) {
284        mDiscover.showLoading();
285        mCom.ajax("classroom/project/duplicate-project", "POST", {
286            classroom_project_guid: selectedProjectGuid,
287            to_classroom_guids: classroomGuids,
288            templateName: (lang.classroom_project_duplicate_template_name || "Copia de {PROJECT_NAME}")
289        }, function (data, status) {
290            mDiscover.hideLoading();
291            if (status === "success") {
292                mToast.toast((lang.classroom_project_duplicate_successful || "El caso se ha duplicado correctamente"), 3000);
293                getProjects();
294            }
295
296            // reload classrooms of home page
297            mTeacherHome.refreshClassrooms();
298
299        }, function (err, status, msg) {
300            mToast.toast((lang.classroom_project_duplicate_error || "Ocurrió un problema al duplicar"), 3000);
301            mDiscover.hideLoading();
302        });
303    }
304    function getClassrooms() {
305        mDiscover.showLoading();
306        getModalSelectClassrooms().find(".d-content").html();
307        getModalSelectClassrooms().find(".btn-submit").addClass("disabled");
308
309        mCom.ajax("classroom/teacher", "GET", "", function (data, status) {
310            console.log("getClassroomOfTeacher() result");
311            mDiscover.hideLoading();
312            if (status === "success") {
313                const classrooms = data.classrooms.filter(classroom => classroom.guid !== mTeacherHome.getClassroomGuid());
314                renderClassrooms(classrooms);
315                console.log(`classrooms.length: ${classrooms.length}`)
316                if (classrooms.length > 0) {
317                    haveTwoOrMoreClassrooms = true;
318                }
319            }
320        }, function (err, status, msg) {
321            hideLoading();
322            mToast.toast(lang.school_get_error, 3000);
323        });
324    }
325
326    function renderClassrooms(data) {
327        console.log(data);
328        getModalSelectClassrooms().find(".btn-submit").removeClass("disabled");
329        getModalSelectClassrooms().find(".d-content").html('');
330        if (data.length === 0) {
331            // message + link
332            // getModalSelectClassrooms().find(".d-content").append(getHtmlClassroomHelp());
333            getModalSelectClassrooms().find(".d-content .d-message a").click(function () {
334                ModalClassroomSelector.hide();
335                routie("#teacher/home");
336            });
337            // disable buttons
338            getModalSelectClassrooms().find(".modal-footer").hide();
339        } else {
340            // enable buttons
341            getModalSelectClassrooms().find(".modal-footer").show();
342            for (var i = 0; i < data.length; i++) {
343                getModalSelectClassrooms().find(".d-content").append(getHtmlClassroomItem(data[i])).find(".d-classroom").last().data(data[i]);
344            }
345        }
346    }
347
348    function renderProjects(data) {
349        // render project cards
350        scope.find(".d-card-projects").html("");
351        var amountProjects = data.length;
352        for (var i = 0; i < amountProjects; i++) {
353            var project = data[i];
354            scope.find(".d-card-projects")
355                .append(getHtmlProject(project))
356                .find(".d-card.project")
357                .last().data(project)
358                .append(getHtmlCardMenu(project))
359                .find(".actions .btn-config").click(
360                    function (e) {
361                        e.preventDefault();
362                        hideDropdowns();
363                        var $dd = $(this).closest(".d-card").find(".dropdown");
364                        $dd.toggle();
365                    });
366            var $card = scope.find(".d-card-projects .d-card.project").last();
367
368            // click card
369            $card.click(function (e) {
370                //console.log("CLICK CARD");
371                //console.log($(e.target).attr("class"));
372                //console.log("1: " + $(e.target).hasClass("project") + " 2: " + $(e.target).hasClass("d-card"));
373                if ($(e.target).hasClass("project") && $(e.target).hasClass("d-card")) {
374                    var project = $(this).data();
375                    routie("teacher/classroom/" + classroom_guid + "/" + project.project_guid + "/" + project.guid + "/activity");
376                }
377            });
378
379            // click change state
380            $card.find(".d-header .label").click(function () {
381                showChangeState($(this).closest(".d-card"));
382            });
383
384            // end project diploma
385            if (project.status === "finished") {
386                $card.find(".d-print-area-btn").click(function (e) {
387                    e.preventDefault();
388                    var project = $(this).closest(".d-card").data();
389                    window.open(config.api + "teacher/pdf/" + mDiscover.getSession() + "/" + project.guid + "/diploma.pdf", "_blank");
390                });
391            }
392
393            // click tasks, tests, trofeos
394            $card.find(".d-footer *").click(function () {
395                var project = $(this).closest(".d-card.project").data();
396                routie("teacher/classroom/" + classroom_guid + "/" + project.project_guid + "/" + project.guid + "/activity");
397            });
398
399            if ($card.hasClass("current")) {
400                mTooltip.setTooltip($card.find(".d-body .d-points, .d-body .d-points-label, .d-body .d-points-next, .d-body .d-points-next-label"), lang.home_teacher_classrooms_investigated_tooltip);
401                mTooltip.setTooltip($card.find(".d-body .d-label-research, .progress-bar-container-1"), lang.home_teacher_classrooms_investigated_tooltip);
402                mTooltip.setTooltip($card.find(".d-body .d-label-resolved, .progress-bar-container-2"), lang.home_teacher_classrooms_resolved_tooltip);
403            }
404            // contextual events
405            scope.find(".d-card-projects .d-card .dropdown." + project.project_guid + " li").click(function () {
406                var action = $(this).find("a").first().attr("action");
407                var project = $(this).closest(".d-card").data();
408                console.log("project.title: " + project.title + " (" + project.project_guid + ") " + action);
409                switch (action) {
410                    case "open":
411                        routie("teacher/classroom/" + classroom_guid + "/" + project.project_guid + "/" + project.guid + "/activity");
412                        break;
413                    case "activate":
414                        changeStatusProject(project, "active");
415                        break;
416                    case "finish":
417                        changeStatusProject(project, "finished");
418                        break;
419                    case "archive":
420                        archiveClassroomProject(project);
421                        break;
422                    case "change-state":
423                        showChangeState($(this).closest(".d-card"));
424                        break;
425                    case "edit":
426                        project_edition = project;
427                        console.log(project);
428                        $("#modal-container .d-classroom-project-form #d-classroom-project-form_title").val(project.title);
429                        $("#modal-container .d-classroom-project-form #d-classroom-project-form_description").val(project.description);
430                        $("#modal-container .d-classroom-project-form .d-icon").attr("style", "background-image:url(" + project.icon + "?t=" + new Date().getTime() + ")");
431                        ModalProject.show();
432                        break;
433                    case "duplicate":
434                        duplicateProject(project.guid);
435                        break;
436                    case "share":
437                        shareProject(project.guid);
438                        break;
439                }
440            });
441            if (project.status === "active") {
442                // progress bars
443                // Investigado
444                if ($card.find(".progress-bar-container-1 .progress-bar").length > 0) {
445                    var bar1 = new ProgressBar.Circle($card.find(".progress-bar-container-1 .progress-bar")[0], {
446                        strokeWidth: 7,
447                        color: '#77d047',
448                        trailColor: '#000',
449                        trailWidth: 7,
450                        easing: 'easeInOut',
451                        duration: 1400,
452                        svgStyle: null,
453                        text: {
454                            value: '',
455                            alignToBottom: true
456                        },
457                        from: { color: '#1ba40d' },
458                        to: { color: '#77d047' },
459                        // Set default step function for all animate calls
460                        step: function (state, bar) {
461                            bar.path.setAttribute('stroke', state.color);
462                            setProgressValue(state, bar);
463                            bar.text.style.color = state.color;
464                        }
465                    }
466                    );
467                    bar1.animate(project.amount_investigated);  // Number from 0.0 to 1.0
468                }
469                // resuelto
470                if ($card.find(".progress-bar-container-2 .progress-bar").length > 0) {
471                    var bar2 = new ProgressBar.Circle($card.find(".progress-bar-container-2 .progress-bar")[0], {
472                        strokeWidth: 7,
473                        color: '#77d047',
474                        trailColor: '#000',
475                        trailWidth: 7,
476                        easing: 'easeInOut',
477                        duration: 1400,
478                        svgStyle: null,
479                        text: {
480                            value: '',
481                            alignToBottom: true
482                        },
483                        from: { color: '#1ba40d' },
484                        to: { color: '#77d047' },
485                        // Set default step function for all animate calls
486                        step: function (state, bar) {
487                            bar.path.setAttribute('stroke', state.color);
488                            setProgressValue(state, bar);
489                            bar.text.style.color = state.color;
490                        }
491                    }
492                    );
493                    bar2.animate(project.amount_resolved);  // Number from 0.0 to 1.0
494                }
495
496
497            }
498        }
499
500        // new project
501        if (amountProjects === 0) {
502            scope.find(".d-card-projects").append(getHtmlNewProject());
503        } else {
504            scope.find(".d-card-projects").append(getHtmlFixedButton());
505        }
506        scope.find(".d-card-projects .d-card.new, .d-card-projects .fixed-btn-add").click(function () {
507            mTeacherHome.getLibraryProjectModule().setCurrentClassroomGUID(classroom_guid);
508            routie("teacher/library-projects");
509        });
510
511        // comportamientos
512
513
514
515        // unboarding d-add-project
516        // alert(scope.find(".d-card.project.new .btn-add-project").is(":visible"));
517        if (!mUnboarding.isViewed("TeacherClassroomProject") && scope.find(".d-card.project.new .btn-add-project").is(":visible")) {
518            //$("body").scrollTop(scope.find(".d-card.project.new .btn-add-project").offset().top);
519            mUnboarding.show("TeacherClassroomProject", scope.find(".d-card.project.new .btn-add-project"), "left");
520        }
521
522
523        // access to classroom project
524        scope.find(".d-card-projects .d-card.project .project-title").click(function () {
525            var project = $(this).closest(".d-card").data();
526            routie("teacher/classroom/" + classroom_guid + "/" + project.project_guid + "/" + project.guid + "/activity");
527        });
528
529        // book access
530        scope.find(".d-card-projects .d-card.project .d-body .icon").click(function () {
531            var project = $(this).closest(".d-card").data();
532            console.log(project);
533            var is_book = false;
534            if (project.hasOwnProperty("original_project")) {
535                if (isNaN(parseInt(project.original_project.guid))) {
536                    // is not integer
537                } else {
538                    is_book = true;
539                    var url_quiosco = mDiscover.getUrlQuiosco() + "i2c/book/open?book_id=" + project.original_project.guid + "&session_id=" + mDiscover.getSession()
540                    + "&book_lang=" + String(project.original_project.lang_id).toLowerCase();
541                    console.log(url_quiosco);
542                    window.open(url_quiosco, "_blank");
543                }
544            }
545            if (!is_book) {
546                routie("teacher/classroom/" + classroom_guid + "/" + project.project_guid + "/" + project.guid + "/activity");
547            }
548        });
549
550        // diploma
551        scope.find(".d-card-projects .d-card.project .d-diploma-btn").click(availableSoon);
552        scope.find(".d-card-projects .d-card.project .d-print-btn").click(availableSoon);
553
554        // changestatus
555        scope.find(".d-card-projects .d-card.project .d-change-status .d-btn").click(function () {
556            console.log($(this).attr("status"));
557            var project = $(this).closest(".d-card").data();
558            console.log(project);
559            changeStatusProject(project, $(this).attr("status"));
560        });
561        scope.find(".d-card-projects .d-card.project .d-changestatus-btn-cancel").click(function () {
562            $(this).closest(".d-change-status").toggle();
563        });
564    }
565
566    function removeClassroomProject(project) {
567        var body_msg = lang.classroom_project_confirm_remove_body;
568        body_msg = body_msg.split("#1").join(project.title);
569
570        mDiscover.openConfirm(lang.classroom_project_confirm_remove_title, body_msg, function (response) {
571            if (response) {
572                mDiscover.showLoading();
573                mCom.ajax("classroom/project/" + project.guid, "DELETE", null, function (data, status) {
574                    mDiscover.hideLoading();
575                    if (status === "success") {
576                        mToast.toast(lang.classroom_project_remove_successful, 3000);
577                        getProjects();
578                    }
579                }, function (err, status, msg) {
580                    mToast.toast(lang.classroom_project_remove_error, 3000);
581                    mDiscover.hideLoading();
582                });
583            }
584        });
585    }
586    function archiveClassroomProject(project) {
587        var body_msg = lang.classroom_project_confirm_archive_body;
588        body_msg = body_msg.split("#1").join(project.title);
589
590        mDiscover.openConfirm(lang.classroom_project_confirm_archive_title, body_msg, function (response) {
591            if (response) {
592                mDiscover.showLoading();
593                mCom.ajax("classroom/project/archive", "PUT", { classroom_project_guid: project.guid }, function (data, status) {
594                    mDiscover.hideLoading();
595                    if (status === "success") {
596                        mToast.toast(lang.classroom_project_archive_successful, 3000);
597                        getProjects();
598                    }
599
600                    // reload classrooms of home page
601                    mTeacherHome.refreshClassrooms();
602
603                }, function (err, status, msg) {
604                    mToast.toast(lang.classroom_project_archive_error, 3000);
605                    mDiscover.hideLoading();
606                });
607            }
608        });
609    }
610    function showTab(section) {
611        //if (section === "results" || section === "students") {
612
613        console.log("showTab:section:" + section);
614
615        $(".d-module .header .d-header-section.project-tab.classroom .d-tab-bt").removeClass("active");
616        $(".d-module .header .d-header-section.project-tab.classroom .d-tab-bt[section='" + section + "']").addClass("active");
617        scope.find(".d-tab-content").hide();
618        scope.find(".d-tab-content." + section).show();
619
620        getClassrooms();
621
622        switch (section) {
623            case "projects":
624                $("body").removeClass("showing-modal");
625                mDiscover.headerMode("header-sticky");
626                break;
627            case "books":
628                $("body").removeClass("showing-modal");
629                mDiscover.headerMode("header-sticky");
630                mBooks.show();
631                break;
632            case "book-students":
633                $("body").removeClass("showing-modal");
634                mDiscover.headerMode("header-retracted header-only-back header-fixed");
635                mBookStudents.show();
636                break;
637            case "students":
638                $("body").removeClass("showing-modal");
639                mDiscover.headerMode("header-sticky");
640                mStudents.show();
641                break;
642            case "gradebook":
643                $("body").addClass("showing-modal");
644                mDiscover.headerMode("header-retracted header-fixed");
645                mGradebook.show();
646                break;
647            case "globaleduca":
648                $("body").addClass("showing-modal");
649                mDiscover.headerMode("header-retracted header-fixed");
650                mGlobalEduca.show();
651                break;
652        }
653    }
654    function openEpisodes() {
655        var episodes = mTeacherHome.getCurrentClassroom().episodes;
656        var amount_episodes = episodes.length;
657
658        // HABILITAR CUANDO HAYA NUEVO EPISODIO Y SOLAMENTE EN ALGUNOS IDIOMAS
659
660        //var amount_episodes = 3;
661
662        // Episodio 4 - restricción para algunos idiomas
663        //if( userLang == "mx" || userLang == "es" || userLang == "ar" || userLang == "gl" || userLang == "ca" || userLang == "va"  ){
664        //	amount_episodes = episodes.length;
665        //}
666
667        var episode_status = "start";
668        var current = 0;
669
670        getModalEpisodes().find(".btn-bitmap.next").off("click").on("click", function () {
671            current++;
672            if (current >
672= amount_episodes) {
673                current = 0;
674            }
675            renderEpisode();
676        });
677
678        getModalEpisodes().find(".btn-bitmap.prev").off("click").on("click", function () {
679            current--;
680            if (current < 0) {
681                current = amount_episodes - 1;
682            }
683            renderEpisode();
684        });
685
686        // episode_status
687        getModalEpisodes().find("input[type='checkbox']").off("change").on("change", function () {
688            console.log("changed! " + $(this).val());
689            episode_status = $(this).val();
690            getModalEpisodes().find("input[type='checkbox']").prop("checked", false);
691            $(this).prop("checked", true);
692        });
693
694        // next step
695        getModalEpisodes().find(".btn-submit").off("click").on("click", function () {
696            setEpisode();
697        });
698
699        // episodes videos
700        getModalEpisodes().find(".episode-video.start .episode-video-image").click(playVideoStart);
701        getModalEpisodes().find(".episode-video.end .episode-video-image").click(playVideoEnd);
702
703        function renderEpisode() {
704            getModalEpisodes().find(".episode-number").html(String(lang.admin_classroom_episodes_episode).split("#NUMBER#").join((current + 1)));
705            try {
706                getModalEpisodes().find(".episode-name").html(lang["admin_classroom_episodes_episode" + (current + 1) + "_title"]);
707                getModalEpisodes().find(".episode-description").html(lang["admin_classroom_episodes_episode" + (current + 1) + "_description"]);
708                getModalEpisodes().find(".episode-videos").removeClass('episode-videos-type-1 episode-videos-type-2 episode-videos-type-3 episode-videos-type-4').addClass('episode-videos-type-' + (current + 1));
709            } catch (e) {
710                console.log(e);
711            }
712            getModalEpisodes().find(".episode-nav .d-nav").removeClass("active");
713            getModalEpisodes().find(".episode-nav .d-nav[guid='" + episodes[current].guid + "']").addClass("active");
714
715            // caso especial por falta de vídeo final en episodio 2
716            /*if (episodes[current].guid === "episode2") {
717                getModalEpisodes().find(".episode-video.end").hide();
718                getModalEpisodes().find(".episode-video.start input[type='checkbox']").click();
719            } else {
720                getModalEpisodes().find(".episode-video.end").show();
721            }*/
722
723            // caso especial por falta de vídeo final en episodio 4
724            if (episodes[current].guid === "episode4") {
725                //getModalEpisodes().find(".episode-video.end").hide();
726                //getModalEpisodes().find(".episode-video.end").addClass('egreyscall');
727                //getModalEpisodes().find(".episode-video.start input[type='checkbox']").click();
728            } else {
729            }
730            getModalEpisodes().find(".episode-video.end").removeClass('egreyscall');
731            getModalEpisodes().find(".episode-video.end").show();
732        }
733        function setEpisode() {
734            mDiscover.showLoading();
735            var data = {};
736            data.episode_guid = episodes[current].guid;
737            data.episode_status = episode_status;
738            data.classroom_guid = classroom.guid;
739            mCom.ajax("classroom/episode", "PUT", data, function (data) {
740                mToast.toast(lang.admin_classroom_episodes_modal_save_ok, 6000);
741                setTimeout(function () {
742                    location.reload();
743                }, 1000);
744                mDiscover.hideLoading();
745            }, function (err, status, msg) {
746                mDiscover.hideLoading();
747                mToast.toast("Problemas recuperando episodios", 3000);
748            });
749        }
750        function playVideoStart() {
751            for (var i = 0; i < episodes[current].videos.length; i++) {
752                if (episodes[current].videos[i].lang_id === userLang) {
753                    mDiscover.showVideo(episodes[current].videos[i].video_url_start);
754                }
755            }
756        }
757        function playVideoEnd() {
758            for (var i = 0; i < episodes[current].videos.length; i++) {
759                if (episodes[current].videos[i].lang_id === userLang) {
760                    mDiscover.showVideo(episodes[current].videos[i].video_url_end);
761                }
762            }
763        }
764
765
766        // set current episode and status
767        var classroom = mTeacherHome.getCurrentClassroom();
768        //console.log(classroom);
769        for (var i = 0; i < episodes.length; i++) {
770            console.log(episodes[i].guid + " - " + classroom.episode_guid);
771            if (episodes[i].guid === classroom.episode_guid) {
772                current = i;
773            }
774        }
775        //console.log("current: " + current);
776        if (classroom.episode_status === "start") {
777            getModalEpisodes().find("input[value='start']").click();
778        } else {
779            getModalEpisodes().find("input[value='end']").click();
780        }
781
782        renderEpisode();
783        ModalEpisodes.show();
784
785        getModalEpisodes().find(".btn-submit").off("click").on("click", function () {
786            setEpisode();
787        });
788    }
789    /**
790     * Constructor de módulo
791     * @returns {undefined}
792     */
793    function build(callback) {
794
795        builded = true;
796
797        // esqueleto de sección
798        scope.append(getHtmlSection());
799
800        // Modal Edit Project
801        $("#modal-container .d-classroom-project-form").remove();
802        $("#modal-container").append(getHtmlModalProject());
803        ModalProject = new Modal($("#modal-container .d-classroom-project-form"));
804        // modal close-btn
805        $("#modal-container .d-classroom-project-form .btn.btn-cancelar").click(function () {
806            ModalProject.hide();
807        });
808        // modal close-btn
809        $("#modal-container .d-classroom-project-form .d-header .d-close").click(function () {
810            ModalProject.hide();
811        });
812        $("#modal-container .d-classroom-project-form .btn.btn-submit").click(saveProjectInfo);
813
814        // icon image click
815        $("#modal-container .d-classroom-project-form .btn-choose-image").click(function () {
816            //$('#modal-container #project-edition-icon-file').trigger('click');
817
818            var avatar = (project_edition.icon !== "" && project_edition.icon !== null) ? project_edition.icon : "css/img/ico-add-image.png";
819            mAvatarProject.show({ type: "project", guid: project_edition.project_guid }, (avatar + "?t=" + new Date().getTime()), function (err, data) {
820                if (!err) {
821                    if (data !== null) {
822                        $("#modal-container .d-classroom-project-form .d-icon").attr("style", "background-image:url(" + data.filename_icon + "?t=" + new Date().getTime() + ")");
823                        scope.find(".d-card[ref='" + project_edition.project_guid + "'] .d-body .icon").attr("style", 'background-image:url(' + data.filename_icon + '?t=' + new Date().getTime() + '); ');
824                        mAvatarProject.hide();
825                    }
826                }
827            });
828
829        });
830
831        // header tab control
832        $(".d-module .header .d-header-section.project-tab.classroom .d-tab-bt").click(function () {
833            var section = $(this).attr("section");
834            routie("teacher/classroom/" + classroom_guid + "/" + section);
835        });
836
837
838        // MODAL ARCHIVED PROJECT
839        $("#modal-container .d-modal-classroom-project-archived").remove();
840        $("#modal-container").append(getHtmlModalArchived());
841        ModalArchivedProject = new Modal(getModalArchived());
842
843        scope.find(".d-header-link .archived-projects").click(getArchivedProjects);
844        getModalArchived().find(".btn-close").click(function () {
845            ModalArchivedProject.hide();
846        });
847
848        // MODAL IMPRIMIBLES
849        $("#modal-container .d-modal-classroom-imprimibles").remove();
850        $("#modal-container").append(getHtmlModalImprimibles());
851        ModalImprimibles = new Modal(getModalImprimibles());
852
853        // MODAL EPISODES
854        $("#modal-container .d-modal-classroom-episodes").remove();
855        $("#modal-container").append(getHtmlModalEpisodes());
856        ModalEpisodes = new Modal(getModalEpisodes());
857
858        // PDI
859        /*
860         $(".d-header .image-top .btn-pdi").click(function () {
861         routie("teacher/pdi/" + mTeacherHome.getClassroomGuid());
862         });
863         */
864
865        $(".d-header .h-green.t-quizz").off("click").on("click", function () {
866            routie("teacher/pdi/" + mTeacherHome.getClassroomGuid());
867        });
868
869
870        // imprimibles
871        $(".d-header .h-green.imprimibles").off("click").on("click", function () {
872            ModalImprimibles.show();
873        });
874        getModalImprimibles().find(".btn-submit").click(function () {
875            ModalImprimibles.hide();
876        });
877
878        // config episodes
879        $(".d-header .image-center .btn-config").off("click").on("click", function () {
880            openEpisodes();
881        });
882        getModalEpisodes().find(".btn-discard").click(function () {
883            ModalEpisodes.hide();
884        });
885
886        // switch comments
887        mTooltip.setTooltip(scope.find(".d-header-link-left"), lang.classroom_messages_chk_help);
888        scope.find(".d-header-link-left input").off("click").on("click", function () {
889            switchEnabledMessage();
890        });
891
892
893        // header PDF buttons
894        getModalImprimibles().find(".btn-agencia").off("click").on("click", function () {
895            window.open(config.api + "classroom/pdf/" + mDiscover.getSession() + "/" + mTeacherHome.getClassroomGuid() + "/cartel-agencia.pdf", "_blank");
896        });
897        getModalImprimibles().find(".btn-detectives").off("click").on("click", function () {
898            window.open(config.api + "classroom/pdf/" + mDiscover.getSession() + "/" + mTeacherHome.getClassroomGuid() + "/orla.pdf", "_blank");
899        });
900        getModalImprimibles().find(".btn-carnet-detectives").off("click").on("click", function () {
901            window.open(config.api + "classroom/pdf/" + mDiscover.getSession() + "/" + mTeacherHome.getClassroomGuid() + "/carnets.pdf", "_blank");
902        });
903        getModalImprimibles().find(".btn-decalogo").off("click").on("click", function () {
904            window.open(config.api + "classroom/pdf/" + mDiscover.getSession() + "/" + mTeacherHome.getClassroomGuid() + "/decalogo.pdf", "_blank");
905        });
906        getModalImprimibles().find(".btn-fichas-de-lectura").off("click").on("click", function () {
907            var url = "printables/fichas-de-lectura/fichas_tatum_imp_spa.pdf";
908            switch (userLang) {
909                case "ca":
910                    url = "printables/fichas-de-lectura/fichas_tatum_imp_cat.pdf";
911                    break;
912                case "eu":
913                    url = "printables/fichas-de-lectura/fichas_tatum_imp_eus.pdf";
914                    break;
915                case "va":
916                    url = "printables/fichas-de-lectura/fichas_tatum_imp_val.pdf";
917                    break;
918                case "gl":
919                    url = "printables/fichas-de-lectura/fichas_tatum_imp_gal.pdf";
920                    break;
921                case "ar":
922                    url = "printables/fichas-de-lectura/fichas_tatum_imp_arg.pdf";
923                    break;
924                case "mx":
925                    url = "printables/fichas-de-lectura/fichas_tatum_imp_mx.pdf";
926                    break;
927            }
928            download_file(url, url.replace(/^.*[\\\/]/, ''));
929        });
930        getModalImprimibles().find(".btn-fichas-de-privilegio").off("click").on("click", function () {
931            var url = "printables/vales-de-privilegio/vales-priv-ta-tum_spa.pdf";
932            switch (userLang) {
933                case "ca":
934                    url = "printables/vales-de-privilegio/vales-priv-ta-tum_cat.pdf";
935                    break;
936                case "eu":
937                    url = "printables/vales-de-privilegio/vales-priv-ta-tum_eus.pdf";
938                    break;
939                case "va":
940                    url = "printables/vales-de-privilegio/vales-priv-ta-tum_val.pdf";
941                    break;
942                case "gl":
943                    url = "printables/vales-de-privilegio/vales-priv-ta-tum_gal.pdf";
944                    break;
945                case "ar":
946                    url = "printables/vales-de-privilegio/vales-priv-ta-tum_arg.pdf";
947                    break;
948                case "mx":
949                    url = "printables/vales-de-privilegio/vales-priv-ta-tum_mx.pdf";
950                    break;
951            }
952            download_file(url, url.replace(/^.*[\\\/]/, ''));
953        });
954
955
956        // Teacher Classroom Student
957        mStudents = new TeacherClassroomStudents(scope.find(".d-teacher-classrooms .d-tab-content.students"));
958
959        // Teacher Classroom Books
960        mBooks = new TeacherClassroomBooks(scope.find(".d-teacher-classrooms .d-tab-content.books"));
961
962        // Teacher Classroom Book Students
963        mBookStudents = new TeacherClassroomBookStudents(scope.find(".d-teacher-classrooms .d-tab-content.book-students"));
964
965        // Teacher Classroom Gradebook
966        mGradebook = new TeacherClassroomGradebook(scope.find(".d-teacher-classrooms .d-tab-content.gradebook"));
967
968        // Teacher Classroom Global Educa
969        mGlobalEduca = new TeacherClassroomGlobaleduca(scope.find(".d-teacher-classrooms .d-tab-content.globaleduca"));
970
971        // modal select classrooms
972        $("#modal-container .select-classroom-2").remove();
973        $("#modal-container").append(getHtmlClassroomsModal());
974        ModalClassroomSelector = new Modal($("#modal-container .select-classroom-2"));
975        getModalSelectClassrooms().find(".btn-cancelar").click(function () {
976            ModalClassroomSelector.hide();
977        });
978        // Modal classroom selector, btn añadir a clase
979        getModalSelectClassrooms().find(".modal-footer .btn-submit").click(function () {
980            if (getModalSelectClassrooms().find(".d-content input[type='checkbox']:checked").length > 0) {
981                var selected_classrooms_ar = [];
982                getModalSelectClassrooms().find(".d-content input[type='checkbox']:checked").each(function () {
983                    if ($(this).closest(".d-classroom").data().guid && $(this).closest(".d-classroom").data().guid !== null) {
984                        selected_classrooms_ar.push($(this).closest(".d-classroom").data().guid);
985                    }
986                });
987                duplicateProjectsDo(selected_classrooms_ar);
988                ModalClassroomSelector.hide();
989            } else {
990                mToast.toast(lang.library_projects_classrooms_validate_select, 3000);
991            }
992        });
993
994        // modal select teacher/classroom
995        $("#modal-container .select-teacher-classroom").remove();
996        $("#modal-container").append(getHtmlTeacherClassroomModal());
997        ModalTeacherClassroomSelector = new Modal($("#modal-container .select-teacher-classroom"));
998        getModalSelectTeacherClassroom().find(".btn-cancelar").click(function () {
999            ModalTeacherClassroomSelector.hide();
1000        });
1001        // Modal classroom selector, btn compartir con clase
1002        getModalSelectTeacherClassroom().find(".modal-footer .btn-submit").click(function () {
1003            if (getModalSelectTeacherClassroom().find(".d-content input[type='checkbox']:checked").length > 0) {
1004                var selected_classrooms_ar = [];
1005                getModalSelectTeacherClassroom().find(".d-content input[type='checkbox']:checked").each(function () {
1006                    if ($(this).closest(".d-classroom").attr("guid") && $(this).closest(".d-classroom").attr("guid") !== null) {
1007                        selected_classrooms_ar.push($(this).closest(".d-classroom").attr("guid"));
1008                    }
1009                });
1010                shareDo(selected_classrooms_ar);
1011                ModalTeacherClassroomSelector.hide();
1012            } else {
1013                mToast.toast(lang.library_projects_classrooms_validate_select, 3000);
1014            }
1015        });
1016
1017        callback();
1018    }
1019    function getArchivedProjects() {
1020        mDiscover.showLoading();
1021        mCom.ajax("classroom/project/archive/" + classroom_guid, "GET", "", function (data, status) {
1022            console.log("getArchivedProjects() result");
1023            mDiscover.hideLoading();
1024            if (status === "success") {
1025                var html = "";
1026                for (var i = 0; i < data.length; i++) {
1027                    html += getHtmlClassroomProjectItem(data[i]);
1028                }
1029                getModalArchived().find(".d-modal-list").html(html);
1030
1031                getModalArchived().find(".d-modal-list input").off("change").on("change", function () {
1032                    if (getModalArchived().find(".d-modal-list input:checked").length > 0) {
1033                        getModalArchived().find(".btn-remove").removeClass("disabled");
1034                        getModalArchived().find(".btn-submit").removeClass("disabled");
1035                    } else {
1036                        getModalArchived().find(".btn-remove").addClass("disabled");
1037                        getModalArchived().find(".btn-submit").addClass("disabled");
1038                    }
1039                });
1040
1041                ModalArchivedProject.show();
1042
1043
1044                getModalArchived().find(".btn-submit").addClass("disabled").off("click").on("click", function () {
1045                    if (!$(this).hasClass("disabled")) {
1046                        var cprojects_ar = [];
1047                        getModalArchived().find(".d-modal-list input:checked").each(function () {
1048                            cprojects_ar.push($(this).attr("value"));
1049                        });
1050                        mDiscover.showLoading();
1051                        mCom.ajax("classroom/project/archived/restore", "PUT", { "cprojects_ar": cprojects_ar }, function (data, status) {
1052                            console.log("getArchivedClassroomOfTeacher() result");
1053                            mDiscover.hideLoading();
1054                            if (status === "success") {
1055                                mToast.toast(lang.classroom_projects_modalarchived_restore_successful, 3000);
1056                                getProjects();
1057                                ModalArchivedProject.hide();
1058
1059
1060                                // reload classrooms of home page
1061                                mTeacherHome.refreshClassrooms();
1062                            }
1063                        }, function (err, status, msg) {
1064                            mDiscover.hideLoading();
1065                            mToast.toast(lang.classroom_projects_modalarchived_restore_error, 3000);
1066                        });
1067                        console.log(cprojects_ar);
1068                    }
1069                });
1070                getModalArchived().find(".btn-remove").addClass("disabled").off("
1070click").on("click", function () {
1071                    if (!$(this).hasClass("disabled")) {
1072                        var cprojects_ar = [];
1073                        getModalArchived().find(".d-modal-list input:checked").each(function () {
1074                            cprojects_ar.push($(this).attr("value"));
1075                        });
1076                        mDiscover.openConfirm(lang.classroom_projects_modalarchived_confirm_title,
1077                            lang.classroom_projects_modalarchived_confirm,
1078                            function (response) {
1079                                console.log("MODAL CONFIRM response: " + response);
1080                                if (response) {
1081                                    mDiscover.showLoading();
1082                                    mCom.ajax("classroom-project/project/archived/", "DELETE", { "cprojects_ar": cprojects_ar }, function (data, status) {
1083                                        console.log("delete archived projects() result");
1084                                        mDiscover.hideLoading();
1085                                        if (status === "success") {
1086                                            mToast.toast(lang.classroom_projects_modalarchived_remove_successful, 3000);
1087                                            getProjects();
1088                                            ModalArchivedProject.hide();
1089
1090                                        }
1091                                    }, function (err, status, msg) {
1092                                        mDiscover.hideLoading();
1093                                        mToast.toast(lang.classroom_projects_modalarchived_remove_error, 3000);
1094                                    });
1095                                }
1096                            });
1097                        console.log(cprojects_ar);
1098                    }
1099                });
1100            }
1101        }, function (err, status, msg) {
1102            mToast.toast(lang.classroom_projects_get_error, 3000);
1103            mDiscover.hideLoading();
1104        });
1105    }
1106
1107    /**
1108     * Constructor
1109     * @returns {undefined}
1110     */
1111    function init() {
1112        // nada, latente hasta show
1113
1114    }
1115    init();
1116
1117    // helpers
1118    function getModalSelectClassrooms() {
1119        return $("#modal-container .modal.select-classroom-2");
1120    }
1121    function getModalSelectTeacherClassroom() {
1122        return $("#modal-container .modal.select-teacher-classroom");
1123    }
1124    function getHtmlClassroomsModal() {
1125        return '  <div class="modal select-classroom-2">' +
1126            '  <div class="modal-content wrap-dialog-popup">' +
1127            '      <div class="modal-content">' +
1128            '      <div class="d-header">' +
1129            '        <h4>' + lang.library_projects_classrooms_title + '</h4>' +
1130            '        <h5>' + lang.library_projects_classrooms_sub_title + '</h5>' +
1131            '      </div>' +
1132            '    <div class="d-content">' +
1133            '    </div>' +
1134            '  </div>' +
1135            '  <div class="modal-footer">' +
1136            '    <a href="javascript:void(0);" class="btn dark btn-cancelar">' + lang.library_projects_classrooms_footer_btn_cancel + '</a>&nbsp;' +
1137            '    <a href="javascript:void(0);" class="btn orange btn-submit">' + lang.library_projects_classrooms_footer_btn_add + '</a>&nbsp;' +
1138            '  </div>' +
1139            '  </div>' +
1140            '</div>';
1141    }
1142    function getHtmlTeacherClassroomModal() {
1143        return '  <div class="modal select-teacher-classroom">' +
1144            '  <div class="modal-content wrap-dialog-popup">' +
1145            '      <div class="modal-content">' +
1146            '      <div class="d-header">' +
1147            '        <h4>' + lang.classroom_project_share_title + '</h4>' +
1148            '        <h5>' + lang.classroom_project_share_message + '</h5>' +
1149            '      </div>' +
1150            '    <div class="d-content">' +
1151            '    </div>' +
1152            '  </div>' +
1153            '  <div class="modal-footer">' +
1154            '    <a href="javascript:void(0);" class="btn dark btn-cancelar">' + lang.classroom_project_share_discard + '</a>&nbsp;' +
1155            '    <a href="javascript:void(0);" class="btn orange btn-submit">' + lang.classroom_project_share_share + '</a>&nbsp;' +
1156            '  </div>' +
1157            '  </div>' +
1158            '</div>';
1159    }
1160    function getHtmlClassroomItem(classroom) {
1161
1162        var style_img = (classroom.avatar !== "") ? 'style="background-image: url(' + classroom.avatar + ')"' : '';
1163        var students_tx = "";
1164
1165        var students_tx = (classroom.amount_students > 0) ? (classroom.amount_students + " " + (classroom.amount_students === 1 ? lang.classroom_info_researcher : lang.classroom_info_researchers)) : lang.classroom_info_wo_researcher;
1166
1167        return '<div class="d-classroom">' +
1168            '   <div class="icon" ' + style_img + '></div>' +
1169            '   <div class="icon-bg"></div>' +
1170            '   <div class="info">' +
1171            '       <div class="name">' + classroom.name + '</div>' +
1172            '       <div class="level">' + classroom.education_level + '</div>' +
1173            '       <div class="students">' + students_tx + '</div>' +
1174            '   </div>' +
1175            '   <div class="simple-checkbox">' +
1176            '       <input id="d-library-classroom-' + classroom.guid + '" type="checkbox" />' +
1177            '       <label for="d-library-classroom-' + classroom.guid + '"></label>' +
1178            '   </div>' +
1179            '</div>';
1180    }
1181    function getHtmlTeacherClassroomItem(teacher) {
1182
1183        let classrooms = '';
1184        for (let i = 0; i < teacher.classrooms.length; i++) {
1185            const classroom = teacher.classrooms[i];
1186            classrooms += `
1187                <div class="d-classroom" guid="${classroom.guid}">
1188
1189                    <div class="simple-checkbox">
1190                        <input id="d-teacher-classroom-${classroom.guid}" type="checkbox" />
1191                        <label for="d-teacher-classroom-${classroom.guid}"></label>
1192                    </div>
1193
1194                    <div class="classroom-name">${classroom.name}</div>
1195                    <div class="level">${classroom.level}</div>
1196
1197                </div>
1198            `;
1199        }
1200        return `<div class="d-teacher">
1201                    <div class="info">
1202                        <div class="teacher-toogle"></div>
1203                        <div class="name">${teacher.name}</div>
1204                        <div class="classrooms">
1205                                ${classrooms}
1206                        </div>
1207                    </div>
1208                </div>`;
1209    }
1210    function getModalArchived() {
1211        return $("#modal-container .modal.d-modal-classroom-project-archived");
1212    }
1213    function getHtmlModalArchived() {
1214        return '  <div class="modal d-modal-classroom-project-archived">' +
1215            '  <div class="modal-content wrap-dialog-popup">' +
1216            '       <div class="d-modal-header">' +
1217            '           <div class="d-modal-header-title">' + lang.classroom_projects_modalarchived_title + '</div>' +
1218            '           <div class="d-modal-header-sub-title">' + lang.classroom_projects_modalarchived_sub_title + '</div>' +
1219            '       </div>' +
1220            '       <div class="d-modal-list">' +
1221            '       </div>' +
1222            '       <div class="d-modal-footer">' +
1223            '           <a class="btn btn-close" href="javascript:void(0);">' + lang.classroom_projects_modalarchived_btn1 + '</a>&nbsp;' +
1224            '           <a class="btn dark btn-remove" href="javascript:void(0);">' + lang.classroom_projects_modalarchived_btn2 + '</a>' +
1225            '           <a class="btn orange btn-submit" href="javascript:void(0);">' + lang.classroom_projects_modalarchived_btn3 + '</a>' +
1226            '       </div>' +
1227            '  </div>' +
1228            ' </div>';
1229    }
1230    function getModalImprimibles() {
1231        return $("#modal-container .modal.d-modal-classroom-imprimibles");
1232    }
1233    function getHtmlModalImprimibles() {
1234        return '  <div class="modal d-modal-classroom-imprimibles">' +
1235            '  <div class="modal-content wrap-dialog-popup">' +
1236            '       <div class="d-modal-header">' +
1237            '           <div class="d-modal-header-title">' + lang.classroom_projects_printables_title + '</div>' +
1238            '           <div class="d-modal-header-sub-title">' + lang.classroom_projects_printables_msg + '</div>' +
1239            '       </div>' +
1240            '       <div class="d-modal-list">' +
1241            '           <div class="btn btn-agencia"><span class="standard-text-shadow-3">' + lang.classroom_project_header_btn1 + '</span></div>' +
1242            '           <div class="btn btn-detectives"><span class="standard-text-shadow-3">' + lang.classroom_project_header_btn2 + '</span></div>' +
1243            '           <div class="btn btn-fichas-de-lectura"><span class="standard-text-shadow-3">' + lang.classroom_project_header_btn5 + '</span></div>' +
1244            '       </div>' +
1245            '       <div class="d-modal-list column-2">' +
1246            '           <div class="btn btn-decalogo"><span class="standard-text-shadow-3">' + lang.classroom_project_header_btn3 + '</span></div>' +
1247            '           <div class="btn btn-carnet-detectives"><span class="standard-text-shadow-3">' + lang.classroom_project_header_btn4 + '</span></div>' +
1248            '           <div class="btn btn-fichas-de-privilegio"><span class="standard-text-shadow-3">' + lang.classroom_project_header_btn6 + '</span></div>' +
1249            '       </div>' +
1250            '       <div class="d-modal-footer">' +
1251            '           <a class="btn orange btn-submit" href="javascript:void(0);">' + lang.classroom_projects_printables_close + '</a>' +
1252            '       </div>' +
1253            '  </div>' +
1254            ' </div>';
1255    }
1256    function getModalEpisodes() {
1257        return $("#modal-container .modal.d-modal-classroom-episodes");
1258    }
1259    function getHtmlModalEpisodes() {
1260        return '  <div class="modal d-modal-classroom-episodes">' +
1261            '  <div class="modal-content wrap-dialog-popup">' +
1262            '    <div class="d-container episode">' +
1263            '        <div class="episode-title">' + lang.admin_classroom_episodes + '</div>' +
1264            '        <div class="episode-nav"></div>' +
1265            '        <div class="d-episode-card">' +
1266            '           <div class="episode-number"></div>' +
1267            '           <div class="episode-name standard-text-shadow-2"></div>' +
1268            '           <div class="episode-description"></div>' +
1269            '           <div class="episode-selection-message">' + lang.admin_classroom_episodes_selection_message + '</div>' +
1270            '           <div class="episode-videos">' +
1271            '           <div class="btn-bitmap next"></div>' +
1272            '           <div class="btn-bitmap prev"></div>' +
1273            '               <div class="episode-video start">' +
1274            '                   <div class="episode-video-image"></div>' +
1275            '                   <div class="simple-checkbox">' +
1276            '                       <input name="episode-video" id="episode-video-start" type="checkbox" checked="checked" class="" value="start" />' +
1277            '                       <label for="episode-video-start">' + lang.admin_classroom_episodes_video_start + '</label>' +
1278            '                   </div>' +
1279            '               </div>' +
1280            '               <div class="episode-video end">' +
1281            '                   <div class="episode-video-image"></div>' +
1282            '                   <div class="simple-checkbox">' +
1283            '                       <input name="episode-video" id="episode-video-end" type="checkbox" class="" value="end" />' +
1284            '                       <label for="episode-video-end">' + lang.admin_classroom_episodes_video_end + '</label>' +
1285            '                   </div>' +
1286            '               </div>' +
1287            '           </div>' +
1288            '        </div>' +
1289            '    </div>' +
1290            '       <div class="d-modal-footer">' +
1291            '           <a class="btn btn-discard" href="javascript:void(0);">' + lang.classroom_projects_modaledit_cancel + '</a>' +
1292            '           <a class="btn orange btn-submit" href="javascript:void(0);">' + lang.admin_classroom_btn_save + '</a>' +
1293            '       </div>' +
1294            '  </div>' +
1295            ' </div>';
1296    }
1297    function getHtmlClassroomProjectItem(project) {
1298
1299        var style_img = (project.icon !== "") ? 'style="background-image: url(' + project.icon + ')"' : '';
1300
1301        return '<div class="d-classroom">' +
1302            '   <div class="icon" ' + style_img + '></div>' +
1303            '   <div class="icon-bg"></div>' +
1304            '   <div class="info">' +
1305            '       <div class="name">' + project.title + '</div>' +
1306            '       <div class="last-state"><span class="label"></span> <span class="value ' + project.status + '">' + lang["classroom_projects_modalarchived_status_" + project.status] + '</span></div>' +
1307            '       <div class="added-at"><span class="label">' + lang.classroom_projects_modalarchived_added_at + '</span> <span class="value">' + project.added_at + '</span></div>' +
1308            '       <div class="archived-at"><span class="label">' + lang.classroom_projects_modalarchived_archived_at + '</span> <span class="value">' + project.archived_at + '</span></div>' +
1309            '   </div>' +
1310            '   <div class="simple-checkbox">' +
1311            '       <input id="d-archived-classroom-project-' + project.guid + '" type="checkbox" value="' + project.guid + '" />' +
1312            '       <label for="d-archived-classroom-project-' + project.guid + '"></label>' +
1313            '   </div>' +
1314            '</div>';
1315    }
1316    function getHtmlModalProject() {
1317        return '  <div class="modal d-classroom-project-form">' +
1318            '  <div class="modal-content wrap-dialog-popup">' +
1319            '    <div class="d-header">' +
1320            '        <div class="d-title standard-text-shadow-2">' + lang.classroom_projects_modaledit_title + '</div>' +
1321            '    </div>' +
1322            '    <form class="d-form">' +
1323            '      <div class="modal-content">' +
1324            '      <div class="d-content">' +
1325            '           <div class="d-content-form">' +
1326            '              <div class="d-row">' +
1327            '                  <div class="label">' + lang.classroom_projects_modaledit_titleproject + '</div>' +
1328            '                  <div class="input-field"><input type="text" class="d-simple-input" id="d-classroom-project-form_title" /></div>' +
1329            '              </div>' +
1330            '              <div class="d-row">' +
1331            '                  <div class="label">' + lang.classroom_projects_modaledit_descriptionproject + '</div>' +
1332            '                  <div class="input-field">' +
1333            '                       <textarea id="d-classroom-project-form_description" class="d-simple-input"></textarea>' +
1334            '                  </div>' +
1335            '              </div>' +
1336            '           </div>' +
1337            '              <div class="d-image-container">' +
1338            '               <div class="d-row">' +
1339            '                  <div class="input-field btn-choose-image">' +
1340            '                       <div class="d-icon"></div>' +
1341            '                       <div class="d-icon-label">' + lang.classroom_projects_modaledit_iconproject1 + '</div>' +
1342            '                  </div>' +
1343            '                  <div class="d-upload-progress-info"></div>' +
1344            '               </div>' +
1345            '              </div>' +
1346            '      </div><!-- END d-content -->' +
1347            '       <div class="modal-footer">' +
1348            '           <a href="javascript:void(0);" class="btn btn-cancelar">' + lang.classroom_projects_modaledit_cancel + '</a>&nbsp;' +
1349            '           <a href="javascript:void(0);" class="btn orange btn-submit">' + lang.classroom_projects_modaledit_publish + '</a>&nbsp;' +
1350            '       </div>' +
1351            '    </form>' +
1352            '    <input type="file" id="project-edition-icon-file" accept="image/*" />' +
1353            '  </div>' +
1354            '</div>';
1355    }
1356    function getHtmlSection() {
1357        return '<div class="d-teacher-classrooms">' +
1358            '   <div class="d-tab-content projects">' +
1359            '       <div class="d-header-link-left">' +
1360            '           <div class="simple-checkbox">' +
1361            '               <input id="chk-student-messages-enabled" type="checkbox" checked="checked" />' +
1362            '               <label for="chk-student-messages-enabled"><span class="standard-text-shadow-1">' + lang.classroom_messages_chk_label + '</span></label>' +
1363            '           </div>' +
1364            '       </div>' +
1365            '       <div class="d-header-link">' +
1366            '           <div class="btn archived-projects standard-text-shadow-1">' + lang.projects_header_btn_archived + '</div>' +
1367            '       </div>' +
1368            '       <div class="d-card-projects center-align">' +
1369            '       </div>' +
1370            '       <div class="d-card-projects-bg-glass"></div>' +
1371            '   </div>' +
1372            '   <div class="d-tab-content books">' +
1373            '   </div>' +
1374            '   <div class="d-tab-content book-students">' +
1375            '   </div>' +
1376            '   <div class="d-tab-content students">' +
1377            '   </div>' +
1378            '   <div class="d-tab-content gradebook">' +
1379            '   </div>' +
1380            '   <div class="d-tab-content globaleduca">' +
1381            '   </div>' +
1382            '</div>';
1383    }
1384    function getHtmlNewProject() {
1385        return '<div class="d-card project new">' +
1386            '   <div class="d-body">' +
1387            '       <div class="btn btn-bitmap btn-add-project">' + lang.projects_card_label_add_case + '</div>' +
1388            '   <div class="d-info">' + lang.projects_card_label_add_case_info + '</div>' +
1389            '   <div class="d-body">' +
1390            '       <div class="disabled-label-dark d-points-label">' + lang.projects_card_label_points + '</div>' +
1391            '       <div class="disabled-label-dark d-label-research">' + lang.projects_card_label_research + '</div>' +
1392            '       <div class="disabled-label-dark d-label-resolved">' + lang.projects_card_label_resolved + '</div>' +
1393            '   </div>' +
1394            '   <div class="d-footer">' +
1395            '       <div class="disabled-label d-activity-tasks">-</div>' +
1396            '       <div class="disabled-label d-activity-tasks-label">' + lang.projects_card_label_tasks + '</div>' +
1397            '       <div class="disabled-label d-activity-tests">-</div>' +
1398            '       <div class="disabled-label d-activity-tests-label">' + lang.projects_card_label_tests + '</div>' +
1399            '       <div class="disabled-label d-activity-trophies">-</div>' +
1400            '       <div class="disabled-label d-activity-trophies-label">' + lang.projects_card_label_trophies + '</div>' +
1401            '   </div>' +
1402            '   </div>' +
1403            '</div>';
1404    }
1405    function getHtmlFixedButton() {
1406        return `
1407            <div class="fixed-btn-add btn btn-bitmap">
1408                <div class="icon"></div>
1409                <div class="label">${lang.projects_card_label_add_case}</div>
1410            </div>
1411        `;
1412    }
1413    /**
1414     * 
1415     * @param {object} project
1416     * @param {string} project_status ('current', 'finished', 'next')
1417     * @returns {undefined}
1418     */
1419    function getHtmlProject(project) {
1420        var html = "";
1421        var tasks_values = project.amount_tasks_students + '/' + (project.amount_tasks * project.amount_students);
1422        var tests_values = project.amount_tests_students + '/' + (project.amount_tests * project.amount_students);
1423        var cromos_values = project.amount_cromos_students + '/' + (project.amount_cromos * project.amount_students);
1424        switch (project.status) {
1425            case "active":
1426                html = '<div class="d-card project current" ref="' + project.project_guid + '">' +
1427                    '   <div class="d-change-status">' + getHtmlChangeStatus(project) + '</div>' +
1428                    '   <div class="d-header">' +
1429                    '       <div class="label active btn btn-bitmap">' + lang.projects_header_label_1 + '</div>' +
1430                    '       <div class="actions"><div class="btn btn-config"></div></div>' +
1431                    '       <div class="project-title btn">' + project.title + '</div>' +
1432                    '   </div>' +
1433                    '   <div class="d-body">' +
1434                    '       <div class="icon btn btn-bitmap" style="background-image:url(' + project.icon + '?t=' + new Date().getTime() + '); "></div>' +
1435                    '       <div class="d-points">' + project.amount_points + '</div>' +
1436                    '       <div class="d-points-label">' + lang.projects_card_label_points + '</div>' +
1437                    '       <div class="d-label-research">' + lang.projects_card_label_research + '</div>' +
1438                    '       <div class="d-label-resolved">' + lang.projects_card_label_resolved + '</div>' +
1439                    '       <div class="progress-bars">' +
1440                    '           <div class="progress-bar-container-1"><div class="progress-bar"></div></div>' +
1441                    '           <div class="progress-bar-container-2"><div class="progress-bar"></div></div>' +
1442                    '       </div>' +
1443                    '   </div>' +
1444                    '   <div class="d-footer">' +
1445                    '       <div class="d-activity-clicable-area"></div>' +
1446                    '       <div class="d-activity-tasks">' + tasks_values + '</div>' +
1447                    '       <div class="d-activity-tasks-label">' + lang.projects_card_label_tasks + '</div>' +
1448                    '       <div class="d-activity-tests">' + tests_values + '</div>' +
1449                    '       <div class="d-activity-tests-label">' + lang.projects_card_label_tests + '</div>' +
1450                    '       <div class="d-activity-trophies">' + cromos_values + '</div>' +
1451                    '       <div class="d-activity-trophies-label">' + lang.projects_card_label_trophies + '</div>' +
1452                    '   </div>' +
1453                    '</div>';
1454                break;
1455            case "finished":
1456                html = '<div class="d-card project finished">' +
1457                    '   <div class="d-change-status">' + getHtmlChangeStatus(project) + '</div>' +
1458                    '   <div class="d-header">' +
1459                    '       <div class="label finished btn btn-bitmap">' + lang.projects_header_label_3 + '</div>' +
1460                    '       <div class="actions"><div class="btn btn-config"></div></div>' +
1461                    '       <div class="project-title btn">' + project.title + '</div>' +
1462                    '   </div>' +
1463                    '   <div class="d-body">' +
1464                    '       <div class="icon btn btn-bitmap" style="background-image:url(' + project.icon + '?t=' + new Date().getTime() + ');"></div>' +
1465                    '       <div class="btn d-diploma-btn">' + lang.projects_card_label_diploma + '</div>' +
1466                    '       <div class="btn d-print-btn">' + lang.projects_card_label_print + '</div>' +
1467                    '       <div class="btn d-print-area-btn"></div>' +
1468                    '   </div>' +
1469                    '   <div class="d-footer">' +
1470                    '       <div class="d-activity-clicable-area"></div>' +
1471                    '       <div class="d-activity-tasks">' + tasks_values + '</div>' +
1472                    '       <div class="d-activity-tasks-label">' + lang.projects_card_label_tasks + '</div>' +
1473                    '       <div class="d-activity-tests">' + tests_values + '</div>' +
1474                    '       <div class="d-activity-tests-label">' + lang.projects_card_label_tests + '</div>' +
1475                    '       <div class="d-activity-trophies">' + cromos_values + '</div>' +
1476                    '       <div class="d-activity-trophies-label">' + lang.projects_card_label_trophies + '</div>' +
1477                    '   </div>' +
1478                    '</div>';
1479                break;
1480            case "next":
1481                html = '<div class="d-card project next">' +
1482                    '   <div class="d-change-status">' + getHtmlChangeStatus(project) + '</div>' +
1483                    '   <div class="d-header">' +
1484                    '       <div class="label next btn btn-bitmap">' + lang.projects_header_label_2 + '</div>' +
1485                    '       <div class="actions"><div class="btn btn-config"></div></div>' +
1486                    '       <div class="project-title btn">' + project.title + '</div>' +
1487                    '   </div>' +
1488                    '   <div class="d-body">' +
1489                    '       <div class="icon btn btn-bitmap" style="background-image:url(' + project.icon + '?t=' + new Date().getTime() + ');"></div>' +
1490                    '       <div class="d-points-next">' + project.amount_points + '</div>' +
1491                    '       <div class="d-points-next-label">' + lang.projects_card_label_points2 + '</div>' +
1492                    '   </div>' +
1493                    '   <div class="d-footer">' +
1494                    '       <div class="d-activity-clicable-area"></div>' +
1495                    '       <div class="d-activity-tasks">' + tasks_values + '</div>' +
1496                    '       <div class="d-activity-tasks-label">' + lang.projects_card_label_tasks + '</div>' +
1497                    '       <div class="d-activity-tests">' + tests_values + '</div>' +
1498                    '       <div class="d-activity-tests-label">' + lang.projects_card_label_tests + '</div>' +
1499                    '       <div class="d-activity-trophies">' + cromos_values + '</div>' +
1500                    '       <div class="d-activity-trophies-label">' + lang.projects_card_label_trophies + '</div>' +
1501                    '   </div>' +
1502                    '</div>';
1503                break;
1504        }
1505        return html;
1506    }
1507    function getHtmlCardMenu(project) {
1508        var html = "";
1509
1510        const duplicateOptionHtml = haveTwoOrMoreClassrooms ?
1511            '    <li><a href="javascript:void(0);" action="duplicate">' + (lang.classroom_project_contextual_duplicate || "Duplicar") + '</a></li>' : '';
1512        const shareOptionHtml =
1513            '    <li><a href="javascript:void(0);" action="share">' + (lang.classroom_project_contextual_share || "Compartir.") + '</a></li>';
1514
1515        switch (project.status) {
1516            case "active":
1517                html = '<div class="dropdown big ' + project.project_guid + '">' +
1518                    '<ul class="dropdown-content">' +
1519                    '    <li><a href="javascript:void(0);" action="open">' + lang.classroom_project_contextual_open + '</a></li>' +
1520                    '    <li><a href="javascript:void(0);" action="edit">' + lang.classroom_project_contextual_edit + '</a></li>' +
1521                    duplicateOptionHtml +
1522                    shareOptionHtml +
1523                    '    <li><a href="javascript:void(0);" action="archive">' + lang.classroom_project_contextual_card_remove + '</a></li>' +
1524                    '    <li class="divider"></li>' +
1525                    '    <li class="disabled"><a href="javascript:void(0);" action="change-state">' + lang.projects_card_changestatus_contextual + '</a></li>' +
1526                    '</ul>' +
1527                    '</div>';
1528                break;
1529            case "finished":
1530                html = '<div class="dropdown big ' + project.project_guid + '">' +
1531                    '<ul class="dropdown-content">' +
1532                    '    <li><a href="javascript:void(0);" action="open">' + lang.classroom_project_contextual_open + '</a></li>' +
1533                    '    <li><a href="javascript:void(0);" action="edit">' + lang.classroom_project_contextual_edit + '</a></li>' +
1534                    duplicateOptionHtml +
1535                    shareOptionHtml +
1536                    '    <li><a href="javascript:void(0);" action="archive">' + lang.classroom_project_contextual_card_remove + '</a></li>' +
1537                    '    <li class="divider"></li>' +
1538                    '    <li class="disabled"><a href="javascript:void(0);" action="change-state">' + lang.projects_card_changestatus_contextual + '</a></li>' +
1539                    '</ul>';
1540                break;
1541            case "next":
1542                html = '<div class="dropdown big ' + project.project_guid + '">' +
1543                    '<ul cl
1543ass="dropdown-content">' +
1544                    '    <li><a href="javascript:void(0);" action="open">' + lang.classroom_project_contextual_open + '</a></li>' +
1545                    '    <li><a href="javascript:void(0);" action="edit">' + lang.classroom_project_contextual_edit + '</a></li>' +
1546                    duplicateOptionHtml +
1547                    shareOptionHtml +
1548                    '    <li><a href="javascript:void(0);" action="archive">' + lang.classroom_project_contextual_card_remove + '</a></li>' +
1549                    '    <li class="divider"></li>' +
1550                    '    <li class="disabled"><a href="javascript:void(0);" action="change-state">' + lang.projects_card_changestatus_contextual + '</a></li>' +
1551                    '</ul>' +
1552                    '</div>';
1553                break;
1554        }
1555        return html;
1556    }
1557    function getHtmlChangeStatus(project) {
1558        var html = '<div class="d-changestatus-title">' + lang.projects_card_changestatus_title + '</div>';
1559        switch (project.status) {
1560            case "active":
1561                html += '<div class="d-changestatus-status-1-msg">' + lang.projects_card_changestatus_msg_finish + '</div>' +
1562                    '<div class="d-changestatus-status-1-btn btn d-btn btn-bitmap red" status="finished">' + lang.projects_card_changestatus_btn_finish + '</div>' +
1563                    '<div class="d-changestatus-status-2-msg">' + lang.projects_card_changestatus_msg_next + '</div>' +
1564                    '<div class="d-changestatus-status-2-btn btn d-btn btn-bitmap" status="next">' + lang.projects_card_changestatus_btn_next + '</div>';
1565                break;
1566            case "next":
1567                html += '<div class="d-changestatus-status-1-msg">' + lang.projects_card_changestatus_msg_active + '</div>' +
1568                    '<div class="d-changestatus-status-1-btn btn d-btn btn-bitmap green" status="active">' + lang.projects_card_changestatus_btn_active + '</div>' +
1569                    '<div class="d-changestatus-status-2-msg">' + lang.projects_card_changestatus_msg_finish + '</div>' +
1570                    '<div class="d-changestatus-status-2-btn btn d-btn btn-bitmap red" status="finished">' + lang.projects_card_changestatus_btn_finish + '</div>';
1571                break;
1572            case "finished":
1573                html += '<div class="d-changestatus-status-1-msg">' + lang.projects_card_changestatus_msg_active + '</div>' +
1574                    '<div class="d-changestatus-status-1-btn btn d-btn btn-bitmap green" status="active">' + lang.projects_card_changestatus_btn_active + '</div>' +
1575                    '<div class="d-changestatus-status-2-msg">' + lang.projects_card_changestatus_msg_next + '</div>' +
1576                    '<div class="d-changestatus-status-2-btn btn d-btn btn-bitmap" status="next">' + lang.projects_card_changestatus_btn_next + '</div>';
1577                break;
1578        }
1579        //html += '<div class="d-changestatus-btn-cancel btn orange">' + lang.projects_card_changestatus_btn_cancel + '</div>';
1580        return html;
1581    }
1582    function getHtmlLoader() {
1583        return '<div class="d-loader"><img src="css/img/loading_gears_2.gif" /></div>';
1584    }
1585
1586    // public methods
1587    this.show = show;
1588    this.getClassroom = getClassroom;
1589}
1590    ;

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.