﻿// 사이드바 - 공통
$.fn.extend({
    toggleWidget: function(url, srnb) {
        var widget = $(this).parent(); var head = $(this); var body = $(widget).find(".body");
        $(head).click(function() {
            var memid = document.blogControllerForm.memid.value;
            var neigList = document.blogControllerForm.neigList.value;
            var formValue = {'blogSrnb':srnb, 'memid':memid, 'neigList':neigList};
            $(body).html() ? $(body).toggle() : $(body).load(url, formValue, function() { $(body).show(); });
            $(head).find("h3:first").toggleClass("on");
        });
    },
    foldList: function() {
        var txt = '';
        var element = $(this).find('li');
        $(element).each(function() {
            var target = this.getElementsByTagName('ul')[0];
            if (target) {
                this.target = target;
            }
            this.onclick = function(e) {
                var evt = e || window.event;
                var evtTarget = evt.target || evt.srcElement;
                while (evtTarget.nodeName != "LI") evtTarget = evtTarget.parentNode;
                if (evtTarget.target)
                {
                    $(evtTarget).toggleClass('on');
                    $(this.target).toggle();
                    return false;
                }
            }
        });
    }

});

// 사이드바 - 달력
(function($) {

    var _workingDate = null;
    var _daysInMonth = 0;
    var _firstOfMonth = null;
    var _lastOfMonth = null;
    var _gridOffset = 0;
    var _totalDates = 0;
    var _gridRows = 0;
    var _totalBoxes = 0;
    var _dateRange = { startDate: null, endDate: null };

    var _isDiary = false;
    //var _daysHeader = [ '일', '월', '화', '수', '목', '금', '토' ];
    var _daysHeader = [ '/image/blog/skin/widget/cal_sun.gif',
                        '/image/blog/skin/widget/cal_mon.gif',
                        '/image/blog/skin/widget/cal_tue.gif',
                        '/image/blog/skin/widget/cal_wed.gif',
                        '/image/blog/skin/widget/cal_thu.gif',
                        '/image/blog/skin/widget/cal_fri.gif',
                        '/image/blog/skin/widget/cal_sat.gif'];
    var _daysPost = [];

    var def = {
            containerId: "#jMonthCalendar",
            firstDayOfWeek: 0,
            calendarStartDate:new Date(),
            onMonthChanging: function() {},
            onMonthChanged: function() {},
            onDayLinkClick: function() {},
            onDayCellClick: function() {},
            onDayCellDblClick: function() {}
        };

    $.jCalendarItem = $.J = function() {};

    var _initDates = function(dateIn) {

        var today = def.calendarStartDate;
        if(dateIn == undefined) {
            _workingDate = new Date(today.getFullYear(), today.getMonth(), 1);
        } else {
            _workingDate = dateIn;
            _workingDate.setDate(1);
        }
        
        _daysInMonth = _workingDate.getDaysInMonth();
        _firstOfMonth = _workingDate.clone().moveToFirstDayOfMonth();
        _lastOfMonth = _workingDate.clone().moveToLastDayOfMonth();
        _gridOffset = _firstOfMonth.getDay() - def.firstDayOfWeek;
        _totalDates = _gridOffset + _daysInMonth;
        _gridRows = Math.ceil(_totalDates / 7);
        _totalBoxes = _gridRows * 7;
        
        _dateRange.startDate = _firstOfMonth.clone().addDays((-1) * _gridOffset);
        _dateRange.endDate = _lastOfMonth.clone().addDays(_totalBoxes - (_daysInMonth + _gridOffset));
    };

    var _initTabs = function() {

        // Tabs
        var calendarLink = $('<a class="viewCalendar" style="cursor:pointer;">캘린더</a>').click(function() {
            var a = $(def.containerId);
            if (_isDiary) {
                _isDiary = false;
                a.hide();
                a.find("ul").addClass("tab_2").end().find(".monthly").hide();
                $.J.FormatCalendar(); // 데이터 호출
                a.fadeIn("normal");
            }
            return false;
        });
        calendarLink = $('<li class="i1"></li>').append(calendarLink);

        var diaryLink = $('<a class="viewDiary" style="cursor:pointer;">다이어리</a>').click(function() {
            var a = $(def.containerId);
            if (!_isDiary) {
                _isDiary = true;
                a.hide();
                a.find("ul").removeClass("tab_2").end().find(".monthly").show();
                $.J.FormatCalendar(); // 데이터 호출
                a.fadeIn("normal");
            }
            return false;
        });
        diaryLink = $('<li class="i2"></li>').append(diaryLink);

        var tabsRow = (_isDiary) ? $('<ul class="tab"></ul>') : $('<ul class="tab tab_2"></ul>');
        tabsRow = $(tabsRow).append(calendarLink, diaryLink);
        return tabsRow;
    };

    var _initNavigator = function() {

        // Calendar Navigation
        var prevMonth = _workingDate.clone().addMonths(-1);
        var nextMonth = _workingDate.clone().addMonths(1);

        var beforeTags = $('<a href="#calendar" id="beforeMonthSide"><img src="' + imageURL + '/image/blog/skin/widget/cal_prev.gif" alt="이전" /></a>').click(function() {
            // 캘린더 호출
            $.J.ChangeMonth(prevMonth);
            return false;
        });

        var currentTags = $('<a href="#calendar" class="current">&nbsp;' + _workingDate.toString("yyyy/MM") + '&nbsp;</a>');

        var AfterTags = $('<a href="#calendar" id="afterMonthSide"><img src="' + imageURL + '/image/blog/skin/widget/cal_next.gif" alt="다음" /></a>').click(function() {
            // 캘린더 호출
            $.J.ChangeMonth(nextMonth);
            return false;
        });

        var naviRow = $('<div class="month_nav"></div>').append(beforeTags, currentTags, AfterTags);

        var monthBox = $('<div class="monthly"></div>').append($('<a href="#viewMonth1"><img src="' + imageURL + '/image/blog/skin/default/btn_mon_view.gif" alt="월별보기" /></a>').click(function() {
            var target = $("form[name='diaryCalendarViewForm']");
            $(target).find("input[name='selectDiaryDate']").val(_workingDate.toString("yyyyMMdd"));
            $(target).find("input[name='diaryYear']").val(_workingDate.getFullYear());
            $(target).find("input[name='diaryMonth']").val(_workingDate.getMonth());
            $(target).find("input[name='diaryDate']").val(_workingDate.getDate());
            $(target).find("input[name='mode']").val("M");
            $.post("/blog/bodyController.do", $(target).serialize(), function(data){
                $("#mainBlogArea").html(data);
            });
        }));
        
        naviRow = $('<div class="container"></div>').append(naviRow, monthBox);
        
        if (!_isDiary) { $(monthBox).hide(); }

        naviRow = $('<div class="tab_contents clearfix"></div>').append(naviRow);

        return naviRow;
    };

    var _initHeaders = function() {

        //  Days
        var headRow = $('<tr style="height:18px;"></tr>');       
        for (var i = def.firstDayOfWeek; i < def.firstDayOfWeek+7; i++) {
            var weekday = i % 7;
            if (weekday == 0) {
                headRow.append('<th class="sun"><span><img src="' + imageURL + _daysHeader[weekday] + '" /></span></th>');
            } else if (weekday == 6) {
                headRow.append('<th class="sat"><span><img src="' + imageURL + _daysHeader[weekday] + '" /></span></th>');
            } else {
                headRow.append('<th><span><img src="' + imageURL + _daysHeader[weekday] + '" /></span></th>');
            }
        }
        headRow = $("<thead></thead>").append(headRow);
        return headRow;
    };

    var _clearClass = function() {
        $(def.containerId).find("[id^=calendarBox]").removeClass("written");
    };
    
    $.J.FormatCalendar = function() {

        var form = $("form[name='diaryCalendarViewForm']");

        $(form).find("input[name='selectDiaryDate']").val(_workingDate.toString("yyyyMM"));
        $(form).find("input[name='diaryYear']").val(_workingDate.getFullYear());
        $(form).find("input[name='diaryMonth']").val(_workingDate.getMonth());
        $(form).find("input[name='diaryDate']").val(_workingDate.getDate());
        $(form).find("input[name='mode']").val(_isDiary ? "true" : "false");
        
        var formValue = (!_isDiary) ? $(form).find(":input[class!='diary']").serialize() : $(form).serialize();

        _clearClass();
        
        $.post("/blog/getCalendarData.do", formValue, function(data) {
            
            if (data == "") { return false; }

            var daysPost = data.split(",");

            for (var i = 0; i < daysPost.length; i++) {
                daysPost[i] = parseInt(daysPost[i].substr(8, 2));
            }
            
            for (var i = 0; i < _totalBoxes; i++) {

                var currentDate = _dateRange.startDate.clone().addDays(i);
                
                if (currentDate.getFullYear() == _workingDate.getFullYear() && currentDate.getMonth() == _workingDate.getMonth()) {
                    if (jQuery.inArray(currentDate.getDate(), daysPost) < 0) {
                        $(def.containerId).find("#calendarBox" + i).removeClass("written").removeAttr("date");
                    } else {
                        $(def.containerId).find("#calendarBox" + i).addClass("written").attr("date", currentDate.toString("yyyyMMdd"));

                        $(def.containerId).find("#calendarBox" + i).click(function() {
                            var today = Date.parseExact($(this).attr("date"), "yyyyMMdd");
                            if (_isDiary) {
                                var target = $("form[name='diaryCalendarViewForm']");
                                $(target).find("input[name='selectDiaryDate']").val(today.toString("yyyyMMdd"));
                                $(target).find("input[name='diaryYear']").val(today.getFullYear());
                                $(target).find("input[name='diaryMonth']").val(today.getMonth()+1);
                                $(target).find("input[name='diaryDate']").val(today.getDate());
                                $(target).find("input[name='mode']").val("V");
                                $.post("/blog/bodyController.do", $(target).serialize(), function(data){
                                    $("#mainBlogArea").html(data);
                                });
                            } else {
                                var target = $("form[name='blogControllerForm']");
                                $(target).find("input[name='currPage']").val(1);
                                $(target).find("input[name='wrinViewDvcd']").val(1);
                                $(target).find("input[name='miniListYN']").val("N");
                                $(target).find("input[name='blogMenuSrnb']").val(0);
                                $(target).find("input[name='subMenuSrnb']").val(0);
                                $(target).find("input[name='menuDvcd']").val("ALL");
                                $(target).find("input[name='today']").val(today.toString("yyyyMMdd"));
                                $.post("/blog/bodyController.do", $(target).serialize(), function(data){
                                    $("#mainBlogArea").html(data);
                                });
                            }
                        });
                    }
                }

            }
        });
    };

    $.J.DrawCalendar = function(dateIn) {

        var now = new Date();
        now.clearTime();
        
        var today = def.calendarStartDate;

        _initDates(dateIn);

        var headerRow = _initHeaders();
        
        // Properties
        var row = null;

        var tBody = $('<table cellpadding="0"></table>');
        tBody.append(headerRow);

        var dateBox;

        for (var i = 0; i < _totalBoxes; i++) {

            var currentDate = _dateRange.startDate.clone().addDays(i);

            if (i == 0 || i % 7 == 0) {
                row = $("<tr></tr>");
                tBody.append(row);
            }

            var weekday = i % 7;
            
            if (currentDate.getFullYear() == _workingDate.getFullYear()
                    && currentDate.getMonth() == _workingDate.getMonth()) {
                if (currentDate.getFullYear() == today.getFullYear()
                        && currentDate.getMonth() == today.getMonth()
                        && currentDate.getDate() == today.getDate()) {
                    dateBox = $('<td class="today"><a id="calendarBox' + i + '">' + currentDate.getDate() + '</a></td>');
                } else {
                    if (weekday == 0) {
                        dateBox = $('<td class="sun"><a id="calendarBox' + i + '">' + currentDate.getDate() + '</a></td>');
                    } else if (weekday == 6) {
                        dateBox = $('<td class="sat"><a id="calendarBox' + i + '">' + currentDate.getDate() + '</a></td>');
                    } else {
                        dateBox = $('<td><a id="calendarBox' + i + '">' + currentDate.getDate() + '</a></td>');
                    }
                }
            } else {
                dateBox = $('<td>&nbsp;</td>');
            }

            row.append(dateBox);
        }
        tBody.append(row);

        var tabsRow = _initTabs();
        var naviRow = _initNavigator();

        // Display
        var a = $(def.containerId);

        a.hide();
        a.empty();
        a.append(tabsRow, naviRow, tBody);
        $.J.FormatCalendar(); // 데이터처리
        a.fadeIn("normal");
    };
    
    $.J.ChangeMonth = function(dateIn) {

        var returned = def.onMonthChanging.call(this, dateIn);

        if (!returned) {
            $.J.DrawCalendar(dateIn);
            def.onMonthChanged.call(this, dateIn);
        }
    };

    $.J.Initialize = function(options, events) {

        var today = new Date();
        
        options = $.extend(def, options);
        
        if (events) { 
            $.J.ClearEventsOnCalendar();
            cEvents = events;
        }

        $.J.DrawCalendar();
    };

})(jQuery);
