/*
 * yukinosho_calendar
 */


(function($){

    $.fn.yukinosho_calendar = function(options) {

        var defs = {
            page            : 3,             // 表示する月の数
            min_date        : "",            // 有効最小日付
            max_date        : "",            // 有効最大日付
            cur_date        : "",            // 表示開始日付
            input_date      : "fair_date",   // 日付入力要素のID
            web_contract_id : 0,             // 契約ID
            click           : true,          // 日付クリック処理有効フラグ
            area_wide_id    : 0,             // 地域ID
        };
        var today  = new Date();
        var infos  = new Array();       // フェア情報

        return this.each(function() {

            $.extend(defs, options);

            // デフォルト値設定
            if (! defs.min_date) {
                defs.min_date = new Date(today.getFullYear(), today.getMonth(), today.getDate());
            }
            if (! defs.max_date) {
                defs.max_date = new Date(defs.min_date.getTime()+60*60*24*90*1000);
            }
            if (! defs.cur_date) {
                defs.cur_date = new Date(today.getFullYear(), today.getMonth(), today.getDate());
            } else {
                defs.cur_date = new Date(defs.cur_date+" 00:00:00");
            }
            if (! defs.area_wide_id) {
                defs.area_wide_id = 1;
            }

            // カレンダー描画
            yukinosho_calendar();
        });

        // カレンダー描画
        function yukinosho_calendar() {

            var container  = $("#yukinosho_calendar");
            var cell       = '';
            var cell_id    = '';
            var cell_width = 0;
            var table      = '';

            var month = defs.cur_date.getMonth();
            var year  = defs.cur_date.getFullYear();

            // 各月のコンテナ追加
            for (i=0; i<defs.page; i++) {
              cell_id = 'ycal_container_cell_'+i;
              cell   += '<div class="ycal_container_cell" id="'+cell_id+'"></div>';
            }
            container.html(cell);

            // 各月のカレンダー追加
            for (i=0; i<defs.page; i++) {

                var navi_left      = '';
                var navi_right     = '';
                var days           = new Date(year,month+1,0).getDate();    // 月の日数
                var youbi_first    = new Date(year,month,1).getDay();       // 初日の曜日
                var row_num        = 0;
                var first_cell_num = 0;
                var day            = 0;
                var youbi          = 0;
                var class_name     = '';
                var id             = '';
                var cell_date      = '';

                // カレンダーテーブル列数算出
                first_cell_num = (youbi_first > 0) ? (8 - youbi_first) : 1;
                row_num        = Math.floor(((days - first_cell_num) / 7))
                                     + (((days - first_cell_num) % 7) ? 1 : 0)
                                     + 1;
                // ナビ作成
                if (i==0) {
                    navi_left = '<div class="ycal_navi prev" style="text-decoration: underline; cursor: pointer;">&lt;&lt;</div>';
                } else if (i==defs.page-1) {
                    navi_right = '<div class="ycal_navi next" style="text-decoration: underline; cursor:pointer;">&gt;&gt;</div>';
                }

                // カレンダーテーブル作成
                table  = '<table class="ycal_container_cell">';

                table += '<tr>';
                table += '<td class="ycal_container_cell_navi">'+navi_left+'</td>';
                table += '<td class="ycal_container_cell_navi" colspan="5">';
                table += year+'年';
                table += (month+1)+'月';
                table += '</td>';
                table += '<td class="ycal_container_cell_navi">'+navi_right+'</td>';
                table += '</tr>';

                table += '<tr>';
                table += '<td class="ycal_container_cell_youbi">月</td>';
                table += '<td class="ycal_container_cell_youbi">火</td>';
                table += '<td class="ycal_container_cell_youbi">水</td>';
                table += '<td class="ycal_container_cell_youbi">木</td>';
                table += '<td class="ycal_container_cell_youbi">金</td>';
                table += '<td class="ycal_container_cell_youbi">土</td>';
                table += '<td class="ycal_container_cell_youbi">日</td>';
                table += '</tr>';

                for (j=0; j<row_num; j++) {
                    table += '<tr>';
                    for (k=0; k<7; k++) {

                        class_name = '';    // クラス名
                        id         = '';    // ID

                        // 曜日取得
                        youbi = (k + 1 == 7) ? 0 : k+1;

                        // 初日
                        if ((j == 0) && (youbi == youbi_first)) {
                            day += 1;
                        }

                        if ((day) && (day <= days)) {

                            // 表示日付オブジェクト作成
                            cell_date = new Date(year, month, day);

                            // 有効無効判定
                            if ((cell_date.getTime() >= defs.min_date.getTime()) &&
                                (cell_date.getTime() <= defs.max_date.getTime())) {

                                // 有効用クラス名
                                class_name = 'ycal_container_cell_active';

                                // 色分け用クラス名
                                if (youbi == 0) {
                                    class_name += ' ycal_container_cell_sun';
                                } else if (youbi == 6) {
                                    class_name += ' ycal_container_cell_sat';
                                } else if ((today.getFullYear() == year) &&
                                           (today.getMonth() == month) &&
                                           (today.getDate() == day)){
                                    class_name += ' ycal_container_cell_today';
                                } else {
                                    class_name += ' ycal_container_cell_ordinary';
                                }

                                // ID
                                id = 'ycal_'+year+'_'+(month+1)+'_'+day;
                            } else {
                                // 無効用クラス名
                                class_name = 'ycal_container_cell_deactive';
                            }

                            table += '<td';
                            table += ' class="'+class_name+'"';
                            table += (id) ? ' id="'+id+'"' : '';
                            if ((defs.click) && (id)) {
                                table += ' style="text-decoration: underline; cursor: pointer;"';
                            }
                            table += '>';
                            if ((! defs.click) && (id)){
                                table += '<a href="#fair_list_'+year+'-'+('00'+(month+1)).slice(-2)+'-'+day+'">';
                            }
                            table += day;
                            if ((! defs.click) && (id)){
                                table += '</a>';
                            }
                            table += '<br /><span id="'+id+'_count">(0)</span>';
                            table += '</td>';
                        } else {
                            table += '<td></td>';
                        }

                        // 日付インクリメント
                        if (day > 0) {
                            day += 1;
                        }
                    }
                    table += '</tr>';
                }

                table += '</table>';

                // カレンダーテーブル追加
                cell_id = 'ycal_container_cell_'+i;
                $("#"+cell_id).html(table);

                // 次月算出
                month += 1;
                if (month == 12) {
                    month = 0;
                }
                if (month == 0) {
                    year += 1;
                }
            }

            // フェア情報表示領域初期化
            if ($("#ycal_container_info").size() > 0) {
                $("#ycal_container_info").empty();
            } else {
                $("#yukinosho_calendar").append('<div id="ycal_container_info"></div>');
            }

            // コンテナの幅設定
            cell_width = $('.ycal_container_cell').css('width');
            container.css('width', cell_width*defs.page+'px');

            if ( j$("input#fair_date").size() > 0 ) {
                var tmp = new String($("input#fair_date").val());
                tmp = tmp.replace("年", "-");
                tmp = tmp.replace("月", "-");
                tmp = tmp.replace("日", "-");

                var tmps = tmp.split("-");
                if (tmps.length > 3) {
                    var tmp_id = 'ycal_'+tmps[0]+'_'+tmps[1]+'_'+tmps[2];
                    j$("#"+tmp_id).addClass('ycal_container_cell_select');
                }
            }

            // ブライダルフェア数更新
            update_fair_count(get_date_format(defs.min_date), get_date_format(defs.max_date), defs.area_wide_id, defs.web_contract_id);

            // エリア選択処理
            if ( $('div#box_fair_search').size() > 0 ) {
                $("#box_fair_search div.jqTransformSelectWrapper ul li a").click(function(){
                    if ($('#form_fair_search').size() > 0) {
                        $('#form_fair_search').submit();
                    } else {
                        var area_wide_id = new Number($(this).attr('index'))+1;
                        // ブライダルフェア数更新
                        update_fair_count(get_date_format(defs.min_date), get_date_format(defs.max_date), area_wide_id, defs.web_contract_id);
                    }
                });
            }

            // カレンダー日付クリック処理
            $('.ycal_container_cell_active').bind("click", function(event){

                if (defs.click == false) {
                    return;
                } else {
                    // 強調表示クラス除去
                    $('td.[class^=ycal_container_cell]').removeClass('ycal_container_cell_select');


                    var youbis   = new Array('日','月','火','水','木','金','土');
                    var id       = new String($(this).attr("id"));
                    var dates    = id.split("_");
                    var obj      = new Date(dates[1], dates[2]-1, dates[3]);
                    var sel_date = obj.getFullYear()+'年'
                                    +(obj.getMonth()+1)+'月'
                                    +obj.getDate()+'日 '
                                    +' ('+youbis[obj.getDay()]+')';

                    if ($('#'+defs.input_date).size() > 0) {
                        $('#'+defs.input_date).val(sel_date);

                        if ($('#form_fair_search').size() > 0) {
                            $('#form_fair_search').submit();
                        }
                    }

                    // 強調表示クラス追加
                    $(this).addClass('ycal_container_cell_select');
                }
            });

            // 月移動処理
            $('.ycal_navi').bind("click", function(event){

                var offset    = 1;
                var dir       = $(this).hasClass("prev") ? "prev" : "next";
                var cur_month = '';
                var cur_year  = '';

                // オフセット取得
                if (dir == "prev") {
                    offset = -1;
                }

                // 表示開始日付設定
                cur_year  = defs.cur_date.getFullYear();
                cur_month = defs.cur_date.getMonth()+offset;

                if (cur_month == -1) {
                    cur_month  = 11;
                    cur_year  -= 1;
                }
                if (cur_month == 12) {
                    cur_month  = 0;
                    cur_year  += 1;
                }

                defs.cur_date.setMonth(cur_month);
                defs.cur_date.setFullYear(cur_year);

                // 再描画
                yukinosho_calendar();
            });

        }

        function get_date_format(obj) {
            y = obj.getFullYear();
            m = obj.getMonth()+1;
            d = obj.getDate();
            return y+'-'+m+'-'+d;
        }

        function update_fair_count(min_date, max_date, area_wide_id, web_contract_id) {

            base_url = $("span#base_url").text();

            $.post(base_url+'wedding/fair_get_count', {min_date:min_date, max_date:max_date, area_wide_id:area_wide_id, web_contract_id:web_contract_id}, function(xml) {

                $(xml).find("fair").each(function() {

                    var date  = new String($(this).find("fair_date").text());
                    var dates = date.split("-");

                    var key = dates[0]+'_'+(parseInt(dates[1],10))+'_'+parseInt(dates[2],10);
                    var id  = 'ycal_'+key+'_count';

                    // フェア数更新
                    var str = '('+$(this).find("fair_count").text()+')';
                    $("#"+id).html(str);
                });
            });
        }
    };

}(jQuery));

