/****************
 * 一般汎用関数
 ****************/

/*
 * 配列ないしハッシュの複製
 * [出典]http://stackoverflow.com/questions/565430/deep-copying-an-array-using-jquery
 */
function cloneObject(target) {
	return $.extend(true, [], target);
}


/*
 * GETパラメータを一括取得
 * [仕様]「数字キー=>パラメータ名」と「パラメータ名=>値」を両格納したハッシュを生成
 *     例：{0:keyName1, keyName1:value1, 1:keyName2, keyName2:value2, ...}
 */
function getUrlVars() {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}


/*
 * ボタン押下によるsubmitアクションを擬似的に実行
 * [仕様]第1引数のボタンはjQueryオブジェクトでもオブジェクト取得用文字列でも可。
 */
$.fn.submitBy = function(button) {
	var formObj = $(this);
	if (typeof button === 'string') {
		button = $(button, formObj);
	}
	formObj.append(
		$('<div><input type="hidden" name="' + button.attr('name') + '" value="' + button.attr('value') + '" /></div>').hide()
	).submit();
};


/*
 * ハンドル部分の画面外逸脱を抑制したdraggable
 * [重要]削除予定。draggableのcontainmentパラメータに座標配列[x1, y1, x2, y2]を渡せば充分のはず。
 */
$.fn.draggableEx = function(opts) {
	// オプションハッシュの初期値をセット
	if (typeof opts === 'undefined') {
		opts = {};
	}

	// ドラッグ対象オブジェクトの取得
	var thisObj = $(this);
	// ハンドルオブジェクトの特定
	var handle = thisObj;
	if (opts.handle) {
		handle = thisObj.find(opts.handle);
	}

	// ハンドルオブジェクトの位置情報を取得
	var offsets = handle.offset();
	var handleTop = offsets.top;
	var handleLeft = offsets.left;
	var handleHeight = handle.height();
	var handleWidth = handle.width();

	// ハンドルオブジェクトが画面内から消滅しない限界値を特定
	var handleTopMin = 15 - handleHeight;
	var handleLeftMin = 25 - handleWidth;
	var handleTopMax = $('html').attr('clientHeight') - 15;
	var handleLeftMax = $('html').attr('clientWidth') - 25;

	// draggable用のstopコールバック関数を構成(注：dragオプションでの抑制は不可)
	var onStop = function(event, ui) {
		// draggable適用要素のドラッグ終了位置情報を取得
		var thisObj = $(this);
		var position = thisObj.position();
		var handleOffsets = handle.offset();

		// draggable適用要素の縦位置を補正
		if (handleOffsets.top > handleTopMax) {
			thisObj.css('top', position.top - (handleOffsets.top - handleTopMax));
		} else if(handleOffsets.top < handleTopMin) {
			thisObj.css('top', position.top + (handleTopMin - handleOffsets.top));
		}

		// draggable適用要素の横位置補正
		if (handleOffsets.left > handleLeftMax) {
			thisObj.css('left', position.left - (handleOffsets.left - handleLeftMax));
		} else if(handleOffsets.left < handleLeftMin) {
			thisObj.css('left', position.left + (handleLeftMin - handleOffsets.left));
		}

		// 本来のstopコールバック関数を実行
		if (typeof opts.stop === 'function') {
			opts.stop(event, ui);
		}
	};

	// オプションハッシュの複製＆整理
	var realOpts = {};
	for ( var k in opts) {
		// stopオプションコールバックのみ上書き
		if (k === 'stop') {
			realOpts[k] = onStop;
		} else {
			realOpts[k] = opts[k];
		}
	}

	// jQueryUI.draggable()実行
	thisObj.draggable(realOpts);
};


/*
 * フォーム要素の妥当な項目にフォーカスする
 */
$.fn.formFocus = function() {
	var thisObj = $(this);
	var inputs = thisObj.find(
		'button, input[type=button], input[type=password], input[type=submit], input[type=text], textarea'
	).filter(':visible');
	if (inputs.length) {
		inputs[0].focus();
	}
	return thisObj;
};


/*
 * 親要素自身を含むHTMLを取得
 * [出典]http://jquery-howto.blogspot.com/2009/02/how-to-get-full-html-string-including.html
 */
function getHtml(expr) {
	return $('<div>').append($(expr).clone()).remove().html();
}


/*
 * 第1引数が関数なら第2引数以下を引数として実行する
 */
function ifFuncFire(funcName){
	if(typeof funcName === 'function'){
		if (arguments.length > 1) {
			var argStr = '';
			for(var i=1; i<arguments.length; i++){
				argStr += 'arguments[' + i + ']';
				if(i < arguments.length - 1){
					argStr += ',';
				}
			}
			eval('funcName(' + argStr + ')');
		} else {
			funcName();
		}
	}
}


/*
 * IE6か否か識別
 */
function isIE6() {
	return (typeof document.body.style.maxHeight === "undefined");
}


/**
 * パディング用関数
 * numberの桁数がsizeより大きい場合はそのまま返す。
 * @param string 対象文字列
 * @param size   変換後の桁数
 * @param letter	パディング処理に用いる文字列
 * @return パディング処理の結果文字列
 *
 */
function padding(string, size, letter) {
	if (typeof string !== 'string') {
		string = String(string);
	}
	if (typeof letter === 'undefined') {
		letter = '0';
	}

	while (string.length < size) {
		string = letter + string;
	}
	if (string.length > size) {
		string = string.substr(0, size);
	}

	return string;
}


/*
 * 半角英数字を基本とする指定長のランダムな文字列を生成
 * [出典]http://blog.bornneet.com/Entry/143/
 */
function randomStr(strLength, additionalLettersStr) {
	additionalLettersStr = additionalLettersStr || '';
	var sourceLettersStr = 'abcdefghijklmnopqrstuvwxyz'
		+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
		+ '0123456789'
		+ additionalLettersStr;
	var sourceLetters = sourceLettersStr.split('');
	var resultStr = '';
	for (var i = 0; i < strLength; i++) {
		resultStr += sourceLetters[Math.floor(Math.random() * sourceLetters.length)];
	}
	return resultStr;
}


/*
 * オブジェクトの中身を展開して表示
 * ＠http://labs.unoh.net/2006/11/javascript.html
 */
function pr(obj, useAlert) {
	// 出力メッセージ
	var message = '';
	// オブジェクト内項目数カウンター
	var count = 0;

	// 出力メッセージの加筆用関数
	var output = function(str) {
	 	message += str + (useAlert ? '\n' : '<br />');
	};

	// オブジェクトの展開実行関数
	var printR = function(obj, name, level) {
		// 加筆用文字列
		var str = '';
		// 無効なオブジェクトまたは深度5以上なら処理回避
		if (obj == undefined || level > 5) return;

		// 展開中のキーが存在するオブジェクト内深度を縦線の本数で表す
		for (var i = 0; i < level; i++) { str += ' | '; }
		//
		str += ' - ' + name + ':' + typeof(obj) + '=' + obj;
		// 構成した文字列の加筆実行
		output(str);

		//
		if (name == "document" || typeof(obj) != "object") return;
		// 傘下のキーを展開して出力
		for ( key in obj ) {
			// 出力キーの総数が限界に達すれば処理終了
			if (count++ > 500) return;
			// 出力実行
			printR(obj[key], key, level + 1);
		}
	};

	// 引数オブジェクトの展開実行
	printR(obj, "*", 0);

	// ブラウザの新窓で表示(オプション)
	if (!useAlert) {
		var prWin = window.open();
		prWin.document.write(message);
		prWin.document.close();
		prWin.focus();
	// アラートで表示(デフォルト)
	} else {
		// alert()では10000文字までしか出力されない(Firefox)点に注意！
		alert(message);
	}
}


/*
 * 文字列の全置換
 */
function replaceAll(str, search, replace){
	return str.split(search).join(replace);
}


/*
 * スクロールバーの表示有無を取得
 */
$.fn.scrollbarExists = function(directionKey) {
	var thisObj = $(this);
	if (typeof directionKey === 'undefined') {
		directionKey = 'y';
	}
	var overflowValue = thisObj.css('overflow-' + directionKey);
	if(overflowValue == 'scroll') { return true; }
	if(overflowValue == 'hidden') { return false; }
	if(overflowValue == 'auto' || thisObj.attr('tagName') === 'HTML') {
		var sizeDirection = (directionKey === 'y' ? 'Height' : 'Width');
		return thisObj.attr('client' + sizeDirection) < thisObj.attr('scroll' + sizeDirection);
	}
	return false;
};


/*
 * 引数文字列の末尾数値を取得
 */
function tailNum(str) {
	return str.match(/([0-9]+)$/)[1];
}


/*
 * 選択チェックボックス付きのテーブルに対応するテーブルと送信フォームをセットアップ
 */
function trChecker(table, forms, opts) {
	/*
	 * 引数の整理
	 */
	if (!table) { table = 'table'; }
	table = $(table);
	opts = $.extend({
		checker: 'td.checkbox',
		allChecker: 'th.checkbox'
	}, opts || {});
	allChecker = $(opts.allChecker, table);
	checker = $(opts.checker, table);


	/*
	 * 全列選択チェックボックス
	 */
	allChecker.click(function(e) {
		var checkAllCBox = $('input[type=checkbox]', allChecker);
		// チェックボックス自体周辺へのクリックならチェックボックスを疑似クリック
		if (e.target.tagName != "INPUT") {
			checkAllCBox.click();
		}
		// 各列対応チェックボックスをシンクロ
		$('input[type=checkbox]', checker).attr('checked', checkAllCBox.attr('checked'));
	});


	/*
	 * 各列対応チェックボックス
	 */
	checker.click(function(e) {
		// チェックボックス自体周辺へのクリックならチェックボックスを疑似クリック
		if (e.target.tagName != "INPUT") {
			$('input[type=checkbox]', $(this)).click();
		}
	});


	/*
	 * 一括編集フォーム
	 */
	if (forms) {
		if (typeof forms === 'string') {
			forms = [forms];
		}

		for (var i = 0; i < forms.length; i++) {
			// 特定キーのフォーム情報配列を整形して取得
			var makeFormArr = function(index) {
				var formArr = forms[index];
				if (!$.isArray(formArr)) {
					formArr = [formArr];
				}
				return formArr;
			};

			// フォーム情報配列をもとにフォームオブジェクトを取得
			var makeFormObj = function(formArr) {
				var formObj;
				if (formArr.obj) {
					formObj = formArr.obj;
				} else {
					formObj = $(formArr.expr ? formArr.expr : formArr[0]);
				}
				return formObj;
			};

			/*
			 * クロージャ関数
			 */
			var submitFunc = (function(index) {
				return function() {
					// イベント実行対象のフォーム情報配列を取得
					var form = makeFormArr(index);
					// イベント実行対象のフォームオブジェクトを取得
					var formObj = makeFormObj(form);

					// 警告メッセージの構成
					var alertMsg = "編集したい行にチェックを入れてください。";
					if (form.alert) {
						alertMsg = form.alert;
					} else if(form[1]) {
						alertMsg = form[1];
					}

					// 確認メッセージの構成
					var confirmMsg;
					if (form.confirm) {
						confirmMsg = form.confirm;
					} else if(form[2]) {
						confirmMsg = form[2];
					}

					// 区切り記号の特定
					var sep = ',';
					if (form.sep) {
						sep = form.sep;
					} else if(form[3]) {
						sep = form[3];
					}

					// メッセージ内の置換用特殊文字列の置換処理
					var msgReplace = function(msg, selectedCBoxes) {
						var num = selectedCBoxes.length;
						var cBoxIds = [];
						var cBoxNames = [];
						var cBoxValues = [];

						for ( var j = 0; j < selectedCBoxes.length; j++) {
							var selectedCBoxObj = $(selectedCBoxes[j]);
							cBoxIds.push(selectedCBoxObj.attr('id'));
							cBoxNames.push(selectedCBoxObj.attr('name'));
							cBoxValues.push(selectedCBoxObj.val());
						}

						var ids = cBoxIds.join(sep);
						var names = cBoxNames.join(sep);
						var vals = cBoxValues.join(sep);

						return msg.replace(
							'{%num%}', num
						).replace(
							'{%ids%}', ids
						).replace(
							'{%names%}', names
						).replace(
							'{%vals%}', vals
						);
					};

					// 各列対応チェックボックスの選択状況を取得
					var checkedChildren = $('input[type=checkbox]:checked', checker);
					if (!checkedChildren.length) {
						alert(msgReplace(alertMsg, checkedChildren));
						return false;
					}

					// 送信是非を特定
					var result = true;
					if (confirmMsg) {
						if (!confirm(msgReplace(confirmMsg, checkedChildren))) {
							result = false;
						}
					}

					// 送信可なら実行
					if (result) {
						// 選択したチェックボックスを送信値に追加
						$('input.inserted-before-submit', formObj).remove();
						for (var k = 0; k < checkedChildren.length; k++) {
							var checkbox = $(checkedChildren[k]);
							formObj.append(
								'<input class="inserted-before-submit" type="hidden" name="' + checkbox.attr("name") + '" value="'
								+ checkbox.val() + '">'
							);
						}
					}

					// 送信是非を返して終了
					return result;
				};
			})(i);

			// イベント設定対象のフォーム情報配列を取得
			var form = makeFormArr(i);
			// イベント設定対象のフォームオブジェクトを取得
			var formObj = makeFormObj(form);

			// イベント設定実行
			formObj.submit(submitFunc);
		}
	}
}




/***************
 * PHP近似関数
 ***************/

/*
 * PHP::array_unique()近似関数
 * [出典]Constellation＠http://d.hatena.ne.jp/javascripter/20080730/1217413682
 */
function arrayUnique(a){
	return Array.reduce(a, function(e, r, arr){
		if(e.indexOf(r) == -1) e.push(r);
		return e;
	}, []);
}


/*
 * ハッシュの値だけを取り出した配列を構成
 */
function arrayValues (input) {
	// http://kevin.vanzonneveld.net
	// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// +	  improved by: Brett Zamir (http://brett-zamir.me)
	// *	 example 1: array_values( {firstname: 'Kevin', surname: 'van Zonneveld'} );
	// *	 returns 1: {0: 'Kevin', 1: 'van Zonneveld'}
	var tmp_arr = [],
		key = '';

	if (input && typeof input === 'object' && input.change_key_case) { // Duck-type check for our own array()-created PHPJS_Array
		return input.values();
	}

	for (key in input) {
		tmp_arr[tmp_arr.length] = input[key];
	}

	return tmp_arr;
}


/*
 * PHP::htmlspecialchars()近似関数
 * [出典]http://tech.kayac.com/archive/jquery-strip_tags-htmlspecialchars.html
 */
function htmlspecialchars(text) {
	return $('<div>').text(text).html();
}


/*
 * PHP::in_array()近似関数
 * [出典]http://phpjs.org/functions/in_array:432
 */
function inArray (needle, haystack, argStrict) {
	var key = '', strict = !!argStrict;

	if (strict) {
		for (key in haystack) {
			if (haystack[key] === needle) {
				return true;
			}
		}
	} else {
		for (key in haystack) {
			if (haystack[key] == needle) {
				return true;
			}
		}
	}

	return false;
}


/*
 * PHP::is_numeric()近似関数
 * [出典]http://phpjs.org/functions/is_numeric:449
 */
function isNumeric(mixed_var) {
	return (typeof(mixed_var) === 'number' || typeof(mixed_var) === 'string') && mixed_var !== '' && !isNaN(mixed_var);
}


/*
 * PHP::nl2br()金時間数
 * [出典]http://phpjs.org/functions/nl2br:480
 */
function nl2Br (str, is_xhtml) {
	var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';
	return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
}


/*
 * PHPのstrip_tags近似関数
 * http://tech.kayac.com/archive/jquery-strip_tags-htmlspecialchars.html
 */
function stripTags(text) {
	return $('<div>').html(text).text();
}


/*
 * PHP::strpos()近似関数
 * [出典]http://phpjs.org/functions/strpos:545
 */
function strpos (haystack, needle, offset) {
	// http://kevin.vanzonneveld.net
	// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// +   improved by: Onno Marsman
	// +   bugfixed by: Daniel Esteban
	// +   improved by: Brett Zamir (http://brett-zamir.me)
	var i = (haystack+'').indexOf(needle, (offset || 0));
	return i === -1 ? false : i;
}


/*
 * 副文字列をカウント
 */
function substrCount(haystack, needle) {
	var temp = haystack.split(needle);
	return temp.length - 1;
}


/*
 * 頭文字を大文字化
 */
function ucfirst (str) {
	// http://kevin.vanzonneveld.net
	// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// +   bugfixed by: Onno Marsman
	// +   improved by: Brett Zamir (http://brett-zamir.me)
	// *	 example 1: ucfirst('kevin van zonneveld');
	// *	 returns 1: 'Kevin van zonneveld'
	str += '';
	var f = str.charAt(0).toUpperCase();
	return f + str.substr(1);
}




/********************
 * Commonヘルパー用
 ********************/

/*
 * jDatetime形式の日時選択メニューに現在時刻を入力
 */
$.fn.jDatetimeClear = function(confirmMsg) {
	var thisObj = $(this);

	var doClear = function() {
		// 設定処理実行
		thisObj.closest('div.datetime').find('select').each(function(){
			$(this).val('');
		});
	}

	if (confirmMsg) {
		if (confirm(confirmMsg)) {
			doClear();
		}
	} else {
		doClear();
	}

	return thisObj;
}

/*
 * jDatetime形式の日時選択メニューに現在時刻を入力
 */
$.fn.jDatetimeRefresh = function(confirmMsg) {
	var thisObj = $(this);

	var doRefresh = function() {
		// 日時の取得
		var now = new Date();
		var year = now.getYear();
		if (year < 2000) { year += 1900; }
		var month = now.getMonth() + 1;
		var day = now.getDate();
		if (day < 10) { day = "0" + day; }
		var hour = now.getHours();
		if (hour < 10) { hour = "0" + hour; }
		var minute = now.getMinutes();
		if (minute < 10) { minute = "0" + minute; }

		// 各セレクトメニューの設定値配列を構成
		var setValues = [year, month, day, hour, minute];
		// 設定処理実行
		var key = 0;
		thisObj.closest('div.datetime').find('select').each(function(){
			$(this).val(setValues[key]);
			key++;
		});
	}

	if (confirmMsg) {
		if (confirm(confirmMsg)) {
			doRefresh();
		}
	} else {
		doRefresh();
	}

	return thisObj;
}




/*****************************************
 * ui.dropdownchecklist.jsプラグイン拡張
 *****************************************/

/*
 * 開閉時コールバック付き複数チェック選択メニューの設定
 * [仕様]ui.dropdownchecklist.jsプラグインに依存
 */
$.fn.multiCheckSelector = function(options) {
	// オプションの整理
	options = $.extend({
		empty: null,
		onShow: null,
		onHide: null
	}, options || {});

	// 選択メニューにdropdownchecklistプラグインを適用し該当のSELECTオブジェクトを取得
	var thisSelect = $(this).dropdownchecklist();
	// 選択メニューのIDを取得
	var selectMenuId = thisSelect.attr('id');
	// 対応する疑似選択メニュー格納用DIVオブジェクトを取得
	var dropdownchecklistWrapper = $('#' + selectMenuId + '0').closest('div.ui-dropdownchecklist-dropcontainer-wrapper');
	// 対応する疑似選択メニュー内チェックボックス群を取得
	var checkboxes = $('input[type=checkbox]', dropdownchecklistWrapper);

	// 対応する選択メニュータイトルSPANオブジェクトを取得
	var titleWrapperSpan = thisSelect.next('span.ui-dropdownchecklist-wrapper');
	// 表示タイトル格納用SPANオブジェクトを取得
	var titleSpan = $('span.ui-dropdownchecklist-text', titleWrapperSpan);
	// 初期タイトル文字列オプションの指定があれば反映
	if (typeof options.empty === 'string') {
		titleSpan.text(options.empty);
	}

	// 対応dropdownchecklistの開閉状態取得用関数
	var isVisible = function() {
		// ※格納時には負のposition値が適用される仕様のためその指定値で検索
		return (dropdownchecklistWrapper.css('top') !== '-3300px');
	};

	// BODYにonClickイベントを設定
	$('body').click(function(){
		// ※BODYクリック時は格納前にイベントが取得される
		if (isVisible()) {
			if (checkboxes.length && typeof options.onHide === 'function') { options.onHide(thisSelect, titleSpan, checkboxes); }
		} else {
			if (typeof options.onShow === 'function') { options.onShow(thisSelect, titleSpan, checkboxes); }
		}
	});

	// 選択メニュータイトルSPANにonClickイベントを設定：必須。原因は未検証だがBODYだけではタイトルSPANへのクリックは無視される
	titleWrapperSpan.click(function(){
		// ※選択メニュータイトルSPANクリック時は格納後にイベントが取得される
		if (isVisible()) {
			if (typeof options.onShow === 'function') { options.onShow(thisSelect, titleSpan, checkboxes); }
		} else {
			if (checkboxes.length && typeof options.onHide === 'function') { options.onHide(thisSelect, titleSpan, checkboxes); }
		}
	});

	return thisSelect;
};


/*
 * 複数チェック選択メニューの追従
 * [仕様]ui.dropdownchecklist.jsプラグインに依存
 */
function synchroMultiCheckSelectors(parentSelect, childSelects, options) {
	// オプションの整理
	options = $.extend({
		clear: false,	// 追従処理完了後に主導選択メニューを初期化。文字列指定なら表示文字列として適用
		confirm: false	// 確認メッセージの表示有無。文字列指定ならメッセージとして適用、配列指定ならキー0と1の間に選択項目名を列挙
	}, options || {});
	// 主導選択メニュータイトルSPANオブジェクトを取得
	var parentTitleSpan = $('span.ui-dropdownchecklist-text', parentSelect.next('span.ui-dropdownchecklist-wrapper'));
	// 主導選択メニュー表示タイトルの取得
	var parentSelectedStr = parentTitleSpan.text();

	// 主導セレクトメニュー初期化用関数
	var clearFunc = function() {
		if (options.clear) {
			// 対応する疑似選択メニュー格納用DIVオブジェクトを取得
			var parentDropdownDiv = $('#' + parentSelect.attr('id') + '0').closest('div.ui-dropdownchecklist-dropcontainer-wrapper');
			$('input[type=checkbox]', parentDropdownDiv).attr('checked', false);
			parentSelect.val([]);
			parentTitleSpan.text(typeof options.clear === 'string' ? options.clear : '');
		}
	};

	// 確認メッセージの構成
	if (options.confirm) {
		var confirmSelectedStr = (parentSelect.val() ? parentSelectedStr : "(選択なし)");
		var confirmMsg = "";
		switch (typeof options.confirm) {
			case 'object':
				if (options.confirm[0]) {
					confirmMsg += options.confirm[0];
				}
				confirmMsg += confirmSelectedStr;
				if (options.confirm[1]) {
					confirmMsg += options.confirm[1];
				}
				break;
			case 'string':
				confirmMsg = options.confirm;
			break;
		}
	}

	// 確認処理
	if (!confirmMsg || confirm(confirmMsg)) {
		// 主導選択メニューの設定値配列を取得
		var valArray = parentSelect.val();
		// 子選択メニュー群の設定値をシンクロ
		childSelects.val(valArray);

		// 子選択メニュー対応チェックボックス群のシンクロ
		for ( var i = 0; i < childSelects.length; i++) {
			// 個々の子選択メニューオブジェクトを取得
			var childSelect = $(childSelects[i]);
			// 個々の子選択メニューオブジェクトのIDを特定
			var childSelectId = childSelect.attr('id');

			// [仕様]対応するチェックボックス群IDはIDが前方一致なのでそれに基づき検索
			$('input[id^=' + childSelectId + ']').each(function() {
				// 対応チェックボックスを逐一処理
				var thisCheckbox = $(this);
				// 主導選択メニューで選択された項目ならチェック
				if (inArray(thisCheckbox.val(), valArray)) {
					thisCheckbox.attr('checked', true);
				// 主導選択メニューで選択されていなければチェックを解除
				} else {
					thisCheckbox.attr('checked', false);
				}
			});

			// 子選択メニュー対応チェックボックスの表示タイトルをシンクロ
			var childTitleWrapperSpan = childSelect.next('span.ui-dropdownchecklist-wrapper');
			var childTitleSpan = $('span.ui-dropdownchecklist-text', childTitleWrapperSpan);
			childTitleSpan.text(parentSelect.val() ? parentSelectedStr : "");
		}

		// 主導選択メニューの初期化
		clearFunc();

	} else {
		// 主導選択メニューの初期化
		clearFunc();
	}
}
