/* ================================================== */
/* 旅と宿　トップページイベントカレンダー Javascript  */
/* top-rss-reader.js                                  */
/* 【注意】必ずjquery-1.6.2.min.js の後に実行すること */
/*         Atom1.0表示用に最適化                      */
/*                                                    */
/* 来歴---------------------------------------------- */
/* 2011/10/01　新規作成                               */
/*                                                    */
/* ================================================== */

/* 初期処理：グローバル変数定義 */
var outputNoEventMessages = '予定しているイベントはありません。';	// 「イベント」が無い場合のメッセージ(char)
var inputEventRSS         = '/rss/event/';		// 「イベント」RSSフォルダの格納場所(char)
var inputEntryArray       = new Array();			// entry内の各タグの中身格納用配列（2ヶ月分）（連想配列）
	inputEntryArray       = [];

// 今月・翌月の各々の日付のイベント件数（2次元配列）
// 1次元目：[0]=今月、[1]=翌月
// 2次元目：[1～31]日にち
// 例：inputMonthEventCount[0][26]の場合、今月の26日のイベント件数
//     inputMonthEventCount[1][2]の場合、翌月の2日のイベント件数
var inputMonthEventCount = new Array();
	for(i = 0; i < 2; i++){
		inputMonthEventCount[i] = new Array();
	}


// 今日の日付を取得
var getToday = new Date();
var getYear  = getToday.getYear();			// 年(int)
var getYear4 = (getYear < 2000) ? getYear + 1900 : getYear ; // 正確な4桁の西暦に変換
var getMonth = getToday.getMonth() + 1;		// 月(int)
var getDate  = getToday.getDate();			// 日(int)
var getDay   = getToday.getDay();			// 曜日(int)

var outputCalendarDispID  = '#calendar';			// 「イベント」RSSデータ表示場所(HTML上)(char)（カレンダー）
var outputEventListDispID = '#eventlist';			// 「イベント」RSSデータ表示場所(HTML上)(char)（イベントリスト）





/* 初期処理：onload時処理定義 返り値：なし */
$(document).ready(function(){

	// ローカル変数定義
	var tmpNextYear  = '';
	var tmpNextMonth = '';

	// 今月のXMLファイル名取得
	var inputNowMonthEventRSS = inputEventRSS + exItoC(getYear4) + exItoC(getMonth) + '.xml';

	//翌月の計算
	tmpNextYear = exCtoI(getYear4);
	if(getMonth == 12){
		tmpNextYear++;
		tmpNextMonth = '01';
	}else{
		tmpNextMonth = exItoC(getMonth + 1);
	}

	// 翌月のXMLファイル名取得
	var inputNextMonthEventRSS = inputEventRSS + tmpNextYear + tmpNextMonth + '.xml';

	// 「当月・翌月のイベントカレンダー」のデータ格納
	inputXMLData(inputNowMonthEventRSS,inputNextMonthEventRSS);

});




/* 計算処理：日付変換処理（文字列⇒数字）　引数：文字列　返り値：int */
function exCtoI(getChar){
	return getChar * 1;
}



/* 計算処理：日付変換処理（数字⇒文字列）　引数：int　返り値：文字列 */
function exItoC(getInt){
	if(getInt < 10){
		getInt = '0' + getInt;
	}else{
		getInt = '' +  getInt;
	}
	return getInt;
}




/* ============================================ */
/* ============= XMLデータ格納 ================ */
/* ============================================ */
/* 入力処理：RSSデータを配列変数に格納　引数：1=今月のXMLファイル名, 2=翌月のXMLファイル名, 3=処理終了後に実行する関数 */
function inputXMLData(nowUrl, nextUrl){

	// 変数定義
	var count = 0;
	var getXMLData = '';

	// 今月のentryの中身を取得
	getXMLData = getRSS(nowUrl);

	// 今月のentryの中身を連想配列に格納
	$(getXMLData).find("entry").each(function(){
		inputEntryArray[count]          = new Array(); //配列の中身を連想配列として定義(char)
		inputEntryArray[count].keisai   = $(this).find("t\\:keisai").text();

		if(!inputEntryArray[count].keisai){
			inputEntryArray[count].keisai   = $(this).find("keisai").text();
		}

		inputEntryArray[count].category = $(this).find("category").attr("term");
		inputEntryArray[count].title    = $(this).find("title").text();
		inputEntryArray[count].link     = $(this).find("link").attr("href");
		count++;
	});

	// 翌月のentryの中身を取得
	getXMLData = '';
	getXMLData = getRSS(nextUrl);

	// 翌月のentryの中身を連想配列に格納
	$(getXMLData).find("entry").each(function(){
		inputEntryArray[count]          = new Array(); //配列の中身を連想配列として定義(char)
		inputEntryArray[count].keisai   = $(this).find("t\\:keisai").text();

		if(!inputEntryArray[count].keisai){
			inputEntryArray[count].keisai   = $(this).find("keisai").text();
		}

		inputEntryArray[count].category = $(this).find("category").attr("term");
		inputEntryArray[count].title    = $(this).find("title").text();
		inputEntryArray[count].link     = $(this).find("link").attr("href");
		inputEntryArray[count].id       = $(this).find("id").text();
		count++;
	});


	// 1日ごとに何件イベントがあるか計算
	var tmpNowYear = getYear4;
	var tmpNowMonth = getMonth;
	var i = 0;
	var j = 0;
	var x = 0;
	var tmpDateCount = 1;
	var tmpBaseDate  = '';	//(char)
	var tmpCalcDate  = '';	//(char)
	var tmpCalcMonth = '';	//(char)
	var tmpNewDateFlag = false;

	for(i = 0; i < 2; i++){

		//翌月の計算
		if(i == 1){
			if(tmpNowMonth == 12){
				tmpNowYear++;
				tmpNowMonth = 1;
			}else{
				tmpNowMonth++;
			}
		}

		//イベント件数集計
		for(j = 1; j <= calcMonthLastDay(tmpNowYear,tmpNowMonth); j++){

			tmpCalcDate  = exItoC(j);
			tmpCalcMonth = exItoC(tmpNowMonth);
			tmpBaseDate  = tmpNowYear + '/' + tmpCalcMonth + '/' + tmpCalcDate;


			for(var k = x; k < inputEntryArray.length; k++){

				// 「掲載日」「タイトル」「リンク」全てのデータがある場合のみカウント
				if(tmpBaseDate == inputEntryArray[k].keisai && inputEntryArray[k].title && inputEntryArray[k].link){
					if(!tmpNewDateFlag){
						inputMonthEventCount[i][j] = 1;
						tmpNewDateFlag = true;
						x = k;
					}else{
						inputMonthEventCount[i][j]++;
					}
				}
			}
			

			if(!tmpNewDateFlag){
				inputMonthEventCount[i][j] = 0;
			}

			tmpNewDateFlag = false;

		}

	}


	// データの読み込みが終了したら、カレンダー表示処理を実行
	displayEventCalendar(getYear4,getMonth,getDate);
	displayEventList(getYear4,getMonth,getDate);

}




/* ============================================ */
/* ============== XML取得処理 ================= */
/* ============================================ */
/* 入力処理：RSSファイル取得　引数：1=読み込むXMLファイル名, 2=XML取得成功後に実行する関数, 3=XML取得失敗後に実行する関数 　返り値：取得したXMLデータ(object) */
function getRSS(getXMLURL){

	return $.ajax({
			type: "GET",
			url: getXMLURL,
			dataType: "xml",
			cache: false,
			async: false
		}).responseXML;

}




/* ============================================ */
/* ============ カレンダー表示処理 ============ */
/* ============================================ */

/* 計算処理：カレンダーの作成 返り値：char  */
/* 【注意事項】引数の"getInputMonth"には予め"-1"を行わないこと */
function displayEventCalendar(getInputYear,getInputMonth,getInputDate){

	var tmpDateCount                = 1;				//出力した日付カウント

	var tmpCalendarDate             = new Array(3);		//その月の1日のミリ秒データ定義
	var tmpCalendarDateFirstDayWeek = new Array(3);		//その月のカレンダーの先頭の日の曜日格納
	var tmpCalendarVerticalLines    = new Array(3);		//その月のカレンダーの行数
	var tmpCalendarTodayDate        = new Date();		//アクセスした日のミリ秒データ定義
	var tmpCalendarUpDate           = new Date(getInputYear, (getInputMonth - 1), getInputDate);	//CSVファイルをアップロードした日のミリ秒データ定義
	var tmpTodayClass				= '';				//今日の場合、todayを格納
	var tmpEventClass				= '';				//イベントがある場合、onを格納
	var tmpDayClass					= '';				//曜日（sundayまたはsaturday）を格納

	var tmpInputYear  = '';		// カレンダー上に記載する年データ(char)
	var tmpInputMonth = '';		// カレンダー上に記載する月データ(char)
	var tmpInputDate  = '';		// カレンダー上に記載する日データ(char)

	//カレンダー作成用のミリ秒データ定義
	tmpCalendarDate[0]              = new Date(getInputYear, (getInputMonth - 1), 1);

	//当月が12月の場合
	if(getInputMonth == 12){
		tmpCalendarDate[1]          = new Date((getInputYear + 1), 0, 1);

	//1～10月の場合
	}else{
		tmpCalendarDate[1]          = new Date(getInputYear, getInputMonth, 1);
	}

	//各月の1日の曜日 及び 各月の行数算出
	for(var i = 0; i < 2; i++){
		tmpCalendarDateFirstDayWeek[i] = tmpCalendarDate[i].getDay();
		tmpCalendarVerticalLines[i]    = Math.ceil((tmpCalendarDateFirstDayWeek[i] + calcMonthLastDay(tmpCalendarDate[i].getFullYear(),(tmpCalendarDate[i].getMonth() + 1))) / 7);
	}

	//カレンダーの曜日定義
	var outputCalendarHeader = '<tr>'
							 + '<th class="sunday">日</th>'
							 + '<th>月</th>'
							 + '<th>火</th>'
							 + '<th>水</th>'
							 + '<th>木</th>'
							 + '<th>金</th>'
							 + '<th class="saturday">土</th>'
							 + '</tr>'
							 + '<tr>';


	/* カレンダー出力 */

	// 表示エリア初期化
	if($(outputCalendarDispID).size() > 0){
		$(outputCalendarDispID).empty();
	}

	//表示する月数分ループ
	for(var i = 0; i < 2; i++){
		// ヘッダ部分定義
		outputCalendarData = '<div class="calendar_bg">'
						   + '<div>'
						   + '<table>'
						   + '<tr>'
						   + '<th class="month" colspan="7"><span>'
						   + getInputMonth
						   + '</span>月</th></tr> ';

		//カレンダー日付出力
		tmpDateCount = 1;	//出力した日付カウントをリセット

		//カレンダーの曜日出力
		outputCalendarData += outputCalendarHeader;

		//日付出力//
		for(var k = 0; k < tmpCalendarVerticalLines[i]; k++){

			outputCalendarData += '<tr>';

			for(var l = 0; l < 7; l++){

				//カレンダーが1行目で、その月の最初の日に達していないか判定
				var calcFirstDrawFlag = false;
				if(k == 0 && tmpCalendarDateFirstDayWeek[i] > l){
					calcFirstDrawFlag = true;
				}

				//カレンダーが最終行で、その月の最後の日に達したか判定
				var calcFinalDrawFlag = false;
				if(k == tmpCalendarVerticalLines[i] - 1 && tmpDateCount > calcMonthLastDay(tmpCalendarDate[i].getFullYear(),(tmpCalendarDate[i].getMonth() + 1))){
					calcFinalDrawFlag = true;
				}

				//今日の日付計算用ミリ秒データ
				var calcCalendarDate = new Date(tmpCalendarDate[i].getFullYear(),tmpCalendarDate[i].getMonth(),tmpDateCount);

				outputCalendarData += '<td';
				
				//アクセス日は「today」を適用
				if(calcFirstDrawFlag == false && calcFinalDrawFlag == false && tmpCalendarTodayDate.getFullYear() == calcCalendarDate.getFullYear() && tmpCalendarTodayDate.getMonth() == calcCalendarDate.getMonth() && tmpCalendarTodayDate.getDate() == calcCalendarDate.getDate()){
					tmpTodayClass = 'today';
				}else{
					tmpTodayClass = '';
				}

				//日曜日は「sunday」を適用
				if(l == 0){
					tmpDayClass = 'sunday';

				//国民の祝日は「sunday」を適用
				}else if(calcFirstDrawFlag == false && calcFinalDrawFlag == false && calcHolidayMain(tmpCalendarDate[i].getFullYear(),(tmpCalendarDate[i].getMonth() + 1),tmpDateCount)){
					tmpDayClass = 'sunday';

				//土曜日は「saturday」を適用
				}else if(l == 6){
					tmpDayClass = 'saturday';
					
				//平日はclassを適用しない
				}else{
					tmpDayClass = '';
				}

				//カレンダーが1行目で、その月の最初の日に達していない場合
				if(calcFirstDrawFlag == true){
					outputCalendarData += '>' + '&nbsp;';

				//カレンダーが最終行で、その月の最後の日に達した場合
				}else if(calcFinalDrawFlag == true){
					outputCalendarData += '>' + '&nbsp;';
				
				//通常日の場合
				}else{

					//イベントがある場合
					if(inputMonthEventCount[i][tmpDateCount] > 0){

						// カレンダーに記載する年月日を文字列化
						tmpInputYear  = exItoC(tmpCalendarDate[i].getFullYear());
						tmpInputMonth = exItoC(tmpCalendarDate[i].getMonth() + 1);
						tmpInputDate  = exItoC(tmpDateCount);

						outputCalendarData += ' class="on ' + tmpTodayClass + ' ' + tmpDayClass + '">'
										   +  '<span class="popup-guidance">'
										   +  '<img alt="イベント' + inputMonthEventCount[i][tmpDateCount] +'件" width="1" height="1" src="images/spacer.gif">'
										   +  '<a href="' + 'event/' + tmpInputYear + tmpInputMonth + '.html#' + tmpInputDate + '">'
										   +  tmpDateCount
										   +  '</a>'
										   +  '</span>';

					//イベントがない場合
					}else{
						outputCalendarData += ' class="' + tmpTodayClass + ' ' + tmpDayClass + '">' + tmpDateCount;
					}

					tmpDateCount++;
				}

				if(inputMonthEventCount[i][tmpDateCount]){
					outputCalendarData += '</a></span></td>';
				}else{
					outputCalendarData += '</td>';
				}
			}	//l loop end

			outputCalendarData += '</tr>';
		}	//k loop end

		outputCalendarData += '</table></div></div>';
		$(outputCalendarDispID).append(outputCalendarData);

		outputCalendarData = '';
		if(getInputMonth == '12'){
			getInputMonth = '01';
		}else{
			getInputMonth++;
		}
	}	//i loop end

}

/* ============================================ */
/* ========== イベントリスト表示処理 ========== */
/* ============================================ */
function displayEventList(getInputYear,getInputMonth,getInputDate){

	//変数定義
	var outputEventListData = '<dl>';	// 出力するイベント

	var keisaiCount = 0;	// 掲載件数カウント
	var tmpDaycount = 0;	// 検索済みの日数

	var tmpBaseDate = '';	// 検索基準日(char)
	var tmpNowYear  = '';	// (char)
	var tmpNowMonth = '';	// (char)
	var tmpNowDate  = '';	// (char)

	var tmpNowMonthFlag     = 0;	// 現在検索している日が、アクセスした日と同じ月か否か(0=true,1=false)(int)

	var tmpNoErrorFlagArray = new Array();	// 複数イベントがある日のうち、データの記載にエラーがあるかの判定の結果を格納した配列変数(boolean)

	// イベントの探索
	while(keisaiCount < 5 && tmpDaycount <= 62){

		// 基準日の計算
		tmpBaseDate = calcPassDays((getInputYear * 1),(getInputMonth * 1),(getInputDate * 1),tmpDaycount);

		tmpNowYear  = exItoC(tmpBaseDate.getFullYear());
		tmpNowMonth = exItoC(tmpBaseDate.getMonth() + 1);
		tmpNowDate  = exItoC(tmpBaseDate.getDate());
		tmpBaseDate = tmpNowYear + '/' + tmpNowMonth + '/' + tmpNowDate;

		// 基準日がアクセスした月と同じか否か
		if(getInputMonth != tmpNowMonth){
			tmpNowMonthFlag = 1;
		}

		/* イベントリストの掲載 */
		// イベント件数の調査
		if(inputMonthEventCount[tmpNowMonthFlag][exCtoI(tmpNowDate)] > 0){
			for(var i = 0; i < inputEntryArray.length; i++){

				// 基準日と掲載日の比較
				if(tmpBaseDate == inputEntryArray[i].keisai && inputEntryArray[i].title != ''){

					// イベントが1件の場合はそのまま掲載
					if(inputMonthEventCount[tmpNowMonthFlag][exCtoI(tmpNowDate)] == 1){
						outputEventListData += '<dt>' + calcDateExchange(tmpBaseDate) + '</dt>'
											+  '<dd>' + '<a href="' + inputEntryArray[i].link + '">' + inputEntryArray[i].title;
						if(inputEntryArray[i].category){
							outputEventListData += '（' + inputEntryArray[i].category + '）';
						}
						outputEventListData += '</a>' + '</dd>';
						keisaiCount++;

					// イベントが複数件の場合はランダムで表示
					}else{

						var tmpWriteFlag  = false;
						var tmpNowLinkNum = 1;
						var tmpLinkArray  = new Array();
						var tmpLink       = '';
						var tmpLinkFirst  = '';
						var tmpRandNum    = (Math.floor(Math.random() * inputMonthEventCount[tmpNowMonthFlag][exCtoI(tmpNowDate)]) + 1);

						for(j = i; j < inputEntryArray.length; j++){
							if(tmpBaseDate == inputEntryArray[j].keisai){

								// <link>の連番を分割して変数に格納
								tmpLinkArray = inputEntryArray[j].link.split('-');
								tmpLink      = tmpLinkArray[(tmpLinkArray.length - 1)]

								// <link>の連番が正しいか精査
								if(tmpLink == tmpNowLinkNum){
									tmpNoErrorFlagArray[(tmpNowLinkNum - 1)] = true;
								}else{
									tmpNoErrorFlagArray[(tmpNowLinkNum - 1)] = false;
								}

								// データの掲載
								if(tmpLink == tmpRandNum && !tmpWriteFlag && tmpNoErrorFlagArray[(tmpNowLinkNum - 1)]){

									// 「イベント○件」のリンク先を設定
									for(k = 0; k < tmpLinkArray.length - 1; k++){
										//tmpLinkFirst += tmpLinkArray[k] + '-';
										tmpLinkFirst += tmpLinkArray[k];
									}
									//tmpLinkFirst += '01';

									// イベント名の設定
									outputEventListData += '<dt>' + calcDateExchange(tmpBaseDate)
														+  '<a href="' + tmpLinkFirst + '">' + 'イベント' + inputMonthEventCount[tmpNowMonthFlag][exCtoI(tmpNowDate)] + '件</a>' + '</dt>'
														+  '<dd>' + '<a href="' + inputEntryArray[j].link + '">' + inputEntryArray[j].title;

									// 「県名」を設定
									if(inputEntryArray[j].category){
										outputEventListData += '（' + inputEntryArray[j].category + '）';
									}

									outputEventListData += '</a>' + '</dd>';
									keisaiCount++;
									tmpWriteFlag = true;
								}

								tmpLinkFirst = '';
								tmpNowLinkNum++;
							}
						}

						i = j;

						// エラー表示
						for(j = 0; j < tmpNoErrorFlagArray.length; j++){
							if(tmpNoErrorFlagArray[j] != true){
								outputEventListData += '<dt style="color:red">' + calcDateExchange(tmpBaseDate) + 'のlinkにエラーがあります</dt><dd></dd>';
								break;
							}
						}
						tmpNoErrorFlagArray = [];

					}
					
				}
			}

		}

		tmpDaycount++;

	}

	//HTMLデータ出力
	if(keisaiCount != 0){
		outputEventListData += '</dl>'
							+  '<p><a href="event/' + exItoC(getInputYear) + exItoC(getInputMonth) + '.html">今月のイベント一覧</a></p>';
	}else{
		outputEventListData = '<dl><dt>' + outputNoEventMessages + '</dt></dl>';
	}

	$(outputEventListDispID).append(outputEventListData);

	// グローバル配列変数初期化
	inputEntryArray      = [];
	inputMonthEventCount = [];

}


/* 計算処理：YYYY/MM/DDデータの変換 返り値：「MM月DD日（DAY）」(char)  */
function calcDateExchange(getDateChar){
	var tmpDateArray = getDateChar.split('/');
	var tmpYear  = tmpDateArray[0] * 1;
	var tmpMonth = tmpDateArray[1] * 1;
	var tmpDate   = tmpDateArray[2] * 1;
	var tmpDateObj = new Date(tmpYear, (tmpMonth - 1), tmpDate);
	var tmpDay = tmpDateObj.getDay();
	var tmpDayArray = new Array('日','月','火','水','木','金','土');
	tmpDay = tmpDayArray[tmpDay];

	return tmpMonth + '月' + tmpDate + '日（' + tmpDay + '）';
}






