/*
カレンダーを表示するスクリプトです
*/

var cal = function(){
	return {

		//name:"",
		//header:"",
		//content:"",

		data:{},    //スケジュールデータを格納するハッシュ（keyはcalYYYYMMDDの形式）

		//設定
		startDay:0,
		yearLabel:function(fullYear){return fullYear + "年"},
		monthLabel:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],
		dayLabel:["日","月","火","水","木","金","土"],
		prevMonthLabel:"&laquo;前月",
		nextMonthLabel:"次月&raquo;",
		captionClass:"year",
		monthClass:["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"],
		dayClass:["sun","mon","tue","wed","thu","fri","sat"],
		prevMonthClass:"calendar_prev",
		nextMonthClass:"calendar_next",
		disabledClass:"disabled",
		futureClass:"future",
		todayClass:"today",
		pastClass:"past",
		dayOfLastMonthClass:"lastMonth",
		dayOfNextMonthClass:"nextMonth",

		name:function() {
			return this
		},

		// 休みの日付が入った配列をスケジュールデータに変換する関数
		getHolidays:function(ARRAY){
			var data = {};
			for(var i = 0; i < ARRAY.length; i++){
				if(typeof ARRAY[i] === "number"){
					data["cal" + ARRAY[i]] = {category:"holiday",title:"お休みです"};
				}
			}
			return data;
		},


		// DateオブジェクトからIDを生成する関数
		createId:function(dateObj) {
			return [
				"cal",
				dateObj.getFullYear(),
				("0" + (dateObj.getMonth() + 1)).slice(-2),
				("0" + dateObj.getDate()).slice(-2)
			].join("");
		},

		//カレンダーを表示する関数、引数は fullyear, month（0-11）, startday（0-6、省略可能）
		display:function(y, m){
			var now   = new Date();
			now   = new Date(now.getFullYear(), now.getMonth(), now.getDate());
			var year  = (typeof(y) === "number")? y : new Date().getFullYear();
			var month = (typeof(m) === "number")? m : new Date().getMonth();
			var d   = new Date(year, month, 1) || (new Date()).setDate(1);
			var d_lastMonth = new Date(d.getTime() - 1000*60*60*24);
			var d_nextMonth = new Date(d.getTime() + 1000*60*60*24*32);

			//
			//ヘッダーのに入れるhtml
			//
			var header = [];

			if(d_lastMonth.getMonth() === now.getMonth()){
				header.push("<a class='" + this.prevMonthClass + "' href='#' onclick='" + calendar.name + ".display(" + d_lastMonth.getFullYear() + ", " + d_lastMonth.getMonth() +"); return false;'>" + this.prevMonthLabel + "</a>");
			}else{
				header.push("<span class='" + this.prevMonthClass + " " + this.disabledClass + "' href='#' onclick='return false;'>" + this.prevMonthLabel + "</span>");
			}
			if(d.getMonth() === now.getMonth()){
				header.push("<a class='" + this.nextMonthClass + "' href='#' onclick='" + calendar.name + ".display(" + d_nextMonth.getFullYear() + ", " + d_nextMonth.getMonth() +"); return false;'>" + this.nextMonthLabel + "</a>");
			}else{
				header.push("<span class='" + this.nextMonthClass + " " + this.disabledClass + "' href='#' onclick='return false;'>" + this.nextMonthLabel + "</span>");
			}

			header.push("<span class='" + this.captionClass + "'>" + this.yearLabel(year) + this.monthLabel[month] + "</span>");

			this.header.innerHTML  = header.join("");

			//
			// カレンダーのhtml
			//
			var content = [];
			content.push("<table>");
			content.push("<tbody>");

			//
			// 曜日
			//
			content.push("<tr>");
			var i = this.startDay;
			do{
				content.push("<th class='" + this.dayClass[i] + "'>" + this.dayLabel[i] + "</th>");
				(i < 6)? i++ : i = 0;
			}while(i !== this.startDay)
			content.push("</tr>");


			//
			// 中身
			//

			//tdのid, classを格納する配列を定義
			var id = ""
			var tdId = "";
			var tdClasses = [];
			var tdTitle   = "";
			var data = {};

			// 始まる日の設定
			while(d.getDay() !== this.startDay){
				d.setTime(d.getTime() - 1000*60*60*24);
			}

			do{
				content.push("<tr>");
					for(var j = 0; j < 7; j++){
						id = this.createId(d);
						data = {};
						if(this.data && this.data[id]){
							data = this.data[id];
						}

						tdId      = id;
						tdClasses = [];
						tdTitle   = data["title"] || "";

						// 曜日をクラスに追加
						tdClasses.push(this.dayClass[d.getDay()]);

						// 未来か今日か過去か、来月か先月かのクラスを追加
						if( d.getTime() > now.getTime() ){
							tdClasses.push(this.futureClass);
						}else if( d.getTime() === now.getTime() ){
							tdClasses.push(this.todayClass);
							
						}else{
							tdClasses.push(this.pastClass);
						}
						if( d.getMonth() === d_lastMonth.getMonth() ){ tdClasses.push(this.dayOfLastMonthClass); }
						if( d.getMonth() === d_nextMonth.getMonth() ){ tdClasses.push(this.dayOfNextMonthClass); }

						// data["category"]をクラスに追加
						if(data["category"]){
							tdClasses.push(data["category"]);
						}

						content.push("<td");

						// id属性
						content.push(" id='");
						content.push(tdId);
						content.push("'");

						// class属性
						if(tdClasses.length > 0){
							content.push("' class='");
							content.push(tdClasses.join(" "));
							content.push("'");
						}

						// title属性
						if(tdTitle !== ""){
							content.push("' title='");
							content.push(tdTitle);
							content.push("'");
						}
						content.push("'>");

						//リンクがあった場合のaタグ
						if(data["link"] && data["link"] !== ""){
							content.push("<a href='");
							content.push(data["link"]);
							//パラメーターにpopup=1があれば
							if(data["link"].indexOf("?") >= 0){
								var param = data["link"].split("?")[1];
								if(param.indexOf("popup=1") >= 0){
									var width = (function(){
										if( param.indexOf("width=") >= 0){
											var str = param.split("width=")[1];
											return (str.indexOf("&") >= 0 )? str.split("&")[0] : str;
										}else{
											return "640";
										}
									})();
									var height = (function(){
										if( param.indexOf("height=") >= 0){
											var str = param.split("height=")[1];
											return (str.indexOf("&") >= 0 )? str.split("&")[0] : str;
										}else{
											return "300";
										}
									})();
									content.push("' onclick='window.open(");
									content.push('"' + data["link"].split("?")[0] + '",');
									content.push('"popup", "width=');
									content.push(width);
									content.push(', height=');
									content.push(height);
									content.push(', status=0, scrollbars=1, menubar=0, location=0, toolbar=0, resizable=0"); return false;');
								}
							}
							content.push("'>");
						}
						content.push(d.getDate());

						//リンクがあった場合のaタグ閉じる
						if(data["link"] && data["link"] !== ""){
							content.push("</a>");
						}

						content.push("</td>");

						// 次の日付けへと行く処理
						d.setTime(d.getTime() + 1000*60*60*24);
					}
				content.push("</tr>");
			}while(d.getMonth() === month)

			this.content.innerHTML = content.join("");
		}
	};
}
