1 InJoy.courseLocker = { 2 endpoint: "https://toolbox.injoyonline.com/InJoyLibrary/courseLocker/index.php", 3 lockedCourses: [], 4 unlockedCourses:[], 5 check: async function() { 6 let url = window.location.href; 7 if (url.includes('learn/manager/course/')) { 8 let courseID = InJoy.courseID(); 9 let locked = await InJoy.courseLocker.locked(); 10 if (locked == 'Locked' || locked == 'true' || locked == 'locked' || locked == '1' || locked == 'yes' || locked == 'true') { 11 console.log('Course is locked'); 12 InJoy.courseLocker.lockedCourses.push(courseID); 13 InJoy.courseLocker.modal(); 14 } else { 15 InJoy.courseLocker.unlockedCourses.push(courseID); 16 InJoy.courseLocker.clear(); 17 console.log('Course is not locked'); 18 } 19 } else { 20 InJoy.courseLocker.clear(); 21 } 22 }, 23 clear: function() { 24 if (document.getElementById('courseLockerModal')){ 25 document.getElementById('courseLockerModal').remove(); 26 } 27 }, 28 set: function(courseID) { 29 // lock course 30 return new Promise(function(resolve, reject) { 31 if (!courseID){ 32 courseID = InJoy.courseID(); 33 }
34 let endpoint = InJoy.courseLocker.endpoint; 35 let formData = new FormData(); 36 formData.append('set', courseID); 37 formData.append("name", InJoy.courseName()); 38 InJoy.genericXHR(endpoint, formData, function(response) { 39 console.log(response); 40 resolve(response); 41 }); 42 }); 43 }, 44 get: function(courseID) { 45 // get list of locked courses 46 return new Promise(function(resolve, reject) { 47 if (!courseID){ 48 courseID = InJoy.courseID(); 49 } 50 let endpoint = InJoy.courseLocker.endpoint; 51 let formData = new FormData(); 52 formData.append('get', courseID); 53 InJoy.genericXHR(endpoint, formData, function(response) { 54 console.log(response); 55 resolve(response); 56 }); 57 }); 58 }, 59 locked: function(courseID) { 60 // check if specific course is locked 61 return new Promise(function(resolve, reject) { 62 if (!courseID){ 63 courseID = InJoy.courseID(); 64 } 65 if (InJoy.courseLocker.lockedCourses.includes(courseID)) { 66 resolve('true'); 67 } else if (InJoy.courseLocker.unlockedCourses.includes(courseID)) { 68 resolve('false'); 69 } else {
70 let endpoint = InJoy.courseLocker.endpoint; 71 let formData = new FormData(); 72 formData.append('locked', courseID); 73 InJoy.genericXHR(endpoint, formData, function(response) { 74 console.log("InJoy.courseLocker.locked",response); 75 resolve(response); 76 }); 77 } 78 }); 79 }, 80 checkAsync: async function(courseID) { 81 return new Promise(function(resolve, reject) { 82 InJoy.courseLocker.locked(courseID).then(function(response) { 83 if (response == 'true' || response == 'Locked' || response == 'locked' || response == '1' || response == 'yes') { 84 console.log('Course is locked'); 85 InJoy.courseLocker.lockedCourses.push(courseID); 86 InJoy.courseLocker.modal(); 87 resolve('locked'); 88 } else { 89 console.log('Course is not locked'); 90 InJoy.courseLocker.unlockedCourses.push(courseID); 91 InJoy.courseLocker.clear(); 92 resolve('unlocked'); 93 } 94 }).catch(function(error) { 95 console.error('Error checking course lock status:', error); 96 reject(error); 97 }); 98 }) 99 }, 100 delete: function(courseID) { 101 // delete course from locked list 102 return new Promise(function(resolve, reject) { 103 if (!courseID){ 104 courseID = InJoy.courseID(); 105 }
106 let endpoint = InJoy.courseLocker.endpoint; 107 let formData = new FormData(); 108 formData.append('delete', courseID); 109 InJoy.genericXHR(endpoint, formData, function(response) { 110 resolve(response); 111 if (document.getElementById('courseLockerModal')){ 112 document.getElementById('courseLockerModal').remove(); 113 } 114 }); 115 116 // maybe we should email me to let me know that a course was unlocked? 117 }); 118 }, 119 modal:function(){ 120 // build a modal that will keep the user from accessing the course 121 if (!document.getElementById('courseLockerModal')){ 122 let modal = document.createElement('div'); 123 modal.id = 'courseLockerModal'; 124 modal.style.display = 'block'; 125 modal.style.position = 'fixed'; 126 modal.style.zIndex = '9999'; 127 modal.style.paddingTop = '100px'; 128 modal.style.left = '0'; 129 modal.style.top = '0'; 130 modal.style.width = '100%'; 131 modal.style.height = '100%'; 132 modal.style.overflow = 'auto'; 133 modal.style.backgroundColor = 'rgba(0,0,0,0.4)'; 134 modal.innerHTML = '<div style="background-color: #fefefe;margin: auto;padding: 20px;border: 1px solid #888;width: 80%;"><h2>This course is locked</h2><p>This course is currently locked. To edit the course, click on the <strong>Unlock Course</strong> button. When you\'re finished with your edits, please contact InJoy\'s Customer Success Team so that the multi-language translations can be updated.</p><p><button onclick="InJoy.courseLocker.preview()">Preview Course</button><button style="margin-left:1rem;" onclick="window.location.assign(\'https://www.injoyonline.com/learn/manager/dashboard\')">Return to Dashboard</button><button style="margin-left:1rem;" onclick="InJoy.courseLocker.delete()">Unlock Course</button></p></div>'; 135 document.body.appendChild(modal); 136 } 137 }, 138 preview:function(){ 139 let viewIcon = document.querySelector('[aria-label="view icon"]'); 140 if (viewIcon){ 141 viewIcon.parentElement.click(); 142 } 143 } 144}
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.