/**
 * Emulates OmniOutliner's task view.  The check box marks a task complete.
 * It is a simulated form field with three states ...
 * 0=unchecked, 1=some children checked, 2=all children checked
 * When a task is clicked, the state of the nodes and parent and children
 * are updated, and this behavior cascades.
 *
 * @extends YAHOO.widget.TextNode
 * @constructor
 * @param oData {object} a string or object containing the data that will
 * be used to render this node
 * @param oParent {YAHOO.widget.Node} this node's parent node
 * @param expanded {boolean} the initial expanded/collapsed state
 * @param checked {boolean} the initial checked/unchecked state
 */
YAHOO.widget.BBSNode = function(oData, oParent, expanded, checked) {
	if (oParent) { 
		this.init(oData, oParent, expanded);
		this.setUpLabel(oData);
		this.checked = checked;
	}
};

YAHOO.widget.BBSNode.prototype = new YAHOO.widget.TextNode();

/**
 * True if checkstate is 1 (some children checked) or 2 (all children checked),
 * false if 0.
 *
 * @type boolean
 */
YAHOO.widget.BBSNode.prototype.checked = true;

// split title 60 byte
YAHOO.widget.BBSNode.prototype.splitString = function( str, length ) {
	var len  = 0;
	splitStr = "";
	for( i = 0; len < length; i++ ) { 
        var code = str.charCodeAt(i); 
        len += ((code >= 0 && code <= 255) || (code >= 0xff61 && code <= 0xff9f)) ? 1 : 2;
        splitStr += str.substr(i, 1);
    }
	return splitStr;
}

/*
 記事情報作成
 @author kay
*/
YAHOO.widget.BBSNode.prototype.genThreadData = function(depth) {
	var title = new Array();
	var	classlebel = '';
	var csslabel = 'main';
	
	if( depth >0){
		classlebel = '2';
		csslabel='res';
	}
	title[title.length] = 
		'<table width="100%" border="0" class="'+csslabel+'cont">' +
		'<tr><td nowrap>' +
			'<div class="'+csslabel+'title">' + this.splitString(this.data.replyList.title, TITLE_LENGTH) + '</div>'+
		'</td></tr>' +
		'<td nowrap ><div class="'+csslabel+'author">' +
			this.splitString(this.data.replyList.author, AUTHOR_LENGTH);

	if ( this.data.replyList.em != "" ) {
		title[title.length] = '<a href="mailto:' + this.data.replyList.em + '" target="new">';
		title[title.length] = '<img src="http://i.yimg.jp/images/geo/bbs/user/bbs_mail.gif" alt="メール" border="0" width="15" height="12"></a>';
	}
	if ( this.data.replyList.url != "" ) {
		title[title.length] = '<a href="' + this.data.replyList.url + '" target="new">';
		title[title.length] = '<img src="http://i.yimg.jp/images/geo/bbs/user/bbs_hp.gif" alt="ホームページ" border="0" width="15" height="12"></a>';
	}
	
	title[title.length] = '</div></td></tr>';
	title[title.length] = '<tr><td>';
	
    title[title.length] = 
		'<div class="'+csslabel+'msg">' + 
		'<p>' + this.data.replyList.body.replace(/\n/g, "<br>").replace(/\r/g, "") + '</p></div>' ;

	title[title.length] = '</td></tr>';
	title[title.length] = '<tr><td align=right><div class="right">' + this.data.replyList.timestamp ;
	
	if( depth <= 0){
		title[title.length] = '<br/><a href="javascript:openCommentWindow(' + this.data.id + ')"><img src="http://i.yimg.jp/images/geo/bbs/user/bbs_reply.gif" alt="返信する" border="0">*res*</a>' ;
	}
	
	title[title.length] = '</div></td></table>\n';

	return title.join('');
}

// create page send HTML
YAHOO.widget.BBSNode.genPageSend = function( data ) {
	var body = new Array();

	var back_offset = eval(data.offset) - VIEW_NUM;
	if (data.offset > 0 ) {
		body[body.length] = '<b><a href="index.html?o=' + back_offset + '&n=' + VIEW_NUM + '">前へ</a></b>';
		body[body.length] = '<a href="index.html?o=' + back_offset + '&n=' + VIEW_NUM + '"><img src="http://i.yimg.jp/images/geo/bbs/user/ar_back.gif" width="6" height="11" border=0 alt="前へ"></a>&nbsp;';

	} else {
		body[body.length] = '<b>前へ</b>';
		body[body.length] = '<img src="http://i.yimg.jp/images/geo/bbs/user/ar_back.gif" width="6" height="11" border=0 alt="前へ">&nbsp;';
	}

	var all = eval(data.count);
	for ( var i = 0; i < all; i += VIEW_NUM ) {
		var number = (i / VIEW_NUM) + 1;
		if( i == data.offset ) {
			body[body.length] = '<b>' + number + '</b>' + '&nbsp;';
		} else {
			body[body.length] = '<a href="index.html?o=' + i + '&n=' + VIEW_NUM + '">' + number + '</a>&nbsp;';
		}
	}

	var next_offset = eval(data.offset) + VIEW_NUM;	if(eval(data.offset) + VIEW_NUM < data.count) {
		body[body.length] = '<a href="index.html?o=' + next_offset + '&n=' + VIEW_NUM + '"><img src="http://i.yimg.jp/images/geo/bbs/user/ar_next.gif" width="6" height="11" border=0 alt="次へ"></a>&nbsp;';
		body[body.length] = '<b><a href="index.html?o=' + next_offset + '&n=' + VIEW_NUM + '">次へ</a></b>';
	} else {
		body[body.length] = '<img src="http://i.yimg.jp/images/geo/bbs/user/ar_next.gif" width="6" height="11" border=0 alt="次へ">&nbsp;';
		body[body.length] = '<b>次へ</b>';
	}

	return body.join('');
}

// Overrides YAHOO.widget.TextNode
YAHOO.widget.BBSNode.prototype.getNodeHtml = function() { 
	var title = new Array();
	var	classlebel = '';
	var csslabel = 'main';
	
	if( this.depth >0){
		classlebel = '2';
		csslabel='res';
	}
	title[title.length] = 
		'<table width="100%" border="0" class="'+csslabel+'cont">' +
		'<tr><td nowrap>' +
			'<div class="'+csslabel+'title">' + this.splitString(this.data.replyList.title, TITLE_LENGTH) + '</div>'+
		'</td></tr>' ;
	
    title[title.length] = 
		'<tr><td><div class="'+csslabel+'msg">' + 
		'<p>' + this.data.replyList.body.replace(/\n/g, "<br>").replace(/\r/g, "") + '</p></div>' +
		'</td></tr>';
	
	title[title.length] = 
		'<tr><td nowrap ><div class="'+csslabel+'author">' +
			this.splitString(this.data.replyList.author, AUTHOR_LENGTH);

	if ( this.data.replyList.em != "" ) {
		title[title.length] = '<a href="mailto:' + this.data.replyList.em + '" target="new">';
		title[title.length] = '<img src="http://i.yimg.jp/images/geo/bbs/user/bbs_mail.gif" alt="メール" border="0" width="15" height="12"></a>';
	}
	if ( this.data.replyList.url != "" ) {
		title[title.length] = '<a href="' + this.data.replyList.url + '" target="new">';
		title[title.length] = '<img src="http://i.yimg.jp/images/geo/bbs/user/bbs_hp.gif" alt="ホームページ" border="0" width="15" height="12"></a>';
	}
	title[title.length] = '</div></td></tr>';
	
	title[title.length] = '<tr><td align=right><div class="'+csslabel+'date">' + this.data.replyList.timestamp ;
	
	if( this.depth <= 0){
		title[title.length] = '<br/><a href="javascript:openCommentWindow(' + this.data.id + ')"><img src="http://i.yimg.jp/images/geo/bbs/user/bbs_reply.gif" alt="返信する" border="0">*res*</a>' ;
	}
	title[title.length] = '</div></td></tr>';
	
	title[title.length] = '</table>\n';

	return title.join('');

};

// treeview object
var tree = null;

// comment id
var comment_id = null;

var xy = null;

// node comment toggle style
function htmlToggle( index ) {
	var id = "comment" + index;

	document.getElementById(id).style.display = '';
	tree.getNodeByIndex(index).data.style = '';
}

// comment window open
function openCommentWindow( no ) {
	closeCommentWindow();
	if (no == 0) {
		document.getElementById('handle').innerHTML = "<span>新規投稿</span>";
	} else {
		document.getElementById('handle').innerHTML = "<span>返信を投稿する</span>";
	}
	document.getElementById('formline').style.display = '';
	var width  = (YAHOO.util.Dom.getViewportWidth() - 427) / 2;
	var scrollTop  = document.body.scrollTop  || document.documentElement.scrollTop;
	var height = (YAHOO.util.Dom.getViewportHeight() - 400) / 2 + scrollTop;
	if (height < 0) {
		height = 0;
	}

	xy = [width, height];
	YAHOO.util.Dom.setXY('formline', xy);
	comment_id = no;
	document.newMessage.p_msgid.value = no;
	document.newMessage.postb.disabled = false;
	document.newMessage.cancelb.disabled = false;
	document.newMessage.title.focus();
}

// close comment window
function closeCommentWindow() {
	document.getElementById('formline').style.display = 'none';
	document.newMessage.p_msgid.value = '';
	var oForm = document.newMessage.elements;
	for ( var i = 1; i < oForm.length -2; i++ ) {
		oForm[i].value = '';
	}
}

// get word length
function getWordByte(str){
	count = 0;
	for (i = 0; i < str.length; i++) {
		n = escape(str.charAt(i));
		if (n.length < 4) {
			count++;
		} else {
			count += 2;
		}
	}
	return count;
}

// check double byte
function checkDoubleByte(str) {
	for (i = 0; i < str.length; i++) {
		n = escape(str.charAt(i));
		if (n.length >= 4) {
			return true;
		}
	}
	return false;
}

// post comment message
function postMessage() {
	var valList = new Array();
	valList[valList.length] = 'bbsname='+USER_NAME;
	var error = false;

	var oForm = document.newMessage.elements;
	for (var i = 1; i < oForm.length-2 && !error; i++) {
		valList[valList.length] = oForm[i].name + '=' + encodeURIComponent(oForm[i].value);

		if (oForm[i].name == 'title') {
			if (oForm[i].value == '') {
				alert('エラー : タイトルが未入力です。');
				error = true;
			} else if(getWordByte(oForm[i].value) > 255) {
				alert('エラー : タイトルが長すぎます。');
				error = true;
			}
		}

		if (oForm[i].name == 'author') {
			if (oForm[i].value == '') {
				alert('エラー : 名前が未入力です。');
				error = true;
			} else if(getWordByte(oForm[i].value) > 255) {
				alert('エラー : 名前が長すぎます。');
				error = true;
			}
		}

		if (oForm[i].name == 'body') {
			if (oForm[i].value == '') {
				alert('エラー : 本文が未入力です。');
				error = true;
			} else if(getWordByte(oForm[i].value) > 4000) {
				alert('エラー : 本文が長すぎます。');
				error = true;
			}
		}

		if (oForm[i].name == 'em' && oForm[i].value != '') {
			if (getWordByte(oForm[i].value) > 255) {
				alert('エラー : メールアドレスが長すぎます。');
				error = true;
			} else if(checkDoubleByte(oForm[i].value)) {
				alert('エラー : メールアドレスは半角で入力してください。');
				error = true;
			} else if(!oForm[i].value.match(/.+@.+\..+/)) {
				alert('エラー : メールアドレス形式が間違っています。');
				error = true;
			}
		}

		if (oForm[i].name == 'url' && oForm[i].value != '') {
			if (getWordByte(oForm[i].value) > 255) {
				alert('エラー : URLが長すぎます。');
				error = true;
			} else if(checkDoubleByte(oForm[i].value)) {
				alert('エラー : URLは半角で入力してください。');
				error = true;
			} else if(!oForm[i].value.match(/https?:\/\//)) {
				alert('エラー : URL形式が間違っています。');
				error = true;
			}
		}
	}

	var callback = {
		success: function(result) {
			var responseText = eval('(' + result.responseText + ')');

			// エラーチェック
			if ((typeof(responseText.rc) != 'number') || (responseText.rc != 0)) {
				alert(responseText.errmsg);
				document.newMessage.postb.disabled = false;
				document.newMessage.cancelb.disabled = false;
			}
			else {
				alert("メッセージの投稿が完了しました。");
				document.newMessage.postb.disabled = false;
				document.newMessage.cancelb.disabled = false;
				closeCommentWindow();
				treeInit();
			}
			return;
		},
		failure: function() { alert("サーバーとの通信中にエラーが発生しました。"); }
	}
	if(!error) {
		document.newMessage.postb.disabled = true;
		document.newMessage.cancelb.disabled = true;
		var cObj = YAHOO.util.Connect.asyncRequest('POST', APIURL_INSERT, callback, valList.join('&'));
	}
}

// ajax responce callback function
var buildTreeCallback = function(result) {
	var responseText = eval('(' + result.responseText + ')');

	// check responce error
	if ((typeof(responseText.rc) != 'number') || (responseText.rc != 0)) {
		alert(responseText.errmsg);
		return;
	}

	var pNode = result.argument;
	var replyList = (typeof(responseText.replyList) == 'object') ? responseText.replyList : [];

	for (var i = 0 in replyList) {

		// myObj object substance
		// label : title
		// id    : message id
		// html  : comment
		// children : reply comment num
		// style : comment style, none or ''(blank)
		var myObj = {
			replyList: replyList[i],
			id:       replyList[i].msgid,
			children: replyList[i].cnt,
			style:    ''
		}
		// create BBSNode for this tree
		var tmpNode = new YAHOO.widget.BBSNode(myObj, pNode, true);
	}
	// create page send html
	document.getElementById('ygbbspg1').innerHTML = YAHOO.widget.BBSNode.genPageSend(responseText);
	document.getElementById('ygbbspg2').innerHTML = YAHOO.widget.BBSNode.genPageSend(responseText);
	
	tree.draw();
}

// request API for get build tree data
function buildTree(node, onCompleteCallback) {
	// -- code to get your data, possibly using Connect --
	var callback = {
		success: buildTreeCallback,
		failure: function() { alert("サーバーとの通信中にエラーが発生しました。"); },
		argument: node
	}
	var argv = new Array();
	argv[argv.length] = '?bbsname='+USER_NAME;
	argv[argv.length] = 'msgid=' + node.data.id;

	var QS = new Array;
	if (location.search.length > 1) {
		var m_Array = location.search.substr(1).split("&"); 
		for (idx in m_Array) {
			var tmp = m_Array[idx].split("=");
			if(tmp[0] == 'o') {
				argv[argv.length] = 'o=' + tmp[1];
			}
		}
	}

	// send request
	var cObj = YAHOO.util.Connect.asyncRequest('GET', APIURL_SELECT + argv.join('&'), callback);

	// Be sure to notify the TreeView component when the data load is complete
	onCompleteCallback();
}

var move = function(e) {
	xy = [YAHOO.util.Event.getPageX(e), YAHOO.util.Event.getPageY(e)];
	if( comment_id != document.newMessage.p_msgid.value) { 
		YAHOO.util.Dom.setXY('formline', xy);
	}
}

// onload function
function treeInit() {
	tree = new YAHOO.widget.TreeView("contents");
	tree.setDynamicLoad(buildTree);

	//YAHOO.util.Event.addListener(document, 'click', move);

	dd = new ygDDOnTop("formline");
	dd.setHandleElId("handle");
	document.getElementById('formline').style.display = 'none';

	YAHOO.util.Event.addListener(document, 'click', move);

	var root = tree.getRoot();
	root.data = { id: '0' };
	buildTree(root, function(){});
}

