(function ($) {
$.fn.calendar_yearview_blocks = function (options) {
// Format string
if (!String.prototype.formatString) {
String.prototype.formatString = function () {
var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) {
return typeof args[number] !== 'undefined'
? args[number]
: match
;
});
};
}
// If the number less than 10, add a zero before it
var prettyNumber = function (number) {
return number < 10 ? '0' + number.toString() : number = number.toString();
};
var getDisplayDate = function (date_obj) {
var pretty_month = prettyNumber(date_obj.getMonth() + 1);
var pretty_date = prettyNumber(date_obj.getDate());
return "{0}-{1}-{2}".formatString(date_obj.getFullYear(), pretty_month, pretty_date);
};
var start = function () {
obj_timestamp = JSON.parse(settings.data);
var wrap_chart = _this;
var containerWidth = wrap_chart.width(); // 1. 컨테이너 너비 가져오기
var gap = 2;
var rectWidth = (containerWidth - gap * 51) / 52; // 52는 주의 개수, 간격을 고려하여 사각형의 너비를 계산
var rectHeight = rectWidth; // 7은 요일의 개수, 동적으로 조절할 수 있습니다.
var end_date = new Date(settings.final_date);
end_date.setHours(23, 59, 59, 999); // 그 날의 마지막 시간으로 설정
var current_date = new Date();
current_date.setHours(0, 0, 0, 0); // 시간 부분을 00:00:00으로 초기화
var start_date = new Date();
start_date.setMonth(end_date.getMonth() - 12);
start_date.setHours(0, 0, 0, 0); // 시간 부분을 00:00:00으로 초기화
var start_weekday = settings.start_monday === true?1:0;
for (var i = 0; i < 7; i++) {
var day = start_date.getDay();
if (day === start_weekday) {
break;
}
else {
// Loop until start_weekday
start_date.setDate(start_date.getDate() + 1);
}
}
var loop_html = "";
// One year has 52 weeks
// var step = 13; // Amount of pixels to move
var step = Math.floor(containerWidth / 52); // Adjust the calculation based on your requirement
var month_position = [];
month_position.push({month_index: start_date.getMonth(), x: 0});
var using_month = start_date.getMonth();
for (var i = 0; i <= 52; i++) { // For each week, generate a column
var g_x = i * step;
var item_html = '';
for (var j = 0; j < 7; j++) { // For each weekday, generate a row
if (start_date > end_date) {
// Break the loop when today's date is found
break;
}
var y = j * step;
var month_in_day = start_date.getMonth();
var data_date = getDisplayDate(start_date);
// Check first day in week
if (j === start_weekday && month_in_day !== using_month) {
using_month = month_in_day;
month_position.push({month_index: using_month, x: g_x});
}
var match_today;
// Put a box around today's date
if (settings.stylize_today) {
match_today = current_date.getTime() === start_date.getTime() ? '" style="stroke:black;stroke-width:2;opacity:0.5"' : '';
} else {
match_today = "";
}
var items = [];
var count = 0;
var legend = '', items_str = '';
var date_data = obj_timestamp.find(entry => entry.date === data_date);
if (date_data) {
items = [date_data.item];
count = date_data.count;
items_str = items.join(", ");
items_str = items_str.replaceAll('&', '&');
items_str = items_str.replaceAll('"', '"');
}
var item_name = items[0]?items[0]:false;
var color = getColorByCount(count);
item_html += '';
// Move on to the next day
start_date.setDate(start_date.getDate() + 1);
}
item_html += "";
loop_html += item_html;
}
// Trick
if (month_position[1].x - month_position[0].x < 40) {
// Fix ugly graph by removing the first item
month_position.shift(0);
}
// Add labels for Months
for (var i = 0; i < month_position.length; i++) {
var item = month_position[i];
var month_name = settings.month_names[item.month_index];
loop_html += '' + month_name + '';
}
var wday_html = '';
for (var i = 0; i < settings.day_names.length; i++) {
var dx = calculateWdayDx(i, settings.start_monday);
var dy = calculateWdayDy(i, settings.start_monday, rectHeight);
wday_html += '' + settings.day_names[i] + '';
}
loop_html += wday_html;
// Fixed size with width= 721 and height = 110
var viewBoxHeight = rectHeight * 7 + 40; // 막대 총 높이 + 여유 공간
var viewBoxWidth = containerWidth + 20;
var wire_html =
// '