var old_chat_entry;
var chat_info_id = 1;

// ページ初期化関数
function initializePage()
{
//	setInterval("checkChatEntry()",1000);
}

// XMLHttpRequest生成関数
function createXmlHttpRequest()
{
	var request = false;
	
	if(window.XMLHttpRequest){
		request = new XMLHttpRequest();
	}else if(window.ActiveXObject){
		try{
			request = new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			request = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	
	return(request);
}

// 記事リスト取得関数
function getArticleList(req_year, req_month, req_day)
{
	var request = createXmlHttpRequest();
	
	if(!req_year){ req_year = ""; }
	if(!req_month){ req_month = ""; }
	if(!req_day){ req_day = ""; }
	
	var query = "./cgi-bin/diary/api/get_article_list.cgi?year=" + req_year + "&month=" + req_month + "&day=" + req_day;
	
	request.open("GET", query, true);
	request.onreadystatechange = function(){
		if(request.readyState == 4 && request.status == 200){
			var xml = request.responseXML;
			if(xml){
				
				var target = document.getElementById("diary_articles");
				while(target.firstChild){
					target.removeChild(target.firstChild);
				}
				var header_list = xml.getElementsByTagName("header");
				if(header_list.length != 0){
					for(var i = 0; i < header_list.length; i++){
						var id = header_list[i].getAttribute("id");
						var date = header_list[i].getAttribute("date");
						var author = header_list[i].getAttribute("author");
						var title = header_list[i].getAttribute("title");
						
						var diary_article = document.createElement("div");
						diary_article.setAttribute("id","article_" + id);
						diary_article.setAttribute("class","diary_article");
						diary_article.setAttribute("className","diary_article");
						
						var article_header = document.createElement("h3");
						article_header.setAttribute("class","article_header");
						article_header.setAttribute("className","article_header");
						
						var button = document.createElement("input");
						button.setAttribute("type","button");
						button.setAttribute("value","+");
						button.setAttribute("article_id",id);
						button.onclick = function(){
							getArticle(this.getAttribute("article_id"));
						};
						article_header.appendChild(button);
						
						var article_date = document.createElement("span");
						article_date.setAttribute("class","article_date");
						article_date.setAttribute("className","article_date");
						article_date.innerHTML = "&nbsp;" + date;
						article_header.appendChild(article_date);
						
						var article_title = document.createElement("span");
						article_title.setAttribute("class","article_title");
						article_title.setAttribute("className","article_title");
						article_title.innerHTML = "&nbsp;-&nbsp;" + title;
						article_header.appendChild(article_title);
						
						var article_author = document.createElement("span");
						article_author.setAttribute("class","article_author");
						article_author.setAttribute("className","article_author");
						article_author.innerHTML = author;
						article_header.appendChild(article_author);
						
						diary_article.appendChild(article_header);
						
						var article_content = document.createElement("div");
						article_content.setAttribute("article_id",id);
						article_content.setAttribute("class","article_content");
						article_content.setAttribute("className","article_content");
						
						diary_article.appendChild(article_content);
						
						target.appendChild(diary_article);
						if(i == 0){
							button.click();
						}
					}
				}else{
					var msg_box = document.createElement("div");
					msg_box.setAttribute("class","msg");
					msg_box.setAttribute("className","msg");
					var msg = document.createElement("p");
					
					msg.innerHTML = "記事がありません。";
					
					msg_box.appendChild(msg);
					target.appendChild(msg_box);
				}
			}
		}
	}
	request.send(null);
}

// 記事内容取得関数
function getArticle(id)
{
	if(! id){
		return;
	}
	
	var target = document.getElementById('article_' + id);
	var diary_articles = document.getElementById("diary_articles");
	
	var button;
	var inputs = diary_articles.getElementsByTagName("input");
	for(var i = 0; i < inputs.length; i++){
		if(inputs[i].getAttribute("type") == "button" && inputs[i].getAttribute("article_id") == id){
			button = inputs[i];
			break;
		}
	}
	var article_content;
	var article_contents = diary_articles.getElementsByTagName("div");
	for(var i = 0; i < article_contents.length; i++){
		if(article_contents[i].getAttribute("article_id") == id){
			article_content = article_contents[i];
			break;
		}
	}
	
	if(article_content.innerHTML){
		button.setAttribute("value","+");
		article_content.innerHTML = "";
		article_content.style.display = "none";
		return;
	}else{
		article_content.innerHTML = "<div class=\"msg\">記事取得中...</div>";
		button.setAttribute("value","-");
		article_content.style.display = "block";
	}
	
	var request = createXmlHttpRequest();
	
	request.open("GET","./cgi-bin/diary/api/get_article.cgi?id=" + id,true);
	request.onreadystatechange = function(){
		if(request.readyState == 4 && request.status == 200){
			txt = request.responseText;
			if(txt){
				article_content.innerHTML = request.responseText;
				
				var article_navi = document.createElement("div");
				article_navi.setAttribute("class","article_navi");
				article_navi.setAttribute("className","article_navi");
				
				var anchor = document.createElement("a");
				anchor.setAttribute("href","#article_top");
				anchor.innerHTML = "記事トップに戻る";
				
				article_navi.appendChild(anchor);
				article_content.appendChild(article_navi);
			}
		}
	}
	request.send(null);
}

// チャット入室者確認
function checkChatEntry()
{
	var request = createXmlHttpRequest();
	
	query = "./cgi-bin/chat/api/get_entry.fcgi";
	
	request.open("GET",query,true);
	request.onreadystatechange = function(){
		if(request.readyState == 4 && request.status == 200){
			xml_doc = request.responseXML;
			chat_entry = xml_doc.getElementsByTagName("member");
			if(old_chat_entry != chat_entry){
				if(old_chat_entry){
					diff1 = minusArray(chat_entry,old_chat_entry);
					diff2 = minusArray(old_chat_entry,chat_entry);
					if(document.getElementById("chat_info_box")){
						chat_info_box = document.getElementById("chat_info_box");
					}else{
						chat_info_box = document.createElement("div");
					}
					chat_info_box.setAttribute("id","chat_info_box");
					document.getElementById("base").appendChild(chat_info_box);
					
					for(i = 0; i < diff1.length; i++){
						chat_entry_element = document.createElement("div");
						chat_entry_element.setAttribute("id","chat_entry_" + chat_info_id);
						chat_entry_element.setAttribute("class","chat_entry_element");
						chat_entry_element.setAttribute("className","chat_entry_element");
						chat_entry_element.innerHTML = "チャット入室 ＞ " + diff1[i].firstChild.nodeValue;
						chat_info_box.appendChild(chat_entry_element);
						insertChatEntryElement("chat_entry_" + chat_info_id);
						setTimeout("clearChatEntry('chat_entry_" + chat_info_id + "')",10000);
						chat_info_id++;
					}
					for(i = 0; i < diff2.length; i++){
						chat_entry_element = document.createElement("div");
						chat_entry_element.setAttribute("id","chat_entry_" + chat_info_id);
						chat_entry_element.setAttribute("class","chat_entry_element");
						chat_entry_element.setAttribute("className","chat_entry_element");
						chat_entry_element.innerHTML = "チャット退室 ＞ " + diff2[i].firstChild.nodeValue;
						chat_info_box.appendChild(chat_entry_element);
						insertChatEntryElement("chat_entry_" + chat_info_id);
						setTimeout("clearChatEntry('chat_entry_" + chat_info_id + "')",10000);
						chat_info_id++;
					}
				}
				old_chat_entry = chat_entry;
			}
		}
	}
	request.send(null);
}

function minusArray(x,y)
{
	result = new Array();
	for(i = 0; i < x.length; i++){
		flg = 1;
		for(j = 0; j < y.length; j++){
			if(x[i].firstChild.nodeValue == y[j].firstChild.nodeValue){
				flg = 0;
				break;
			}
		}
		if(flg){
			result.push(x[i]);
		}
	}
	return(result);
}

function insertChatEntryElement(id)
{
	var target = document.getElementById(id);
	if(target){
		target.style.left = "200px";
		target.style.color = "#ffffff";
		target.style.borderColor = "#ffffff";
		setInterval("insertElement('" + id + "');",20);
	}
}

function insertElement(id)
{
	var target = document.getElementById(id);
	if(target){
		left = target.style.left.split("px")[0] - 0;
		color = target.style.color.split("#")[1];
		if(left > 1){
			if(color){
				red = parseInt("0x"+color.substr(0,2)) - 7;
				green = parseInt("0x"+color.substr(2,2)) - 7;
				blue = parseInt("0x"+color.substr(4,2));
				target.style.color = "#" + red.toString(16) + green.toString(16) + blue.toString(16);
				target.style.borderColor = "#" + red.toString(16) + green.toString(16) + blue.toString(16);
			}else{
				target.style.color = "#7777ff";
			}
			left /= 1.2;
			target.style.left = parseInt(left) + "px";
		}
	}
}

function clearChatEntry(id)
{
	chat_entry_element = document.getElementById(id);
	chat_entry_element.style.display = "none";
}

function createCalendar(year, month)
{
	var day_name_list = new Array("日","月","火","水","木","金","土");
	var day_class_list = new Array("sunday","weekday","weekday","weekday","weekday","weekday","saturday");
	var calendar_element = document.createElement("table");
	var first_date = new Date(year, month - 1, 1);
	var last_date = first_date.getLastDate();
	var date_num = 1;
	var line_num = 0;
	
	// ナビゲーションセルの生成
	var navi_element = document.createElement("tr");
	
	var navi_preview_element = document.createElement("td");
	navi_preview_element.setAttribute("id","navi_preview");
	navi_preview_element.innerHTML = "&lt;&lt;";
	navi_element.appendChild(navi_preview_element);
	
	var navi_month_element = document.createElement("td");
	navi_month_element.setAttribute("colspan","5");
	navi_month_element.setAttribute("id","navi_month");
	navi_month_element.innerHTML = year + "年" + month + "月";
	navi_month_element.setAttribute("title",year + "/" + month);
	navi_element.appendChild(navi_month_element);
	
	var navi_next_element = document.createElement("td");
	navi_next_element.setAttribute("id","navi_next");
	navi_next_element.innerHTML = "&gt;&gt;";
	navi_element.appendChild(navi_next_element);
	
	calendar_element.appendChild(navi_element);
	
	// 曜日ヘッダの生成
	var week_element = document.createElement("tr");
	for(var i = 0; i < 7; i++){
		var date_element = document.createElement("th");
		date_element.innerHTML = day_name_list[i];
		week_element.appendChild(date_element);
	}
	calendar_element.appendChild(week_element);
	
	// 日付セルの生成
	if(first_date.getDay() != 0){
		var week_element = document.createElement("tr");
		for(var i = 0; i < first_date.getDay(); i++){
			var date_element = document.createElement("td");
			date_element.innerHTML = "";
			week_element.appendChild(date_element);
		}
		for(var i = first_date.getDay(); i < 7; i++){
			var date_element = document.createElement("td");
			date_element.setAttribute("class",day_class_list[i]);
			date_element.setAttribute("className",day_class_list[i]);
			date_element.setAttribute("title",new Date(year, month - 1, date_num).getString());
			date_element.setAttribute("id","date_" + new Date(year, month - 1, date_num).getString());
			date_element.innerHTML = date_num;
			week_element.appendChild(date_element);
			date_num++;
		}
		calendar_element.appendChild(week_element);
		line_num++;
	}
	
	for(var i = line_num; i < (parseInt((first_date.getDay() + last_date.getDate()) / 7)); i++){
		var week_element = document.createElement("tr");
		for(var j = 0; j < 7; j++){
			var date_element = document.createElement("td");
			date_element.setAttribute("class",day_class_list[j]);
			date_element.setAttribute("className",day_class_list[j]);
			date_element.setAttribute("title",new Date(year, month - 1, date_num).getString());
			date_element.setAttribute("id","date_" + new Date(year, month - 1, date_num).getString());
			date_element.innerHTML = date_num;
			week_element.appendChild(date_element);
			date_num++;
		}
		calendar_element.appendChild(week_element);
		line_num++;
	}
	
	if(date_num - 1 < last_date.getDate()){
		var week_element = document.createElement("tr");
		for(var i = date_num; i <= last_date.getDate(); i++){
			var date_element = document.createElement("td");
			date_element.setAttribute("class",day_class_list[new Date(year,month - 1,i).getDay()]);
			date_element.setAttribute("className",day_class_list[new Date(year,month - 1,i).getDay()]);
			date_element.setAttribute("title",new Date(year, month - 1, date_num).getString());
			date_element.setAttribute("id","date_" + new Date(year, month - 1, date_num).getString());
			date_element.innerHTML = date_num;
			week_element.appendChild(date_element);
			date_num++;
		}
		for(var i = last_date.getDay() + 1; i < 7; i++){
			var date_element = document.createElement("td");
			date_element.innerHTML = "";
			week_element.appendChild(date_element);
			date_num++;
		}
		calendar_element.appendChild(week_element);
	}
	
	calendar_element.setAttribute("id","calendar");
	calendar_element.setAttribute("class","calendar");
	calendar_element.setAttribute("className","calendar");
	
	return(calendar_element);
}

function showCalendar(target_month){
	
	var calendar = document.getElementById("calendar");
	var year;
	var month;
	
	if(! calendar){
		calendar = createCalendar(new Date().getFullYear(), new Date().getMonth() + 1);
		document.getElementById("calendar_box").appendChild(calendar);
	}
	
	if(target_month){
		year = target_month.split("/")[0];
		month = target_month.split("/")[1];
		calendar = createCalendar(year, month);
		document.getElementById("calendar_box").innerHTML = "";
		document.getElementById("calendar_box").appendChild(calendar);
	}
	
	document.getElementById("calendar_box").innerHTML = document.getElementById("calendar_box").innerHTML;
	
	var td_list = document.getElementById("calendar").getElementsByTagName("td");
	
	for(var i = 0; i < td_list.length; i++){
		if(td_list[i].innerHTML != ""){
			if(td_list[i].getAttribute("id") == "navi_preview"){
				td_list[i].onmouseover = function(){
					this.style.color = "#ffffff";
					this.style.backgroundColor = "#7777ff";
				}
				td_list[i].onmouseout = function(){
					this.style.color = "#333333";
					this.style.backgroundColor = "#ccccff";
				}
				td_list[i].onmousedown = function(){
					var year = document.getElementById("navi_month").getAttribute("title").split("/")[0];
					var month = document.getElementById("navi_month").getAttribute("title").split("/")[1];
					if(--month == 0){
						year--;
						month = 12;
					}
					showCalendar(year + "/" + month);
				}
			}else if(td_list[i].getAttribute("id") == "navi_month"){
				td_list[i].onmouseover = function(){
					this.style.color = "#ffffff";
					this.style.backgroundColor = "#7777ff";
				}
				td_list[i].onmouseout = function(){
					this.style.color = "#333333";
					this.style.backgroundColor = "#ccccff";
				}
				td_list[i].onmousedown = function(){
					var title_date = this.getAttribute("title");
					var year = title_date.split("/")[0];
					var month = title_date.split("/")[1];
					getArticleList(year, month);
				}
			}else if(td_list[i].getAttribute("id") == "navi_next"){
				td_list[i].onmouseover = function(){
					this.style.color = "#ffffff";
					this.style.backgroundColor = "#7777ff";
				}
				td_list[i].onmouseout = function(){
					this.style.color = "#333333";
					this.style.backgroundColor = "#ccccff";
				}
				td_list[i].onmousedown = function(){
					var year = document.getElementById("navi_month").getAttribute("title").split("/")[0];
					var month = document.getElementById("navi_month").getAttribute("title").split("/")[1];
					if(++month == 13){
						year++;
						month = 1;
					}
					showCalendar(year + "/" + month);
				}
			}else if(1 <= td_list[i].innerHTML && td_list[i].innerHTML <= 31){
				td_list[i].onmouseover = function(){
					this.style.backgroundColor = "#ccccff";
				}
				td_list[i].onmouseout = function(){
					this.style.backgroundColor = "#ffffff";
				}
				td_list[i].onmousedown = function(){
					var title_date = this.getAttribute("title");
					var year = title_date.split("/")[0];
					var month = title_date.split("/")[1];
					var day = title_date.split("/")[2];
					getArticleList(year, month, day);
				}
			}
		}
	}
	checkDatesOfArticles();
}

function checkDatesOfArticles()
{
	var request = createXmlHttpRequest();
	
	var query = "./cgi-bin/diary/api/get_dates.cgi";
	
	request.open("GET", query, true);
	request.onreadystatechange = function(){
		if(request.readyState == 4 && request.status == 200){
			var xml = request.responseXML;
			var dates = xml.getElementsByTagName("date");
			for(var i = 0; i < dates.length; i++){
				var year = dates[i].getAttribute("year");
				var month = dates[i].getAttribute("month");
				var day = dates[i].getAttribute("day");
				var cell;
				if(cell = document.getElementById("date_" + year + "/" + month + "/" + day)){
					cell.innerHTML = "<strong>" + cell.innerHTML + "</strong>";
				}
			}
		}
	}
	request.send(null);
}

Date.prototype.getLastDate = function(){
	return(new Date(this.getFullYear(),this.getMonth() + 1, 0));
}

Date.prototype.getString = function(){
	var yy = this.getFullYear();
	var mm = this.getMonth() + 1;
	var dd = this.getDate();
	if(mm < 10){ mm = "0" + mm }
	if(dd < 10){ dd = "0" + dd }
	return(yy + "/" + mm + "/" + dd);
}

