﻿/*
 学校検索用JavaScript
*/


/*
 * バリデータ。
 */
SearchValidatorChain = function(){
	this.execute = function(){
		var ret = true;
		for(var i = 0; i < this.validators.length; i++){
			if(this.stopChainOnError && !ret){
				continue;
			}

			if(!this.validators[i].validate()){
				if(this.resultHandler != null){
					this.resultHandler(this.validators[i].errMsg);
					ret = false;
				}
			}
		}

		return ret;
	};
	this.add = function(validator){ // タイプ数削減用関数。
		this.validators.push(validator);
	};

	this.resultHandler = function(errMsg){alert(errMsg)};
	this.stopChainOnError = true; // バリデーションエラーの際にとめるかどうか。
};

/*
 * ワード検索用バリデーション集。必要に応じてhtml側でnewする。
 */
WordFormValidatorChain = function(textBoxId, defaultText){
	this.validators = new Array(); // errMsgとvalidationから構成されるオブジェクトの配列。
	textBoxId = isEmpty(textBoxId) ? "searchfield" : textBoxId;
	this.add({errMsg : "検索ワードを入力してください。", validate : function(){return !isEmpty(getValue(textBoxId))}});
	this.add({errMsg : "検索ワードを入力してください。", validate : function(){return getValue(textBoxId) != defaultText}});
	this.add({errMsg : "検索ワードを正しく入力してください。", validate : function(){return !isOnlySpace(getValue(textBoxId))}});
};
WordFormValidatorChain.prototype = new SearchValidatorChain();

/*
 * 入試orイベント日程検索用バリデーション集。必要に応じてhtml側でnewする。
 * 各種IDのプレフィックスは固定（yearbox、monthbox、daybox）で、引数のnumで見分ける。
 */
DateFormValidatorChain = function(startTermNum, endTermNum, isExam){
	this.validators = new Array(); // errMsgとvalidationから構成されるオブジェクトの配列。
	var syId = "yearbox" + startTermNum;
	var smId = "monthbox" + startTermNum;
	var sdId = "daybox" + startTermNum;
	var eyId = "yearbox" + endTermNum;
	var emId = "monthbox" + endTermNum;
	var edId = "daybox" + endTermNum;

	// 空欄チェック。
	var errMsgStart = isExam ? "開始日付を正しく入力してください。" : "検索期間を入力してください。";
	var errMsgEnd = isExam ? "終了日付を正しく入力してください。" : "検索期間を入力してください。";
	this.add({errMsg : errMsgStart, validate : function(){return !isEmpty(getValue(syId))}});
	this.add({errMsg : errMsgStart, validate : function(){return !isEmpty(getValue(smId))}});
	this.add({errMsg : errMsgStart, validate : function(){return !isEmpty(getValue(sdId))}});
	this.add({errMsg : errMsgEnd, validate : function(){return !isEmpty(getValue(eyId))}});
	this.add({errMsg : errMsgEnd, validate : function(){return !isEmpty(getValue(emId))}});
	this.add({errMsg : errMsgEnd, validate : function(){return !isEmpty(getValue(edId))}});

	// 値チェック
	this.add({errMsg : "開始日付を正しく入力してください。", validate : function(){return !isEmpty(getValue(syId).match(/^[0-9]{4}/))}});
	this.add({errMsg : "開始日付を正しく入力してください。", validate : function(){return !isEmpty(getValue(smId).match(/^[0-9]{1,2}/))}});
	this.add({errMsg : "開始日付を正しく入力してください。", validate : function(){return !isEmpty(getValue(sdId).match(/^[0-9]{1,2}/))}});
	this.add({errMsg : "終了日付を正しく入力してください。", validate : function(){return !isEmpty(getValue(eyId).match(/^[0-9]{4}/))}});
	this.add({errMsg : "終了日付を正しく入力してください。", validate : function(){return !isEmpty(getValue(emId).match(/^[0-9]{1,2}/))}});
	this.add({errMsg : "終了日付を正しく入力してください。", validate : function(){return !isEmpty(getValue(edId).match(/^[0-9]{1,2}/))}});

	// 日付の正しさチェック。
	this.add({errMsg : "検索する期間を入力してください。", validate : function(){return getValueAndIsNotEmptyAll(Array(syId, smId, sdId, eyId, emId, edId))}});
	this.add({errMsg : "不正な日付です。", validate : function(){return isCorrectDate(syId, smId, sdId)}});
	this.add({errMsg : "不正な日付です。", validate : function(){return isCorrectDate(eyId, emId, edId)}});

	// 日付逆転チェック。
	this.add({errMsg : "不正な日付です。", validate : function(){return !isReverseDate(syId, smId, sdId, eyId, emId, edId)}});
};
DateFormValidatorChain.prototype = new SearchValidatorChain();

DateFormValidatorChainSearchAgain = function(startTermNum, endTermNum){
	this.validators = new Array(); // errMsgとvalidationから構成されるオブジェクトの配列。
	var syId = "yearbox" + startTermNum;
	var smId = "monthbox" + startTermNum;
	var sdId = "daybox" + startTermNum;
	var eyId = "yearbox" + endTermNum;
	var emId = "monthbox" + endTermNum;
	var edId = "daybox" + endTermNum;

	// 値チェック
	this.add({errMsg : "開始日付を正しく入力してください。", validate : function(){return isEmpty(getValue(syId)) || !isEmpty(getValue(syId).match(/^[0-9]{4}/))}});
	this.add({errMsg : "開始日付を正しく入力してください。", validate : function(){return isEmpty(getValue(smId)) || !isEmpty(getValue(smId).match(/^[0-9]{1,2}/))}});
	this.add({errMsg : "開始日付を正しく入力してください。", validate : function(){return isEmpty(getValue(sdId)) || !isEmpty(getValue(sdId).match(/^[0-9]{1,2}/))}});
	this.add({errMsg : "終了日付を正しく入力してください。", validate : function(){return isEmpty(getValue(eyId)) || !isEmpty(getValue(eyId).match(/^[0-9]{4}/))}});
	this.add({errMsg : "終了日付を正しく入力してください。", validate : function(){return isEmpty(getValue(emId)) || !isEmpty(getValue(emId).match(/^[0-9]{1,2}/))}});
	this.add({errMsg : "終了日付を正しく入力してください。", validate : function(){return isEmpty(getValue(edId)) || !isEmpty(getValue(edId).match(/^[0-9]{1,2}/))}});

	// 日付の正しさチェック。
	this.add({errMsg : "検索する期間を入力してください。", validate : function(){return getValueAndIsEmptyAll(Array(syId, smId, sdId, eyId, emId, edId)) || getValueAndIsNotEmptyAll(Array(syId, smId, sdId, eyId, emId, edId))}});
	this.add({errMsg : "不正な日付です。", validate : function(){return getValueAndIsEmptyAll(Array(syId, smId, sdId)) || isCorrectDate(syId, smId, sdId)}});
	this.add({errMsg : "不正な日付です。", validate : function(){return getValueAndIsEmptyAll(Array(eyId, emId, edId)) || isCorrectDate(eyId, emId, edId)}});

	// 日付逆転チェック。
	this.add({errMsg : "不正な日付です。", validate : function(){return getValueAndIsEmptyAll(Array(syId, smId, sdId, eyId, emId, edId)) || !isReverseDate(syId, smId, sdId, eyId, emId, edId)}});
};
DateFormValidatorChainSearchAgain.prototype = new SearchValidatorChain();

function createDateSearchUrlPart(startTermNum, endTermNum){
	var syId = "yearbox" + startTermNum;
	var smId = "monthbox" + startTermNum;
	var sdId = "daybox" + startTermNum;
	var eyId = "yearbox" + endTermNum;
	var emId = "monthbox" + endTermNum;
	var edId = "daybox" + endTermNum;
	var sDate = createDateFromId(syId, smId, sdId);
	var eDate = createDateFromId(eyId, emId, edId);
	var sy = '' + sDate.getFullYear();
	var sm = (sDate.getMonth() + 1) < 10 ? ('0' + (sDate.getMonth() + 1)) : ('' + (sDate.getMonth() + 1));
	var sd = sDate.getDate() < 10 ? ('0' + sDate.getDate()) : ('' + sDate.getDate());
	var ey = '' + eDate.getFullYear();
	var em = (eDate.getMonth() + 1) < 10 ? ('0' + (eDate.getMonth() + 1)) : ('' + (eDate.getMonth() + 1));
	var ed = eDate.getDate() < 10 ? ('0' + eDate.getDate()) : ('' + eDate.getDate());

	return "/" + sy + "-" + sm + "-" + sd + "/" + ey + "-" + em + "-" + ed + "/";
}

function getValue(id){
	return $(jQueryId(id)).attr("value");
}

function jQueryId(id){
	return "#" + id;
}

function isEmpty(val){
	return val == null || val == '';
}

function isEmptyAll(ary){
	var ret = true;
	for(var i = 0; i < ary.length; i++){
		ret = isEmpty(ary[i]);
		if(!ret){
			break;
		}
	}
	return ret;
}

function isNotEmptyAll(ary){
	var ret = true;
	for(var i = 0; i < ary.length; i++){
		ret = !isEmpty(ary[i]);
		if(!ret){
			break;
		}
	}
	return ret;
}

function getValueAndIsEmptyAll(idAry){
	var ary = new Array();
	for(var i = 0; i < idAry.length; i++){
		ary.push(getValue(idAry[i]));
	}
	return isEmptyAll(ary);
}

function getValueAndIsNotEmptyAll(idAry){
	var ary = new Array();
	for(var i = 0; i < idAry.length; i++){
		ary.push(getValue(idAry[i]));
	}
	return isNotEmptyAll(ary);
}

String.prototype.trim = function()
{
	return this.replace(/^\s+|\s+$/g, '');
}

function isOnlySpace(val){
	return isEmpty(val.trim());
}

function isCorrectDate(yId, mId, dId){
	var ret = false;
	var y = getValue(yId);
	var m = getValue(mId);
	var d = getValue(dId);
	if(1 <= m && m <= 12 && 1 <= d && d <= 31){
		var date = new Date(y, m - 1, d);
		ret = !isNaN(date)
			&& date.getFullYear() == y
			&& date.getMonth() == m - 1
			&& date.getDate() == d;
	}
	return ret;
}

function isReverseDate(syId, smId, sdId, eyId, emId, edId){
	return createDateFromId(syId, smId, sdId) > createDateFromId(eyId, emId, edId);
}

function createDateFromId(yId, mId, dId){
	var y = getValue(yId);
	var m = getValue(mId);
	var d = getValue(dId);
	return new Date(y, m - 1, d);
}

/*
 parentで選択中のnameに対応する項目リストをtargetに反映させる
 parent: 親リストボックス
 target: 子リストボックスのID
*/
function changeList2(parent, target, prefix1, prefix2, prefix3){
	var listId = ((parent.options[parent.selectedIndex].value != "") ? prefix1 + parent.options[parent.selectedIndex].value : prefix3);
	var selTag = document.getElementById(target);

	loadList2(listId,selTag, prefix2, prefix3);

	if (selTag.onchange)
		selTag.onchange();
}

/*
 listIdで指定された項目リストをsetTagに反映させる
*/
function loadList(listId,selTag) {
	selTag.options.length = 0; // まず空にする

	// 項目リストを展開する
	var nodes = document.getElementById(listId).childNodes;
	for (var i = 0; i < nodes.length; i++) {
		if (nodes[i].nodeType != 1)
			continue; // エレメント以外は無視
		if (!nodes[i].name)
			continue; // 名前がないのも無視

		var optTag = document.createElement('OPTION');
		optTag.value = nodes[i].value;
		optTag.appendChild(document.createTextNode(nodes[i].name));
		selTag.appendChild(optTag);
	}
}

function loadList2(listId, selTag, prefix1, prefix2){
	selTag.options.length = 0;

	var nodes = document.getElementById(listId).childNodes;
	for (var i = 0; i < nodes.length; i++) {
		if (nodes[i].nodeType != 1)
			continue;
		if (!nodes[i].name)
			continue;

		var optTag = document.createElement('OPTION');
		optTag.value = ((nodes[i].value.indexOf("none") == -1) ? nodes[i].value.replace(prefix1, "") : "");
		optTag.appendChild(document.createTextNode(nodes[i].name));
		selTag.appendChild(optTag);
	}
}

function changeLink(link, container, areaId, type, paramName) {
	var target = $("#" + container);
	target.children().remove();
	if(areaId != null && areaId != ""){
		$("<img>").attr({
			"height" : "16",
			"width" : "15",
			"alt" : "→",
			"src" : $("#contextPath").attr("value") + "/common/images/search/img_arrow_pref.png"
		}).appendTo(target);

		var dd = $("<dd>");

	//	$("#" + areaId).children().each(function(){
	//
	//	})
		var nodes = $("#" + areaId).children()
		for(var i = 0; i < nodes.length; i++){
			var nodeVal = nodes[i].value;
			var nodeName = nodes[i].name;

//			$("<input>").attr({
//				"id" : "chk-area" + nodeVal,
//				"name" : paramName,
//				"value" : nodeVal,
//				"type" : "checkbox"
//			}).appendTo(dd)

			// ↑のコードだとIEがチェックボックスを無視するため、文字列を作って一気に入れてやる。
			// 因みに動かない理由は、IEだとinputエレメントの作成時にtype要素が必須なため。
			var inputId = "chk-area" + nodeVal;
			var inputStr = '<input id="' + inputId + '" name="' + paramName + '" value="' + nodeVal + '" type="checkbox" checked="checked" />';
			$(inputStr).appendTo(dd);

			$("<label>").attr("for", "chk-area" + nodeVal).append(nodeName).appendTo(dd);

			if(i == 5){
				$("<br>").appendTo(dd);
			}
		}

		$("<dl>").append(
			$("<dt>").append("都道府県：")
		).append(dd).appendTo(target);

		$("<span>").attr("class", "mark").append("　他の地域を選択すると左のチェックはクリアされます").appendTo(target);
	}
}

function changeLink2(link, container, areaId) {
	var dest = document.getElementById(container);

	while(dest.childNodes.length > 0)
		dest.removeChild(dest.childNodes[0]);

	if (areaId != "") {
        var nodes = document.getElementById(areaId).childNodes;
		var num = 0;

		var ele_p_1 = document.createElement('P');
		ele_p_1.className = 'module-arrow';

		var ele_img_1 = document.createElement('IMG');
		ele_img_1.src = '../common/icon/img_mark_arrow_submenu.gif';
		ele_img_1.alt = '\u2193';
		ele_img_1.height = 12;
		ele_img_1.width = 11;
		ele_p_1.appendChild(ele_img_1);

		var ele_p_2 = document.createElement('P');
		ele_p_2.className = 'search-subelement';

		ele_p_2.appendChild(document.createTextNode('\u90fd\u9053\u5e9c\u770c\uff1a'));

		for (var i = 0; i < nodes.length; i++) {
			if (nodes[i].nodeType != 1)
				continue;
			if (!nodes[i].name)
				continue;

			var element = document.createElement('a');
            element.href = 'javascript:document.getElementById(\'locationList\').value=\'' + nodes[i].value + '\';document.retrieval_form.submit();';
            element.appendChild(document.createTextNode(nodes[i].name));
            if (num++ != 0) ele_p_2.appendChild(document.createTextNode(' / '));
            ele_p_2.appendChild(element);
		}

		dest.appendChild(ele_p_1);
		dest.appendChild(ele_p_2);
	}
}

function changeColor(this_, name, className) {
    var ele_links = document.getElementsByName(name);
    for (var i = 0; i < ele_links.length; i++) ele_links[i].className = (ele_links[i].id == this_.id) ? className : '';
}
