PageSourceSearch

https://www.janek.com/wp-content/cache/min/1/wp-content/mu-plugins…/assets/js/course-finder.js?ver=1789171510

js janek.com collected 2026-09-25 02:38:34 UTC 26,321 bytes, 125 lines download raw bytes

1(function($){"use strict";$(document).ready(function(){initCourseFinder()});function initCourseFinder(){$(".fx-course-finder-block").each(function(){var $block=$(this);var blockId=$block.attr("id");var courseData=JSON.parse($block.find(".fx-course-data").text());var finder=new CourseFinder($block,courseData);finder.init()})}
2function CourseFinder($block,data){this.$block=$block;this.data=data;this.$overlay=$(".fx-lightbox-overlay");this.$subskillsLightbox=$(".fx-subskills-lightbox");this.$subskillDetailsLightbox=$(".fx-subskill-details-lightbox");this.$courseDetailsLightbox=$(".fx-course-details-lightbox");this.$roleDetailsLightbox=$(".fx-role-details-lightbox");this.currentView="skills";this.currentSkillIndex=null;this.lastOpenedSkill=null;this.subskillDetailsSource=null;this.lastOpenedRole=null;this.lastOpenedCourse=null}
3CourseFinder.prototype.init=function(){this.bindEvents();this.handleHashNavigation()};CourseFinder.prototype.bindEvents=function(){var self=this;this.$block.find(".fx-toggle-btn").on("click",function(){var view=$(this).data("view");self.switchView(view)});this.$block.find(".fx-skills-view .fx-category-btn").on("click",function(){var skillIndex=$(this).data("skill-index");self.showSubskillsLightbox(skillIndex);$(this).addClass("active").siblings().removeClass("active")});this.$block.find(".fx-courses-view .fx-category-btn").on("click",function(){var courseId=$(this).data("course-id");self.showCourseDetailsLightbox(courseId);$(this).addClass("active").siblings().removeClass("active")});this.$block.find(".fx-roles-view .fx-category-btn").on("click",function(){var roleName=$(this).data("role-name");self.showRoleDetailsLightbox(roleName);$(this).addClass("active").siblings().removeClass("active")});this.$courseDetailsLightbox.on("click",".fx-subskill-clickable",function(){var subskillIndex=$(this).data("subskill-index");self.showSubskillDetailsFromCourse(subskillIndex)});this.$courseDetailsLightbox.on("click",".fx-role-clickable",function(){var roleName=$(this).data("role-name");self.showRoleDetailsFromCourse(roleName)});this.$roleDetailsLightbox.on("click",".fx-subskill-clickable",function(){var skillIndex=$(this).data("skill-index");var subskillIndex=$(this).data("subskill-index");if(subskillIndex!==undefined){self.showSubskillDetailsFromRole(subskillIndex)}else if(skillIndex!==undefined){self.showSubskillsLightbox(skillIndex)}});this.$roleDetailsLightbox.on("click",".fx-course-clickable",function(){var courseId=$(this).data("course-id");self.showCourseDetailsFromRole(courseId)});this.$subskillDetailsLightbox.on("click",".fx-course-clickable",function(){var courseId=$(this).data("course-id");self.showCourseDetailsFromSubskill(courseId)});this.$subskillDetailsLightbox.on("click",".fx-role-clickable",function(){var roleName=$(this).data("role-name");self.showRoleDetailsFromSubskill(roleName)});this.$overlay.on("click",".fx-lightbox-close",function(){self.closeLightbox()});this.$subskillDetailsLightbox.on("click",".fx-lightbox-back",function(){self.goBackToSubskills()});this.$subskillDetailsLightbox.on("click",".fx-carousel-prev, .fx-carousel-next",function(){if(!$(this).hasClass("disabled")){var direction=$(this).data("direction");self.navigateSubskill(direction)}});this.$overlay.on("click",function(e){if($(e.target).hasClass("fx-lightbox-overlay")){self.closeLightbox()}});$(document).on("keyup",function(e){if(e.key==="Escape"){self.closeLightbox()}})};CourseFinder.prototype.switchView=function(view,updateHash){this.currentView=view;this.$block.find(".fx-toggle-btn").removeClass("active");this.$block.find('.fx-toggle-btn[data-view="'+view+'"]').addClass("active");this.$block.find(".fx-view").removeClass("active");this.$block.find('.fx-view[data-view="'+view+'"]').addClass("active");if(updateHash!==!1){this.updateHash(view)}};CourseFinder.prototype.handleHashNavigation=function(){var self=this;var hash=window.location.hash.replace("#","");var validViews=["skills","courses","roles"];if(hash&&validViews.indexOf(hash)!==-1){this.switchView(hash,!1);setTimeout(function(){self.scrollToBlock()},100)}
4$(window).on("hashchange",function(){var newHash=window.location.hash.replace("#","");if(newHash&&validViews.indexOf(newHash)!==-1){self.switchView(newHash,!1);self.scrollToBlock()}else if(!newHash){self.switchView("skills",!1)}})};CourseFinder.prototype.updateHash=function(view){if(history.pushState){history.pushState(null,null,"#"+view)}else{window.location.hash=view}};CourseFinder.prototype.scrollToBlock=function(){var blockOffset=this.$block.offset().top;var scrollOffset=blockOffset-100;$("html, body").animate({scrollTop:scrollOffset,},500)};CourseFinder.prototype.showSubskillsLightbox=function(skillIndex){var self=this;this.currentSkillIndex=skillIndex;this.lastOpenedSkill=skillIndex;var skill=this.data.skills.find(function(s){return s.index==skillIndex});if(!skill||!skill.subskills||skill.subskills.length===0){return}
5this.$subskillsLightbox.find(".fx-lightbox-title").text(skill.name);this.$subskillsLightbox.find(".fx-lightbox-subtitle").text(skill.description);var $buttonsContainer=this.$subskillsLightbox.find(".fx-subskills-buttons");$buttonsContainer.empty();
5skill.subskills.forEach(function(subskill,index){var courses=subskill.courses||[];var courseIds=courses.map(function(course){return course.id||course.page_id}).filter(function(id){return id!==null&&id!==undefined});var $btn=$("<button>",{class:"fx-subskill-btn"+(index===0?" active":""),text:subskill.title,"data-subskill-index":subskill.index,"data-course-ids":courseIds.length>0?JSON.stringify(courseIds):"","data-course-count":courses.length,});$btn.on("click",function(){self.subskillDetailsSource="skills";self.showSubskillDetails(subskill);$(this).addClass("active").siblings().removeClass("active")});$buttonsContainer.append($btn)});this.$overlay.fadeIn(300);this.$subskillsLightbox.fadeIn(300)};CourseFinder.prototype.showSubskillDetails=function(subskill,courseIndex){var self=this;this.$subskillsLightbox.hide();this.currentSubskill=subskill;this.currentSubskillIndex=subskill.index;if(typeof courseIndex==="undefined"){courseIndex=0}
6this.currentCourseIndexInSubskill=courseIndex;var $detailContainer=this.$subskillDetailsLightbox.find(".fx-subskill-detail");$detailContainer.empty();this.$subskillDetailsLightbox.find(".fx-carousel-nav").remove();$detailContainer.html('<div class="fx-loading">Loading...</div>');this.$overlay.fadeIn(300);this.$subskillDetailsLightbox.fadeIn(300);if(subskill.courses&&subskill.courses.length>0&&subskill.courses[courseIndex]&&subskill.courses[courseIndex].page_id){var course=subskill.courses[courseIndex];var pageId=course.page_id;var courseUrl=course.url;$.ajax({url:fxCourseFinder.ajaxurl,type:"POST",data:{action:"fx_get_page_data",page_id:pageId,view:"skills",},success:function(response){if(response.success&&response.data){var data=response.data;self.renderSubskillDetails(subskill,data,courseIndex)}else{self.renderSubskillDetailsError(subskill,courseIndex,courseUrl)}},error:function(){self.renderSubskillDetailsError(subskill,courseIndex,courseUrl)},})}else{var courseUrl=subskill.courses&&subskill.courses.length>0?subskill.courses[0].url:null;self.renderSubskillDetailsBasic(subskill,courseIndex,courseUrl)}};CourseFinder.prototype.renderSubskillDetails=function(subskill,data,courseIndex){var self=this;var $detailContainer=this.$subskillDetailsLightbox.find(".fx-subskill-detail");var imageHtml=this.getBackgroundHtml("skills",data.featured_image,data.heading);var coursesHtml='<div class="fx-course-subskills"><h4>Courses to Advance This Skillset:</h4>';if(subskill.courses&&subskill.courses.length>0){coursesHtml+='<div class="fx-subskill-tags">';subskill.courses.forEach(function(course){coursesHtml+='<a class="fx-subskill-tag" href="'+course.url+'" target="_blank">'+self.escapeHtml(course.title)+"</a>"});coursesHtml+="</div>"}else{coursesHtml+='<p class="fx-no-courses">No related courses</p>'}
7coursesHtml+="</div>";var rolesHtml='<div class="fx-course-subskills"><h4>Roles That Leverage This Skillset:</h4>';if(subskill.related_roles&&subskill.related_roles.length>0){rolesHtml+='<div class="fx-subskill-tags">';subskill.related_roles.forEach(function(roleName){rolesHtml+='<span class="fx-subskill-tag fx-role-clickable" data-role-name="'+self.escapeHtml(roleName)+'">'+self.escapeHtml(roleName)+"</span>"});rolesHtml+="</div>"}else{rolesHtml+='<p class="fx-no-courses">No related roles</p>'}
8rolesHtml+="</div>";var ctaHtml="";var ctaUrl=subskill.cta_link;if(ctaUrl){var ctaText="Contact us";ctaHtml='<a href="'+this.escapeHtml(ctaUrl)+'" class="fx-subskill-cta">'+this.escapeHtml(ctaText)+"</a>"}
9var detailHtml=`
10            <div class="fx-subskill-detail-inner">
11                ${imageHtml}
12                <div class="fx-subskill-info">
13                    <div class="fx-subskill-info-header">
14                        <button class="fx-lightbox-back">&larr;</button>
15                        <button class="fx-lightbox-close">&times;</button>
16                    </div>
17                    ${
18                        subskill.title
19                            ? '<p class="fx-subskill-caption">' + this.escapeHtml(subskill.title) + "</p>"
20                            : ""
21                    }
22                    ${subskill.text ? '<p class="fx-subskill-text">' + this.escapeHtml(subskill.text) + "</p>" : ""}
23                    ${rolesHtml}
24                    ${coursesHtml}
25                    ${ctaHtml}
26                </div>
27            </div>
28        `;$detailContainer.html(detailHtml)};
28CourseFinder.prototype.renderSubskillDetailsBasic=function(subskill,courseIndex,courseUrl){var self=this;var $detailContainer=this.$subskillDetailsLightbox.find(".fx-subskill-detail");var coursesHtml='<div class="fx-course-subskills"><h4>Courses to Advance This Skillset:</h4>';if(subskill.courses&&subskill.courses.length>0){coursesHtml+='<div class="fx-subskill-tags">';subskill.courses.forEach(function(course){coursesHtml+='<a class="fx-subskill-tag" href="'+course.url+'" target="_blank">'+self.escapeHtml(course.title)+"</a>"});coursesHtml+="</div>"}else{coursesHtml+='<p class="fx-no-courses">No related courses</p>'}
29coursesHtml+="</div>";var rolesHtml='<div class="fx-course-subskills"><h4>Roles That Leverage This Skillset:</h4>';if(subskill.related_roles&&subskill.related_roles.length>0){rolesHtml+='<div class="fx-subskill-tags">';subskill.related_roles.forEach(function(roleName){rolesHtml+='<span class="fx-subskill-tag fx-role-clickable" data-role-name="'+self.escapeHtml(roleName)+'">'+self.escapeHtml(roleName)+"</span>"});rolesHtml+="</div>"}else{rolesHtml+='<p class="fx-no-courses">No related roles</p>'}
30rolesHtml+="</div>";var ctaHtml="";var ctaUrl=courseUrl||subskill.cta_link;if(ctaUrl){ctaHtml='<a href="'+this.escapeHtml(ctaUrl)+'" class="fx-subskill-cta">Contact us</a>'}
31var detailHtml=`
32            <div class="fx-subskill-detail-inner">
33                <div class="fx-subskill-info">
34                    <div class="fx-subskill-info-header">
35                        <button class="fx-lightbox-back">&larr;</button>
36                        <button class="fx-lightbox-close">&times;</button>
37                    </div>
38                    ${
39                        subskill.title
40                            ? '<h3 class="fx-subskill-title">' + this.escapeHtml(subskill.title) + "</h3>"
41                            : ""
42                    }
43                    ${subskill.text ? '<p class="fx-subskill-text">' + this.escapeHtml(subskill.text) + "</p>" : ""}
44                    ${
45                        subskill.content
46                            ? '<div class="fx-subskill-description">' + this.escapeHtml(subskill.content) + "</div>"
47                            : ""
48                    }
49                    ${coursesHtml}
50                    ${rolesHtml}
51                    ${ctaHtml}
52                </div>
53            </div>
54        `;$detailContainer.html(detailHtml)};CourseFinder.prototype.renderSubskillDetailsError=function(subskill,courseIndex,courseUrl){var self=this;var $detailContainer=this.$subskillDetailsLightbox.find(".fx-subskill-detail");var coursesHtml='<div class="fx-course-subskills"><h4>Courses to Advance This Skillset:</h4>';if(subskill.courses&&subskill.courses.length>0){coursesHtml+='<div class="fx-subskill-tags">';subskill.courses.forEach(function(course){coursesHtml+='<span class="fx-subskill-tag fx-course-clickable" data-course-id="'+course.id+'">'+self.escapeHtml(course.title)+"</span>"});coursesHtml+="</div>"}else{coursesHtml+='<p class="fx-no-courses">No related courses</p>'}
55coursesHtml+="</div>";var rolesHtml='<div class="fx-course-subskills"><h4>Roles That Leverage This Skillset:</h4>';if(subskill.related_roles&&subskill.related_roles.length>0){rolesHtml+='<div class="fx-subskill-tags">';subskill.related_roles.forEach(function(roleName){rolesHtml+='<span class="fx-subskill-tag fx-role-clickable" data-role-name="'+self.escapeHtml(roleName)+'">'+self.escapeHtml(roleName)+"</span>"});rolesHtml+="</div>"}else{rolesHtml+='<p class="fx-no-courses">No related roles</p>'}
56rolesHtml+="</div>";var ctaHtml="";var ctaUrl=courseUrl||subskill.cta_link;if(ctaUrl){ctaHtml='<a href="'+this.escapeHtml(ctaUrl)+'" class="fx-subskill-cta">Contact us</a>'}
57var detailHtml=`
58            <div class="fx-subskill-detail-inner">
59                <div class="fx-subskill-info">
60                    <div class="fx-subskill-info-header">
61                        <button class="fx-lightbox-back">&larr;</button>
62                        <button class="fx-lightbox-close">&times;</button>
63                    </div>
64                    <h3 class="fx-subskill-title">${this.escapeHtml(subskill.title)}</h3>
65                    ${subskill.text ? '<p class="fx-subskill-text">' + this.escapeHtml(subskill.text) + "</p>" : ""}
66                    <div class="fx-error">Error loading subskill data</div>
67                    ${coursesHtml}
68                    ${rolesHtml}
69                    ${ctaHtml}
70                </div>
71            </div>
72        `;$detailContainer.html(detailHtml)};
72CourseFinder.prototype.addCarouselNavigation=function(subskill,currentCourseIndex){var $detailContainer=this.$subskillDetailsLightbox.find(".fx-subskill-detail");var totalCourses=subskill.courses&&subskill.courses.length?subskill.courses.length:0;console.log("=== CarouselSkills Debug ===",{type:"Courses within Subskill",subskillTitle:subskill.title,totalCourses:totalCourses,currentCourseIndex:currentCourseIndex,displayPosition:currentCourseIndex+1+" / "+totalCourses,});if(totalCourses>1){var prevDisabled=currentCourseIndex<=0?" disabled":"";var nextDisabled=currentCourseIndex>=totalCourses-1?" disabled":"";var $carouselNav=$("<div>",{class:"fx-carousel-nav fx-carousel-skills","data-carousel-type":"skills",});var $prevBtn=$("<button>",{class:"fx-carousel-prev"+prevDisabled,"data-direction":"prev",html:"<span>&larr;</span>",});var $counter=$("<span>",{class:"fx-carousel-counter",text:currentCourseIndex+1+" / "+totalCourses,});var $nextBtn=$("<button>",{class:"fx-carousel-next"+nextDisabled,"data-direction":"next",html:"<span>&rarr;</span>",});$carouselNav.append($prevBtn,$counter,$nextBtn);$detailContainer.after($carouselNav);console.log("CarouselSkills: Navigation added successfully - navigating between",totalCourses,"courses")}else{console.log("CarouselSkills: No navigation needed - only",totalCourses,"course(s) mapped to this subskill")}};CourseFinder.prototype.showCourseDetailsLightbox=function(courseId){var self=this;var course=this.data.courses.find(function(c){return c.id==courseId});if(!course){return}
73this.lastOpenedCourse=courseId;var $detailContainer=this.$courseDetailsLightbox.find(".fx-course-detail");$detailContainer.empty();this.$courseDetailsLightbox.find(".fx-carousel-nav").remove();$detailContainer.html('<div class="fx-loading">Loading...</div>');this.$overlay.fadeIn(300);this.$courseDetailsLightbox.fadeIn(300);$.ajax({url:fxCourseFinder.ajaxurl,type:"POST",data:{action:"fx_get_page_data",page_id:course.id,view:"courses",},success:function(response){if(response.success&&response.data){var data=response.data;self.renderCourseDetails(course,data)}else{self.renderCourseDetailsError(course)}},error:function(){self.renderCourseDetailsError(course)},})};CourseFinder.prototype.renderCourseDetails=function(course,data){var self=this;var $detailContainer=this.$courseDetailsLightbox.find(".fx-course-detail");var imageHtml=this.getBackgroundHtml("courses",data.featured_image,data.heading);var relatedSubskills=[];if(data.related_subskills&&data.related_subskills.length>0){relatedSubskills=data.related_subskills}else if(this.data.skills&&this.data.skills.length>0){var courseId=parseInt(course.id,10);this.data.skills.forEach(function(skill){if(skill.subskills&&skill.subskills.length>0){skill.subskills.forEach(function(subskill){if(subskill.courses&&subskill.courses.length>0){subskill.courses.forEach(function(subskillCourse){var subskillCourseId=parseInt(subskillCourse.id||subskillCourse.page_id,10);if(subskillCourseId===courseId){var alreadyAdded=relatedSubskills.some(function(rs){return rs.index===subskill.index});if(!alreadyAdded){relatedSubskills.push({title:subskill.title,index:subskill.index,})}}})}})}})}
74var subskillsHtml="";if(relatedSubskills.length>0){subskillsHtml='<div class="fx-course-subskills"><h4>Skills Learned:</h4><div class="fx-subskill-tags">';relatedSubskills.forEach(function(subskill){subskillsHtml+='<span class="fx-subskill-tag fx-subskill-clickable" data-subskill-index="'+subskill.index+'">'+self.escapeHtml(subskill.title)+"</span>"});subskillsHtml+="</div></div>"}
75var rolesHtml="";if(data.related_roles&&data.related_roles.length>0){rolesHtml='<div class="fx-course-subskills"><h4>Roles That Benefit From This Course:</h4><div class="fx-subskill-tags">';data.related_roles.forEach(function(roleName){rolesHtml+='<span class="fx-subskill-tag fx-role-clickable" data-role-name="'+self.escapeHtml(roleName)+'">'+self.escapeHtml(roleName)+"</span>"});rolesHtml+="</div></div>"}
76var ctaHtml="";if(data.page_url){var ctaText=data.default_cta_text||"Get Started";ctaHtml='<a href="'+this.escapeHtml(data.page_url)+'" class="fx-subskill-cta">'+this.escapeHtml(ctaText)+"</a>"}
77var detailHtml=`
78            <div class="fx-subskill-detail-inner">
79                ${imageHtml}
80                <div class="fx-subskill-info">
81                    <h3 class="fx-subskill-title">${this.escapeHtml(data.heading)}</h3>
82                    ${data.description ? '<div class="fx-subskill-description">' + data.description + "</div>" : ""}
83                    ${subskillsHtml}
84                    ${rolesHtml}
85                    ${ctaHtml}
86                </div>
87            </div>
88        `;$detailContainer.html(detailHtml)};CourseFinder.prototype.renderCourseDetailsError=function(course){var $detailContainer=this.$courseDetailsLightbox.find(".fx-course-detail");var ctaHtml="";if(course.url){ctaHtml='<a href="'+this.escapeHtml(course.url)+'" class="fx-subskill-cta">Get Started</a>'}
89var detailHtml=`
90            <div class="fx-subskill-detail-inner">
91                <div class="fx-subskill-info">
92                    <h3 class="fx-subskill-title">${this.escapeHtml(course.title)}</h3>
93                    <div class="fx-error">Error loading course data</div>
94                    ${ctaHtml}
95                </div>
96            </div>
97        `;$detailContainer.html(detailHtml)};CourseFinder.prototype.showRoleDetailsLightbox=function(roleName){var self=this;var role=this.data.roles.find(function(r){return r.name===roleName});if(!role){return}
98this.lastOpenedRole=roleName;var $detailContainer=this.$roleDetailsLightbox.find(".fx-role-detail");$detailContainer.empty();this.$roleDetailsLightbox.find(".fx-carousel-nav").remove();
98var imageHtml=this.getBackgroundHtml("roles",null,role.name);var subskillsHtml="";var detailedSubskillsHtml='<div class="fx-course-subskills"><h4>Skills Critical For This Role:</h4>';if(role.detailed_subskills&&role.detailed_subskills.length>0){detailedSubskillsHtml+='<div class="fx-subskill-tags">';role.detailed_subskills.forEach(function(subskill){detailedSubskillsHtml+='<span class="fx-subskill-tag fx-subskill-clickable" data-subskill-index="'+subskill.index+'">'+self.escapeHtml(subskill.title)+"</span>"});detailedSubskillsHtml+="</div>"}else{detailedSubskillsHtml+='<p class="fx-no-courses">No related sub-skills</p>'}
99detailedSubskillsHtml+="</div>";var coursesHtml='<div class="fx-course-subskills"><h4>Recommended Sales Training Courses For This Role:</h4>';if(role.courses&&role.courses.length>0){coursesHtml+='<div class="fx-subskill-tags">';role.courses.forEach(function(course){coursesHtml+='<a class="fx-subskill-tag" href="'+course.url+'" target="_blank">'+self.escapeHtml(course.title)+"</a>"});coursesHtml+="</div>"}else{coursesHtml+='<p class="fx-no-courses">No related courses</p>'}
100coursesHtml+="</div>";var ctaHtml="";if(role.cta_link){var ctaText="Get Started";ctaHtml='<a href="'+this.escapeHtml(role.cta_link)+'" class="fx-subskill-cta"> Contact us </a>'}
101var detailHtml=`
102            <div class="fx-subskill-detail-inner">
103                ${imageHtml}
104                <div class="fx-subskill-info">
105                    <h3 class="fx-subskill-title">${this.escapeHtml(role.name)}</h3>
106                    ${role.description ? '<div class="fx-subskill-description">' + role.description + "</div>" : ""}
107                    ${subskillsHtml}
108                    ${detailedSubskillsHtml}
109                    ${coursesHtml}
110                    ${ctaHtml}
111                </div>
112            </div>
113        `;$detailContainer.html(detailHtml);this.$overlay.fadeIn(300);this.$roleDetailsLightbox.fadeIn(300)};CourseFinder.prototype.showSubskillDetailsFromRole=function(subskillIndex){var subskill=null;var parts=String(subskillIndex).split("_");if(parts.length===2){var skillIndex=parseInt(parts[0],10);var localSubskillIndex=parseInt(parts[1],10);if(this.data.skills[skillIndex]&&this.data.skills[skillIndex].subskills){for(var j=0;j<this.data.skills[skillIndex].subskills.length;j++){if(this.data.skills[skillIndex].subskills[j].index==localSubskillIndex){subskill=this.data.skills[skillIndex].subskills[j];break}}}}else{for(var i=0;i<this.data.skills.length;i++){var skill=this.data.skills[i];for(var j=0;j<skill.subskills.length;j++){if(skill.subskills[j].index==subskillIndex){subskill=skill.subskills[j];break}}
114if(subskill)break}}
115if(!subskill){return}
116this.subskillDetailsSource="role";this.$roleDetailsLightbox.hide();this.showSubskillDetails(subskill)};CourseFinder.prototype.showSubskillDetailsFromCourse=function(subskillIndex){var subskill=null;for(var i=0;i<this.data.skills.length;i++){var skill=this.data.skills[i];for(var j=0;j<skill.subskills.length;j++){if(skill.subskills[j].index==subskillIndex){subskill=skill.subskills[j];break}}
117if(subskill)break}
118if(!subskill){return}
119this.subskillDetailsSource="course";this.$courseDetailsLightbox.hide();this.showSubskillDetails(subskill)};CourseFinder.prototype.showRoleDetailsFromCourse=function(roleName){this.$courseDetailsLightbox.hide();this.showRoleDetailsLightbox(roleName)};CourseFinder.prototype.showCourseDetailsFromRole=function(courseId){this.$roleDetailsLightbox.hide();this.showCourseDetailsLightbox(courseId)};CourseFinder.prototype.showCourseDetailsFromSubskill=function(courseId){this.$subskillDetailsLightbox.hide();this.showCourseDetailsLightbox(courseId)};CourseFinder.prototype.showRoleDetailsFromSubskill=function(roleName){this.$subskillDetailsLightbox.hide();this.showRoleDetailsLightbox(roleName)};CourseFinder.prototype.navigateSubskill=function(direction){var self=this;if(!this.currentSubskill||!this.currentSubskill.courses||this.currentSubskill.courses.length<=1){return}
120var currentCourseIndex=this.currentCourseIndexInSubskill||0;var newCourseIndex;if(direction==="prev"){newCourseIndex=currentCourseIndex-1}else if(direction==="next"){newCourseIndex=currentCourseIndex+1}
121if(newCourseIndex<0||newCourseIndex>=this.currentSubskill.courses.length){return}
122console.log("Navigating to course index",newCourseIndex,"of",this.currentSubskill.courses.length,"courses");this.showSubskillDetails(this.currentSubskill,newCourseIndex)};CourseFinder.prototype.goBackToSubskills=function(){this.$subskillDetailsLightbox.hide();if(this.subskillDetailsSource==="role"&&this.lastOpenedRole){this.showRoleDetailsLightbox(this.lastOpenedRole)}else if(this.subskillDetailsSource==="course"&&this.lastOpenedCourse){this.showCourseDetailsLightbox(this.lastOpenedCourse)}else{this.$subskillsLightbox.fadeIn(300)}
123this.subskillDetailsSource=null};CourseFinder.prototype.closeLightbox=function(){this.$overlay.fadeOut(300);this.$subskillsLightbox.fadeOut(300);this.$subskillDetailsLightbox.fadeOut(300);this.$courseDetailsLightbox.fadeOut(300);this.$roleDetailsLightbox.fadeOut(300)};CourseFinder.prototype.escapeHtml=function(text){if(!text)return"";var map={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;",};return String(text).replace(/[&<>"']/g,function(m){return map[m]})};
123CourseFinder.prototype.getBackgroundHtml=function(view,featuredImage,altText){var backgroundMode=this.data.backgroundMode||"image";var siteLogo=this.data.siteLogo||"";if(backgroundMode==="gradient"){var gradientColor=this.data.gradientColors&&this.data.gradientColors[view]?this.data.gradientColors[view]:"#0066cc";var rgba=this.hexToRgba(gradientColor,0.35);var gradientStyle="--gradient-color: "+rgba+"; background: linear-gradient(to right, "+rgba+" 0%, rgba(255,255,255,0) 100%);";var html='<div class="fx-subskill-image fx-gradient-background" style="'+gradientStyle+'">';if(siteLogo){html+='<div class="fx-background-logo"><img src="'+this.escapeHtml(siteLogo)+'" alt="Site Logo"></div>'}
124html+="</div>";return html}else{var imageUrl=featuredImage||(this.data.defaultImages&&this.data.defaultImages[view]?this.data.defaultImages[view]:"");if(imageUrl){return('<div class="fx-subskill-image"><img src="'+this.escapeHtml(imageUrl)+'" alt="'+this.escapeHtml(altText)+'"></div>')}
125return""}};CourseFinder.prototype.hexToRgba=function(hex,opacity){hex=hex.replace("#","");var r=parseInt(hex.substring(0,2),16);var g=parseInt(hex.substring(2,4),16);var b=parseInt(hex.substring(4,6),16);return"rgba("+r+", "+g+", "+b+", "+opacity+")"}})(jQuery)

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.