';
}
else for(var i = 0; i < rows.length; ++i) {
tbl += '
';
for(var j = 0; j < cols.length; ++j) {
var cn = colNames[j];
var v = rows[i][cols[j]] || '';
var r = rows[i];
var cls = '';
if (j==0) {
cn='Time';
var e = v.split(':');
var dv = rows[i]['Date'];
var e2 = dv.split('-');
var dt = new Date(e2[0],e2[1],e2[2],e[0],e[1]);
var v = SH.utils.formatDate(dt,'h:mmtt');
v += ' - ';
var et = rows[i]['EndTime'];
var e3 = et.split(':');
var dt2 = new Date(e2[0],e2[1],e2[2],e3[0],e3[1]);
v += SH.utils.formatDate(dt2,'h:mmtt');
}
if (cn == 'Class') {
var su = (rows[i]['SignUp']) ? 1 : 0;
cls = (su) ? '' : 'sh_passed';
if (rows[i]['Status'] == 1) {
cls += ' sh_cancelled';
}
v = ''+v+'';
if (r.ServiceType_id == 3 && r.SessionNum && r.NumSessions > 1) {
v += ' (Session '+r.SessionNum+' of '+r.NumSessions+')';
}
}
tbl += '
'+ v + '
';
}
tbl += '
'+'\n';
}
tbl += '
';
var header = me.buildHeader();
$('#'+c.domId).html(header+tbl);
$('#sh_datepicker_input').datepicker({
buttonImageOnly: true,
showOn: 'both',
defaultDate: date,
maxDate: 180,
minDate: -1,
onSelect: function(dateText) {
me.run(new Date(dateText));
}
});
},
formatDateLong: function(dstr,incY) {
if (!dstr) return '';
var d = new Date(dstr + 'T13:00:00');
if (!d) return '';
var days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
var day = days[d.getDay()];
var month = months[d.getMonth()];
var s = day + ' ' + month + ' ' + d.getDate() + ' ';
if (incY) s += d.getFullYear() + ' ';
return s;
},
formatTime: function(tstr) {
var parts = tstr.split(':');
var h = parseInt(parts[0]);
var m = 'AM';
if (h > 12) {
h -= 12;
m = 'PM';
}
if (h >= 12) m = 'PM';
return '' + h + ':' + parts[1] + ' ' + m + ' ';
},
/**
* DetailView used by Class or Workshop
*/
drawDetailView: function(d) {
var me = SH.widget.Schedule;
var c = me.config;
/**
* build class combo based on actual classes in list
*/
var tbar = '';
var unique = [];
var html = tbar;
var classes = [{value: '', text: '--All Classes--'}];
for(var i = 0; i < d.rows.length; ++i) {
var r = d.rows[i];
if (!unique[r.Class_id]) {
unique[r.Class_id] = 1;
classes.push({ value: r.Class_id, text: r.ClassName});
}
// Sunday October 27 to Sunday December 08 2019 at 12:00 PM - 1:00 PM
// or Sunday December 08 2019 at 12:00 PM - 1:00 PM
var datestr = '';
if (r.NumSessions > 1) {
datestr += me.formatDateLong(r.StartDate,1) + ' to ';
}
if (!r.EndDate) r.EndDate = r.Date;
datestr += me.formatDateLong(r.EndDate) + 'at ' + me.formatTime(r.StartTime) + ' - ' + me.formatTime(r.EndTime);
var signup = '';
if (r.SignUp && (r.AllSessionsRequired == 0 || r.SessionNum == 1)) {
var btnStr = 'Signup';
if (r.SignUp && r.WaitlistAllowed && r.IsFull == 1 && (r.AllSessionsRequired == 0 || r.SessionNum == 1)) {
btnStr = 'Waitlist';
}
signup = '';
}
var path = (c.iframe) ? '' : 'https://schedulehouse.com';
html +=
'
' +
'
'+
'
'+ r.ClassName +''+
'
'+datestr+'
'+
signup +
r.ClassDescription +
'
'+
'
'
;
}
$('#'+c.domId).html(html);
var tbar_id = c.domId+'_tbar';
if (c.hideFilters == 1) {
$('#'+tbar_id).css('display','none');
}
if (!me.allClasses) {
me.allClasses = classes;
me.allClasses.sort(function(a,b) {
return (a.text.localeCompare(b.text, 'en', {sensitivity: 'base'}));
});
}
var classCombo = me.createCombo(me.allClasses,c.filters.Class_id);
$('#'+tbar_id).append(classCombo);
classCombo.addEventListener("change", function() {
c.filters.Class_id = this.value;
me.run(me.currentDate);
});
var btns = $("button.sh_workshop_signup");
btns.on("click", function(e) {
// /SH/Client/001601#workshops:7637
var u = c.url.replace('API/','');
if (c.ViewMode == 'Class') {
u += c.SiteID + '#signup:'+$(this).data('instanceid');
} else {
u += c.SiteID + '#workshops:'+$(this).data('id');
}
window.top.location = u;
});
var cb_id = c.domId+'_unavailcb';
$('').attr({ type: 'checkbox', value: '1', checked: (c.filters.OnlyAvailable == 1), id: cb_id, style: 'margin-left:8px'}).appendTo('#'+tbar_id);
$('', { 'for': cb_id, text: 'Hide unavailable classes', style: 'margin-left:3px' }).appendTo('#'+tbar_id);
$('#'+cb_id).on('click',function(e) {
c.filters.OnlyAvailable = (this.checked) ? 1 : 0;
if (!c.filters.Class_id) me.allClasses = null;
me.run(me.currentDate);
});
},
createCombo: function(store,val) {
var sel = document.createElement('select');
sel.class = 'sh_workshop_selector';
for(var i = 0; i < store.length; ++i) {
var el = document.createElement('option');
el.textContent = store[i].text;
el.value = store[i].value;
if (el.value == val) el.selected = true;
sel.appendChild(el);
}
return sel;
},
/**
* Month view
*/
drawMonth: function() {
var me = SH.widget.Schedule;
var c = me.config;
var html = me.createMonthLayout();
$('#'+c.domId).html(html);
me.setupEvents();
me.updateCalendar();
},
/**
* for specified date, format the cell contents.
* here is where we add the class events based on the data obtained for this specific day.
* o.date = target date.
* o.html = append with contents built here.
*/
formatDay: function(o) {
var me = SH.widget.Schedule;
var date = SH.utils.formatDate(o.date,'yyyy-MM-dd');
var rows = me.data.rows;
if (rows) for(var i = 0; i < rows.length; ++i) {
var r = rows[i];
if (r.Date == date) {
var date_str = r.Date+'T'+r.StartTime+'Z';
var d2 = new Date(date_str);
var st = SH.utils.formatDate(d2,'h:mmTT',true);
var sn = (r.Status == 1 && r.StaffNote) ? true: false;
var t = '';
if (sn) t = r.StaffNote + '\n\n';
t += "Instructor: "+r.Instructor+'\n'+me.roomLabel+': '+r.Room;
if (me.showCapacity) t += '\nSigned Up: '+r.Enrollments+"/"+r.MaxCapacity;
t = t.replace(/"/g,'');
var si = '';
if (r.IsFull == 1 || r.IsFull == '1') si = ' (full)';
if (r.ServiceType_id == 3 && r.SessionNum && r.NumSessions > 1) {
// display star ★ if first session
var fs = (r.SessionNum == 1) ? '★' : '';
var sclass = 'session';
if (fs) sclass += '-b';
si += ' '+fs+'(Session '+r.SessionNum+' of '+r.NumSessions+')';
}
var cls = "dayevent";
if (r.Status==1) cls += ' iscancelled';
o.html += '
'+st+" "+r.ClassName+si+"
";
}
}
},
moveMonths: function(months) {
var me = SH.widget.Schedule;
me.run(SH.utils.addMonths(me.getTargetDate(),months));
},
showPrevMonth: function() {
var me = SH.widget.Schedule;
me.moveMonths(-1);
},
showNextMonth: function() {
var me = SH.widget.Schedule;
me.moveMonths(1);
},
getScrollbarWidth: function() {
var me = SH.widget.Schedule;
if (me.scrollbarWidth) return me.scrollbarWidth;
var div = $('
');
$('body').append(div);
var w1 = $('div', div).innerWidth();
div.css('overflow-y', 'auto');
var w2 = $('div', div).innerWidth();
$(div).remove();
me.scrollbarWidth = (w1 - w2);
return me.scrollbarWidth;
},
createMonthLayout: function() {
var me = SH.widget.Schedule;
var htmlData = [];
var mw = 860;
var mr = me.getScrollbarWidth();
htmlData.push("
");
var daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
if (me.weekStartingDay == 1) {
daysOfWeek.shift();
daysOfWeek.push('Sun');
}
for (var i = 0; i < 7; i++) {
var width = i == 0 || i == 6 ? 15 : 14;
htmlData.push('
' + daysOfWeek[i] + '
');
}
htmlData.push('
');
htmlData.push('
');
htmlData.push("
");
htmlData.push('');
var s = '';
for (var i = 0; i < 42; i++) {
width = i == 0 || i == 6 ? 15 : 14;
s = (i < 7) ? ('width="' + width + '%"') : '';
if (i % 7 == 0) { // First day of week
htmlData.push("
");
}
htmlData.push("
");
if (i % 7 == 6) { // Last day of week
htmlData.push("
");
}
}
htmlData.push('');
htmlData.push("
");
htmlData.push("
");
return htmlData.join('');
},
setupEvents: function() {
var me = SH.widget.Schedule;
me.calendarHeaderEl = $('th.month-title')[0];
$('table.sh_cal').click(function(e) {
me.processEvent('click', e);
});
},
/**
* Handles both click and mouse over events.
* If over a TD then we can figure out related date and fires mouseoverday,clickday or mouseoutday
* If over a DIV then pull eventid from the dom object and fires mouseoverevent, clickevent or mouseoutevent
*/
processEvent: function(eventName, e) {
var me = SH.widget.Schedule;
var t = e.target;
var tn = t.tagName;
if (tn == 'SPAN') { // events may contain span items, so get parent
t = t.parentNode;
tn = t.tagName;
}
if (tn == 'DIV') {
var CI_id = t.getAttribute('eventid'),
Class_id, SignUp;
if (CI_id) {
var rows = me.data.rows;
for(var i = 0; i < rows.length; ++i) {
if (rows[i].id == CI_id) {
Class_id = rows[i].Class_id;
SignUp = rows[i].SignUp;
break;
}
}
if (Class_id) me.showClass(CI_id,Class_id,SignUp);
}
}
},
setCalendarDate: function(value) {
var me = SH.widget.Schedule;
if (!value) value = new Date();
var end = SH.utils.getLastDateOfMonth(value),
start = SH.utils.getFirstDateOfMonth(value);
me.targetDate = value;
var startWeekDay = Number(start.getDay());
console.log("me.weekStartingDay",me.weekStartingDay);
if (me.weekStartingDay == 1) { --startWeekDay; if (startWeekDay < 0) startWeekDay = 6; }
if (startWeekDay > 0) {
start = SH.utils.addDays(start,-startWeekDay);
}
me.startOfCalendar = start;
var endWeekDay = Number(end.getDay());
if (me.weekStartingDay == 1) { --endWeekDay; if (endWeekDay < 0) endWeekDay = 6; }
if (endWeekDay < 6) {
end = SH.utils.addDays(end,6 - endWeekDay);
}
me.endOfCalendar = end;
},
getCalendarStartDate: function() {
var me = SH.widget.Schedule;
return me.startOfCalendar || new Date();
},
getCalendarEndDate: function() {
var me = SH.widget.Schedule;
return me.endOfCalendar;
},
getTargetDate: function() {
var me = SH.widget.Schedule;
return me.targetDate;
},
updateCalendar: function() {
var me = SH.widget.Schedule;
var value = me.getTargetDate(),
start = me.getCalendarStartDate(),
end = me.getCalendarEndDate();
var duration = end - start;
var oneDay = 1000 * 60 * 60 * 24;
duration = duration / oneDay + 1;
end = SH.utils.addDays(end, 42 - duration);
me.calendarHeaderEl.innerHTML = '<< '+
SH.utils.formatDate(value,"MMMM yyyy") +
' >>';
$('#sh_prev_month').click(function() {
me.moveMonths(-1);
});
$('#sh_next_month').click(function() {
me.moveMonths(1);
});
var currentMonth = SH.utils.formatDate(value,"M");
var today = new Date();
var o = { today: today, date: start };
//var cells = me.cells;
var needWeek7;
var cells = $("table.sh_cal td");
var trs = $("table.sh_cal tr.month-row");
// a grid of 42 cells
for (var i = 0; i < 42; i++) {
o.css = SH.utils.formatDate(o.date,"M") == currentMonth ? "targetmonth" : "othermonth";
if (i == 35) needWeek7 = (o.css == 'targetmonth');
o.css += " x-unselectable";
if (o.date.toString() == today.toString()) o.css += ' today';
else if (o.date.toString() == value.toString()) o.css += ' targetday';
o.html = '