/*
Nicholai Ver 0.001 Copyright 2007 by Tsuda, Nobuhide
Created: 07/02/24
Author: Tsuda, Nobuhide
Description: Nicholai フロントエンドJavaScriptプログラム

本プログラムのライセンスは MIT License (http://www.opensource.jp/licenses/mit-license.html) に従う。
MIT License とは、要約すると以下のとおりである。
   1. このソフトウェアを誰でも無償で無制限に扱って良い。但し、著作権表示および本許諾表示を、
      ソフトウェアのすべての複製または重要な部分に記載しなければならない。
   2. 作者または著作権者は、ソフトウェアに関してなんら責任を負わない。
*/
$(function() {
	$(".cancel").click(全フォームを閉じる);

	$("#doLogin").click(ログイン処理);
	$("#doLogout").click(ログアウト処理);
	$("#li_creAcnt").click(アカウント作成画面);
	$("#doCreateAccount").click(アカウント作成処理);
	$("#li_sendPass").click(パスワード再発行画面);
	$("#doSendPass").click(パスワード再発行処理);
	$("#chgUserSettings").click(ユーザ設定画面);
	$("#doChgUserSettings").click(ユーザ設定処理);

	$("#postLib").click(ライブラリ登録画面);
	//$("#postLib2").click(ライブラリ登録画面);
	$("#doPostLib").click(ライブラリ登録処理);
	$("#editLib").click(ライブラリ編集画面);

	$("#doConfirmComment").click(コメント確認画面);
	$("#cancelPostComment").click(コメント投稿中止処理);
	$("#doPostComment").click(コメント投稿処理);
	$("#doLiPostComment").click(liコメント投稿処理);

	$(".catList").click(カテゴリ絞込);
	$(".voteStar").click(星クリック処理);
	$(".voteStar").hover(星マウスオーバー, 星マウスアウト);

	if( g_lid != 0 ) {
		if( g_loginID != 0 )
			$("#liCommentForm").show();
		else
			$("#commentForm").show();
	}
	//if( g_lid != 0 )
	//	ライブラリ表示(g_lid);
	タグクラウド表示();
	//ライブラリ一覧表示();
	if( !g_pageJump )
		$(".libList").click(ライブラリ詳細表示);
	コメント新着順表示();
	g_formIDs.push("detailDiv");
});
function toJSON(html, errMsg)
{
	if( html.length == 0 ) {
		alert("サーバからの応答が空です");
		return null;
	}
	if( html[0] == '<' ) {
		alert(html);
		return null;
	}
	json = eval("(" + html + ")");
	if( json.status != "OK" ) {
		alert(errMsg + "\n" + json.status);
		return null;
	}
	return json;
}
function 全フォームを閉じる()
{
	//	すべてのフォームIDは g_formIDs に格納されている
	for(i = 0; i < g_formIDs.length; ++i) {
		//alert(g_formIDs[i]);
		$("#" + g_formIDs[i]).hide();
		//$("#" + g_formIDs[i]).hide("slow");
	}
	//$("#postLibForm").hide("slow");
	//$("#editLibForm").hide("slow");
}
/*
function アカウント作成処理()
{
	alert("アカウント作成処理はまだ実装されていません。");
	return false;
}
function パスワード再発行画面()
{
	alert("パスワード再発行処理はまだ実装されていません。");
	return false;
}
function ユーザ設定処理()
{
	alert("ユーザ設定処理はまだ実装されていません。");
	return false;
}
*/
//----------------------------------------------------------------------
function コメント確認画面()
{
	var name = $("#cm_name").val();
	if( name == "" )
		name = "名無しさん";
	$("#cf_name").text(name);
	var body = $("#cm_body").val().replace("\r", "");
	if( body == "" ) {
		alert("コメント文が入力されていません。");
		return false;
	}
	$("#cf_body").html(複数行のHTML要素をエスケープ(body));
	$("#confCommentDiv").show("slow");
	return false;
}
function コメント投稿中止処理()
{
	$("#cm_name").val("");
	$("#cm_body").val("");
	$("#confCommentDiv").hide("slow");
}
//	非ログイン状態の投稿処理
function コメント投稿処理()
{
	var name = $("#cm_name").val();
	if( name == "" )
		name = "名無しさん";
	var body = $("#cm_body").val().replace("\r", "");
	param = {act:"postComment", name:"", body:"", lid:0};
	param.name = name;
	param.body = body;
	param.lid = g_lid;
	$.post(g_backEndPHP, param, function(html,status) {
		if( (json = toJSON(html, "コメントを投稿出来ませんでした")) == null )
			return false;
		alert("コメントを投稿しました");
		コメント一覧表示(g_lid);
		$("#cm_name").val("");
		$("#cm_body").val("");
		$("#confCommentDiv").hide("slow");
	});
	return false;
}
function liコメント投稿処理()
{
	var body = $("#licm_body").val().replace("\r", "");
	if( body == "" ) {
		alert("コメント文が入力されていません。(@licm_body)");
		return false;
	}
	param = {act:"postComment", name:"", body:"", lid:0};
	//param.body = body.replace("\n", "\\n");
	param.lid = g_lid;
	param.body = body;
	var cmid = $("#licm_id").attr("value");
	if( cmid == 0 ) {
		//	コメント投稿
		$.post(g_backEndPHP, param, function(html,status) {
			if( (json = toJSON(html, "コメントを投稿出来ませんでした")) == null )
				return;
			alert("コメントを投稿しました");
			コメント一覧表示(g_lid);
			$("#licm_body").val("");
		});
	} else {
		//	コメント編集
		param.act = "updateComment";
		param.cmid = cmid;
		$.post(g_backEndPHP, param, function(html,status) {
			if( (json = toJSON(html, "コメントを更新出来ませんでした")) == null )
				return;
			alert("コメントを更新しました");
			コメント一覧表示(g_lid);
			$("#licm_body").val("");
		});
	}
	return false;
}
function リンク処理(text)
{
	/*
	text = text.replace(/&gt;&gt;(\d+)/, 
		function(str, p1) {
			return '<a href="#' + p1 + '">&gt;&gt;' + p1 + '</a>';
		});
	*/
	/*
	text = text.replace(/http:\/\/([\w\.\/#?&=-]+)/, 
		function(str, p1) {
			return '<a href="http://' + p1 + '">http://' + p1 + '</a>';
		});
	*/
	var result = "";
	while( text.match(/&gt;&gt;(\d+)/) ) {		//	>>番号
		result += RegExp.leftContext;
		result += '<a href="" class="jumpNumber" num="' +RegExp.lastParen + '">&gt;&gt;' + RegExp.lastParen + '</a>';
		text = RegExp.rightContext;
	}
	text = result + text;
	result = "";
	//	注意：URL引数セパレータの & は &amp; に変換されている
	while( text.match(/http:\/\/([\w\.\/#?&=;%-]+)/) ) {
		result += RegExp.leftContext;
		result += '<a href="http://' + RegExp.lastParen + '" target=_blank>http://' + RegExp.lastParen + '</a>';
		text = RegExp.rightContext;
	}
	return result + text;
}
function コメント一覧表示(lid)
{
	var param = {act:"getComments", lid:0};
	param.lid = lid;
	$.post(g_backEndPHP, param, function(html, status) {
		if( (json = toJSON(html, "コメント一覧の取得に失敗しました")) == null )
			return;
		g_comments = json.comments;
		//alert(g_comments);
		var cmntList = "";
		if( g_comments.length != 0 ) {
			for(var i = 0; i < g_comments.length; ++i) {
				var name = escapeHTML(g_comments[i].name);
				var body = リンク処理(複数行のHTML要素をエスケープ(g_comments[i].body));
				var number = g_comments[i].number;
				cmntList += '<div id="cmnt' + number + '">\n'
				cmntList += '<div class="cmntTitle">';
				cmntList += '<a href="" class="viewTop" num="' + number + '">#' + number + '</a>';
				if( g_comments[i].author != 0 )
					cmntList += ' <span class="userName">' + name + '</span> ';
				else
					cmntList += ' <strong>' + name + '</strong> ';
				cmntList += g_comments[i].datetime.substring(0, 19);		//.replace("-", "/");
				if( g_comments[i].author != 0 && g_comments[i].author == g_loginID ) {
					cmntList += '　[ <a href="" class="editComment" ix="' + i + '">編集</a>';
					cmntList += '　| <a href="" class="deleteComment" ix="' + i + '">削除</a> ]\n';
				}
				//cmntList += '<span class="scrollToTop">↑</span>\n';
				cmntList += '</div>\n';
				cmntList += '<div class="cmntBody">' + body + '</div>\n';
				cmntList += '</div>\n';
			}
		}
		cmntList += '<hr><br>\n';
		$("#commentList").html(cmntList);
		$(".editComment").click(コメント編集画面);
		$(".deleteComment").click(コメント削除);
	});
}

function コメント編集画面()
{
	alert("この機能はまだ実装されていません。m(_ _)m");
	return false;
}
function コメント削除()
{
	alert("この機能はまだ実装されていません。m(_ _)m");
	return false;
}
function コメント新着順表示()
{
	$.post(g_backEndPHP, {act:"getComments", lid:0}, function(html, status) {
		if( (json = toJSON(html, "コメント一覧の取得に失敗しました")) == null )
			return;
		g_comments = json.comments;
		var cmntList = '<ul id="cmntListUL">\n';
		if( g_comments.length != 0 ) {
			for(var i = 0; i < g_comments.length; ++i) {
				var name = escapeHTML(g_comments[i].name);
				var body = escapeHTML(g_comments[i].body).substring(0, 18) + "...";
				var lid = g_comments[i].lid;
				cmntList += '<li>';
				cmntList += g_comments[i].datetime.substring(5, 10).replace("-", "/");
				cmntList += ' ' + name;
				cmntList += ' <a href="' + g_thisDir + lid + '" class="cmntLink" lid="' + lid + '">' + body + '</a>\n';
			}
		}
		cmntList += '</ul>\n';
		$("#cmntListDiv").html(cmntList);
		//$(".cmntLink").click(コメントのライブラリ表示);
	});
}
function コメントのライブラリ表示()
{
	lid = $(this).attr("lid");
	ライブラリ表示(lid);
	return false;
}
//----------------------------------------------------------------------
function ライブラリ登録画面()
{
	//alert("ライブラリ登録処理はまだ実装されていません。");
	if( g_loginID == 0 )
		alert("ログインを行っていないと、ライブラリ登録できません。");
	else {
		全フォームを閉じる();	//	フォームを非表示にする
		//$("#detailDiv").hide("slow");
		//$("#editLibForm").hide("slow");
		//	ToDo: フォーム内容をクリア
		$("#li_title").val("");
		$("#li_expl").val("");
		$("#li_file").val("");
		$("#postLibForm").show("slow");
	}
	return false;
}
function ライブラリ登録処理()
{
	var title = $("#li_title").val();
	if( title == "" ) {
		alert("タイトルが入力されていません");
		return false;
	}
	return true;
}
//	アップロード終了時に iframe からコールされる
function onDoneUpload(lid)
{
	if( lid != 0 ) {
		alert("ライブラリ登録を行いました (lid = " + lid + ")");
		$("#postLibForm").hide("slow");
		ライブラリ表示(lid);
		ライブラリ一覧表示();
	} else {
		alert("ライブラリ登録に失敗しました。");
	}
}
function ライブラリ編集画面()
{
	if( g_loginID == 0 )
		alert("ログインを行っていないと、ライブラリ編集できません。");
	else {
		全フォームを閉じる();	//	フォームを非表示にする
		//$("#postLibForm").hide("slow");
		//$("#editLibForm").hide("slow");
		var param = {act:"getLib", lid:0};
		param.lid = g_lid;
		$.post(g_backEndPHP, param, function(html, status) {
			if( (json = toJSON(html, "ライブラリの取得に失敗しました")) == null )
				return;
			lib = json.lib;
			$("#el_lid").attr("value", g_lid);
			$("#el_title").attr("value", lib.title);
			var catid = "#el_category_" + lib.category;
			$(catid).attr("selected", "on");
			$("#el_expl").val(lib.explanation);
			//$("#el_expl").html(escapeHTML(lib.explanation));
			if( lib.public )
				$("#el_public").attr("checked", "on");
			else
				$("#el_public").removeAttr("checked");
			$("#editLibForm").show("slow");
		});
	}
	return false;
}
//	更新終了時に iframe からコールされる
function onDoneUpdate(lid)
{
	if( lid != 0 ) {
		alert("ライブラリを更新しました (lid = " + lid + ")");
		$("#editLibForm").hide("slow");
		ライブラリ表示(lid);
		ライブラリ一覧表示();
	} else {
		alert("ライブラリ更新に失敗しました。");
	}
}
function ライブラリ本文のリンク処理(text)
{
	result = "";
	//	注意：URL引数セパレータの & は &amp; に変換されている
	while( text.match(/http:\/\/([[\w\.\/#?&=;%-]+)/) ) {
		result += RegExp.leftContext;
		result += '<a href="http://' + RegExp.lastParen + '" target=_blank>http://' + RegExp.lastParen + '</a>';
		text = RegExp.rightContext;
	}
	return result + text;
}
function 行頭空白類置換()
{
	ar = text.split("\n");
	var r = "";
	for(var i = 0; i < ar.length;) {
		text = ar[i];
		if( ++i < ar.length )
			r += "<br>"
	}
	return r;
}
var g_voteCount = 0;
var g_voteSum = 0;
var g_voted = false;
function ライブラリ表示(lid)
{
	if( !lid ) return;
	var param = {act:"getLib", lid:0};
	param.lid = lid;
	$.post(g_backEndPHP, param, function(html, status) {
		if( (json = toJSON(html, "ライブラリの取得に失敗しました")) == null )
			return;
		$("#detailDiv").hide();
		g_lid = lid;
		lib = json.lib;
		g_voteCount = parseInt(lib.voteCount);
		g_voteSum = parseInt(lib.voteSum);
		g_voted = false;
		var detail = '<input type="button" id="closeDetail" value="閉じる" />' +
						" modified:<b>" + lib.modified + "</b> ビュー数:<b>" +
						'<img src="view_counter.php?lid=' + lid + '" />' +
						"</b> ダウンロード数:<b>" + lib.download_count +
						"</b>カテゴリ：<b>" + lib.catName + "</b>";
		detail += " author:<b>" + lib.authorName + "</b>";
		if( g_loginID == lib.author )
			detail += ' [ <a href="" id="editLib">編集</a> ]\n';
		//detail += '　URL:<input type="text" value="http://vivi.dyndns.org/Nicholai/' + g_lid +
		//			'" id="URLtext" size=40> <br>\n';
		detail += '<br>\n';
		detail += '<span class="voteStar" id="star1" val="1">☆</span>';
		detail += '<span class="voteStar" id="star2" val="2">☆</span>';
		detail += '<span class="voteStar" id="star3" val="3">☆</span>';
		detail += '<span class="voteStar" id="star4" val="4">☆</span>';
		detail += '<span class="voteStar" id="star5" val="5">☆</span>';
		detail += '\n';
		detail += '<span class="title">' + 複数行のHTML要素をエスケープ(lib.title) + "</span>\n";
		detail += '<table><tr><td>登録タグ：</td><td>';
		tags = lib.tags;
		if( tags.length == 0 )
			detail += 'ありません';
		else {
			tagIDs = lib.tagIDs;
			for(var i = 0; i < tags.length; ++i)
				detail += '<a href="" class="tagFilter" tagID="' + tagIDs[i] + '">' + tags[i] + '</a> ';
		}
		detail += '　<span class="editTag">【タグ追加】</span><input type="text" id="tagText" size=16 />';
		detail += '<input type="button" class="addTagButton" value="追加" />';
		detail += '</td></td></table>\n';
		detail += "<p>" + ライブラリ本文のリンク処理(複数行のHTML要素をエスケープ(lib.explanation));
		detail += '</pre>\n';		//	念のため
		detail += '<p><b>添付ファイル：</b>';
		//detail += '<p><input type="button" id="closeDetail" value="閉じる" /> <b>添付ファイル：</b>';
		if( lib.fileName != "" ) {
			if( lib.approved ) {
				detail += '"' + lib.fileName + '"　<a href="NicholaiDownload.php?lid=' + lib.lid + '">ダウンロード</a>\n';
				var ext = getExtention(lib.fileName).toLowerCase();
				if( ext != "lzh" && ext != "zip" )
					detail += '　<a href="NicholaiViewer.php?lid=' + lib.lid + '" target=_blank>ソースを表示</a>\n';
			} else
				detail += '未承認状態です\n';
		} else
			detail += '無し';
		detail += "<hr>\n";
		$("#detailTextDiv").html(detail);
		if( g_loginID != 0 )
			$("#liCommentForm").show();
		else
			$("#commentForm").show();
		コメント一覧表示(lid);
		評価値表示();
		$("#detailDiv").show("slow");
		$("#URLtext").click(function() { $(this).select(); });	//	クリック時：全選択
		$("#editLib").click(ライブラリ編集画面);
		$("#closeDetail").click(function() {
			$("#detailDiv").hide("slow");
			//return false;
		});
		$(".tagFilter").click(タグ絞込);
		$(".editTag").click(タグ追加処理);
		$(".addTagButton").click(タグ追加処理);
		$(".voteStar").click(星クリック処理);
		$(".voteStar").hover(星マウスオーバー, 星マウスアウト);
	});
}
function 星クリック処理()
{
	if( !g_voted ) {
		var val = parseInt($(this).attr("val"));
		var lid = parseInt($(this).attr("lid"));
		g_voteCount = 1;
		g_voteSum = val;
		g_voted = true;
		var param = {act:"vote", lid:0, val:0};
		param.lid = lid;
		param.val = val;
		$.post(g_backEndPHP, param, function(html, status) {
			if( (json = toJSON(html, "vote処理に失敗しました")) == null )
				return;
		});
	} else
		alert("すでに投票済みです。");
	評価値表示();
}
function 星マウスオーバー()
{
	//	マウスオーバー時処理
	if( !g_voted ) {
		var val = parseInt($(this).attr("val"));
		//	srat1 ～ マウス位置までの☆の背景をゴールドに変更
		for(var i = 1; i <= val; ++i)
			$("#star" + i).css("background", "gold");
		for(var i = val + 1; i <= 5; ++i)
			$("#star" + i).css("background", "white");
	}
}
function 星マウスアウト()
{
	//	マウスアウト時処理
	評価値表示();
}
function 評価値表示()
{
	for(var i = 1; i <= 5; ++i)
		$("#star" + i).css("background", "white");
	if( g_voteCount == 0 ) return;
	var avg = Math.round(g_voteSum / g_voteCount);
	//	srat1 ～ avgまでの文字を★に変更
	for(var i = 1; i <= avg; ++i)
		$("#star" + i).html("★");
	for(var i = avg + 1; i <= 5; ++i)
		$("#star" + i).html("☆");
}
function タグ絞込()
{
	全フォームを閉じる();	//	フォームを非表示にする
	//alert('この機能はまだ実装されていません');
	var tagID = $(this).attr("tagID");
	//alert('tagID = ' + tagID);
	var param = {act:"updateTag", tagID:0};
	param.tagID = tagID;
	$.post(g_backEndPHP, param, function(html, status) {
		タグクラウド表示();
	});
	param = {act:"getLibs", tagID:0};
	param.tagID = tagID;
	$.post(g_backEndPHP, param, function(html, status) {
		if( (json = toJSON(html, "ライブラリ一覧の取得に失敗しました")) == null )
			return;
		g_libs = json.libs;
		var libList = 'ライブラリ更新順： [ <a href="" id="postLib2">ライブラリ登録</a> ]\n';
		libList += '<ul id="libListUL">\n';
		for(var i = 0; i < g_libs.length; ++i) {
			var title = escapeHTML(g_libs[i].title);
			var id = g_libs[i].id;
			var modified = g_libs[i].modified.substring(5);
			libList += '<li>' + modified + ' <a href="' + g_thisDir +id+ '" class="libList" lid="' +id+ '"'
			libList += ' ix = ' +i+ '>' + title + '</a>';
			libList += '　[' + g_libs[i].category + ']';
			//libList += '　' + modified;
			if( !g_libs[i].public ) libList += ' <font color=red>非公開</font>';
			if( !g_libs[i].approved ) libList += ' <b>未承認</b>';
			libList += '</li>\n';
		}
		libList += '</ul>\n';
		$("#libsDiv").html(libList);
		//$("#filterDiv").html(libList);
		if( !g_pageJump )
			$(".libList").click(ライブラリ詳細表示);
		$("#postLib2").click(ライブラリ登録画面);
		//$("#filterDiv").show("slow");
	});
	return false;
}
function タグ追加処理()
{
	tagText = $("#tagText").val();
	if( tagText == '' ) {
		alert("タグ文字列が入力されていません。");
		return false;
	}
	var param = {act:"setTag", lid:0, tagText:""};
	param.lid = g_lid;
	param.tagText = tagText;
	$.post(g_backEndPHP, param, function(html, status) {
		if( (json = toJSON(html, "タグの設定に失敗しました")) == null )
			return;
		$("#tagText").val("");
		ライブラリ表示(g_lid);
	});
	return false;
}
//	一覧表示のリンクをクリックした時にコールされる
function ライブラリ詳細表示()
{
	全フォームを閉じる();	//	フォームを非表示にする
	ライブラリ表示($(this).attr("lid"));
	return false;
}
function カテゴリ絞込()
{
	$(".catList").css("background", "white");
	$(this).css("background", "lightblue");
	g_cat = $(this).attr("cat");
	ライブラリ一覧表示();
	return false;
}
function タグクラウド表示()
{
	$.post(g_backEndPHP, {act:"getTags"}, function(html, status) {
		if( (json = toJSON(html, "タグクラウドの取得に失敗しました")) == null )
			return;
		var tags = json.tags;
		var tagIDs = json.tagIDs;
		var tagText = '<ul id="tagCloudUL">\n';
		for(var i = 0; i < tags.length; ++i) {
			tagText += '<li class="tagCloud" tagID="' + tagIDs[i] + '">' + escapeHTML(tags[i]) + '\n';
		}
		tagText += '</ul>\n';
		$("#tagsDiv").html(tagText);
		$(".tagCloud").click(タグ絞込);
	});
}
function ライブラリ一覧表示()
{
	var param = {act:"getLibs", cat:0};
	param.cat = g_cat;
	$.post(g_backEndPHP, param, function(html, status) {
		if( (json = toJSON(html, "ライブラリ一覧の取得に失敗しました")) == null )
			return;
		g_libs = json.libs;
		var libList = 'ライブラリ更新順： [ <a href="" id="postLib2">ライブラリ登録</a> ]\n';
		libList += '<ul id="libListUL">\n';
		for(var i = 0; i < g_libs.length; ++i) {
			var title = escapeHTML(g_libs[i].title);
			var id = g_libs[i].id;
			var modified = g_libs[i].modified.substring(5);
			libList += '<li><span class="voteStars">';
			for(var r = 0; r < g_libs[i].rank; ++r) libList += '★';
			for(var r = g_libs[i].rank; r < 5; ++r) libList += '☆';
			libList += '</span> ' + modified + ' <a href="' + g_thisDir + id + '" class="libList" lid="' +id+ '"'
			libList += ' ix = ' +i+ '>' + title + '</a>';
			libList += '　[' + g_libs[i].category + ']';
			//libList += '　' + modified;
			if( !g_libs[i].public ) libList += ' <font color=red>非公開</font>';
			if( !g_libs[i].approved ) libList += ' <b>未承認</b>';
			libList += '</li>\n';
		}
		libList += '</ul>\n';
		$("#libsDiv").html(libList);
		if( !g_pageJump )
			$(".libList").click(ライブラリ詳細表示);
		$("#postLib2").click(ライブラリ登録画面);
	});
}
