//----------------------------------------------------------------------------
//uajBBS One(Javascript部)	2006/5/29 - 2006/6/1
var uajbbs_logfile = "/training/message/log.txt";	//ログファイルのパス(ドメインを除いた部分で)
var uajbbs_script = "/training/message/cmd.php";	//書き込み用PHPファイルのパス(ドメインを除いた部分で)

//最終行だけ最後の「,」がいりません
var uajbbs_config_color = new Array(
	{name:"base", code:"#333333"},
	{name:"eyesoft", code:"#009999"},
	{name:"rosetea", code:"#BC8F8F"}
);
//----------------------------------------------------------------------------
//行数変更
function UAJBBS_changeLines(){
	function main(){
		var lines = document.uajbbs_form.uajbbs_lines.value;
		uajbbs_view.articles(uajbbs_article_cache, lines);
	}
	UAJBBS_controller(main);
}
//----------------------------------------------------------------------------
//色変更(Firefox系用)
function UAJBBS_changeColor(){
	var f = document.uajbbs_form;
	var color = uajbbs_config_color[f.uajbbs_color.value].code;
	f.uajbbs_color.style.color = color;
}
//----------------------------------------------------------------------------
//投稿orリロード
function UAJBBS_post(){
	function main(){
		uajbbs_debug.write('●投稿処理');
		var f = document.uajbbs_form;
		var name = f.uajbbs_name.value;
		if (name == "") name = "-";
		var comment = f.uajbbs_comment.value;
		var color = f.uajbbs_color.value;

		var lines = f.uajbbs_lines.value;
		if (comment == ""){	//コメントが空の時はリロード
			uajbbs_debug.write('コメントが空なのでリロードします');
			uajbbs_article_cache = uajbbs_model.getLog();
			uajbbs_view.articles(uajbbs_article_cache, lines);
		}else{
			uajbbs_article_cache = uajbbs_model.post(name, comment, color);
			f.uajbbs_comment.value = "";
			uajbbs_view.articles(uajbbs_article_cache, lines);
		}
		name = uajbbs_cookie.escape(name);
		uajbbs_cookie.set(name + "<>" + color , 14);
	}
	UAJBBS_controller(main);
}
//----------------------------------------------------------------------------
//初期化
function UAJBBS_init(){
	function main(){
		uajbbs_debug.write('●初期化開始');

		var f = document.uajbbs_form;
		uajbbs_article_cache = uajbbs_model.getLog();
		var lines = f.uajbbs_lines.value;
		uajbbs_view.articles(uajbbs_article_cache, lines);

		var cok = uajbbs_cookie.get();
		if (cok != null){
			cok = cok.split("<>");
			f.uajbbs_name.value = uajbbs_cookie.unescape(cok[0]);
			f.uajbbs_color.value = cok[1];
			UAJBBS_changeColor();
		}
	}
	UAJBBS_controller(main);
}
//----------------------------------------------------------------------------
//Controller
function UAJBBS_controller(func){
	try{
		uajbbs_debug.init();
		func();
		uajbbs_debug.write('正常終了');
	}catch(e){
		alert(e.message);
	}
	uajbbs_debug.out();
}
//----------------------------------------------------------------------------
//Modelクラス
function UAJBBS_TModel(){
	this.http = new UAJBBS_uHTTP();	//http通信用オブジェクト
	this.http.init();

	//ログを記事オブジェクトに変換
	this._logToArticles = function(log){
		var result = new Array();
		for (var i=0; i<log.length; i++){
			if (log[i].indexOf("<>") != -1){
				var art = new UAJBBS_Article(log[i]);
				result.push(art);
			}
		}
		return result;
	}
	
	//ログ取得
	this.getLog = function(){
		uajbbs_debug.write("ログ取得開始");
		var res = this.http.getex(uajbbs_logfile);
		return this._logToArticles(res);
	}

	//投稿！
	this.post = function(name, comment, color){
		var str = "name=" + encodeURIComponent(name)
			+ "&comment=" + encodeURIComponent(comment)
			+ "&color=" + color;
		var res = this.http.post(uajbbs_script, str);
		return this._logToArticles(res);
	}
}
//----------------------------------------------------------------------------
//記事クラス
function UAJBBS_Article(str){
	//アンシリアライズ
	this.unserialize = function(str){
		var dat = str.split("<>");
		this.name = dat[0];
		this.color = dat[1];
		this.comment = dat[2];
		this.time = dat[3];
		this.host = dat[4];
	}

	if (str != ""){
		this.unserialize(str);
	}
}
//----------------------------------------------------------------------------
//HTTP通信用オブジェクトクラス
function UAJBBS_uHTTP(){
	this._xmlhttp = null;	//XMLHTTPオブジェクト用
	this.mod = 0;	//最終更新時刻
	this.cache = "";	//キャッシュ
	
	//初期化メソッド
	this.init = function(){
		this._xmlhttp = this.createXMLHTTPObject();
		if (this._xmlhttp == null) UAJBBS_error("XMLHTTPの生成に失敗しました");
	}

	//GETメソッド
	this.getex = function(url){
		uajbbs_debug.write('GET:'+url);
//		window.defaultStatus = "GET";
//		var dd = new Date();
//		var bf = dd.getTime();
		this._xmlhttp.open("GET", url, false);
		this._xmlhttp.setRequestHeader("If-Modified-Since", this.mod);
		this._xmlhttp.send("");
		var last = this._xmlhttp.getResponseHeader("Last-Modified");
		if (last != ""){
			this.mod = last;
			uajbbs_debug.write('更新:'+last);
		}
//		dd = new Date();
//		window.defaultStatus = "done:" + (dd.getTime() - bf) + "[ms]";
		return this._response();
	}

	//POSTメソッド
	this.post = function(url, data){
		uajbbs_debug.write('POST:'+url);
		uajbbs_debug.write("----------");
		uajbbs_debug.write(data);
//		window.defaultStatus = "POST";
//		var dd = new Date();
//		var bf = dd.getTime();
		this._xmlhttp.open("POST", url, false);
		this._xmlhttp.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
		this._xmlhttp.send(data);
//		dd = new Date();
//		window.defaultStatus = "done:" + (dd.getTime() - bf) + "[ms]";
		return this._response();
	}

	//サーバーからの返り値の処理
	this._response = function(){
		var restext = this._xmlhttp.responseText;
		if (restext == ""){
			restext = this.cache;
			uajbbs_debug.write("非更新のためキャッシュから読みました");
		}else{
			uajbbs_debug.write("----------");
			uajbbs_debug.write(restext);
			uajbbs_debug.write("----------");
		}
		var res = restext.split("\n");
		var stat = res.shift().split(":");
		
		if (stat[0] != "done"){
			if (stat[0] == "error") UAJBBS_error(res[0]);
			UAJBBS_error(stat + res.join("\n"));
		}
		this.cache = restext;
		return res;
	}
	
	//HTTP通信用オブジェクト作成関数
	this.createXMLHTTPObject = function(){
		var obj = null;
		try{
			obj = new XMLHttpRequest();
		}catch(e){
			try{
				obj = new ActiveXObject("Msxml2.XMLHTTP");
			}catch(e){
				try{
					obj = new ActiveXObject("Microsoft.XMLHTTP");
				}catch(e){
					return null;
				}
			}
		}
		return obj;
	}

}
//----------------------------------------------------------------------------
//エラー用に例外を投げる
function UAJBBS_error(mes){
	throw new Error(0, mes);
}
//----------------------------------------------------------------------------
//デバッグ用
function UAJBBS_uDebug(flag){
	this._log = new Array();

	if (flag == true){
		//初期化
		this.init = function(){
			this._log = new Array();
			document.getElementById("debug").style.display = "block";
		}
	
		//書き込み
		this.write = function(mes){
			this._log.push(mes);
		}
	
		//出力
		this.out = function(){
			var text = this._log.join("\n");
			text = text.replace(/</g, "&lt;");
			text = text.replace(/>/g, "&gt;");
			text = text.replace(/\"/g, "&quot;");	//"
			document.getElementById("debug").innerHTML =
				"<textarea cols=100 rows=15>"+text+"</textarea>";
		}
	}else{
		this.init = function(){}
		this.write = function(){}
		this.out = function(){}
	}
}
//----------------------------------------------------------------------------
//view
function UAJBBS_TView(){
	//記事群を表示
	this.articles = function(arts, lines){
		var html = "";
		for (var i=0; i<arts.length; i++){
			if (lines <= i) break;
			var art = arts[i];
			var color = uajbbs_config_color[art.color].code;
			
			html += "<tr><th style=\"color: "+ color +"\" title=\""+ art.host +"\">"
				+ art.name + "</th><td>"
				+ art.comment + "</td><td class=\"date\">"+ art.time +"</td></tr>"
		}
		html = "<table>" + html + "</table>";
		document.getElementById("uajbbs_viewer").innerHTML = html;
	}
}
//----------------------------------------------------------------------------
//Cookieクラス
function UAJBBS_uCookie(name){
	this.key = name;

	//設定
	this.set = function(value, days){
		var etime = new Date();
		etime.setTime(etime.getTime() + (days*24*60*60*1000));
		var item = "@" + this.key + "=" + encodeURIComponent(value) + ";";
		var expr = "expires=" + etime.toGMTString();
		document.cookie = item + expr ;
	}

	//取得
	this.get = function(){
		var name = "@" + this.key + "=";
		var str = document.cookie + ";";
		var result = null;
		var ptr = str.indexOf(name);
		if (ptr != -1){
			var start = ptr + name.length;
			var end = str.indexOf(";" , start);
			
			result = decodeURIComponent(str.substring(start, end));
		}
		return result;
	}

	//区切り文字用文字列エスケープ
	this.escape = function(str){
		str.replace(/</g, "&lt;");
		str.replace(/>/g, "&gt;");
		return str;
	}
	//区切り文字用文字列アンエスケープ
	this.unescape = function(str){
		str.replace(/&lt;/g, "<");
		str.replace(/&gt;/g, ">");
		return str;
	}
}
//----------------------------------------------------------------------------
var uajbbs_debug = new UAJBBS_uDebug(false);
var uajbbs_model = new UAJBBS_TModel();
var uajbbs_view = new UAJBBS_TView();
var uajbbs_cookie = new UAJBBS_uCookie('uajbbs');
var uajbbs_article_cache = null;

var tmp = "";
for (var i=0; i<uajbbs_config_color.length; i++){
	tmp += "<option value="+i+ " style=\"color: "+ uajbbs_config_color[i].code
		+"\">" + uajbbs_config_color[i].name + "</option>";
}
tmp = "<select name=\"uajbbs_color\" onchange=\"UAJBBS_changeColor();\" class=\"color\">"
 + tmp + "</select>";

var uajbbs_html = "<h2>ショートメッセージ</h2>"
+"<form name=\"uajbbs_form\" action=\"./cmd.php\" title=\"ショートメッセージ欄は、鍛練場に関する短い連絡に使用します。緊急性・重要性がある、または相手が気づかない可能性がある場合に使ってみましょう。\">"
+"<input name=\"uajbbs_name\" type=\"text\" size=\"5\" maxlength=\"10\" placeholder=\"名前\" required=\"required\" title=\"名前\" /> "
+"<input name=\"uajbbs_comment\" type=\"text\" size=\"40\" title=\"メッセージ\" placeholder=\"メッセージ\" required=\"required\" onkeypress=\"if (event.keyCode == 13){UAJBBS_post(); return false;}\" /> "
+ tmp
+"<input type=\"button\" value=\"メッセージを送信する\" onclick=\"UAJBBS_post();\" />"
+"<select name=\"uajbbs_lines\" title=\"表示メッセージ数\" onchange=\"UAJBBS_changeLines();\"><option value=\"5\">5</option><option value=\"10\">10</option><option value=\"20\">20</option></select>"
+"<!-- -->"
+"</form>"
+"<div id=\"uajbbs_viewer\"></div>"
;

document.open();
document.write(uajbbs_html);
document.close();

UAJBBS_init();


