/** *********************************************************************
 * ix Based Javascript Libraries.
 * **********************************************************************
 * @filename ix.js
 * @author (c) norihikoikeda.
 * @encode UTF-8
 * @last modifierd 2009/01/07
 ************************************************************************
 * usage:
 * js file.
 * begin line "/// <reference path="path/to/ix.js"/>" write tag,
 * support for Visual Studio Intellisence.
 *
 * html file.
 * "<script type="text/javascript" src="path/to/ix.js"></script>" write tag,
 * in header tag section.
 ********************************************************************** */

///////////////////////////////////////////////////////////////////////////
// null
///////////////////////////////////////////////////////////////////////////
function ixIsNull(value) {
	/// <summary>値が空かどうかを調べます。</summary>
	/// <param name="value" type="Object">調べる値。</param>
	/// <return type="bool">
	/// 空の場合は true。それ以外は false。
	/// value が Object, Boolean型などは falseを返します。
	/// 長さが 0 個の配列は空と認識し、true を返します。
	/// </return>
	if (value == undefined || value == null || value == "NaN" || value == "") return true;
	var t = typeof (value);
	if (t == "number" || t == "function" || t == "boolean") return false;
	if (t == "object") {
		if (ixIsArray(value)) {
			var l = value.length;
			if (l == "NaN" || l <= 0) return true;
		}
		return false;
	}
	return false;
}
 
///////////////////////////////////////////////////////////////////////////
// event
///////////////////////////////////////////////////////////////////////////
function ixAddEvent(target, eventType, listener) {
	/// <summary>指定されたオブジェクトにイベントリスナーを追加します。</summary>
	/// <param name="target" type="Object">イベントを追加する対象。</param>
	/// <param name="eventType" type="string">イベントの種類。(click, mouseover 等)</param>
	/// <param name="listener" type="function">呼び出される関数。</param>
	if(target.addEventListener)
		target.addEventListener(eventType, listener, false);
    else if(target.attachEvent)
		target.attachEvent("on" + eventType, listener);
    else
		target["on" + eventType] = listener;
}
function ixRemoveEvent(target, eventType, listener) {
	/// <summary>指定されたオブジェクトのイベントを削除します。</summary>
	/// <param name="target" type="Object">イベントを削除する対象。</param>
	/// <param name="eventType" type="string">イベントの種類。(click, mouseover 等)</param>
	/// <param name="listener">削除する関数。</param>
	if(target.removeEventListener)
		target.removeEventListener(eventType, listener, false);
	else if(target.detachEvent)
		target.detachEvent("on" + eventType, listener);
	else
		delete target["on" + eventType];
}

///////////////////////////////////////////////////////////////////////////
// ajax
///////////////////////////////////////////////////////////////////////////
function ixXmlHttpRequest() {
	/// <summary>非同期通信に必要なXmlHttpRequestオブジェクトを取得します。</summary>
	/// <return type="XmlHttpRequest">XmlHttpRequestオブジェクト。</return>
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		var progIDs = [
			"Msxml2.ServerXMLHTTP.6.0",
			"Msxml2.ServerXMLHTTP.5.0",
			"Msxml2.ServerXMLHTTP.4.0",
			"Msxml2.ServerXMLHTTP.3.0",
			"Msxml2.ServerXMLHTTP",
			"Microsoft.ServerXMLHTTP",
			"Msxml2.XMLHTTP.6.0",
			"Msxml2.XMLHTTP.5.0",
			"Msxml2.XMLHTTP.4.0",
			"Msxml2.XMLHTTP.3.0",
			"Msxml2.XMLHTTP",
			"Microsoft.XMLHTTP"];
		for (var i = 0; i < progIDs.length; ++i) {
			try {
				return new ActiveXObject(progIDs[i]);
			} catch (e) {
				if (i == progIDs.length - 1) throw e;
			}
		}
	} else {
		return undefined;
	}
}
function ixAjaxRequest(url, successfulCallback, failedCallback, args, async, method, data, username, password) {
	/// <summary>非同期通信でデータを送信します。</summary>
	/// <param name="url" type="string">送信URL。</param>
	/// <param name="successfulCallback" type="function">成功した場合のコールバック関数。</param>
	/// <param name="failedCallback" type="function">失敗した場合のコールバック関数。(不必要な場合はnull。デフォルトnull)</param>
	/// <param name="args" type="Array">コールバック関数に渡す追加引数。(デフォルト null)</param>
	/// <param name="async" type="bool">非同期通信の場合は true。同期通信の場合は false。(デフォルト true)</param>
	/// <param name="method" type="string">通信メソッド。(GET, POST等。デフォルト"GET")</param>
	/// <param name="data" type="string">送信データ。(デフォルト null)</param>
	/// <param name="username" type="string">ログインに必要なユーザー名。(デフォルト 空文字)</param>
	/// <param name="password" type="string">ログインに必要なパスワード。(デフォルト 空文字)</param>
	url = encodeURI(url);
	if (ixIsNull(failedCallback)) failedCallback = null;
	if (ixIsNull(async)) async = true;
	if (ixIsNull(method)) method = "GET";
	if (ixIsNull(data)) data = null;
	else data = encodeURI(data);
	if (ixIsNull(username)) username = "";
	if (ixIsNull(password)) password = "";

	var ajax = ixXmlHttpRequest();
	if (ajax == undefined) {
		if (!ixIsNull(failedCallback)) failedCallback(ajax);
		return;
	}
	ajax.onreadystatechange = function() {
		if (ajax.readyState == 4) {
			var arg = new Array(ajax);
			if (!ixIsNull(args)) arg = arg.concat(args);
			if (ajax.status == 200) successfulCallback.apply(this, arg);
			else if (!ixIsNull(failedCallback)) failedCallback.apply(this, arg);
		}
	};
	ajax.open(method, url, async, username, password);
	if (method.toLowerCase() == "post")
		ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
	ajax.send(data);
}

///////////////////////////////////////////////////////////////////////////
// math
///////////////////////////////////////////////////////////////////////////
function ixIsNumber(value) {
	/// <summary>値が数値かどうか調べます。</summary>
	/// <param name="value" type="Object">調べる値。</param>
	/// <return type="bool">数値の場合は true。</return>
	return (+value == value);
}
function ixMathRundomInt(value1, value2) {
	/// <summary>整数値でランダムな値を取得します。</summary>
	/// <param name="value1" type="int">開始値。</param>
	/// <param name="value1" type="int">終了値。</param>
	/// <return type="bool">ランダムな整数値。</return>
	if (!ixIsNumber(value1)) value1 = 0;
	if (!ixIsNumber(value2)) value2 = 1;
	var max = Math.max(value1, value2);
	var min = Math.min(value1, value2);
	return Math.floor(Math.random() * (max - min + 1)) + min;
}
function ixMathShuffle(values, num) {
	/// <summary>配列をシャッフルします。また、重複しない数を取得する場合にも利用できます。</summary>
	/// <param name="values" type="Array">シャッフルする配列。</param>
	/// <param name="num" type="int">取得する個数。</param>
	/// <return type="Array">ランダムな数値を含んだ配列。</return>
	var a = values;
	var t = {};
	var r = [];
	var l = a.length;
	var n = num < l ? num : l;
	while (n-- > 0) {
		var i = Math.random() * l | 0;
		r[n] = t[i] || a[i];
		--l;
		t[i] = t[l] || a[l];
	}
	return r;
}

///////////////////////////////////////////////////////////////////////////
// string
///////////////////////////////////////////////////////////////////////////
function ixIsString(value) {
	/// <summary>文字列かどうか調べます。</summary>
	/// <param name="value" type="String"> 検索する値。</param>
	/// <return type="bool">文字列の場合は true。</return>
	return (typeof(value) == "string" || value instanceof String);
}
function ixTrim(value) {
	/// <summary>文字列の前、または、後ろの空文字をすべて削除します。</summary>
	/// <param name="value" type="String"> 検索する文字列。</param>
	/// <return type="String">前、または、後ろの空文字をすべて削除した文字列。</return>
	return value.replace(/^[\s\t\n\v\f\r]+|[\s\t\n\v\f\r]+$/g, "");
}
function ixTrimLeft(value) {
	/// <summary>文字列の前の空文字をすべて削除します。</summary>
	/// <param name="value" type="String"> 検索する文字列。</param>
	/// <return type="String">前の空文字をすべて削除した文字列。</return>
	return value.replace(/^[\s\t\n\v\f\r]+/g, "");
}
function ixTrimRight(value) {
	/// <summary>文字列の後ろの空文字をすべて削除します。</summary>
	/// <param name="value" type="String"> 検索する文字列。</param>
	/// <return type="String">後ろの空文字をすべて削除した文字列。</return>
	return value.replace(/[\s\s\t\n\v\f\r]+$/g, "");
}
function ixTrimWchar(value) {
	/// <summary>文字列の前、または、後ろの全角半角空文字をすべて削除します。</summary>
	/// <param name="value" type="String"> 検索する文字列。</param>
	/// <return type="String">前、または、後ろの空文字をすべて削除した文字列。</return>
	return value.replace(/^[\s\t\n\v\f\r　]+|[\s\t\n\v\f\r　]+$/g, "");
}
function ixTrimLeftWchar(value) {
	/// <summary>文字列の前の全角半角空文字をすべて削除します。</summary>
	/// <param name="value" type="String"> 検索する文字列。</param>
	/// <return type="String">前、または、後ろの空文字をすべて削除した文字列。</return>
	return value.replace(/^[\s\t\n\v\f\r　]+/g, "");
}
function ixTrimRightWchar(value) {
	/// <summary>文字列の後ろの全角半角空文字をすべて削除します。</summary>
	/// <param name="value" type="String"> 検索する文字列。</param>
	/// <return type="String">前、または、後ろの空文字をすべて削除した文字列。</return>
	return value.replace(/[\s\s\t\n\v\f\r　]+$/g, "");
}

///////////////////////////////////////////////////////////////////////////
// array
///////////////////////////////////////////////////////////////////////////
function ixIsArray(value) {
	/// <summary>配列かどうかを調べます。</summary>
	/// <param name="value" type="Array">調べる値。</param>
	/// <return type="String">配列の場合は true。それ以外は false。</return>
	return (value instanceof Array);
}

///////////////////////////////////////////////////////////////////////////
// datetime
///////////////////////////////////////////////////////////////////////////
function ixDate1000msecMultiplication(unixtime) {
	/// <summary>Unix時間に1000ミリ秒を乗算します。PHP等のUnix時間が異なる値に使用します。</summary>
	/// <param name="unixtime" type="int">Unix時間。</param>
	/// <return type="Date">Date オブジェクト。</return>
	return new Date(unixtime * 1000);
}
function ixDate1000msecDivision(date) {
	/// <summary>時間から1000ミリ秒を除算します。PHP等のUnix時間が異なる値に使用します。</summary>
	/// <param name="date" type="Date">Date オブジェクト。</param>
	/// <return type="int">Unix時間。</return>
	return date.getTime() / 1000;
}
function ixDateAdd(date, addYear, addMonth, addDay, addHour, addMinute, addSecond, addMillisecond) {
	/// <summary>日付や時間を追加します。</summary>
	/// <param name="date" type="Date">Dateオブジェクト</param>
	/// <return type="Date">Dateオブジェクト。</return>
	var a = new Array[addYear, addMonth, addDay, addHour, addMinute, addSecond, addMillisecond];
	for (var i = 0; i < a.length; i++) {
		if (+a[i] != a[i]) a[i] = 0;
	}
	date.setFullYear(date.getFullYear() + a[0]);
	date.setMonth(date.getMonth() + a[1]);
	date.setDay(date.getDay() + a[2]);
	date.setHours(date.getHours() + a[3]);
	date.setMinutes(date.getMinutes() + a[4]);
	date.setSeconds(date.getSeconds() + a[5]);
	date.setMilliseconds(date.getMilliseconds() + a[6]);
	return date;
}
function ixDateAddYear(date, addYear) {
	/// <summary>年数を追加します。</summary>
	/// <param name="date" type="Date">Dateオブジェクト</param>
	/// <param name="addYear" type="int">加算する年</param>
	/// <return type="Date">Dateオブジェクト。</return>
	return ixDateAdd(date, addYear, 0, 0, 0, 0, 0, 0);
}
function ixDateAddMonth(date, addMonth) {
	/// <summary>月数を追加します。</summary>
	/// <param name="date" type="Date">Dateオブジェクト</param>
	/// <param name="addMonth" type="int">加算する月</param>
	/// <return type="Date">Dateオブジェクト。</return>
	return ixDateAdd(date, 0, addMonth, 0, 0, 0, 0, 0);
}
function ixDateAddDay(date, addDay) {
	/// <summary>日数を追加します。</summary>
	/// <param name="date" type="Date">Dateオブジェクト</param>
	/// <param name="addDay" type="int">加算する日</param>
	/// <return type="Date">Dateオブジェクト。</return>
	return ixDateAdd(date, 0, 0, addDay, 0, 0, 0, 0);
}
function ixDateAddHour(date, addHour) {
	/// <summary>時間数を追加します。</summary>
	/// <param name="date" type="Date">Dateオブジェクト</param>
	/// <param name="addHour" type="int">加算する時間</param>
	/// <return type="Date">Dateオブジェクト。</return>
	return ixDateAdd(date, 0, 0, 0, addHour, 0, 0, 0);
}
function ixDateAddMinute(date, addMinute) {
	/// <summary>分数を追加します。</summary>
	/// <param name="date" type="Date">Dateオブジェクト</param>
	/// <param name="addMinute" type="int">加算する分</param>
	/// <return type="Date">Dateオブジェクト。</return>
	return ixDateAdd(date, 0, 0, 0, 0, addMinute, 0, 0);
}
function ixDateAddSecond(date, addSecond) {
	/// <summary>秒数を追加します。</summary>
	/// <param name="date" type="Date">Dateオブジェクト</param>
	/// <param name="addSecond" type="int">加算する秒</param>
	/// <return type="Date">Dateオブジェクト。</return>
	return ixDateAdd(date, 0, 0, 0, 0, 0, addSecond, 0);
}
function ixDateAddMillisecond(date, addMillisecond) {
	/// <summary>ミリ秒数を追加します。</summary>
	/// <param name="date" type="Date">Dateオブジェクト</param>
	/// <param name="addMillisecond" type="int">加算するミリ秒</param>
	/// <return type="Date">Dateオブジェクト。</return>
	return ixDateAdd(date, 0, 0, 0, 0, 0, 0, addMillisecond);
}
function ixDateIsLeapYear(year) {
	/// <summary>うるう年かどうかを調べます。</summary>
	/// <param name="year" type="int">年。</param>
	/// <return type="bool">うるう年の場合は true。</return>
	var ret = false;
	if ((year % 4) != 0) return ret;
	if ((year % 100) == 0)
		if ((year % 400) == 0) ret = true;
	else
		ret = true;
	return ret;
}
function ixDateMonthLastDay(year, month) {
	/// <summary>その月の最後の日を取得します。</summary>
	/// <param name="year" type="int">調べる年。</param>
	/// <param name="month" type="int">調べる月。</param>
	/// <return type="Date">指定された年月の最後の日。</return>
	var ret = 31;
	if (month == 2) {
		if (ixDateIsLeapYear(year)) ret = 29;
		else ret = 28;
	} else if (month == 4 || month == 6 || month == 9 || month == 11) {
		ret = 30;
	}
	return ret;
}

///////////////////////////////////////////////////////////////////////////
// request
///////////////////////////////////////////////////////////////////////////
function ixRequestCreateQueryString(hash, isAddNull) {
	/// <summary>ハッシュ配列からクエリー文字列を作成します。</summary>
	/// <param name="hash" type="array">クエリー文字を含んだ配列。</param>
	/// <param name="isAddNull" type="bool">値が空であってもクエリー文字に追加する場合は true。(デフォルト treu)</param>
	/// <return type="string">クエリー文字列。</return>
	if (ixIsNull(isAddNull)) isAddNull = true;
	var ret = "";
	for (var key in hash) {
		if(!ixIsNull(hash[key]) && !isAddNull)
			ret += key + "=" + val + "&";
	}
	return ret.substring(0, ret.length - 1);
}
function ixRequestProtocolName() {
	/// <summary>リクエストされたプロトコル名を取得します。</summary>
	/// <return type="string">小文字のプロトコル名。</return>
	var ret = window.location.protocol;
	ret = ret.toLowerCase();
	return ret.substring(0, ret.length - 1);
}
function ixRequestProtocolHost() {
	/// <summary>リクエストされたプロトコル名とホスト名を合わせた文字を取得します。</summary>
	/// <return type="string">リクエストされたプロトコル名とホスト名を合わせた文字。</return>
	return location.protocol + "//" + location.host;
}
function ixRequestFilename() {
	/// <summary>リクエストされたファイル名を取得します。</summary>
	/// <return type="string">リクエストされたファイル名。</return>
	var ret = location.pathname.split("/");
	return ret[ret.length - 1];
}
function ixRequestQueryString() {
	/// <summary>クエリー文字列を取得します。</summary>
	/// <return type="array">クエリー文字列のキーと値を含んだ連想配列。</return>
	var qy = location.search;
	var ret = new Array();
	if(qy == "undefined" || qy == "") return ret;
	var q = qy.substring(1, qy.length);
	var qs = q.split("&");
	for(var i in qs) {
		var params = qs[i];
		var param = params.split("=");
		ret[param[0]] = param[1];
	}
	return ret;
}
function ixRequestQueryParameter(key) {
	/// <summary>クエリーキーからクエリ文字列を取得します。</summary>
	/// <param name="key" type="string">クエリーキー文字列。</param>
	/// <return type="string">クエリーキーに合致したクエリー文字。</return>
	var ps = ixRequestQueryString();
	var ret = ps[key];
	return (ixIsNull(ret)) ? "" : ret;
}

///////////////////////////////////////////////////////////////////////////
// validation
///////////////////////////////////////////////////////////////////////////
function ixValidationRequire(value, hasNullString) {
	/// <summary>値が存在するかどうかを調べます。</summary>
	/// <param name="value" type="Object">調べる値。</param>
	/// <param name="hasNullString" type="string">検索に空文字を含める場合は true。(デフォルト true)</param>
	/// <return type="bool">値が存在する場合は true。</return>
	if (ixIsNull(hasNullString)) hasNullString = true;
	if (value == undefined || value == null || value == "NaN") return false;
	else if (hasNullString && value == "") return false;
	return true;
}
function ixValidationRegex(value, regex) {
	/// <summary>指定された正規表現にマッチするか調べます。</summary>
	/// <param name="value" type="Object">調べる値。</param>
	/// <param name="regex" type="Regex">Regexオブジェクト。(/regex/i などの matchと同様の指定も可能)</param>
	/// <return type="bool">マッチした場合は true。</return>
	if(value.match(regex) != null) return true;
	else return false;
}
function ixValidationCompare(value1, value2, operator) {
	/// <summary>値が存在するかどうかを調べます。</summary>
	/// <param name="value1" type="Object">比較元の値。</param>
	/// <param name="value2" type="Object">比較する値。</param>
	/// <param name="operator" type="string">比較方法[=, !, >, <, >=, <=]</param>
	/// <return type="bool">正しい場合は true。</return>
	switch(operator) {
	case "=":
		if(value1 == value2) return true;
		else return false;
	case "!":
		if(value1 != value2) return true;
		else return false;
	case ">":
		if(value1 > value2) return true;
		else return false;
	case "<":
		if(value1 < value2) return true;
		else return false;
	case ">=":
		if(value1 >= value2) return true;
		else return false;
	case "<=":
		if(value1 <= value2) return true;
		else return false;
	default:
		return false;
	}
}

///////////////////////////////////////////////////////////////////////////
// element
///////////////////////////////////////////////////////////////////////////
function ixElm(element) {
	/// <summary>
	/// エレメント、または、ID からエレメントを取得します。
	/// 引数などの指定にエレメント、または、ID のどちらでも取得したい場合に利用できます。
	/// </summary>
	/// <param name="id" type="string">エレメント、または、ID 名。</param>
	/// <return type="Object">合致したエレメント。(合致しない場合は undefined)</return>
	if (ixIsNull(element)) return undefined;
	if (ixIsString(element)) return ixElmId(element);
	return element;
}
function ixElmId(id) {
	/// <summary>ID からエレメントを取得します。</summary>
	/// <param name="id" type="string">ID 名。</param>
	/// <return type="Object">ID の合致したエレメント。(合致しない場合は undefined)</return>
	if (document.getElementById) return document.getElementById(id);
	else if (document.all) return document.all(id);
	else if (document.layers) return document.layers[id];
	return undefined;
}

///////////////////////////////////////////////////////////////////////////
// style
///////////////////////////////////////////////////////////////////////////
function ixStyleCreate(params) {
	/// <summary>スタイルを作成します。</summary>
	/// <param name="base" type="string">スタイル属性と値を含んだハッシュ配列。</param>
	/// <return type="string">作成されたスタイル。</return>
	if (ixIsNull(params)) return "";
	var ret = "";
	for (var key in params)
		ret += key + ":" + params[key] + ";";
	return ret;
}
function ixStyleConcat(base, add) {
	/// <summary>スタイルを結合します。</summary>
	/// <param name="base" type="string">結合元のスタイル。</param>
	/// <param name="add" type="string">結合するスタイル。</param>
	/// <return type="string">結合されたスタイル。</return>
	base = ixTrim(base);
	if (ixIsNull(base)) return add;
	var suffix = "";
	if (base.substr(base.length - 1, 1) != ";") suffix = ";";
	return base + suffix + add;
}

///////////////////////////////////////////////////////////////////////////
// create tag
///////////////////////////////////////////////////////////////////////////
function ixCreateTag(tagName, id, cls, content, styles, params, addReturn, isCloseXhtml) {
	/// <summary>タグを作成します。</summary>
	/// <param name="tagName" type="string">タグ名。</param>
	/// <param name="id" type="string">ID。(デフォルト空文字)</param>
	/// <param name="cls" type="string">CSSクラス名。(デフォルト空文字)</param>
	/// <param name="content" type="string">表示する内容。(デフォルト空文字)</param>
	/// <param name="styles" type="array">スタイル属性と値を含んだハッシュ配列。(デフォルト undefined)</param>
	/// <param name="params" type="array">属性と値を含んだハッシュ配列。(デフォルト undefined)</param>
	/// <param name="addReturn" type="bool">タグの末尾に改行を追加する場合は true。(デフォルト true)</param>
	/// <param name="isCloseXhtml" type="bool">タグの末尾をXHTML形式で閉じる場合は true。(デフォルト false)</param>
	/// <return type="string">作成されたタグ。</return>
	if (ixIsNull(tagName)) return "";
	if (ixIsNull(content)) content = "";
	if (addReturn == undefined || addReturn == null || addReturn == true) addReturn = "\n";
	else addReturn = "";
	if (ixIsNull(isCloseXhtml)) isCloseXhtml = false;

	var param = "";
	if (!ixIsNull(id)) param += " id=\"" + id + "\"";
	if (!ixIsNull(cls)) param += " class=\"" + cls + "\"";
	if (!ixIsNull(params))
		for(var key in params)
			param += " " + key + "=\"" + params[key] + "\"";
	if (!ixIsNull(styles)) {
		var style = ixStyleCreate(styles);
		if (!ixIsNull(style)) param += " style=\"" + style + "\"";
	}
	var tag = "<" + tagName + param;
	if(isCloseXhtml)
		return tag + " />" + addReturn;
	return tag + ">" + addReturn + content + "</" + tagName + ">" + addReturn;
}

///////////////////////////////////////////////////////////////////////////
// input value
///////////////////////////////////////////////////////////////////////////
function ixInputValue(elm) {
	/// <summary>
	/// エレメント、または、ID からテキストの値を取得します。
	/// このメソッドは、textarea、radio 等の value 値も取得できます。
	/// </summary>
	/// <param name="elm" type="Object">エレメント、または、ID。</param>
	/// <return type="string">入力されたテキスト文字列。</return>
	if (ixIsString(elm)) elm = ixElmId(elm);
	if (ixIsNull(elm)) return "";
	return elm.value;
}
function ixInputChecked(elm) {
	/// <summary>エレメントがチェックされているか調べます。</summary>
	/// <param name="elm" type="Object">エレメント、または、ID。</param>
	/// <return type="bool">チェックされている場合は true。(エレメントが取得できない場合は null)</return>
	if (ixIsString(elm)) elm = ixElmId(elm);
	if (ixIsNull(elm)) return null;
	return elm.checked;
}
function ixInputCheckedValue(elm) {
	/// <summary>チェックされているエレメントの値を取得します。</summary>
	/// <param name="elm" type="Object">エレメント、または、ID。</param>
	/// <return type="bool">チェックされているエレメントの値。(チェックされていない場合は空文字)</return>
	if (!ixIsNull(ixInputChecked(elm))) return ixInputValue(elm);
	else return "";
}
function ixInputRadiosChecked(name) {
	/// <summary>チェックされているラジオボタングループのエレメントを取得します。</summary>
	/// <param name="elm" type="string">name 属性に設定した名前。</param>
	/// <return type="bool">チェックされているラジオボタンのエレメント。(すべてチェックされていない場合は undefined)</return>
	var radios = document.getElementsByName(name);
	for (var i = 0; i < radios.length; i++)
		if (radios[i].checked) return radios[i];
	return undefined;
}
function ixInputRadiosValue(name) {
	/// <summary>チェックされているラジオボタングループの値を取得します。</summary>
	/// <param name="elm" type="string">name 属性に設定した名前。</param>
	/// <return type="bool">チェックされているラジオボタンの値。(すべてチェックされていない場合は空文字)</return>
	var radios = document.getElementsByName(name);
	for (var i = 0; i < radios.length; i++)
		if (radios[i].checked) return radios[i].value;
	return "";
}
function ixInputSelected(elm) {
	/// <summary>選択されている項目番号を取得します。</summary>
	/// <param name="elm" type="Object">エレメント、または、ID。</param>
	/// <return type="array">選択されている項目番号を含んだ配列。(エレメントが取得できない場合は undefined)</return>
	if (ixIsString(elm)) elm = ixElmId(elm);
	if (ixIsNull(elm)) return undefined;
	var ret = new Array(0);
	for (var i = 0; i < elm.options.length; i++) {
		if (elm.options[i].selected) ret.push(i);
	}
	return ret;
}
function ixInputSelectedValue(elm) {
	/// <summary>選択されている値を取得します。</summary>
	/// <param name="elm" type="Object">エレメント、または、ID。</param>
	/// <return type="array">選択されている項目番号を含んだ配列。(エレメントが取得できない場合は undefined)</return>
	if (ixIsString(elm)) elm = ixElmId(elm);
	if (ixIsNull(elm)) return undefined;
	var ret = new Array(0);
	for (var i = 0; i < elm.options.length; i++) {
		if (elm.options[i].selected) ret.push(elm.options[i].value);
	}
	return ret;
}
function ixInputCreateDropdownList(id, name, hash, selectedKey, changeEvent) {
	/// <summary>ドロップダウンリストタグを作成します。</summary>
	/// <param name="id" type="string">ID。(デフォルト空文字)</param>
	/// <param name="name" type="string">名前。(デフォルト空文字)</param>
	/// <param name="hash" type="array">ドロップダウンリスト一覧に表示するハッシュ配列。[key:valueに入る値, value:表示値]</param>
	/// <param name="selectedKey" type="int">初期状態で選択するインデックス番号。(デフォルト -1)</param>
	/// <param name="changeEvent" type="string">チェンジイベントに登録するイベントハンドラ名。(デフォルト空文字)</param>
	/// <return type="string">作成されたドロップダウンリストタグのHTML文字列。</return>
	if (!ixIsNull(id)) id = " id='" + id + "'";
	else id = "";
	if (!ixIsNull(name)) name = " name='" + name + "'";
	else name = "";
	if (!ixIsNull(changeEvent)) changeEvent = " onchange='" + changeEvent + "'";
	else changeEvent = "";

	var h = "<select" + id + name + changeEvent + ">\n";
	for (var i = 0; i < hash.length; i++) {
		var s = "";
		if (i == selectedKey) s = " selected='selected'";
		h += "<option value='" + key + "'" + s + ">" + hash[key] + "</option>\n";
	}
	h += "</select>\n";
	return h;
}

///////////////////////////////////////////////////////////////////////////
// dynamic html
///////////////////////////////////////////////////////////////////////////
function ixToggleBlock(elm) {
	/// <summary>表示、非表示をトグル表示します。</summary>
	/// <param name="elm" type="object">エレメント、または、ID。</param>
	elm = ixElm(elm);
	if (ixIsNull(elm)) return;
	if (ixIsNull(elm.style.display) || elm.style.display == "block")
		elm.style.display = "none";
	else
		elm.style.display = "block";
}
function ixToggleBlockText(targetElement, textElement, noneText, blockText) {
	/// <summary>表示、非表示をトグル表示し、表示状態を示す文字列を変更します。</summary>
	/// <param name="targetElement" type="object">表示、非表示をトグルするエレメント、または、ID。</param>
	/// <param name="textElement" type="object">表示状態を示す文字列エレメント、または、ID。</param>
	/// <param name="changingText" type="object">非表示状態のテキスト、または、HTML。</param>
	/// <param name="changedText" type="object">表示状態のテキスト、または、HTML。</param>
	targetElement = ixElm(targetElement);
	if (ixIsNull(targetElement)) return;
	textElement = ixElm(textElement);
	if (ixIsNull(targetElement.style.display) || targetElement.style.display == "block") {
		targetElement.style.display = "none";
		if (ixIsNull(textElement)) return;
		textElement.innerHTML = noneText;
	} else {
		targetElement.style.display = "block";
		if (ixIsNull(textElement)) return;
		textElement.innerHTML = blockText;
	}
}
function ixClientSize() {
	/// <summary>現在のウインドのクライアントサイズを取得します。</summary>
	/// <return type="array">ウインドのクライアントサイズ。[w:width, h:height]</return>
	var ret = new Array(2);
	ret["w"] = 0;
	ret["h"] = 0;
	if(self.innerHeight) { // all except Explorer
		ret["w"] = self.innerWidth;
		ret["h"] = self.innerHeight;
	} // Explorer 6 Strict Mode
	else if(document.documentElement && document.documentElement.clientHeight) {
		ret["w"] = document.documentElement.clientWidth;
		ret["h"] = document.documentElement.clientHeight;
	} // other Explorers
	else if(document.body) {
		ret["w"] = document.body.clientWidth;
		ret["h"] = document.body.clientHeight;
	}
	return ret;
}
function ixScrollPosition() {
	/// <summary>現在のウインドのスクロール値を取得します。</summary>
	/// <return type="array">ウインドのスクロール値。[w:width, h:height]</return>
	var ret = new Array(2); 
	ret["x"] = document.documentElement.scrollLeft || document.body.scrollLeft; 
	ret["y"] = document.documentElement.scrollTop || document.body.scrollTop; 
	return ret; 
} 
function ixScrollFull() {
	/// <summary>現在の非表示領域を含めたウインドのスクロール値を取得します。</summary>
	/// <return type="array">非表示領域を含めたウインドのスクロール値。[w:width, h:height]</return>
	var ret = new Array(2);
	ret["x"] = 0;
	ret["y"] = 0;
	if(document.documentElement) {
		ret["x"] = document.documentElement.scrollWidth;
		ret["y"] = document.documentElement.scrollHeight;
	} else if(document.body) {
		ret["x"] = document.body.scrollWidth;
		ret["y"] = document.body.scrollHeight;
	}
	return ret;
}
function ixImageChange(elm, url) {
	/// <summary>指定された img タグの画像を入れ替えます。</summary>
	/// <param name="elm" type="object">入れ替えるイメージエレメント、または、ID。</param>
	/// <param name="key" type="string">入れ替える画像の URL。</param>
	elm = ixElm(elm);
	if (ixIsNull(elm)) return;
	elm.src = url;
}
function ixImageRandomChange(elm, baseUrl, filenames) {
	/// <summary>画像をランダムに入れ替えます。</summary>
	/// <param name="elm" type="object">入れ替えるイメージエレメント、または、ID。</param>
	/// <param name="baseUrl" type="string">画像が入っているフォルダの URL。</param>
	/// <param name="filenames" type="array">入れ替える画像のファイル名。(可変パラメーター)</param>
	/// <return type="int">入れ替えた画像番号。</return>
	var args = arguments;
	if (args.length < 3) return;
	if (ixIsNull(baseUrl)) baseUrl = "";
	var i = ixMathRundomInt(2, args.length - 1);
	ixImageChange(elm, baseUrl + args[i]);
	return i - 2;
}
