/*---------------------------------------*/
/* bodyのonLoad
/*---------------------------------------*/
$(
	function(){
		
		$('#calendar').html('<div class="Loading"><p class="text"><span>カレンダー読込中</span></p></div>');
		$('div#eventlist').html('<div class="Loading"><p class="text"><span>イベントリスト読込中</span></p></div>');
		
		// 画像先読み
		preLoadImg();
		
		// クッキー読込
		var getY = getCookie('openedY');
		var getM = getCookie('openedM');
		var getD = getCookie('openedD');
		var getEvent = getCookie('openedEvent');
		
		// カレンダー表示
		if(getY && getM && getD){
			createCalendarAndEventData(getY, getM, getD, getEvent);
		}else{
			createCalendarAndEventData(false, false, false, '');
		}
		
		// 次の月へボタン　イベントハンドラ
		$('div.prevnext a').live('click', function(){
			$(this).attr('href').match(/([0-9]+\/[0-9]+)$/);
			var num =  RegExp.$1.split('/');
			createCalendarAndEventData(num[0], num[1], false, '');
			return false;
		});
		
		// 日付ボタン　イベントハンドラ
		$('#calendar a.eventListDate').live('click', function(){
				$(this).attr('href').match(/([0-9]+\/[0-9]+\/[0-9]+)\/$/);
				var num =  RegExp.$1.split('/');
				var eve =  $(this).attr('rel');
				diplayEvent(num[0],num[1],num[2],eve,false);
				$('#calendar a.eventListDate').removeClass('clicked');
				$(this).addClass('clicked');
				setCookie('openedY',num[0]);
				setCookie('openedM',num[1]);
				setCookie('openedD',num[2]);
				return false;
		});
		$('#calendar a.eventListDate').live('mouseover',function(){
			$(this).addClass('hovered');
		});
		$('#calendar a.eventListDate').live('mouseout',function(){
			$(this).removeClass('hovered');
		});

		$('#eventlist a.EvListA img').live('mouseover', function(){
				$('div#eventlist').append('<div id="imgPre" style="position:absolute; top:92px; left:65px; display:none; border: 1px solid #DBCFB7; margin:0; padding:35px; background:#FCFBF9;"></div>');
				$('div#imgPre').html('<img src="' + $(this).attr('src') + '" />').css('display','block');
		});
		$('#eventlist a.EvListA img').live('mouseout', function(){
			$('div#imgPre').remove();
		});
		
		$('div#eventlist a.EvListA').live('click',function(){
			var id = $(this).attr('rel');
			setCookie('openedEvent',id);
		});
		
	}
);

/*==========================================================================*/
/* functions
/*======================================================*/

/*---------------------------------------*/
/* カレンダー表示＋イベント用データ保存
/*---------------------------------------*/
function createCalendarAndEventData(Y,M,D,Event){
	
	Y = parseInt(Y);
	M = parseInt(M);
	D = parseInt(D);
	
	$('#calendar').html('<div class="Loading"><p class="text"><span>カレンダー読込中</span></p></div>');
	
	$.ajax({
		dataType: "json",
		url: "common/php/access.php",
		data: "year=" + Y + "&month=" + M + "&date=" + D ,
		success: function(data){
			var Y = data.Y;
			var M = data.M;
			var D = data.D;
			var tY = data.tY;
			var tM = data.tM;
			var tD = data.tD;
			var eventData = data.event;
			var dateData = data.calendar;
			$('#calendar').html('');
			setEventData(data);
			displayTitle(Y,M);
			displayCalender(Y,M,D,tY,tM,tD,Event,dateData);
			displayMonthBt(Y,M,tY,tM);
		}
	});
	
}

/*---------------------------------------*/
/* イベントリスト表示
/*---------------------------------------*/
function diplayEvent(Y,M,D,AllEvent,SelectEvent){
	
	if(AllEvent=='undefined'){
		$('div#eventlist').html('');
		return;
	};
	
	// ヘッダー出力
	var Eve = AllEvent.split(',');
	var html = '';
	html += '<h3 id="eventListTitle">'+Y+'年'+M+'月'+D+'日のイベント<span class="eListNum">（' + Eve.length + '件）</span></h3>';
	
	// リスト出力
	var str = $('div#eventdata').html();
	eval(str);
	
	html += '<div class="listwrap"><dl class="lievent">';
	
	for(var i in Eve){
		var id = Eve[i];
		var eveObj = eventData['id'+id];
		var description = eveObj.description.substring(0,50) + '...';
		
		html += '<dt class="lititle"><a class="EvListA" rel="' + id + '" href="' + eveObj.link + '">' + eveObj.title + '</a></dt>';
		html += '<dd class="liday">'+eveObj.start_day+' - '+eveObj.end_day+'</dd>';
		if(eveObj.thumbs!=''){
			html += '<dd class="liimg"><a class="EvListA" rel="' + id + '" href="' + eveObj.link + '"><img src="'+eveObj.thumbs+'" height="'+eveObj.thumbsHeight+'" width="'+eveObj.thumbsWidth+'"></a></dd>';
			html += '<dd class="litext">' + description + '</dd>';
		}else{
			html += '<dd class="litext nophoto">' + description + '</dd>';
		}
		html += '<dd class="liline"></dd>';
	}
	html += '</dl></div>';
	$('div#eventlist').html(html);
	
	if(SelectEvent && SelectEvent!=''){
		setTimeout("ListScrolling(" + SelectEvent + ")", 10);
	}
}

function ListScrolling(SelectEvent){
	var obj = $('div#eventlist a[rel="' + SelectEvent + '"]');
	if(obj.length != 0){
		$('div#eventlist div.listwrap').scrollTo(obj,400,{offset:-15});
		delCookie('openedEvent');
	}
}

/*---------------------------------------*/
/* イベントデータ保存
/*---------------------------------------*/
function setEventData(data){
	var event = data.event;
	var html = '';
	html += 'var eventData = new Object();';
	for(var id in event){
		var entry = event[id];
		html += 'eventData.'+id+' = new Object();';
		html += 'eventData.'+id+'.title = \''+entry.title+'\';';
		html += 'eventData.'+id+'.start_day = \''+entry.start_day+'\';';
		html += 'eventData.'+id+'.end_day = \''+entry.end_day+'\';';
		html += 'eventData.'+id+'.description = \''+entry.description+'\';';
		html += 'eventData.'+id+'.thumbs = \''+entry.thumbs+'\';';
		html += 'eventData.'+id+'.thumbsWidth = \''+entry.thumbsWidth+'\';';
		html += 'eventData.'+id+'.thumbsHeight = \''+entry.thumbsHeight+'\';';
		html += 'eventData.'+id+'.link = \''+entry.link+'\';';
	}
	$('#calendarbody').append('<div id="eventdata" style="display:none;"></div>');
	$('div#eventdata').html(html);
}


/*---------------------------------------*/
/* カレンダー年・月部分表示
/*---------------------------------------*/
function displayTitle(Y,M){
	var y = Y.toString();
	$('#caltitle').html('<h3><span class="tiyear"><img src="images/calendar/'+y.charAt(0)+'.gif"><img src="images/calendar/'+y.charAt(1)+'.gif"><img src="images/calendar/'+y.charAt(2)+'.gif"><img src="images/calendar/'+y.charAt(3)+'.gif"></span><img src="images/calendar/year.gif" class="tiyear2"><img src="images/calendar/month_'+M+'.gif" class="timonth"><img src="images/calendar/month.gif" class="timonth2"><img src="images/calendar/old_'+M+'.gif" class="tiold"></h3>');
}


/*---------------------------------------*/
/* カレンダー表示
/*---------------------------------------*/
function displayCalender(Y,M,D,tY,tM,tD,Event,dateData){
	
	// 今日を取得
	var thisY = tY;
	var thisM = tM;
	var thisD = tD;

	// データ設定
	var datas = new Array();
	for(i=1;i<=31;i++){
		var date = new Date(Y,M-1,i);
		var vDate = date.getDate();
		var vDay = date.getDay();
		
		if(vDate == i){
			obj = new Object;
			obj.date = vDate;
			obj.day = vDay;
			if(dateData['date'+i]){
				obj.count = dateData['date'+i].length;
				obj.event = dateData['date'+i];
			}
			if(thisY==Y && thisM==M && thisD==i){
				obj.today = true;
			}
			datas[i-1] = obj;
		}else{
			break;
		}
	}

	var preNum = datas[0].day;
	var preArr = new Array();
	for(i=0;i<preNum;i++){
		obj = new Object;
		obj.date = '';
		obj.day = i;
		preArr[i] = obj;
	}
	
	
	var nxtNum = datas[datas.length - 1].day;
	var nxtArr = new Array();
	for(i=nxtNum+1;i<=6;i++){
		obj = new Object;
		obj.date = '';
		obj.day = i;
		nxtArr[i] = obj;
	}
	var list = preArr.concat(datas,nxtArr);

	// 祝日を取得
	var shu = holidays(Y);
	var shukujitu = new Array();
	for(i in shu){
		if((shu[i].getMonth()+1)==M){
			shukujitu.push(shu[i].getDate());
		}
	}
	
	// 表示
	var html = '';
	for(i in list){
		var vDate = list[i].date;
		var vCount = list[i].count;
		var vEvent = list[i].event;
		var vHtml = '';
		if(vDate && vCount && vEvent){
			vHtml = '<a href="'+Y+'/'+M+'/'+vDate+'/" rel="'+vEvent+'" class="eventListDate"><span class="date">'+vDate+'</span><span class="eventNum">'+vCount+'件</span></a>';
		}else if(vDate){
			vHtml = '<span class="date"><span>'+vDate+'</span></span>';
		}
		
		var vDay = list[i].day;
		var isSpecialDay = '';
		isSpecialDay += list[i].today ? ' today':'';
		for(j in shukujitu){
			if(shukujitu[j] == vDate){
				isSpecialDay += ' holi_day';
			}
		}
		
		switch(vDay){
			case 0:
				html += '<tr>';
				html += '<td class="sun' + isSpecialDay + '"><div class="size">'+vHtml+'</div></td>';
				break;
			case 6:
				html += '<td class="sat' + isSpecialDay + '"><div class="size">'+vHtml+'</div></td>';
				html += '</tr>';
				break;
			default:
				html += '<td class="day' + isSpecialDay + '"><div class="size">'+vHtml+'</div></td>';
				break;
		}
	}
	$('#calendar').append('<table class="calendar_table"><thead><tr><td class="sun">日</td><td class="mon">月</td><td class="tue">火</td><td class="wed">水</td><td class="thu">木</td><td class="fri">金</td><td class="sat">土</td></tr></thead><tbody>' + html + '</tbody></table>');
	
	//delCookie('openedY');
	//delCookie('openedM');
	
	// 指定日のイベントを表示
	if(D){
		var target = $('#calendar a.eventListDate[href*="' + Y + '/' + M + '/' + D + '/"]');
		if(target.length){
			var eve = target.attr('rel');
			diplayEvent(Y,M,D,eve,Event);
			$('#calendar a.eventListDate').removeClass('clicked');
			target.addClass('clicked');
			setCookie('openedY',Y);
			setCookie('openedM',M);
			setCookie('openedD',D);
		}else{
			$('div#eventlist').html('');
		}
	}
}


/*---------------------------------------*/
/* 来月・今月・先月へボタン表示
/*---------------------------------------*/
function displayMonthBt(Y,M,tY,tM){

	// 過去が何ヶ月前まで見れるか設定
	var preLimit = 6;
	
	// 未来が何ヶ月前まで見れるか設定
	var nxtLimit = 3;
	
	var preY = Y;
	var preM = M - 1;
	var nxtY = Y;
	var nxtM = M + 1;
	if(M == 1){
		preY = Y - 1;
		preM = 12;
	}else if(M == 12){
		nxtY = Y + 1;
		nxtM = 1;
	}

	var thsY = tY;
	var thsM = tM;
	
	var preBt = '<a href="'+preY+'/'+preM+'" class="prev_m">&lt;前の月へ</a> | ';
	var preLiM = thsM+12-preLimit;
	if( (preLiM>12 && M<=preLiM-12 && Y<=thsY) || (preLiM<=12 && M<=preLiM && Y<thsY) ){
		preBt = '';
	}
	
	var nxtBt = ' | <a href="'+nxtY+'/'+nxtM+'">次の月へ&gt;</a>';
	var nxtLiM = thsM+nxtLimit;
	if( (nxtLiM>12 && nxtLiM-12<=M && thsY<Y) || (nxtLiM<=12 && nxtLiM<=M && thsY<=Y) ){
		nxtBt = '';
	}
	
	$('#calendar').append( '<div class="prevnext">' + preBt + '<a href="'+thsY+'/'+thsM+'">今月へ</a>' + nxtBt + '</div>');
}


/*==================================================================================*/

/*---------------------------------------*/
/* 画像プリロード
/*---------------------------------------*/
function preLoadImg(){
	var Imgs = new Array();
	for(i=1;i<=12;i++){
		var img1 = new Image();
		var img2 = new Image();
		img1.src = 'images/calendar/old_'+i+'.gif';
		img2.src = 'images/calendar/month_'+i+'.gif';
		Imgs.push(img1);
		Imgs.push(img2);
	}
	for(i=1;i<=10;i++){
		var img1 = new Image();
		img1.src = 'images/calendar/'+i+'.gif';
		Imgs.push(img1);
	}
}

/*==================================================================================*/

/*---------------------------------------*/
/* クッキー設定
/*---------------------------------------*/
function setCookie(name, value){
	document.cookie = name + "=" + value + " ;";
}

/*---------------------------------------*/
/* クッキー取得
/*---------------------------------------*/
function getCookie(name){
	var NameAndValues = document.cookie.split("; ");
	for(var i = 0; i < NameAndValues.length; i++){
		var nandv = NameAndValues[i].split("=");
		if(nandv[0] == name){
			return nandv[1];
		}
	}
	return false;
}

/*---------------------------------------*/
/* クッキー削除
/*---------------------------------------*/
function delCookie(name) {
  document.cookie = name + "=;" + "expires=Thu,01-Jan-70 00:00:01 GMT";
}




// year年の祝日の配列を返す。
function holidays(year){
	
  //日付が同じかどうか判定する関数
  function isSameDate(date1, date2){
	return (
	  date1.getFullYear()==date2.getFullYear()
	  && date1.getMonth()==date2.getMonth()
	  && date1.getDate()==date2.getDate()
	);
  }
  
  //何年何月何週目の何曜日、のDateを返す。
  function DateByWeek(year, month, week, day){ //monthはJavaScript月(実際の月-1)
	return new Date(year, month, 7*(week-1) + (day+7-(new Date(year,month,1)).getDay())%7+1 );
  }
  
  //日付sort用
  function dateSort(a,b){
	return a.getTime()-b.getTime();
  }
  
  //基本祝日リスト
  var hds = [new Date(year+"/1/1")]; //元日
  hds.push(DateByWeek(year, 1-1, 2, 1)); //成人の日
  hds.push(new Date(year+"/2/11")); //建国記念の日
  hds.push(new Date(year+"/3/"+(Math.floor(20.8431+0.242194*(year-1980)-Math.floor((year-1980)/4))))); //春分の日(1980〜2099)
  hds.push(new Date(year+"/4/29")); //昭和の日
  hds.push(new Date(year+"/5/3")); //憲法記念日
  hds.push(new Date(year+"/5/4")); //みどりの日
  hds.push(new Date(year+"/5/5")); //こどもの日
  hds.push(DateByWeek(year, 7-1, 3, 1)); //海の日
  hds.push(DateByWeek(year, 9-1, 3, 1)); //敬老の日
  hds.push(new Date(year+"/9/"+(Math.floor(23.2488+0.242194*(year-1980)-Math.floor((year-1980)/4))))); //秋分の日(1980〜2099)
  hds.push(DateByWeek(year, 10-1, 2, 1)); //体育の日
  hds.push(new Date(year+"/11/3")); //文化の日
  hds.push(new Date(year+"/11/23")); //勤労感謝の日
  hds.push(new Date(year+"/12/23")); //天皇誕生日
  	  
  //振替休日探し
  function isHoliday(d){
	for(var i=0; i<hds.length; i++)
	  if(isSameDate(d, hds[i])) return true;
	return false;
  }
  
  for(var i=0; i<hds.length; i++){
	if(hds[i].getDay()==0){ //日曜日
	  nd = new Date(hds[i].getFullYear(), hds[i].getMonth(), hds[i].getDate()+1); //翌日
	  while(isHoliday(nd))
		nd.setDate(nd.getDate()+1);
	  hds.push(nd);
	}
  }
  hds.sort(dateSort);
  
  //祝日に挟まれたら連休にする
  for(var i=1; i<hds.length; i++){
	var ototoi = new Date(hds[i]);  //ototoiは2日前
	ototoi.setDate(ototoi.getDate()-2);
	if(isSameDate( ototoi, hds[i-1])){
	  ototoi.setDate(ototoi.getDate()+1)
	  hds.push(ototoi);
	}
  }
  hds.sort(dateSort);
  
  return hds;
}
