$(function(){
    if($('div#calendar.fc').length > 0){return;}// for IE
    var _holder     = [];
    var _dateholder = [];
    var onBeforeShow = function(elm){
        var day   = parseInt(elm.getTrigger().attr('rel'), 10);
        var events = _holder[day];
        if(events){
            var tip  = elm.getTip();
            tip.empty();
            var html = '';
            var h4   = document.createElement('h4');
            h4.appendChild(document.createTextNode(day + '日のイベント'));
            tip.append(h4);
            var ul = document.createElement('ul');
            for(var i = 0; i < events.length; i++){
                var li = document.createElement('li');
                if(events[i]['event_url']){
                    var a = document.createElement('a');
                    a.href   = events[i]['event_url'];
                    a.appendChild(document.createTextNode(events[i]['event_title']));
                    html = a;
                }
                else{
                    html = document.createTextNode(events[i]['event_title']);
                }
                li.appendChild(html);
                ul.appendChild(li);
            }
            tip.append(ul);
        }
        else{
            return false;
        }
    }
    $('div#calendar').fullCalendar({
        "theme"    : true,
        "height"   : '200',
        "editable" : false,
        "weekends" : true,
        "firstDay" : 1,
        "header"   : {
            "left"   : '',
            "center" : 'title',
            "right"  : ''
        },
        "titleFormat" : {
            "month" : 'yyyy年 MMMM',
            "week"  : "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
            "day"   : 'dddd, MMM d, yyyy'
        },
        "monthNames" : [
            '1月',
            '2月',
            '3月',
            '4月',
            '5月',
            '6月',
            '7月',
            '8月',
            '9月',
            '10月',
            '11月',
            '12月'
        ],
        "monthNamesShort" : [
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
            '8',
            '9',
            '10',
            '11',
            '12'
        ],
        "dayNames" : [
            '日曜',
            '月曜',
            '火曜',
            '水曜',
            '木曜',
            '金曜',
            '土曜'
        ],
        "dayNamesShort" : [
            '日',
            '月',
            '火',
            '水',
            '木',
            '金',
            '土'
        ],
        "dayClick" : function(date, allDay, jsEvent, view){
            var year  = date.getFullYear();
            var month = date.getMonth() + 1;
            var date  = date.getDate();
        },
        "eventRender" : function(event, element){
            if(_dateholder[parseInt(event['_start'].getDate(), 10)]){// a day having a flag
                return false;
            }
            _dateholder[parseInt(event['_start'].getDate(), 10)] = true;
            element.css({
                "width"               : "12px",
                "height"              : "12px",
                "padding"             : 0,
                "overflow"            : "hidden",
                "border"              : "none",
                "background-color"    : "transparent",
                "background-image"    : "url('/admin/js/library/fullcalendar/img/flag.png')",
                "background-repeat"   : "no-repeat",
                "background-position" : "left top"
            });
            element.attr('rel', event['_start'].getDate());
            element.empty();
            element.tooltip({
                "tip"      : '.tooltip_calendar',
                "position" : "center right",
                "relative" : true,
                "onBeforeShow" : function(){
                    return onBeforeShow(this);
                }
            });
        },
        "events" : function(start, end, callback){
            var startMonth = start.getMonth();
            var endMonth   = end.getMonth();
            var thisMonth  = (endMonth === 0)? 12 : endMonth;
            /*
            if(endMonth === 0){
                thisMonth = startMonth + 2;
            }
            else{
                thisMonth = endMonth;
            }
            */
            var startYear = start.getFullYear();
            var endYear   = end.getFullYear();
            var thisYear  = 0;
            if(startYear === endYear || thisMonth === 1){
                thisYear = endYear;
            }
            else{
                thisYear = startYear;
            }
            
            $.ajax({
                "type"     : 'post',
                "dataType" : 'json',
                "data"     : 'year=' + thisYear + '&month=' + thisMonth,
                "url"      : '/calendar/get-schedule-by-month/',
                "error"    : function(){
                },
                "success"  : function(json){
        //once, you remove classes
        $('td.holiday').removeClass('holiday');
        $('td.weekend').removeClass('weekend');
                    var events = [];
                    _holder = [];
                    for(var i = 0; i < json['events'].length; i++){
                        events.push({
                            "id"          : json['events'][i]['id'],
                            "title"       : json['events'][i]['event_title'],
                            "url"         : json['events'][i]['event_url'],
                            "start"       : json['events'][i]['calendar_date'],
                            "end"         : json['events'][i]['calendar_date'],
                            "allDay"      : true,
                            "description" : json['events'][i]['event_title'],
                            "className"   : json['events'][i]['id'],
                            "editable"    : false
                        });
                        var day = parseInt(json['events'][i]['calendar_date'].split('-')[2], 10);
                        if(_holder[day] instanceof Array){
                            _holder[day].push(json['events'][i]);
                        }
                        else{
                            _holder[day] = [json['events'][i]];
                        }
                    }
                    
                    //休日の色をかえる処理
                    var first = $('div.fc-view-month table tbody tr td:not(.fc-other-month)').eq(0).attr('class');
                    first.match(/^.*fc-day([0-9]+)/);
                    var delta = parseInt(RegExp.$1, 10) - 1;
                    for(var i = 0; i < json['holidays'].length; i++){
                        if(json['holidays'][i]['holiday_flag'] === '2'){// holiday
                            var day = parseInt(json['holidays'][i]['calendar_date'].split('-')[2], 10) + delta;
                            $('td.fc-day' + day).addClass('holiday');
                            $('td.fc-day' + day).removeClass('weekend');
                        }
                        else{// weekday
                            var day = parseInt(json['holidays'][i]['calendar_date'].split('-')[2], 10) + delta;
                            $('td.fc-day' + day).removeClass('holiday');
                            $('td.fc-day' + day).addClass('weekend');
                        }
                    }
                    //
                    
                    callback(events);
                    switch(json['holiday_code']){
                        case '3' :
                            $('th.fc-sun:not(.weekend), td.fc-sun:not(.weekend), th.fc-sat:not(.weekend), td.fc-sat:not(.weekend)').css({
                                "backgroundColor" : "#ffddff",
                                "backgroundImage" : "none"
                            });
                            $('th.fc-sun.weekend, td.fc-sun.weekend, th.fc-sat.weekend, td.fc-sat.weekend').css({
                                "backgroundColor" : "#dfeffc",
                                "backgroundImage" : "none"
                            });
                            break;
                        case '2' :
                            $('th.fc-sun:not(.weekend), td.fc-sun:not(.weekend)').css({
                                "backgroundColor" : "#ffddff",
                                "backgroundImage" : "none"
                            });
                            $('th.fc-sun.weekend, td.fc-sun.weekend').css({
                                "backgroundColor" : "#dfeffc",
                                "backgroundImage" : "none"
                            });
                            break;
                        case '1' :
                            $('th.fc-sat:not(.weekend), td.fc-sat:not(.weekend)').css({
                                "backgroundColor" : "#ffddff",
                                "backgroundImage" : "none"
                            });
                            $('th.fc-sat.weekend, td.fc-sat.weekend').css({
                                "backgroundColor" : "#dfeffc",
                                "backgroundImage" : "none"
                            });
                            break;
                    }
                }
            });
        },
        "eventMouseover" : function(event, jsEvent, view){
        }
    });
    $('a.button_flip_month[rel="last"]').click(function(){
        $('div#calendar').fullCalendar('prev');
    });
    $('a.button_flip_month[rel="this"]').click(function(){
        $('div#calendar').fullCalendar('today');
    });
    $('a.button_flip_month[rel="next"]').click(function(){
        $('div#calendar').fullCalendar('next');
    });
    
    $('div.fc-view tbody td').tooltip({
        "tip"      : '.tooltip_calendar',
        "position" : "center right",
        "onBeforeShow" : function(){
            return onBeforeShow(this);
        }
    });
});
