1$(function() { 2 3 $('.slider-nav').slick({ 4 slidesToShow: 3, 5 slidesToScroll: 1, 6 dots: false, 7 centerMode: false, 8 focusOnSelect: true, 9 responsive: [ 10 { 11 breakpoint: 768, 12 settings: { 13 slidesToShow: 1, 14 infinite : false, 15 centerMode: true, 16 } 17 } 18 ] 19 }); 20 21 // On afterChange slide change 22 $('.slider-nav').on('afterChange', function(event, slick, currentSlide, nextSlide){ 23 let indx = $(this).parents('.tab').index() 24 // console.log(indx) 25 var currentSlideElData = $(event.currentTarget).find('.slick-current').find('button').attr('data-type'); 26 // console.log(currentSlideElData) 27 tabsSlides(currentSlideElData, indx) 28 }); 29 30 // let data = { 31 // level : [164], 32 // rank: "Beginner", 33 // session_type: "standard", 34 // }; 35 // const URL = 'https://api.alfaskolen.no/api/get/courses/registration' 36 // fetch(URL, { 37 // method: 'post', 38 // headers: { 39 // 'Accept': 'application/json, text/plain, */*', 40 // 'Content-Type': 'application/json' 41 // }, 42 // body: JSON.stringify(data), 43 // }) 44 // .then(response => { 45 // response.json().then(resp => { 46 // console.log(resp) 47 // 48 // }) 49 // }) 50 51 //******* 52 let tabsSlides = function (type, seltab){ 53 // console.log('seltab', seltab) 54 $('.tabs-slides').each(function (i, tab){ 55 // console.log('tab', tab) 56 let html; 57 let type_course = typeof type !== "undefined" ? type : $(tab).attr('data-type') 58 // console.log('type_course', type_course) 59 let isMc = $(tab).attr('data-ismc') === "1" ? '?by=mastercourses' : '' 60 // console.log('isMc', isMc) 61 let data = { 62 level : $(tab).attr('data-level').split(','), 63 rank: $(tab).attr('data-rank'), 64 session_type: type_course, 65 }; 66 // console.log($(tab).attr('data-level').split(',')) 67 let filters = typeof $(tab).attr('data-filters') !== "undefined" && $(tab).attr('data-filters') !== '' ? $(tab).attr('data-filters').split(',') : null; 68 if(filters !== null){ 69 filters.forEach(function (filterName){ 70 // console.log($(tab).find('button[data-type="'+filterName+'"]')) 71 $(tab).find('button[data-type="'+filterName+'"]').parents('.slick-slide').remove() 72 }) 73 } 74 const URL = 'https://api.alfaskolen.no/api/get/courses/registration' + isMc 75 fetch(URL, { 76 method: 'post', 77 headers: { 78 'Accept': 'application/json, text/plain, */*', 79 'Content-Type': 'application/json' 80 }, 81 body: JSON.stringify(data), 82 }) 83 .then(response => { 84 response.json().then(resp => { 85 htmlm = '<div class="slider-months">'; 86 if((type !== 'conversationXX' && type !== 'individual' && isMc !== "?by=mastercourses") || type !== 'undefined'){ 87 // console.log('standard or intensive') 88 // console.log(type) 89 // console.log(resp.courses) 90 if(resp.courses.length < 1){ 91 // console.log(resp.courses.length) 92 htmlm += '<div class="item-month">'; 93 htmlm += '<h5>No available courses</h5>'; 94 htmlm += '</div>'; 95 } 96 resp.courses.forEach(function (month){ 97 98 htmlm += '<div class="item-month">'; 99 htmlm += '<h5>'+month.month+'</h5>'; 100 htmlm += '<ul>'; 101
102 month.courses.forEach(function (course){ 103 // console.log(course.available) 104 let btnText = 'Buy' 105 let AvTxt = 'Only ' + course.available + ' available' 106 let display = '' 107 let disabled = '' 108 let style= "opacity: 1 " 109 let discount_price = '<span class="c-item-prixe" data-course-price="'+course.price+'">'+course.price+' NOK</span>'; 110 let priceClass = ''; 111 let savingsTxt = ''; 112 let discount = course.Discounted; 113 let discount_class = discount ? 'discount' : ''; 114 if( course.available == null || course.available >= 3 || course.available <= 0){ 115 display = 'display: none;' 116 } else { 117 display = ''; 118 disabled = '' 119 } 120 if( course.available <= 0 && course.available !== null){ 121 btnText = 'Full' 122 display = '' 123 AvTxt = 'No Places left' 124 disabled = 'disabled' 125 } 126 if( typeof course.full !== "undefined" && course.full !== null && course.full === true ){ 127 btnText = 'Full group' 128 display = '' 129 AvTxt = 'No Places left' 130 disabled = 'disabled' 131 style = "opacity: .5" 132 } 133 134 if(course.Discounted.is_discount){ 135 discount_price = '<span class="c-item-prixe discount" data-course-price="'+course.price+'"><small class="oprice" data-course-price="'+course.price+'">'+course.price+' NOK</small><br/>'+course.Discounted.price+' NOK</span>'; 136 priceClass = 'class="oprice"'; 137 savingsTxt = '<span class="earlybird discount">'+course.Discounted.discount.message+'</span>'; 138 } 139 if(course.Discounted.is_earlybird){ 140 discount_price = '<span class="c-item-prixe discount" data-course-price="'+course.Discounted.price+'"><small class="oprice" data-course-price="'+course.Discounted.price+'">'+course.price+' NOK</small><br/>'+course.Discounted.price+' NOK</span>'; 141 savingsTxt = '<span class="earlybird discount">'+course.Discounted.earlybird.message+'</span>'; 142 priceClass = 'class="oprice"'; 143 } 144 145 let date_s = course.date_start.split(' ')[0]; 146 date_s = date_s.split('-')[2] +'-'+ date_s.split('-')[1] +'-'+ date_s.split('-')[0] 147 148 let date_e = course.date_end.split(' ')[0]; 149 date_e = date_e.split('-')[2] +'-'+ date_e.split('-')[1] +'-'+ date_e.split('-')[0] 150 151 // console.log(date_s) 152 153 let cssclass = course.master_course.classroom_type !== 'online' ? 'bg-danger' : 'bg-success' 154 htmlm += '<li style="'+style+'" >'; 155 htmlm += 156 '<div class="c-item-info"><strong>'+course.Name+'</strong>' + 157 '<small class="c-item-sub">
157'+date_s+' to '+date_e+' ('+course.hours+'h)</small>' + savingsTxt + 158 '</div>' + 159 '<div class="class-item-classroom">' + 160 '<span class="'+cssclass+' badge">'+course.master_course.classroom_type+'</span>' + 161 '<span class="available-places" style="'+display+'">'+AvTxt+'</span>' + 162 '</div>' + 163 '<div class="c-item-dates"><strong>'+course.days+'</strong>' + 164 '<small class="c-item-sub">'+course.time_from+' - '+course.time_to+'</small>' + 165 '</div>' + 166 '<div class="c-item-select">' + discount_price + 167 '<button type="button" class="select '+discount_class+' '+disabled+'" data-course-id="'+course.id+'" '+disabled+' >'+btnText+'</button>' + 168 (disabled === 'disabled' ? '<br><a class="waitinglist" href="/register/?course_id='+course.id+'&waitinglist=1" data-course-id="'+course.id+'" >Waiting list</a>' : '') + 169 '</div>'; 170 171 htmlm += '</li>'; 172 }) 173 htmlm += '</ul>'; 174 htmlm += '</div>'; 175 176 }) 177 htmlm += '</div></div>'; 178 }else { 179 // console.log(course.available) 180 // if(typeof resp.courses == 'undefined' || resp.courses.length < 1){ 181 // // console.log(resp.length) 182 // htmlm += '<div class="item-month">'; 183 // htmlm += '<h5>No available courses</h5>'; 184 // htmlm += '</div>'; 185 // } 186 187 htmlm += '<div class="item-month">'; 188 htmlm += '<h5> </h5>'; 189 htmlm += '<ul>'; 190 191 resp.courses.forEach(function (course){ 192 // console.log(month) 193 let btnText = 'Buy' 194 let AvTxt = 'Only ' + course.available + ' available' 195 let display = '' 196 if( course.available == null || course.available >= 3 || course.available <= 0){ 197 display = 'display: none;' 198 } else { 199 display = ''; 200 } 201 if( course.available <= 0 && course.available !== null){ 202 btnText = 'Waiting list' 203 display = '' 204 AvTxt = 'No Places left' 205 } 206 207 if( course.available <= 0 && course.available !== null ){ 208 209 btnText = 'Waiting list' 210 } 211 let cssclass = course.master_course.classroom_type !== 'online' ? 'bg-danger' : 'bg-success' 212 213 let date_s = course.date_start.split(' ')[0]; 214 date_s = date_s.split('-')[2] +'-'+ date_s.split('-')[1] +'-'+ date_s.split('-')[0] 215 216 let date_e = course.date_end.split(' ')[0]; 217 date_e = date_e.split('-')[2] +'-'+ date_e.split('-')[1] +'-'+ date_e.split('-')[0] 218 219 htmlm += '<li>'; 220 htmlm += 221 '<div class="c-item-info"><strong>'+course.Name+'</strong>' + 222 '<small class="c-item-sub">'+date_s+' to '+date_e+' ('+course.hours+')</small>' + 223 '</div>' + 224 '<div class="class-item-classroom">' + 225 '<span class="'+cssclass+' badge">'+course.master_course.classroom_type+'</span>' + 226 '<span class="available-places" style="'+display+'">'+AvTxt+'</span>' + 227 '</div>' + 228 '<div class="c-item-dates"><strong>'+course.days+'</strong>' + 229 '<small class="c-item-sub">
229'+course.time_from+' - '+course.time_to+'</small>' + 230 '</div>' + 231 '<div class="c-item-select"><span class="c-item-prixe" data-course-price="'+course.price+'">'+course.price+' NOK</span>' + 232 '<button class="select" data-course-id="'+course.id+'">Buy</button>' + 233 '</div>'; 234 235 htmlm += '</li>'; 236 237 }) 238 htmlm += '</ul>'; 239 htmlm += '</div>'; 240 htmlm += '</div></div>'; 241 } 242 243 // console.log(htmlm) 244 // console.log(tab) 245 let tabb = typeof seltab !== "undefined" ? $('.tabs-slides:eq('+seltab+')') : tab 246 // console.log(tabb) 247 248 if (typeof seltab !== 'undefined'){ 249 if(i === seltab){ 250 $(tabb).find('.slider-months').remove().append(htmlm) 251 $(tabb).find('.packs').append(htmlm) 252 }else { 253 // console.log('no matching tab') 254 } 255 }else { 256 $(tabb).find('.slider-months').remove().append(htmlm) 257 $(tabb).find('.packs').append(htmlm) 258 } 259 260 261 262 // console.log(resp) 263 264 setTimeout(function (){ 265 $(tabb).find('.slider-months').slick({ 266 slidesToShow: 1, 267 slidesToScroll: 1, 268 adaptiveHeight: true, 269 arrows: true, 270 fade: true, 271 infinite: false, 272 }); 273 }, 500) 274 275 }) 276 }) 277 }) 278 279 // ============================================ 280 // Add to Cart functionality 281 // ============================================ 282 $(document).on('click', 'button.select', function (e){ 283 e.preventDefault(); 284 285 const courseId = parseInt($(this).attr('data-course-id')); 286 287 // Get course details from the list item 288 const $li = $(this).closest('li'); 289 290 // Extract course name from .c-item-info strong 291 const courseName = $li.find('.c-item-info strong').text().trim() || 'Course'; 292 293 // Extract price from span.c-item-prixe data-course-price attribute 294 const coursePrice = $li.find('.c-item-prixe').attr('data-course-price') || '0'; 295 296 console.log('Adding to cart:', { 297 id: courseId, 298 name: courseName, 299 price: coursePrice 300 }); 301 302 // Add to cart using CourseCart service 303 if (typeof CourseCart !== 'undefined') { 304 const added = CourseCart.addCourse(courseId, courseName, coursePrice); 305 306 if (added) { 307 // Change button text temporarily to show feedback 308 const $btn = $(this); 309 const originalText = $btn.text(); 310 311 $btn.html('<i class="fa fa-check"></i> Added!'); 312 $btn.prop('disabled', true); 313 $btn.addClass('btn-success'); 314 315 setTimeout(() => { 316 $btn.text(originalText); 317 $btn.prop('disabled', false); 318 $btn.removeClass('btn-success'); 319 }, 2000); 320 } 321 } else { 322 console.error('CourseCart not loaded!'); 323 alert('Cart system not available. Please refresh the page.'); 324 } 325 }) 326 327 328// Call after courses are loaded 329// $(document).on('DOMNodeInserted', '.tabs-slides', function() { 330// setTimeout(addCartButtons, 100); 331// }); 332// 333// // Also run on page load 334// $(document).ready(function() { 335// setTimeout(addCartButtons, 1500); 336// }); 337 338 } 339 tabsSlides() 340 341 // $('.item-sessions button').on('click', function (e){ 342 // // console.log('click btn') 343 // let indx = $(this).parents('.tab').index() 344 // // console.log($(this).attr('data-type')) 345 // tabsSlides($(this).attr('data-type'), indx) 346 // 347 // // console.log(indx) 348 // }) 349 350 351// Burger Menu 352
353 var forEach=function(t,o,r){if("[object Object]"===Object.prototype.toString.call(t))for(var c in t)Object.prototype.hasOwnProperty.call(t,c)&&o.call(r,t[c],c,t);else for(var e=0,l=t.length;l>e;e++)o.call(r,t[e],e,t)}; 354 355 var hamburgers = document.querySelectorAll(".hamburger"); 356 if (hamburgers.length > 0) { 357 forEach(hamburgers, function(hamburger) { 358 hamburger.addEventListener("click", function() { 359 this.classList.toggle("is-active"); 360 }, false); 361 }); 362 } 363 364 $('.hamburger').click(function() { 365 $('.mobmenu').toggleClass("show"); 366 }); 367 368 369});
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.