/*	##########################################################################
◇	ＪＳｌａｙｏｕｔ
	反復して表示するＨＴＭＬレイアウトを、JavaScriptの関数にして描くクラス
	補助JS関数群

	Nov-25.2005
	--------------------------------------------------------------------------
*/

function getcsv(str)
{
	var ary = new Array();
	var quo = new Boolean();
	var len = str.length;
	var sta = end = 0;
	var lst = false;
	for (n = 0; sta < len; ++n)
	{
		if (str.charAt(sta) == '"')
		{
			quo = true;
			end = ++sta;
			while (1)
			{
				end = str.indexOf('"', end);
				if (end > -1 && str.charAt(end +1) == '"')
				{
					end += 2;
				}
				else if (end == -1 || end == len -1)
				{
					lst = true;
					break;
				}
				else
				{
					break;
				}
			}
		}
		else
		{
			quo = false;
			end = str.indexOf(',', sta);
		}
		if (end == -1) { end = len; }
		ary[n] = str.substring(sta, end).replace('""', '&quot;');
		if (lst) { break; }
		sta = (quo)? str.indexOf(',', end) +1: end +1;
	}
	return ary;
}

function br2nl(str)
{
	return (''+str).replace(/<br[^>]*>/ig, "\n");
}

function strip_tags(str)
{
	return (''+str).replace(/<\/?[a-z][^\>]*>/ig, "\n");
}

function number_format(str, decimal)
{
	var frac = '';
	decimal = 1 * decimal;

	str = (''+str).replace(/[^0-9\.\-]/g, '');

	if (decimal)
	{
		var tmp = ''+Math.round(Math.pow(10, decimal) * str);
		str = 1 * tmp.substring(0, tmp.length -1 * decimal);
		frac = tmp.substring(tmp.length -1 * decimal, tmp.length);
	}
	else
	{
		str = Math.round(str);
	}

	if (isNaN(str) || str == "" || str == null) { str = "0"; }
	str = ''+str;
	while (str.match(/\d{4}(,|$)/)) { str = (''+str).replace(/(\d)(\d{3})(,|$)/, "$1,$2$3"); }
	return str+((frac != '')? '.'+frac: '');
}

function escape_slashes(str)
{
	return (''+str).replace(/\\/, "\\\\").replace(/'/, "\\'").replace(/"/, '&quot;');
}

function trim(str)
{
	return (''+str).replace(/^\s+/, '').replace(/\s+$/, '');
}


/*	==========================================================================
	エラーチェック
*/
function _track_errors(res)
{
	//	返す値
	var rtn = {"success":"", "error":"", "warning":"", "track_error":""};

	if (!!res)
	{
		var XML = res.responseXML.getElementsByTagName('message');
		if (XML.length > 0)
		{
			var XOBJ = MyXML(XML.item(0));
			if (XOBJ == null)
			{
				rtn["track_error"] = "エラーが発生しました。<?= __LINE__ ?>";
				return rtn;
			}
			else
			{
				if (XOBJ.ROW['success'] > 0)
				{
					str = "成功:\n";
					while (XOBJ1 = XOBJ.fetch())
					{
						if (XOBJ1.ROW['type'] == 'success')
						{
							str += "   " + XOBJ1.ROW['value'] + "   \n";
						}
					}
					rtn["success"] = str+"\n";
				}
				else if (XOBJ.ROW['error'] > 0)
				{
					var XOBJ = MyXML(XML.item(0));

					str = "エラー:\n";
					while (XOBJ1 = XOBJ.fetch())
					{
						if (XOBJ1.ROW['type'] == 'error')
						{
							str += "   " + XOBJ1.ROW['value'] + "   \n";
						}
					}
					rtn["error"] = str+"\n";
				}
				else if (XOBJ.ROW['warning'] > 0)
				{
					var XOBJ = MyXML(XML.item(0));

					str = "警告:\n";
					while (XOBJ1 = XOBJ.fetch())
					{
						if (XOBJ1.ROW['type'] == 'warning')
						{
							str += "   " + XOBJ1.ROW['value'] + "   \n";
						}
					}
					rtn["warning"] = str+"\n";
				}

				return rtn;
			}
		}
		else
		{
			return rtn;
		}
	}
	else
	{
		rtn["track_error"] = "エラーが発生しました。<?= __LINE__ ?>";
		return rtn;
	}
}


/*	==========================================================================
	プルダウン
	alt :	１行目の文字列

	OPTIONS :
		style		styleの指定
		js			onChangeの指定
		tabindex	tabindexの指定
		disabled	trueの場合disabled
		comparison
	
*/
function OBJselect(alt, name, values, sel, OPTIONS)
{
	var _ = '';

	if (name == '')
	{
		name = 'select';
	}

	var style = js = tabindex = disabled = comparison = false;
	for (ii in OPTIONS)
	{
		switch (ii)
		{
		case 'style':
			style = OPTIONS[ii];
			break;
		case 'js':
			js = OPTIONS[ii];
			break;
		case 'tabindex':
			tabindex = OPTIONS[ii];
			break;
		case 'disabled':
			disabled = OPTIONS[ii];
			break;
		case 'comparison':
			comparison = OPTIONS[ii];
			break;
		}
	}

	_ += '<select id="'+name+'" name="'+name+'"';
	if (!!style)	{ _ += ' style="'+style+'"'; }
	if (!!js)		{ _ += ' onChange="'+js+'"'; }
	if (!!tabindex)	{ _ += ' tabindex="'+tabindex+'"'; }
	if (!!disabled)	{ _ += ' disabled'; }
	_ += ">\n";
	if (!sel && alt)
	{
		_ += '<option value="" style="background-color:#ddd;">'+alt+"</option>\n";
	}

//	if (!!values.join)
	{
		for (n in values)
		{
			v = (comparison == 'value') ? values[n] : n;
			k = (v == sel) ? " selected" : "";
			_ += '<option value="'+v+'"'+k+'>'+values[n]+"</option>\n";
		}
	}

	_ += "</select>\n";

	return _;
}


/*
	var XML = MyXML(arguments[0], columnName1 {, columnName2 ...});
*/
function MyXML_lite()
{
	var obj = new Object;

	//	XML構造体
	obj.Node = arguments[0];

	//	XML構造体が正常かどうか
	obj.normal = (obj.Node != null);

	//	カラム名（２番目の引数以降すべてがカラム名）
	obj._CNAME = new Array;
	for (var ii = arguments.length; --ii > 0;)
	{
		obj._CNAME[arguments[ii]] =
			(obj.normal && obj.Node.getElementsByTagName(arguments[ii]).length > 0);
	}

	//	行数の取得
	obj.rows = (obj.normal)
	?	((arguments[1])? obj.Node.getElementsByTagName(arguments[1]).length :0)
	:	0
	;

	//	fetchした結果を収録する変数
	obj.ROW = new Array;

	//	現在取り扱っている fetchポインタ
	obj.pos = -1;

	//	関数群
	obj.fetch = function ()
	{
	//	結果の初期化
		this.ROW = new Array;

		if (++this.pos >= this.rows)
		{
			return false;
		}

		for (var cname in this._CNAME)
		{
			this.ROW[cname] = this.result(this.pos, cname);
		}

		return this.ROW;
	}

	obj.result = function (pos, cname)
	{
		if (pos < 0 || pos >= this.rows)
		{
			return null;
		}
		if (this.normal)
		{
			if (this.Node.getElementsByTagName(cname).length == 0)
			{
				return null;
			}

			var _tmp = this.Node.getElementsByTagName(cname)[pos];
			return (_tmp.firstChild != null)
			?	trim(_tmp.firstChild.nodeValue)
			:	''
			;
		}
		else
		{
			return '';
		}
	}

	obj.num_rows = function ()
	{
		return this.rows;
	}

	obj.data_seek = function (pos)
	{
	//	結果の初期化
		this.ROW = new Array;

		if (pos < 0 || pos >= this.rows)
		{
			return false;
		}
		this.pos = pos;

		for (var cname in this._CNAME)
		{
			this.ROW[cname] = this.result(this.pos, cname);
		}

		return true;
	}

	//	TagName serverside_error を探し、
	//	存在した場合はサーバサイド側のエラーがあったと判断する
	obj.serverside_error = (obj.normal && obj.Node.getElementsByTagName('serverside_error').length > 0);
	obj.error_message = (obj.serverside_error)? obj.Node.getElementsByTagName('serverside_error')[0].firstChild.nodeValue: '';
	obj.error = function ()
	{
		return this.error_message;
	}

	return obj;
}
/*
	var XML = MyXML(arguments[0]);
*/
function MyXML()
{
	if (arguments[0] == null)
	{
		return null;
	}

	var obj = new Object;

	//	XML構造体
	obj.Node = arguments[0];

	//	nodeNameへのショートカット
	obj.nodeName = obj.Node.nodeName;

	//	属性を入れた配列
	obj.ROW = new Array;
	if (obj.Node.attributes != null)
	{
		for (var ii = obj.Node.attributes.length; --ii >= 0;)
		{
			var Item = obj.Node.attributes.item(ii);
			obj.ROW[Item.nodeName] = Item.nodeValue;
		}
	}

	//	hasChildNodes()へのショートカット
	obj.hasChildNodes = function ()
	{
		return obj.Node.hasChildNodes();
	}

	//	行数の取得
	obj.rows = (obj.Node.hasChildNodes())? obj.Node.childNodes.length: 0;

	//	現在取り扱っている fetchポインタ
	obj.pos = -1;

	//	fetchした結果を収録するオブジェクト
	obj.responseObject = null;

/*	----------------------------------------------------------------------  */
	//	配下の node数を得る
	obj.num_rows = function ()
	{
		return this.rows;
	}

	//	次の nodeの属性を配列にして取得する(fetch_row)
	obj.fetch = function ()
	{
		if (++this.pos >= this.rows)
		{
			return false;
		}

	//	データ問い合わせ
		if (this.data_seek(this.pos) == false)
		{
			return false;
		}

		return this.responseObject;
	}

	//	指定した nodeに移動する
	obj.data_seek = function (pos)
	{
		if (pos < -1 || pos >= this.rows)
		{
			return false;
		}
		this.pos = pos;

	//	返信するオブジェクト
		this.responseObject = (pos == -1)
		?	null
		:	MyXML(this.Node.childNodes.item(this.pos))
		;

		return true;
	}

/*	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
	//	指定属性を持つnodeを取得する
	obj.result = function (atname, attext)
	{
		var flag = true;
		for (var pos = this.rows; --pos >= 0;)
		{
			var tmpobj = this.Node.childNodes.item(pos);
			if ((document.all || !!tmpobj.getAttributeNode) && !!tmpobj.getAttributeNode(atname) && tmpobj.getAttributeNode(atname).value == attext)
			{
				flag = false;
				break;
			}
		}
		if (flag)
		{
			return null;
		}

	//	オブジェクトを返信する
		return MyXML(this.Node.childNodes.item(pos));
	}

/*	- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
	//	TagName serverside_error を探し、
	//	存在した場合はサーバサイド側のエラーがあったと判断する
	var tmpobj = obj.Node;
	obj.serverside_error = ((document.all || tmpobj.getElementsByTagName) && tmpobj.getElementsByTagName('serverside_error').length > 0);
	obj.error_message = (obj.serverside_error)? obj.Node.getElementsByTagName('serverside_error')[0].firstChild.nodeValue: '';
	obj.error = function ()
	{
		return this.error_message;
	}

	return obj;
}

