
/*------------------*/
/* グローバル変数   */
/*------------------*/

var Thread_data;//スレッドタイトル情報
var Wait_flag = false;//スレッド表示のウエイトフラグ
var Selected_id;//ハイライト表示されているスレッドのID

var Current = new Object;
Current.dir = "";//現在の掲示板
Current.id  = 0;//スレッドID

var Drag_offset_X = 0;
var Drag_offset_Y = 0;

/*--------------------*/
/* 定数、インスタンス */
/*--------------------*/

var THREAD_SIZE = 100;//表示するスレッド数

var RES_WINDOW;//DIV element
var RES_WINDOW_WIDTH_MAX = 800;//width値の最大値
var RES_WINDOW_TOP_LIMIT = 200;//top座標の最小値
var RES_WINDOW_OFFSET_LEFT = 170;
var RES_WINDOW_DRAGGABLE = true;//ドラッグ可能
var RES_WINDOW_STICKY = true;//移動された位置にウィンドウを固定する
var RES_WINDOW_OPACITY = 100;//不透明度

var RES_WINDOW_OUTPUT_ID = new Object;
RES_WINDOW_OUTPUT_ID.title 		= "res_window_title";
RES_WINDOW_OUTPUT_ID.response  	= "res_window_response";
RES_WINDOW_OUTPUT_ID.name 		= "res_window_name";
RES_WINDOW_OUTPUT_ID.date 		= "res_window_date";
RES_WINDOW_OUTPUT_ID.keyword 	= "res_window_keyword_area";
RES_WINDOW_OUTPUT_ID.upper 		= "res_window_upper";

var DRAG_TOP_MIN  = 200;
var DRAG_LEFT_MIN = 170;

var RESPONSE_MAX  = 1000;
var RESPONSE_GRAPH_WIDTH = 50;
var RESPONSE_GRAPH_UNIT = parseInt(RESPONSE_MAX / RESPONSE_GRAPH_WIDTH);

var CONTENTS;//DIV element
var AJAX_SEARCH_FORM;

var FADE_TIME = 200;
var AJAX_WAIT_TIME = 1000;

/*------------------*/

function prepare()
{
	RES_WINDOW = document.getElementById('res_window');
	CONTENTS = document.getElementById('contents');
	AJAX_SEARCH_FORM = document.ajax_search;

	changeOpac(RES_WINDOW_OPACITY, 'res_window');

	if (RES_WINDOW_DRAGGABLE)
	{
		RES_WINDOW.onmousedown = dragStart;
		RES_WINDOW.onmouseup   = dragEnd;
	}
	resetResWindow();

	new genresDataReader();

	drawHistoryOptions();
	drawNewsTicker();

	/*--------------*/
	var dir    = document.params.dir.value;
	var genres = document.params.genres.value;
	if (genres)
	{
		new boardsDataReader(genres);
	}

	if (dir)
	{
		document.history_dir.dir.value = dir;
		document.history_keyword.keyword.disabled = false;
	}

	AJAX_SEARCH_FORM.sort.value = document.params.sort.value;

	drawContents(dir);
}

function drawContents(dir)
{
	if (!dir) return false;

	AJAX_SEARCH_FORM.dir.value = dir;
	AJAX_SEARCH_FORM.keyword.value = "";

	var sort = AJAX_SEARCH_FORM.sort.value;

	Selected_id = false;
	Current.dir = dir;

	hideResWindow();

	if (CONTENTS.innerHTML)
	{
		changeOpac(30, 'contents');
	}

	new categoryDataReader(dir);

	var value = (dir.match(/plus/)) ? "95px" : "75px";
	addCSSRule("#contents div", "height:" + value);

	Thread_data = new threadDataReader(dir, sort, THREAD_SIZE);

	location.href = "#";
	resetResWindow();

	//ソート用ボタンのスタイルを変更
	if (AJAX_SEARCH_FORM.sort.value == "id")
	{
		document.getElementById('sort_1').className = "pushed";
		document.getElementById('sort_0').className = "button";
	}
	else
	{
		document.getElementById('sort_0').className = "pushed";
		document.getElementById('sort_1').className = "button";
	}
}

function doit(str)
{
	AJAX_SEARCH_FORM.keyword.value = str;
	AJAX_SEARCH_FORM.submit();
}

function kwd(str)
{
	if (Wait_flag) return;

	var sort = AJAX_SEARCH_FORM.sort.value;
	new searchResultReader(Current.dir, str, sort, 'res_window_search_result_area');

	var tag = '<div align=center><img src="/img/magni.gif"> <a href="javascript:doit(\'' + str.replace(/'/, "\\'") + '\')">さらに検索</a></div>';
	document.getElementById('res_window_search_result_more').innerHTML = tag;

	document.subform.keyword.value = str;
	document.msearch.p.value = str;

	var amazon = document.getElementById('amazon');
	amazon.src = "http://rcm-jp.amazon.co.jp/e/cm?t=sakkarin-22&o=9&p=13&l=st1&mode=books-jp&search=%s%&fc1=&lt1=&lc1=&bg1=&f=ifr".replace(/%s%/, encodeURI(str));

	setWaitTimer(RES_WINDOW_OUTPUT_ID.keyword, AJAX_WAIT_TIME);
}

function dirkwd(dir, keyword)
{
	if (keyword) AJAX_SEARCH_FORM.action = "/search/";

	AJAX_SEARCH_FORM.dir.value = dir;
	AJAX_SEARCH_FORM.dir_dummy.disabled = true;//検索パラメータに使用されないようにする
	AJAX_SEARCH_FORM.keyword.value = keyword;
	AJAX_SEARCH_FORM.submit();

	AJAX_SEARCH_FORM.dir_dummy.disabled = false;
}

function setDir(dir)
{
	drawContents(dir);
}

function setSort(mode)
{
	AJAX_SEARCH_FORM.sort.value = mode;
	drawContents(Current.dir);
}

function addOption(obj, newOption, newValue)
{
	var found = false;
	var len = obj.options.length;
	for (var i = 0; i < len; i ++)
	{
		if (obj.options[i].value == newOption)
		{
			found = true;
			break;
		}
	}
	if (!found)
	{
		obj.options[len] = new Option(newOption, newValue);
	}
	return true;
}


function setDirHistory(dir, dir_name)
{
	//検索履歴のクッキー登録と履歴フォーム表示
	var cookie_name, cookie_data, str;

	if (dir && dir_name)
	{
		str = dir_name + "\t" + dir;
		cookie_name = "history_dir";
		cookie_data = add2metadata(str, readCookie(cookie_name), HISTORY_DIR_MAX);

		writeCookie(cookie_name, cookie_data, COOKIE_EXPIRE_DAYS, COOKIE_PATH);

		drawHistoryOptions();
		document.history_dir.dir.value = dir;
	}
}

function addCSSRule(selector, property)
{
	if (document.styleSheets[0].addRule) //IE
	{
		document.styleSheets[0].addRule(selector, "{" + property + "}");
	}
	else if (document.styleSheets[0].insertRule) //Mozilla
	{
		document.styleSheets[0].insertRule(selector + "{" + property + "}", document.styleSheets[0].cssRules.length);
	}
	else return false;
}

/*------------------*/

function readDat(obj)
{
	if (Wait_flag) return false;

	var array = obj.childNodes[0].href.match(/dir=([a-z0-9]+)&id=([0-9]+)/i);
	if (array.length != 3) return false;
	var dir = array[1];
	var id  = array[2];

	new datReader(dir, id, RES_WINDOW_OUTPUT_ID);

	locateResWindow();
	showResWindow();

	var title = obj.parentNode.childNodes[1].innerHTML;
	document.getElementById('res_window_title').innerHTML = title;
	pickupKeyword(obj.parentNode.childNodes[1].firstChild.innerHTML, RES_WINDOW_OUTPUT_ID.keyword);

	setWaitTimer('control_button', AJAX_WAIT_TIME);

	Current.id = id;
}

function readDatByID(dir, id, obj)
{
	if (Wait_flag) return false;

	var title = obj.innerHTML.replace(/<.+?>/g,'');

	new datReader(dir, id, RES_WINDOW_OUTPUT_ID);

	var url = "/go.php?dir=" + dir + "&id=" + id;
	document.getElementById('res_window_title').innerHTML = '<a href="' + url + '" target=_blank>' + title + '</a>';
	pickupKeyword(title, RES_WINDOW_OUTPUT_ID.keyword);

	locateResWindow();
	showResWindow();

	setWaitTimer('control_button', AJAX_WAIT_TIME);

	Current.id = id;
}

function setWaitTimer(id, msec)
{
	Wait_flag = true;
	changeOpac(20, id)
	setTimeout("resetWaitTimer('"+ id +"')", msec);
}

function resetWaitTimer(id)
{
	Wait_flag = false;
	changeOpac(100, id)
}

/*------------------*/

function pickupKeyword(str, output_id)
{
	var tag = "", dummy_tag = "";

	var keyword_array = str2Keywords(str);
	if (keyword_array)
	{
		var checked = new Array;
		var len = 0, size = 0, key = "";

		for (var i = 0; i < keyword_array.length; i ++)
		{
			key = keyword_array[i];

			if (!checked[key])
			{
				var len = 1;
				var size = 0;
				if (Thread_data.keywords[key])
				{
					len  = Thread_data.keywords[key].length;
					size = parseInt(len / 3);
					if (size > 2) size = 2;
				}

				tag += "<a href=\"javascript:kwd('" + key.replace(/'/, "\\'") + "')\"><font size='+" + size + "'>" + key + "</font></a> ";
				dummy_tag += "<font size='+" + size + "'>" + key + "</font> ";

				checked[key] = true;
			}
		}
		var key_all = keyword_array.join(" ").replace(/'/g, "\\'");

		tag = "<a href=\"javascript:kwd('" + key_all + "')\"><img src=\"/img/inspect.gif\" title=\"類似スレッド検索\"></a> " + tag;
		dummy_tag = "<img src=\"/img/inspect.gif\" title=\"類似スレッド検索\"> " + dummy_tag;

	}
	document.getElementById(output_id).innerHTML = tag;
	document.getElementById(output_id + "_dummy").innerHTML = dummy_tag;
}

function highlightThread(id)
{
	var c;

	if (id != Selected_id)
	{
		if (Selected_id)
		{
			c = document.getElementById(Selected_id).className;
			document.getElementById(Selected_id).className = c.replace(/_selected/, '');
		}

		c = document.getElementById(id).className += "_selected";
		document.getElementById(id).className = c;

		Selected_id = id;
	}
}

/*------------------*/

function locateResWindow()
{
	if (RES_WINDOW_STICKY)
	{
		var window_top    = (document.all) ? parseInt(RES_WINDOW.style.pixelTop) : parseInt(RES_WINDOW.style.top);
		var window_height = parseInt(RES_WINDOW.clientHeight);

		var scroll_top    = parseInt(document.body.scrollTop);
		var client_height = parseInt(document.body.clientHeight);

		if (window_top < scroll_top)
		{
			if (document.all) document.body.scrollTop = window_top;
			else location.hash = "res_window";
		}
		else if (window_top > scroll_top + client_height * 0.8)
		{
			resetResWindow();
		}
	}
	else
	{
		resetResWindow();
	}
}

function showResWindow()
{
	if (RES_WINDOW.style.display == "none")
	{
		resetResWindow();
		opacity(RES_WINDOW.id, 0, RES_WINDOW_OPACITY, FADE_TIME);
	}
	RES_WINDOW.style.display = "";
	document.getElementById(RES_WINDOW_OUTPUT_ID.upper).style.display = "";

	document.getElementById('prev_button').style.display = (Selected_id) ? "" : "none";
	document.getElementById('next_button').style.display = (Selected_id) ? "" : "none";

}

function hideResWindow(time)
{
	var id = RES_WINDOW.id;

	if (!time)
	{
		changeOpac(0, RES_WINDOW.id)
		RES_WINDOW.style.display = "none";
	}
	else
	{
		opacity(RES_WINDOW.id, RES_WINDOW_OPACITY, 0, time);
	}
}

function resetResWindow()
{
	var width_rate = 0.95;
	var width  = parseInt((document.body.clientWidth - RES_WINDOW_OFFSET_LEFT) * width_rate);
	if (width > RES_WINDOW_WIDTH_MAX) width = RES_WINDOW_WIDTH_MAX;

	var padding_modify = (document.all) ? 0 : 10 * 2;

	var top = document.body.scrollTop + parseInt(document.body.clientHeight * 0.05);
	var left = parseInt((document.body.clientWidth + RES_WINDOW_OFFSET_LEFT - width) / 2);

	if (top < RES_WINDOW_TOP_LIMIT) top = RES_WINDOW_TOP_LIMIT;

	RES_WINDOW.style.width = width  - padding_modify;
	RES_WINDOW.style.left  = left + "px";
	RES_WINDOW.style.top   = top  + "px";
}

function showNextThread(add)
{
	if (!Selected_id) return false;
	if (Wait_flag) return false;

	var num =  parseInt(Selected_id.match(/[0-9]+/)[0]);
	num += add;

	var id = "b_" + num;
	if (document.getElementById(id))
	{
		highlightThread(id);
		readDat(document.getElementById(id).childNodes[1]);
	}
	else
	{
		alert("最後のスレッドです");
	}
}

/*------------------*/

function dragStart(e)
{
	if (document.all)
	{
		Drag_offset_X = event.clientX + document.body.scrollLeft - this.style.pixelLeft;
		Drag_offset_Y = event.clientY + document.body.scrollTop  - this.style.pixelTop;
	}
	else if (document.getElementById)
	{
		Drag_offset_X = e.pageX - parseInt(this.style.left);
		Drag_offset_Y = e.pageY - parseInt(this.style.top);
	}
	this.onmousemove = dragMove;
	this.style.cursor = "move";
}


function dragMove(e)
{
	if (document.all)
	{
		this.style.pixelLeft = event.clientX + document.body.scrollLeft - Drag_offset_X;
		this.style.pixelTop  = event.clientY + document.body.scrollTop  - Drag_offset_Y;

		var left = this.style.pixelLeft;
		var top  = this.style.pixelTop;

		if (left < DRAG_LEFT_MIN) this.style.pixelLeft = DRAG_LEFT_MIN;
		if (left + this.clientWidth > document.body.clientWidth) 	this.style.pixelLeft = document.body.clientWidth - this.clientWidth;

		if (top < DRAG_TOP_MIN) this.style.pixelTop = DRAG_TOP_MIN;
		if (top > document.body.scrollTop + document.body.clientHeight * 0.8) this.style.pixelTop = document.body.scrollTop + parseInt(document.body.clientHeight * 0.8);
	}
	else if (document.getElementById)
	{
		this.style.left = e.pageX - Drag_offset_X;
		this.style.top  = e.pageY - Drag_offset_Y;

		var left = parseInt(this.style.left);
		var top  = parseInt(this.style.top);

		if (left < DRAG_LEFT_MIN) this.style.left = DRAG_LEFT_MIN;
		if (left + this.clientWidth > document.body.clientWidth) this.style.left = document.body.clientWidth - this.clientWidth;

		if (top < DRAG_TOP_MIN) this.style.top = DRAG_TOP_MIN;
		if (top > document.body.scrollTop + document.body.clientHeight * 0.8) this.style.top = document.body.scrollTop + parseInt(document.body.clientHeight * 0.8);
	}
}

function dragEnd(e)
{
	this.onmousemove = null;
	this.style.cursor = "";
}

function onResize()
{
	resetResWindow();
}

function onMousemove()
{
	return;
}

function onScroll()
{
	return;
}

function fold(id)
{
	var num = document.getElementById("folder_" + id).length;

	if (num)
	{
		var fstatus = document.getElementById("folder_"+id)[1].style.display;

		var new_status = "";
		if (!fstatus) new_status = "none";

		for (var i = 0; i < num; i ++)
		{
			document.getElementById("folder_" + id)[i].style.display = new_status;
		}
	}
	else
	{
		var fstatus = document.getElementById("folder_" + id).style.display;

		var new_status = "";
		if (!fstatus) new_status = "none";

		document.getElementById("folder_" + id).style.display = new_status;
	}
}

/*------------------*/

function setGenresMenuSize(num)
{
	if (!num) num = AJAX_SEARCH_FORM.genres.length;
	AJAX_SEARCH_FORM.genres.size = num;
}

function flipGenresMenu(min)
{
	var size = min;
	var len  = AJAX_SEARCH_FORM.genres.length;
	if (AJAX_SEARCH_FORM.genres.size != len) size = len;
	AJAX_SEARCH_FORM.genres.size = size;
}

/*------------------*/

function opacity(id, opacStart, opacEnd, millisec)
{
	if (document.all)
	{
		changeOpac(opacEnd, id);
		if (opacEnd == 0) hideElement(id);
	}
	else
	{
	    var speed = Math.round(millisec / 100);
	    var timer = 0;

	    if (opacStart > opacEnd)
	    {
	        for (var i = opacStart; i >= opacEnd; i--)
	        {
	            setTimeout("changeOpac(" + i + ",'" + id + "')", (timer * speed));
	            timer ++;
	        }
	    }
	    else if(opacStart < opacEnd)
	    {
	        for (var i = opacStart; i <= opacEnd; i++)
	        {
	            setTimeout("changeOpac(" + i + ",'" + id + "')", (timer * speed));
	            timer ++;
	        }
	    }
	}

    if (opacEnd == 0)
    {
    	timer ++;
		setTimeout("hideElement('" + id + "')", (timer * speed));
    }
}

function changeOpac(opacity, id)
{
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
} 

function hideElement(id)
{
	document.getElementById(id).style.display = "none";
}

/*------------------*/

function markupKeyword(target, keyword)
{
	if (!keyword || keyword == '&') return target;

	var str = keyword.split(' ');
	var sep = "";
	var words = "";

	for (var i = 0;i < str.length; i ++)
	{
		if (str[i])
		{
			words += sep + str[i];
			sep = "|";
		}
	}
	var regex = new RegExp("(" + words + ")", "gi");

	return target.replace(regex, '<b>$1</b>');
}

function flipStyleDisplay(id)
{
	var obj = document.getElementById(id);
	obj.style.display = (!obj.style.display) ? "none" : "";
}

function openThread()
{
	var url = "/go.php?dir=" + Current.dir + "&id=" + Current.id;
	window.open(url,"_blank");
}

