var writeBlog = {
	TEMPLATE_XML : "../xml/blog_template.xml",
	DATA_XML_DIR : "../xml/blog_comment/",
	query:{},
	t: new Date().getTime(),
	tmplXML : {},
	//dataXML : {},
	init : function() {
		this.tmplXML = this.readXML(this.TEMPLATE_XML);
		if(this.tmplXML) {
			this.getQuery();
			var month = this.query['month'];
			var date  = this.query['date'];
			if(month){
				if(!this.checkDate(month+'01')){
					month = false;
				}
			}
			if(date){
				if(!this.checkDate(date)){
					date = false;
				}
			}
			this.tmplXML = this.tmplXML.blogs;
			this.writeBlog(month,date);
		}
	},

	getQuery : function() {
		var search = window.location.search;
		if(search) {
			search = search.substring(1);
			var params = search.split("&");
			for(var i=0; i<params.length; i++) {
				var index  = params[i].indexOf("=");
				var key = params[i].substring(0, index);
				var val = params[i].substring(index+1);
				if(key && val) {
					this.query[unescape(key)] = unescape(val);
				}
			}
		}
	},

	readXML : function(xml, arrayOption) {
		var jklParseXML = new JKL.ParseXML(xml + "?t=" + this.t);
		if(arrayOption) {
			jklParseXML.setOutputArrayElements(arrayOption);
		}
		return jklParseXML.parse();
	},

	replaceTemplate : function(temp, name, value) {
		return temp.replace(new RegExp("{" + name + "}", "g"), value);
	},

	getValue : function(xml) {
		var value = "";
		if(xml) {
			value = xml;
		}
		return value;
	},

	createImg : function(xml) {
		var tag = "";
		if(xml) {
			var src = this.getValue(xml.src);
			var alt = this.getValue(xml.alt);
			if(src != "" && src != null){
				tag =
					'<img src="' + this.getValue(xml.src) +
					'" alt="' + this.getValue(xml.alt) + '" />';
			}
		}
		return tag;
	},


	writeBlog : function(month,date) {
		var maxCount = 5;	//ブログの最大表示件数
		var tmpl = this.tmplXML;
		var elm  = document.getElementById(tmpl.id);
		var data = tmpl.blog;
		if(data == undefined){
			elm.innerHTML = "";
			return;
		}
		if(data.id != undefined){
			var a = new Array();
			a[0] = data;
			data = a;
		}else{
			//降順(日付)に変更
			data.sort(function(a, b) {return (a.date-b.date)*-1;});
		}
		//日付格納用の配列
		var dayArray = new Array();
		//現在日を取得
		var today  = this.getYMD(null);
		//引数に年月がある場合はそれを現在日に指定
		if(month && month < today.substring(0,6)){
			today = month + '31';
		}
		if(date && month < today){
			today = date;
		}
		var result = "";
		var count  = 0;
		var arrayCount = 0;
		var maxWrite = true;
		for (var i = 0; i < data.length; i++) {
			var each = data[i];
			var day  = this.getValue(each.date);
			var write = false;
			if(maxWrite){
				if(date){
					if(day == date){
						write = true;
					}
				}else if(today >= day){	//現在日以下のブログのみ表示する
					write = true;
				}
				if(write){
					//コメント数を求める
					var comment = 0;
					var dataXML = this.readXML(this.DATA_XML_DIR + "comment_" + this.getValue(each.id) + ".xml", ["comment"]);
					if(dataXML){
						dataXML = dataXML.comments;
						if(dataXML){
							var commentXML = dataXML.comment;
							if(commentXML){
								comment = commentXML.length;
							}
						}
					}
					//画像を取得
					var image = this.createImg(each);
					result = result
							+ "<div class=\"blog-box\">"
							+ "<h3>" + this.defaultEscape(this.getValue(each.title)) + "</h3>"
							+ "<p class=\"blog-name\">" + this.defaultEscape(this.getValue(each.name)) + "</p>"
							+ "<p class=\"blog-date\">" + this.formatDate(day) + "</p>";
					if(image != '' && image != null){
						result = result + image;
					}
					result = result
							+ "<p class=\"blog-contents\">" + this.nl2brFormat(this.defaultEscape(this.getValue(each.contents))) + "</p>"
							+ "<p class=\"blog-comment\"><a href=\"./comment.html?id=" + this.getValue(each.id) + "\">评语(" + comment + ")</a></p>"
							+ "<p class=\"blog_back\"><a href=\"#blog-top\">返回首页</a></p>"
							+ "</div>";
					++count;
				}
				if(count >= maxCount && !date){
					maxWrite = false;
				}
			}
			//配列に表示しているブログの日付を格納する
			if(today >= day){
				dayArray[arrayCount] = day;
				++arrayCount;
			}
		}
		if(date){
			month = date.substring(0,6);
		}

		elm.innerHTML = result;
		//カレンダーの設定
		this.createCalendar(dayArray,month);
	},

	//日付の変換YYYYMMDD→YYYY月MM月DD日
	formatDate : function(date) {
		var year  = date.substring(0,4);
		var month = Number(date.substring(4,6));
		var day   = Number(date.substring(6,8));
		return(year+'年'+month+'月'+day+'日');
	},

	nl2brFormat : function(value){
		value = value.replace(/\r\n/g, "<br />");
		value = value.replace(/(\n|\r)/g, "<br />");
		return value;
	},

	getYMD : function(date) {
		if(!date){
			date  = new Date();
		}
		var year  = date.getFullYear();
		var month = date.getMonth() + 1;
		var date  = date.getDate();
		if (month < 10) {
			month = "0" + month;
		}else{
			month = String(month);
		}
		if (date < 10) {
			date = "0" + date;
		}else{
			date = String(date);
		}
		var strDate = year + month + date;
		return strDate;
	},

	getYM : function() {
		var date  = new Date();
		var year  = date.getFullYear();
		var month = date.getMonth() + 1;
		if (month < 10) {
			month = "0" + month;
		}else{
			month = String(month);
		}
		var strDate = year + month;
		return strDate;
	},

	getModYMD : function(mon,addMonths) {
		var year;
		var month;
		var day;
		if(mon){
			year  = mon.substring(0,4);
			month = Number(mon.substring(4,6));
			day   = mon.substring(6,8);
		}else{
			var ymd = this.getYMD(null);
			year  = ymd.substring(0,4);
			month = Number(ymd.substring(4,6));
			day   = Number(ymd.substring(6,8));
		}
		month += addMonths;
	    var endDay = this.getMonthEndDay(year, month);
	    if(day > endDay) day = endDay;
	    var dt = new Date(year, month - 1, day);
	    return this.getYMD(dt);
	},

	getMonthEndDay :function(year, month) {
	    var dt = new Date(year, month, 0);
	    return dt.getDate();
	},

	//日付チェック
	checkDate : function(datestr) {
		if(datestr.length != 8){
			return false;
		}
		var vYear = datestr.substr(0, 4) - 0;
		var vMonth = datestr.substr(4, 2) - 1; // Javascriptは、0-11で表現
		var vDay = datestr.substr(7, 2) - 0;
		// 月,日の妥当性チェック
		if(vMonth >= 0 && vMonth <= 11 && vDay >= 1 && vDay <= 31){
			var vDt = new Date(vYear, vMonth, vDay);
			if(isNaN(vDt)){
				return false;
			}else if(vDt.getFullYear() == vYear && vDt.getMonth() == vMonth && vDt.getDate() == vDay){
				return true;
			}else{
				return false;
			}
		}else{
			return false;
		}
	},

	createCalendar : function(dayArray,mon) {
		var year;
		var month;
		if(mon){
			year  = mon.substring(0,4);
			month = Number(mon.substring(4,6)) -1;
		}else{
			var today = new Date();
			year      = today.getFullYear();
			month     = today.getMonth();
		}
		var start     = new Date(year + "/" + (month + 1) + "/1");
		var startday  = start.getDay();
		var beforeMon = (this.getModYMD(this.getYMD(start),-1)).substring(0,6);
		var nextMon   = (this.getModYMD(this.getYMD(start),1)).substring(0,6);
		//ブログが書き込まれている日付判断用
		var ym;
		if(mon){
			ym = mon;
		}else{
			ym = this.getYM();
		}
		//最終日のチェック
		for(i = 28 ; i <= 32 ; i++) {
			var check = new Date(year + "/" + (month + 1) + "/" + i);
			var enddate;
			var endday;
			if(check.getMonth() != month) {
				enddate = i - 1;
				endday  = check.getDay() - 1;
				if(endday < 0) {
					endday   += 7;
				}
				break;
			}
		}
		var count = 0;
		var calendar = "";
		calendar = '<table>'
				 + '<tr id="month-box">'
				 + '<th colspan="'+enddate+'">'
				 + '<font size="-1"><a href="./blog.html?month=' + beforeMon + '"><< 上个月</a></font>    '
				 + '<font size="+1">'
				 + year
				 + '</font><font size="-1">年</font>'
				 + '<font size="+1">'
				 + (month + 1)
				 + '</font><font size="-1">月</font>'
				 + '    <font size="-1"><a href="./blog.html?month=' + nextMon + '">下个月 >></a></font></th>'
				 + '</tr>'
				 + '<tr>';
		//１日の曜日までの空白を設定
		for(i = 0 ; i < startday ; i++) {
		/*
			if(count == 0) {
				calendar = calendar + '<tr>';
			}
			calendar = calendar + '<td>　</td>';
		*/
			++count;
		}
		//日付の設定
		for(i = 1 ; i <= enddate ; i++) {
			if(count == 0) {
				//calendar = calendar + '<tr>';
			}
			/*
			if(i == date) {
				calendar = calendar + '<td align="right" bgcolor="#ddffff">';
			}else{
				calendar = calendar + '<td align="right">';
			}
			*/
			//日付を設定する
			var ymd;
			var j;
			if(i < 10){
				j = "0" + i;
				ymd = ym + j;
			}else{
				ymd = ym + i;
			}
			//ブログのある日付かどうか比較する
			var check = false;
			for(var k = 0; k < dayArray.length; k++){
				if(dayArray[k] == ymd){
					check = true;
					break;
				}
			}
			//「check」がtrueのときは背景色を変更
			if(check){
				calendar = calendar + '<td class="blog-day-link">';
			}else{
				calendar = calendar + '<td>';
			}
			if(count == 0) {
				calendar = calendar + '<font color="red">';
			}
			if(count == 6) {
				calendar = calendar + '<font color="blue">';
			}
			//「check」がtrueのときは日付にリンクを設定
			if(check){
				calendar = calendar + "<a href=\"./blog.html?date=" + ymd + "\">"+ i + "</a>";
			}else{
	      		calendar = calendar + i;
	      	}
			if(count == 0) {
				calendar = calendar + '</font>';
			}
			if(count == 6) {
				calendar = calendar + '</font>';
			}
			calendar = calendar + '</td>';
			++count;
			if(count == 7) {
				//calendar = calendar + '</tr>';
				count = 0;
			}
		}
		//最終日からの空白を設定する
/*
		for(i = endday ; i < 6 ; i++) {
			calendar = calendar + '<td>　</td>';
			++count;
			if(count == 7) {
				//calendar = calendar + '</tr>';
			}
		}
*/
		calendar = calendar + '</tr></table>';

		//カレンダーの設定
		var elm = document.getElementById('blog-calendar');
		elm.innerHTML = calendar;
	},
	
	//エスケープされた文字を元に戻す
	defaultEscape : function(value){
		value = value.replace(/\\"/g, '"');
		value = value.replace(/\\'/g,"'");
		return value;
	}
};

(function(){writeBlog.init();})();
