1 line
15 KiB
JavaScript

var CourseNav=function(e){"use strict";new Set;class t extends Howl{constructor(e){super(e),this._timeupdateListeners=[],this._interval=null,this._startTimeUpdate()}_startTimeUpdate(){this._interval=setInterval((()=>{this.playing()&&this._emitTimeUpdate(this.seek())}),250)}_emitTimeUpdate(e){this._timeupdateListeners.forEach((t=>t(e)))}onTimeUpdate(e){this._timeupdateListeners.push(e)}offTimeUpdate(e){this._timeupdateListeners=this._timeupdateListeners.filter((t=>t!==e))}off(e,t,n){return 0===arguments.length&&(this._timeupdateListeners=[]),super.off(e,t,n)}play(e){const t=super.play(e);return this._interval||this._startTimeUpdate(),t}pause(e){const t=super.pause(e);return clearInterval(this._interval),this._interval=null,t}stop(e){super.stop(e),clearInterval(this._interval),this._interval=null}}function n(e){return e?new t({src:[e]}):null}const o=new class{constructor(){this.audioElement=null,this.audioControlButton=document.getElementById("coursenav-audio-control"),this.audioIcon=document.getElementById("coursenav-audio-icon"),this.progressCircle=document.getElementById("coursenav-progress-circle"),this.isMuted=!1,this.progressCircle&&(this.progressCircle.style.display="none"),this.audioControlButton&&this.audioControlButton.addEventListener("click",this.toggleAudio.bind(this))}stopAllSoundsAndPlay(e){Howler._howls?.forEach((t=>{t!==e&&t.stop()})),this.updateIcon(),this.setAudio(e),this.playAudio()}loadAudio(e){this.audioElement&&this.audioElement.stop(),e&&(this.audioElement=n(e),this._bindAudioEvents())}playAudio(){this.audioElement?.play()}pauseAudio(){this.audioElement?.pause()}stopAudio(){this.audioElement?.stop(),this.progressCircle&&(this.progressCircle.style.display="none"),this.updateIconVolume(),this.audioElement=null}toggleAudio(){this.audioElement&&(this.audioElement.playing()?this.toggleMute():this.playAudio())}toggleMute(){this.isMuted=!this.isMuted,Howler.mute(this.isMuted),this.updateIconVolume(),document.querySelectorAll("video").forEach((e=>e.muted=this.isMuted))}onPlay(){this.progressCircle&&(this.progressCircle.style.display="block");const e=this.audioElement.seek();this.updateProgressCircle(e),this.updateIconVolume()}onEnd(){this.progressCircle&&(this.progressCircle.style.display="none"),this.updateIcon()}updateIcon(){if(!this.audioIcon)return;const e=this.audioElement?.playing();this.audioIcon.className=e?"fa-duotone fa-solid fa-pause":"fa-duotone fa-solid fa-play"}updateIconVolume(){this.audioIcon&&(this.audioIcon.className=this.isMuted?"fa-duotone fa-solid fa-volume-slash":"fa-duotone fa-solid fa-volume")}updateProgressCircle(e){if(!this.progressCircle||!this.audioElement)return;const t=parseFloat(this.progressCircle.getAttribute("r")),n=2*Math.PI*t,o=n-e/this.audioElement.duration()*n;this.progressCircle.setAttribute("stroke-dashoffset",o)}setAudioUrl(e){this.loadAudio(e)}setAudio(e){e instanceof t&&(this.audioElement?.stop(),this.audioElement=e,this._bindAudioEvents())}_bindAudioEvents(){this.audioElement.on("play",this.onPlay.bind(this)),this.audioElement.on("pause",this.updateIcon.bind(this)),this.audioElement.on("stop",this.updateIcon.bind(this)),this.audioElement.on("end",this.onEnd.bind(this)),this.audioElement.onTimeUpdate(this.updateProgressCircle.bind(this))}},s=e.COURSE_CONFIG_URL||"config.json",i=e.DEBUG||!1,r=(e.KEY,document.getElementById("coursenav-main-content")),a=document.getElementById("coursenav-loader-course"),c=new Audio("audio/click.mp3"),l=document.getElementById("coursenav-prev-btn"),d=document.getElementById("coursenav-next-btn"),u=document.getElementById("coursenav-progress-bar"),m=document.getElementById("coursenav-main-menu"),p=[...document.body.classList];let h;pipwerks.SCORM.version="1.2",pipwerks.debug.isActive=i,pipwerks.SCORM.handleExitMode=!1;let f=!1,g=null,v={contentArray:[],maximumAdvance:0},y=0;function A(e,t="",n="",o=null){e.forEach((e=>{const s=!o&&!n?e.title:n;e.content&&v.contentArray.push({title:e.title,content:e.content,visited:!1,showAnimation:!0,courseTitle:t,moduleTitle:s,parentTitle:o}),e.topics&&A(e.topics,t,s,e.title)}))}function w(){const e=new XMLHttpRequest;e.open("GET",`${s}?_=${Date.now()}`,!0),e.setRequestHeader("X-Requested-With","XMLHttpRequest"),e.withCredentials=!0,e.responseType="json",e.onload=function(){if(e.status>=200&&e.status<300){g=e.response,v={contentArray:[],maximumAdvance:0},g.title&&(document.title=g.title),A(g.modules,g.title||"");const t=T()||{contentArray:[],maximumAdvance:0};t.contentArray&&function(e,t){return!(!e||!t||e.length!==t.length)&&e.every(((e,n)=>e.title===t[n].title&&e.content===t[n].content))}(t.contentArray,v.contentArray)&&(v=t),v.maximumAdvance>0?"undefined"==typeof Swal?(y=confirm("¿Retomar tu progreso?")?v.maximumAdvance:0,S()):Swal.fire({title:"¿Dónde quieres empezar?",text:"Retomar o comenzar de nuevo",icon:"question",showCancelButton:!0,confirmButtonText:"Retomar",cancelButtonText:"Comenzar",target:r,customClass:{confirmButton:"btn btn-primary text-white",cancelButton:"btn btn-secondary text-white"}}).then((e=>{y=e.isConfirmed?v.maximumAdvance:0,S()})):S(),q(v)}else r?.remove()},e.onerror=function(){r?.remove()},e.send()}function S(){m&&(m.innerHTML="",(g.modules||[]).forEach((e=>{const t=document.createElement("ul");t.classList.add("course-menu"),t.appendChild(C(e)),m.appendChild(t)})),E(),E()),v.contentArray.length>0?b():r.innerHTML="<div class='alert alert-warning'>No hay contenido.</div>",l?.addEventListener("click",(()=>{_(-1)})),d?.addEventListener("click",(()=>{_(1)})),O()}function C(e){const t=document.createElement("li");t.classList.add("menu-item");const n=document.createElement("div");n.classList.add("witem"),t.appendChild(n);const o=document.createElement("a");o.classList.add("coursenav-link"),o.innerHTML=e.title;const s=v.contentArray.findIndex((t=>t.content===e.content&&t.title===e.title));if(o.dataset.coursenavindex=s,o.dataset.coursenavvisited=s>=0&&v.contentArray[s].visited,n.appendChild(o),o.addEventListener("click",(()=>{c.play();const e=parseInt(o.dataset.coursenavindex,10);if(e>=0)i||v.contentArray[e].visited?(y=e,M(),b()):(M(),k());else{const e=n.querySelector(".toggle-icon");e&&e.click()}})),e.topics?.length){const o=document.createElement("span");o.classList.add("toggle-icon"),o.innerHTML='<i class="fa-duotone fa-solid fa-square-chevron-down"></i>',n.appendChild(o);const s=document.createElement("ul");s.classList.add("sub-ul","open"),e.topics.forEach((e=>s.appendChild(C(e)))),t.appendChild(s),o.addEventListener("click",(()=>{c.play();const e=s.classList.toggle("open"),t=o.querySelector("i");t.classList.toggle("fa-square-chevron-down",e),t.classList.toggle("fa-square-chevron-right",!e)}))}return t}function E(){document.querySelectorAll("#coursenav-main-menu > ul.course-menu").forEach((function e(t){const n=new Set;Array.from(t.children).filter((e=>"LI"===e.tagName)).forEach((t=>{const o=t.querySelector(":scope > .witem > .coursenav-link");if(o){const e=o.textContent.trim();n.has(e)?t.style.display="none":n.add(e)}t.querySelectorAll(":scope > ul").forEach(e)}))}))}function M(){const e=document.getElementById("coursenav-offcanvas");(bootstrap.Offcanvas.getInstance(e)||new bootstrap.Offcanvas(e)).hide()}function k(){"undefined"==typeof Swal?alert("Debes completar el contenido actual antes de avanzar."):Swal.fire({text:"Debes completar el contenido actual antes de avanzar.",icon:"warning",target:r,customClass:{confirmButton:"btn btn-primary text-white",cancelButton:"btn btn-warning text-white"}})}function b(){document.body.className="",p.forEach((e=>document.body.classList.add(e))),r.innerHTML="",a.style.display="block",d&&d.classList.remove("look_at_me");const e=v.contentArray[y];e?.content&&(o.stopAudio(),o.audioElement?.off(),Howler._howls?.forEach((e=>e.stop())),window.gsap&&("function"==typeof gsap.killAll?gsap.killAll():gsap.killTweensOf(gsap.utils.toArray("*"))),Swal.isVisible()&&Swal.close(),document.documentElement.classList.remove("swal2-shown","swal2-height-auto"),document.body.classList.remove("swal2-shown","swal2-height-auto"),document.documentElement.removeAttribute("aria-hidden"),document.body.removeAttribute("aria-hidden"),document.querySelectorAll("script[aria-hidden]").forEach((e=>e.removeAttribute("aria-hidden"))),document.querySelectorAll("[aria-hidden]").forEach((e=>e.removeAttribute("aria-hidden"))),fetch(e.content,{cache:"no-store"}).then((e=>{if(!e.ok)throw new Error(e.statusText);return e.text()})).then((e=>{$(r).html(e)})).catch((e=>{r.innerHTML=`<pre>${e.message}</pre>`})).finally((()=>{v.maximumAdvance=Math.max(v.maximumAdvance,y),a.style.display="none",window.scrollTo(0,0),I(),function(e,t){document.body.dispatchEvent(new CustomEvent("slideChange",{detail:{message:"Slide changed!",slideIndex:e,contentArray:t}}))}(y,v.contentArray)})))}function I(){q(v),O(),L(),document.querySelectorAll(".coursenav-link").forEach((e=>{const t=parseInt(e.dataset.coursenavindex,10),n=v.contentArray[t];n&&(e.dataset.coursenavvisited=n.visited,n.visited?e.classList.add("visited"):e.classList.remove("visited"))}))}function _(e){!function(e,t){document.body.dispatchEvent(new CustomEvent("beforeSlideChange",{detail:{message:"Before slide change!",currentIndex:e,contentArray:t}}))}(y,v.contentArray),d&&d.classList.remove("look_at_me");const t=y+e;t<0||t>=v.contentArray.length||(-1===e||v.contentArray[y].visited||i?(y=t,b()):k(),O())}function O(){if(v.contentArray.length&&v.contentArray[y]){if(l.disabled=0===y,d.disabled=y>=v.contentArray.length-1||!v.contentArray[y].visited&&!i,d){const e=y>=v.contentArray.length-1,t=v.contentArray[y];!e&&t.showAnimation&&t.visited?(d.classList.add("look_at_me"),t.showAnimation=!1,q(v)):d.classList.remove("look_at_me")}}else l.disabled=d.disabled=!0}function L(){const e=v.contentArray.filter((e=>e.visited)).length/v.contentArray.length*100;u.style.width=e+"%",u.setAttribute("aria-valuenow",e.toFixed(2)),u.textContent=`${e.toFixed(0)}%`}function R(e=!0){var t,n,o;v.contentArray[y].visited=e,I(),t=y,n=v.contentArray.length,o=v.contentArray[y],document.body.dispatchEvent(new CustomEvent("slideCompleted",{detail:{message:"Slide completed!",slideIndex:t,totalSlides:n,slide:o}}));document.getElementById("coursenav-next-btn")}function x(e){if(pipwerks.SCORM.connection.isActive){const t=pipwerks.SCORM.set("cmi.core.lesson_status",e);return t&&pipwerks.SCORM.save(),t}return sessionStorage.setItem("cmi.core.lesson_status",e),!0}function T(){let e=pipwerks.SCORM.connection.isActive?pipwerks.SCORM.get("cmi.suspend_data"):sessionStorage.getItem("cmi.suspend_data");if(e)try{return JSON.parse(e)}catch{return e}return""}function B(e){const t=JSON.stringify(e);if(pipwerks.SCORM.connection.isActive){const e=pipwerks.SCORM.set("cmi.suspend_data",t);return e&&pipwerks.SCORM.save(),e}return sessionStorage.setItem("cmi.suspend_data",t),!0}function q(e){B(e)}function N(){if(pipwerks.SCORM.connection.isActive&&!f){const e=(Date.now()-h)/1e3,t=String(Math.floor(e/3600)).padStart(2,"0"),n=String(Math.floor(e%3600/60)).padStart(2,"0"),o=String(Math.floor(e%60)).padStart(2,"0");pipwerks.SCORM.set("cmi.core.session_time",`${t}:${n}:${o}`),pipwerks.SCORM.save(),pipwerks.SCORM.quit(),f=!0}}function D(e){return pipwerks.SCORM.connection.isActive?pipwerks.SCORM.get(e)??"":sessionStorage.getItem(e)??""}return document.addEventListener("DOMContentLoaded",(()=>{!function(e){const t=pipwerks.SCORM,n=t.init();n&&("not attempted"===t.get("cmi.core.lesson_status")&&(t.set("cmi.core.lesson_status","incomplete"),t.save()),h=Date.now());e(n)}((()=>w())),window.addEventListener("beforeunload",N),[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((e=>new bootstrap.Tooltip(e)))})),{audioController:o,createSound:n,soundClick:function(){c.play()},isDebug:function(){return i},getStudentName:()=>D("cmi.core.student_name"),getLessonLocation:function(){if(pipwerks.SCORM.connection.isActive){return pipwerks.SCORM.get("cmi.core.lesson_location")??""}return sessionStorage.getItem("cmi.core.lesson_location")??""},setLessonLocation:function(e){if(pipwerks.SCORM.connection.isActive){const t=pipwerks.SCORM.set("cmi.core.lesson_location",e);return t&&pipwerks.SCORM.save(),t}return sessionStorage.setItem("cmi.core.lesson_location",e),!0},getLessonStatus:function(){return pipwerks.SCORM.connection.isActive?pipwerks.SCORM.get("cmi.core.lesson_status")??"":sessionStorage.getItem("cmi.core.lesson_status")??""},setLessonStatus:x,getScore:function(){let e=pipwerks.SCORM.connection.isActive?pipwerks.SCORM.get("cmi.core.score.raw"):sessionStorage.getItem("cmi.core.score.raw");return null!=e&&""!==e?Number(e):null},setScore:function(e){if(pipwerks.SCORM.connection.isActive){const t=pipwerks.SCORM.set("cmi.core.score.raw",e);return t&&pipwerks.SCORM.save(),t}return sessionStorage.setItem("cmi.core.score.raw",e),!0},getSuspendData:T,setSuspendData:B,getScormData:D,setScormData:function(e,t){if(pipwerks.SCORM.connection.isActive){const n=pipwerks.SCORM.set(e,t);return n&&pipwerks.SCORM.save(),n}return sessionStorage.setItem(e,t),!0},nextSlide:()=>_(1),prevSlide:()=>_(-1),gotoSlide:function(e){const t=Math.floor(e);!isNaN(t)&&t>=0&&t<v.contentArray.length&&(y=t,b())},openSidebar:function(){const e=document.getElementById("coursenav-offcanvas");if(e){(bootstrap.Offcanvas.getInstance(e)||new bootstrap.Offcanvas(e)).show()}},closeSidebar:M,isVisited:()=>v.contentArray[y]?.visited||!1,isCompletedSlideIndex:e=>e>=0&&e<v.contentArray.length?v.contentArray[e].visited:void 0,getCurrentSlide:()=>v.contentArray[y],getCurrentIndex:()=>y,getCourseData:()=>v,getCourseStructure:()=>g,getCourseConfig:()=>e,getCourseTitle:()=>g?.title||"",getCourseModules:()=>g?.modules||[],getCourseContentArray:()=>v.contentArray,resetCourse:function(){v.contentArray.forEach((e=>{e.visited=!1,e.showAnimation=!0})),v.maximumAdvance=0,y=0,pipwerks.SCORM.connection.isActive?(pipwerks.SCORM.set("cmi.core.lesson_status","incomplete"),pipwerks.SCORM.set("cmi.core.lesson_location","0"),pipwerks.SCORM.set("cmi.core.score.raw",""),pipwerks.SCORM.set("cmi.suspend_data",""),pipwerks.SCORM.save()):(sessionStorage.removeItem("cmi.core.lesson_status"),sessionStorage.setItem("cmi.core.lesson_location","0"),sessionStorage.removeItem("cmi.core.score.raw"),sessionStorage.removeItem("cmi.suspend_data")),q(v),b()},markSlidesAsVisited:function(e){e.sort(((e,t)=>t-e)).forEach((e=>{y=e,R(!0)}))},setSlideVisited:R,completeLesson:()=>x("completed"),updateProgressBar:L,getProgressPercent:function(e=!1){if(!e){const e=v.contentArray.filter((e=>e.visited)).length;return parseFloat((e/v.contentArray.length*100).toFixed(2))}const t=v.contentArray[y],n=v.contentArray.filter((e=>e.moduleTitle===t.moduleTitle)),o=n.filter((e=>e.visited)).length;return n.length?parseFloat((o/n.length*100).toFixed(2)):0},getProgressByModule:function(){const e={};v.contentArray.forEach((t=>{const n=t.moduleTitle||"Sin módulo";e[n]||(e[n]={total:0,visited:0}),e[n].total++,t.visited&&e[n].visited++}));const t={};return Object.entries(e).forEach((([e,{total:n,visited:o}])=>{t[e]=parseFloat((o/n*100).toFixed(2))})),t},getCurrentModuleSlides:()=>{const e=v.contentArray[y]?.moduleTitle;return v.contentArray.filter((t=>t.moduleTitle===e))},getCurrentModuleTitle:()=>v.contentArray[y]?.moduleTitle||"",getCurrentCourseTitle:()=>v.contentArray[y]?.courseTitle||"",save:()=>pipwerks.SCORM.connection.isActive?pipwerks.SCORM.save():q(v),reload:b,loadModule:e=>{const t=v.contentArray.findIndex((t=>t.moduleTitle===e));t>=0&&(y=t,b())}}}(COURSE_CONFIG);window.CourseNav=CourseNav;