Manual_Vantive/js/coursenav.min.js
2025-10-08 11:06:36 -06:00

1 line
14 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))}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((e=>e.stop())),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()}toggleAudio(){this.audioElement&&(this.audioElement.playing()?this.pauseAudio():this.playAudio())}toggleMute(){this.isMuted=!this.isMuted,Howler.mute(this.isMuted),this.updateIcon(),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.updateIcon()}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"}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("wrap-course-content");a.setAttribute("data-original-class",a.className);const c=document.getElementById("coursenav-loader-course"),l=new Audio("audio/click.mp3"),d=document.getElementById("coursenav-prev-btn"),u=document.getElementById("coursenav-next-btn"),p=document.getElementById("coursenav-progress-bar"),m=document.getElementById("coursenav-main-menu");let h;pipwerks.SCORM.version="1.2",pipwerks.debug.isActive=i,pipwerks.SCORM.handleExitMode=!1;let g=!1,f=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,audio:e.audio,visited:!1,courseTitle:t,moduleTitle:s,parentTitle:o}),e.topics&&A(e.topics,t,s,e.title)}))}function C(){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){f=e.response,v={contentArray:[],maximumAdvance:0},f.title&&(document.title=f.title),A(f.modules,f.title||"");const 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",cancelButton:"btn btn-secondary"}}).then((e=>{y=e.isConfirmed?v.maximumAdvance:0,S()})):S(),T(v)}else r?.remove()},e.onerror=function(){r?.remove()},e.send()}function S(){m&&(m.innerHTML="",(f.modules||[]).forEach((e=>{const t=document.createElement("ul");t.classList.add("course-menu"),t.appendChild(w(e)),m.appendChild(t)})),E(),E()),v.contentArray.length>0?M():r.innerHTML="<div class='alert alert-warning'>No hay contenido.</div>",d?.addEventListener("click",(()=>{l.play(),k(-1)})),u?.addEventListener("click",(()=>{l.play(),k(1)})),I()}function w(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.textContent=e.title;const s=v.contentArray.findIndex((t=>t.content===e.content&&t.title===e.title));if(o.dataset.coursenavindex=s,o.dataset.coursenavvisited=!0,n.appendChild(o),o.addEventListener("click",(()=>{l.play();const e=parseInt(o.dataset.coursenavindex,10);if(e>=0)y=e,function(){const e=document.getElementById("coursenav-offcanvas");(bootstrap.Offcanvas.getInstance(e)||new bootstrap.Offcanvas(e)).hide()}(),M();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(w(e)))),t.appendChild(s),o.addEventListener("click",(()=>{l.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(){r.innerHTML="",a.className=a.getAttribute("data-original-class"),window.scrollTo(0,0),c.style.display="block";const e=v.contentArray[y];e?.content&&(o.stopAudio(),Howler._howls?.forEach((e=>e.stop())),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"))),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),c.style.display="none",b(),function(e,t){document.body.dispatchEvent(new CustomEvent("slideChange",{detail:{message:"Slide changed!",slideIndex:e,contentArray:t}}))}(y,v.contentArray)})))}function b(){T(v),I(),O(),document.querySelectorAll(".coursenav-link").forEach((e=>{const t=parseInt(e.dataset.coursenavindex,10);v.contentArray[t]&&(e.dataset.coursenavvisited=!0,e.classList.add("visited"))}))}function k(e){!function(e,t){document.body.dispatchEvent(new CustomEvent("beforeSlideChange",{detail:{message:"Before slide change!",currentIndex:e,contentArray:t}}))}(y,v.contentArray);const t=y+e;t<0||t>=v.contentArray.length||(-1===e||v.contentArray[y].visited||i?(y=t,M()):"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",cancelButton:"btn btn-warning"}}),I())}function I(){v.contentArray.length&&v.contentArray[y]?(d.disabled=0===y,u.disabled=y>=v.contentArray.length-1||!v.contentArray[y].visited&&!i):d.disabled=u.disabled=!0}function O(){const e=v.contentArray.filter((e=>e.visited)).length/v.contentArray.length*100;p.style.width=e+"%",p.setAttribute("aria-valuenow",e.toFixed(2)),p.textContent=`${e.toFixed(0)}%`}function L(e=!0){var t,n,o;v.contentArray[y].visited=e,b(),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}}))}function R(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 _(){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 x(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 T(e){x(e)}function B(){if(pipwerks.SCORM.connection.isActive&&!g){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(),g=!0}}function q(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)}((()=>C())),window.addEventListener("beforeunload",B),[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((e=>new bootstrap.Tooltip(e)));const e=document.getElementById("coursenav-offcanvas"),t=document.getElementById("wrap-course-content"),n=bootstrap.Offcanvas.getOrCreateInstance(e);e.addEventListener("shown.bs.offcanvas",(()=>{if(t.querySelector(".offcanvas-backdrop"))return;const e=document.createElement("div");e.className="offcanvas-backdrop fade",t.appendChild(e),e.getBoundingClientRect(),e.classList.add("show"),e.addEventListener("click",(()=>n.hide()))})),e.addEventListener("hidden.bs.offcanvas",(()=>{t.querySelector(".offcanvas-backdrop")?.remove()}))})),{audioController:o,createSound:n,soundClick:function(){l.play()},isDebug:function(){return i},getStudentName:()=>q("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:R,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:_,setSuspendData:x,getScormData:q,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:()=>k(1),prevSlide:()=>k(-1),gotoSlide:function(e){const t=Math.floor(e);!isNaN(t)&&t>=0&&t<v.contentArray.length&&(y=t,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:()=>f,getCourseConfig:()=>e,getCourseTitle:()=>f?.title||"",getCourseModules:()=>f?.modules||[],getCourseContentArray:()=>v.contentArray,resetCourse:function(){v.contentArray.forEach((e=>e.visited=!1)),v.maximumAdvance=0,y=0,b(),M()},markSlidesAsVisited:function(e){e.sort(((e,t)=>t-e)).forEach((e=>{y=e,L(!0)}))},setSlideVisited:L,completeLesson:()=>R("completed"),updateProgressBar:O,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():T(v),reload:M,loadModule:e=>{const t=v.contentArray.findIndex((t=>t.moduleTitle===e));t>=0&&(y=t,M())}}}(COURSE_CONFIG);window.CourseNav=CourseNav;