// config はconfig.jsに設定しています。 'use strict'; (function( $ ){ var isObject = function(a) { return (!!a) && (a.constructor === Object); } $.fn.timetable = function(options) { var defaults = { api_url : config.api_url } var events = { onTimeChange : function() {} } var settings = $.extend( {}, defaults, options ); // declaration var _this = this; var _selector = this.selector; var _apiUrl = settings.api_url; var _count = 1; var _timeTableData = []; var _originalTimetable = []; var _advanceTime = 0; var _isLoading = false; $(document).on('change', _selector+' input[type="radio"]', function(){ $('#estimate .est_time').text(''); calculateTime($(this), function(){ schedSeletTime(); }); }); $(document).on('change', '.calculate_time input[type="radio"]', function(){ $('#estimate .est_time').text(''); calculateTime($(this), function(){ if(_state.date.day && _state.date.day !== undefined) { _renderTimetable(); fixCalendar(); } }); }); $(document).on('change', 'input[type="radio"].time_gender, input[type="radio"].time_choice', function(){ $('#estimate .est_time').text(''); calculateTime($(this), function(){ if(_state.date.day && _state.date.day !== undefined) { _renderTimetable(); fixCalendar(); } }); }); // private functions function fixCalendar() { $.each(_state.calendarTimes, function(i, date){ if(date !== undefined && date.timetable !== undefined) { var isFull = true; $.each(date.timetable, function(i, time){ if(!time.add_time) { if(parseInt(time.status) == 0) { isFull = false; return false; } } }); var imgName = $('#day'+date.day).find('img').attr('src'); if(imgName !== undefined) { if(isFull == true) { imgName = imgName.replace('icn_avail', 'icn_triangle'); $('#day'+date.day).find('img').attr('src', imgName); } else { imgName = imgName.replace('icn_triangle', 'icn_avail'); $('#day'+date.day).find('img').attr('src', imgName); } } } }); } // handles time calculate function calculateTime(el, _callback) { _count = 1; _state.totalTime = 0; _advanceTime = 0; var parent = $('.calculate_time'); var type = ''; if(el !== null && el !== undefined) { type = el.data('kind'); } if(type == 'count') { _count = parseInt(el.val()); } if(_count !== undefined) { for(var x = 0; x <= (_count-1); x++) { var tmpTime = _state.planTime[x]; var num = 0; if(isObject(tmpTime)) { num = calcAryTime(tmpTime, parent); } else { num = tmpTime; } _state.totalTime += num; } } $.each(_state.calendarTimes, function(i, data){ if(data && data !== undefined) { fixTimetable(i); } }); _callback(); return false; } // calculate ary time function calcAryTime(time, el) { var val = 0; switch(time.type) { case 'gender': var gender = el.next('li').find('input.time_gender:checked').val(); if(gender === undefined) { gender = 0; } else { gender = parseInt(gender); } val = time.data[gender]; break; case 'choice' : var choice = el.next('li').find('input.time_choice:checked').val(); if(choice === undefined) { choice = 0; } else { choice = parseInt(choice); } var tmpVal = time.data[choice]; if(isObject(tmpVal)) { val = calcAryTime(tmpVal, el); } else { val = tmpVal; } break; case 'advance' : _advanceTime = time.data[0]; val = time.data[1]; break; } return val; } // handles on select sched time function schedSeletTime() { _this.find('table td').removeClass('active'); _this.find('table td input[type="radio"]').each(function() { var isChecked = $(this).is(':checked'); var _parent = $(this).parents('.available'); if(isChecked) { var val = parseInt($(this).val()); var timeFrom = $(this).data('time'); var timeTo = ''; // advance time var advanceTime = ''; if(_advanceTime) { advanceTime = val; val = val+(_advanceTime/30); $('.est_time_advance').val(advanceTime); // advanceTime = _state.aryTime[advanceTime]; } else { $('.est_time_advance').val(0); } $('.est_time_fr').val(val); if(_state.totalTime && _state.totalTime !== undefined) { timeTo = val+(_state.totalTime/30); $('.est_time_to').val(timeTo); timeTo = _state.aryTime[timeTo]; } else { $('.est_time_to').val(0); } var timeSched = timeFrom; /* if(_advanceTime) { advanceTime = val-(_advanceTime/30); advanceTime = _state.aryTime[advanceTime]; timeSched = '('+advanceTime+'〜)'+timeSched; } */ events.onTimeChange(timeSched); _parent.addClass('active'); } }); return false; } function fixTimetable(tableID) { var x = 1; var timetable = JSON.parse(JSON.stringify(_originalTimetable[tableID])); var subtractTime = 0; var advSubtractTime = 0; if(_state.totalTime != 0) { subtractTime = _state.totalTime/30; } if(_advanceTime != 0) { advSubtractTime = _advanceTime/30; } if(_advanceTime) { var tmpData = [0]; var tmpCall = [0]; // pattern1 no advance + advance // 【 60 】 => 【(60)60】 $.each(timetable, function(i, data){ if(data.advance == 0 && data.status != 0) { if(parseInt(data.status) == 2) { tmpData.push(i); timetable[i].status = 0; } if(parseInt(data.status) == 1) { tmpCall.push(i); timetable[i].status = 0; } } }); $.each(tmpCall, function(i, id) { if(id == 0) { id = -1; } var a = id-advSubtractTime; if(a>=0 && timetable[a].status !== undefined) { timetable[a].status = 1; } }); $.each(tmpData, function(i, id) { if(id == 0) { id = -1; } var a = id-advSubtractTime; if(a>=0 && timetable[a].status !== undefined) { timetable[a].status = 2; } }); // pattern2 advance + advance // 【(60)60】 => 【(60)60】 tmpData = [0]; tmpCall = [0]; $.each(timetable, function(i, data){ if(data.advance != 0 && data.status != 0) { //var tmpAdvance = data.advance; if(parseInt(data.status) == 2) { tmpData.push(i); timetable[i].status = 0; } if(parseInt(data.status) == 1) { tmpCall.push(i); timetable[i].status = 0; } } }); $.each(tmpCall, function(i, id) { if(id == 0) { id = -1; } var a = id-subtractTime; if(a>=0 && timetable[a].status !== undefined) { timetable[a].status = 1; } }); $.each(tmpData, function(i, id) { if(id == 0) { id = -1; } var a = id-subtractTime; if(a>=0 && timetable[a].status !== undefined) { timetable[a].status = 2; } }); } // change status from time var tmpData = [0]; $.each(timetable, function(i, data) { if(parseInt(data.status) == 1 || parseInt(data.status) == 2) { tmpData.push(i); for(var y = (i-(subtractTime-1)); y <= i; y++) { if(y>=0) { timetable[y].status = 1; } } } }); // 12:00以降予約可能 var month = parseInt(_state.calendarTimes[tableID].month); if(month == 10 || month == 11) { if(_state.no_am == true) { $.each(timetable, function(i, data){ if(data.id <= 13) { timetable[i].status = 1; } }); } } else { if(_state.no_am == true && _state.calendarTimes[tableID].holiday && _state.planType == 11) { $.each(timetable, function(i, data){ if(i <= 5) { timetable[i].status = 1; } }); } } // if(_state.totalTime !== undefined || _state.totalTime !== 0) { subtractTime = _state.totalTime/30; if(_advanceTime) { subtractTime = subtractTime+advSubtractTime; } } subtractTime = parseInt(subtractTime); var y = 0; var max = timetable.length-(subtractTime-1); _state.calendarTimes[tableID].max = max; // アンエミュ芦屋の予約を90分ずつにする _state.storeId = parseInt(_state.storeId); if(_state.storeId == 6) { var i = 0; tmpData = new Array(); $.each(timetable, function(key, data) { if(max <= y) { data.status = 2; } if(i >= 3) { i = 0; } if(i == 0) { tmpData.push(data); } y++; i++; }); timetable = JSON.parse(JSON.stringify(tmpData)); } else { $.each(timetable, function(key, data) { if(max <= y) { timetable[key].status = 1; } y++; }); } _state.calendarTimes[tableID].timetable = JSON.parse(JSON.stringify(timetable)); } // ajax call // @param1 [int] : timetable data // @param2 [array] : date data // @param3 [function] : callback function function ajaxGetTimetable(id, data, _callback) { var date = data.year+'-'+data.month+'-'+data.day; if(data.year) { $.ajax({ type : "get", url : _apiUrl+'timetable.php', data : { 'date' : date, 's_id' : _state.storeId } }).done(function(res){ _originalTimetable[id] = JSON.parse(JSON.stringify(res.timetable)); _state.calendarTimes[id].timetable = new Array(); fixTimetable(id); _callback(); }); } } // renders html function _renderTimetable() { var day = _state.date.day; var html = ''; var td = ''; if(_state.calendarTimes[day] !== undefined && _state.calendarTimes[day].timetable !== undefined) { var max = _state.calendarTimes[day].max; var x = 1; var y = 0; $.each(_state.calendarTimes[day].timetable, function(i, data){ if(!data.add_time) { var status = parseInt(data.status); // if(max <= y) { status = 2; } switch(status) { case 0 : td += '\ '+data.time+'\ \ '; break; case 1: td += '\ '+data.time+'\ \ '; break; case 2 : td += ''+data.time+' '; break; } if(x >= 3) { html += ''+td+''; x = 1; td = ''; } else { x++; } y++; } }); if(td) { html += ''+td+''; } } _this.find('table').html(html); return false; } function _init(_callback) { var count = 0; $.each(_state.calendarTimes, function(i, data){ if(data && data !== undefined){ ajaxGetTimetable(i, data, function(){ count++; }); } else { count++; } }); var myVar = setInterval(function(){ if(count >= _state.calendarTimes.length) { _callback(); clearInterval(myVar); } }, 100); } // public functions function renderTimetable() { _renderTimetable(); return false; } function init(_callback = function(){}) { _this.find('table').html(''); //_this.find('table').html('

読み込み中...

'); _init(function(){ calculateTime($(this), function(){ if(_state.date.day && _state.date.day !== undefined) { _renderTimetable(); } fixCalendar(); _callback(); }); }); } return { renderTimetable : renderTimetable, init : init, events : events, ajaxGetTimetable : ajaxGetTimetable }; } })( jQuery );