//------------------------------------------------------------------------------
//--                                                                          --
//--    FILE NAME :  item_validate.js
//--                                                                          --
//--        Designed by Webproduce   2008-05-20   Ver. 1.00                   --
//--        Coded    by Webproduce   2008-05-20   Ver. 1.00                   --
//--        Revised  by XXXXXXXXX    XXXX-XX-XX   Ver. X.00                   --
//--                                                                          --
//------------------------------------------------------------------------------
//--   (C)COPYRIGHT 2008 BY Webproduce   CORPORATION ALL RIGHTS RESERVED       --
//------------------------------------------------------------------------------
//--   概要 : メールフォーム入力機能の実装

//------------------------------------------------------------------------------
// メソッド定義
//------------------------------------------------------------------------------

// サーバから取得した validation 結果の処理
function process_validation_result (item_ident, result) {

	// validation 結果のフォーマット:
	//   1行目: <ステータス>
	//   2行目以降: エラーの場合のメッセージ

	// <ステータス> に関しては、"OK" であれば形式チェック等問題なし、
	// "NG" であれば問題あり、とする。

	// まずは result を 1 行目とそれ以外に分ける。
	var result_array = result.split('\n');
	if (result_array.length < 1) {
		return;
	}
	var status = result_array.shift().replace(/[\r\n]/, '');
	var message = result_array.join('\n');
		
	// エラーメッセージ表示部分の HTML Object を取得
	elem_error_td = document.getElementById('td_' + item_ident);
	elem_error_p = document.getElementById('note_' + item_ident);

	// 既にエラーメッセージが存在すれば、エラーメッセージを削除する
	if (elem_error_p) {
  		elem_error_td.removeChild(elem_error_p);
	}

	// NG の場合は、エラーメッセージの表示、エラーフラグの設定を行う
	if (status == 'NG') {
	     // メッセージを作成
	     elem_error = document.createElement('span');
	     elem_error.setAttribute("id", "note_" + item_ident);
	     elem_error.className = "t_strong red block";
	     elem_error.innerHTML = message;

	     // 追加
	     elem_error_td.appendChild(elem_error);
	}

	// 無事終了
	return;
}

// 連想配列から HTTP POST 用のデータへの変換
function array2postdata (data) {
	
	var postdata = '';

	for(var key in data) {
		if (postdata) {
			postdata += '&';
		}
		postdata += encodeURIComponent(key);
		postdata += '=';
		postdata += encodeURIComponent(data[key]);
	}

	return postdata;

	
}

// 基本的な validation (item_val がテキスト等であれば、このまま利用する)
function item_validate_text (url_root, form_ident, item_ident, item_val) {

	// リクエスト先の URL を生成する
	var url_to_validate = url_root + 'validate/';
	
	// POST するデータを生成する (p_item_ident=<item_ident>&p_item_val=<item_val>)
	var data = { 'p_item_ident':item_ident, 'p_item_val':item_val };
	var postdata = array2postdata(data);

	// 生成した URL に対して 生成したデータを POST する
	xmlhttp = new XMLHttpRequest();
	if (!xmlhttp) {
		return;
	}

	// レスポンス取得時の処理の設定
	xmlhttp.onreadystatechange = function () {

		if (xmlhttp.readyState != 4 || xmlhttp.status != 200) {
			return; 
		}

		// 結果を取得
		result = xmlhttp.responseText;

		// 結果の処理をする
		process_validation_result (item_ident, result);

		return;
	}

	// 実際に POST
	xmlhttp.open('POST', url_to_validate, true);
	xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xmlhttp.send(postdata);
}

// チェックボックスに対する validation
function item_validate_checkbox (url_root, form_ident, item_ident){

	// おなじ item_ident のチェックボックスを調べる
	var idx = 1;
	var val = '';
	while (1) {
		var elem = document.getElementById('select_' + item_ident + '_' + idx);
		if (!elem) {
			break;
		}
		if (elem.checked) {
			val = 1;
			break;
		}
		++idx;
	}

	return item_validate_text (url_root, form_ident, item_ident, val);
}


// 複数カラムテキストに対する validation
function item_validate_multi_text  (url_root, form_ident, item_ident, text_idx, delimitor) {

	// サフィックス決定用
	item_validate_multi_text.suffixes = ["first", "second", "third"];

	// onchange チェック用変数
	item_validate_multi_text.is_onchange = item_validate_multi_text.is_onchange || new Array();

	// onchange チェックを行う
	var ident_to_check = item_ident;
	ident_to_check += '_' + item_validate_multi_text.suffixes[text_idx];
	item_validate_multi_text.is_onchange[ident_to_check] = 1;

	// データを取得
	// 現在のところ、最大 3 カラム
	var val_to_validate = '';
	for (var i=0; i<item_validate_multi_text.suffixes.length; ++i) {
		var ident_elem = item_ident + '_' + item_validate_multi_text.suffixes[i];
		var elem = document.getElementsByName (ident_elem);
		if (!elem || !elem.item(0)) {
			// elem が取得できなかった場合は、
			// validation の前処理終了
			break;
		}
		ident_to_check = item_ident + '_' + item_validate_multi_text.suffixes[i];
		if (elem.item(0).value == ''
			&& !item_validate_multi_text.is_onchange[ident_to_check]) {
			// 内容が空、かつ onchange がなされていない場合は
			// validate せずに終了
			return false;
		}
		if (val_to_validate != '') {
			val_to_validate += delimitor;
		}
		val_to_validate += elem.item(0).value;
	}

	// validation を行う
	return item_validate_text (url_root, form_ident, item_ident, val_to_validate);
}

// 郵便番号に対する validation
function item_validate_postcode (url_root, form_ident, item_ident, is_first) {

	// onchange チェック用変数
	item_validate_postcode.is_onchange = item_validate_postcode.is_onchange || new Array();

	// onchange チェックを行う
	var ident_to_check = item_ident;
	if (is_first) {
		ident_to_check += '_first';
	}
	item_validate_postcode.is_onchange[ident_to_check] = 1;

	// 郵便番号を取得
	var ident_first = item_ident + '_first';
	var ident_second = item_ident + '_second';

	// エレメントを取得
	var elem_postcode_first = document.getElementsByName (ident_first);
	var elem_postcode_second = document.getElementsByName (ident_second);
	if (!elem_postcode_first || !elem_postcode_second) {
		return false;
	}

	// 最初の3桁と次の4桁、両方の onchange が発生してから、実際の validation を行う。
	if ((!item_validate_postcode.is_onchange[item_ident] && elem_postcode_second.item(0).value == '')
		|| !item_validate_postcode.is_onchange[item_ident + '_first'] && elem_postcode_first.item(0).value == '') {
		return false;
	}


	// 郵便番号の生成
	var postcode = '' + elem_postcode_first.item(0).value + '-' + elem_postcode_second.item(0).value;

	// validation を行う
	return item_validate_text (url_root, form_ident, item_ident, postcode);
}

// 郵便番号からの住所自動入力
function getAddrFromPostCode (url_root, form_ident, ident, ident_address_target) {

	// ident のチェック
	if (!ident) {
		return false;
	}

	// 郵便番号を取得
	var ident_first = ident + '_first';
	var ident_second = ident + '_second';

	// エレメントを取得
	var elem_postcode_first = document.getElementsByName (ident_first);
	var elem_postcode_second = document.getElementsByName (ident_second);
	if (!elem_postcode_first || !elem_postcode_second) {
		return false;
	}

	// 郵便番号の生成
	var postcode = '' + elem_postcode_first.item(0).value + elem_postcode_second.item(0).value;

	// リクエスト先の URL を生成する
	var url_to_get_address = url_root + 'postcode/' + postcode;

	// 生成した URL に対して GET を行う
	xmlhttp = new XMLHttpRequest();
	if (!xmlhttp) {
		return;
	}

	// レスポンス取得時の処理の設定
	xmlhttp.onreadystatechange = function () {

		if (xmlhttp.readyState != 4 || xmlhttp.status != 200) {
			return; 
		}

		// 結果を取得
		result = xmlhttp.responseText;

		// 結果の処理をする
		process_postcode_result (url_root, form_ident, ident_address_target, result);

		return;
	}

	// 実際に GET
	xmlhttp.open('GET', url_to_get_address, true);
	xmlhttp.send(null);
}

// 郵便番号からの住所をフォームに挿入する
function process_postcode_result (url_root, form_ident, ident_address_target, result) {

	// 結果が空の場合は alert をあげて終了
	if (!result) {
		alert ('郵便番号から住所を取得できませんでした。');
		return false;
	}

	document.getElementsByName(ident_address_target)[0].value = result;
	var onchange = document.getElementsByName(ident_address_target)[0].onchange;
	if (onchange) {
		onchange();
	}
}

jQuery.noConflict();
jQuery(document).ready(function(){

	//「申し込み情報をコピーする」リンク
	jQuery('.enable_copy').click(function() {
		var elem = jQuery(this);
		var id = elem.attr('id');

		var onclick = false;
		var onchange = false;

		var dest_id = id.replace(/^enable_copy_/,'');
		var src_id = dest_id.replace(/_[^_]*$/,'') + '_1';
		var dest_elem = jQuery('input:text[name=' + dest_id + ']');
		var val = jQuery('input:text[name=' + src_id + ']').val();
		if (val) {
			dest_elem.val(val);
			onclick = dest_elem.attr('onclick');
			onchange = dest_elem.attr('onchange');
		}
		val = jQuery('textarea[name=' + src_id + ']').val();
		if (val) {
			dest_elem = jQuery('textarea[name=' + dest_id + ']');
			dest_elem.val(val);
			onclick = dest_elem.attr('onclick');
			onchange = dest_elem.attr('onchange');
		}		
		val = jQuery('input:text[name=' + src_id + '_first]').val();
		if (val) {
			dest_elem = jQuery('input[name=' + dest_id + '_first]');
			dest_elem.val(val);
			onclick = dest_elem.attr('onclick');
			onchange = dest_elem.attr('onchange');
		}		
		val = jQuery('input:text[name=' + src_id + '_second]').val();
		if (val) {
			dest_elem = jQuery('input[name=' + dest_id + '_second]');
			dest_elem.val(val);
			onclick = dest_elem.attr('onclick');
			onchange = dest_elem.attr('onchange');
		}
		if (onclick) {	
			onclick();
		}
		if (onchange) {
			onchange();
		}
	});

	//「同時参加者を追加」ボタン
	jQuery('#btn_add_params').click(function(){
		var max_params_elem = jQuery('input[name=p_max_params]');
		var max_params = max_params_elem.val();
		if (max_params === undefined || 5 <= max_params) {
			return false;
		}
		++max_params;
		if (5 <= max_params) {
			jQuery(this).hide();
		}
		jQuery('#params_table_' + max_params).show('slow');
		max_params_elem.val(max_params);
	});

	//「同時参加者を削除」リンク
	jQuery('.delete_params').click(function(){
		var elem = jQuery(this);
		var target = parseInt(elem.attr('id').replace(/^.*_/, ''));
		jQuery('#params_table_' + target).hide('slow', function(){
			var elem = jQuery(this);
			var target = parseInt(elem.attr('id').replace(/^.*_/, ''));
			var max_params_elem = jQuery('input[name=p_max_params]');
			var max_params = parseInt(max_params_elem.val());

			// 値・エラーメッセージのコピー
			for (var i=target; i+1<=max_params; ++i) {
				// 値のコピー
				var fn_copy = function() {
					var dest_id = jQuery(this).attr('id');
					var src_num = i+1;
					var src_id = dest_id.replace(/^(.*)_[0-9]+(.*)$/, '$1' + '_' + src_num + '$2');
					jQuery(this).val(jQuery('#'+src_id).val());
				};
				jQuery('#params_table_' + i + ' input:text').each(fn_copy);
				jQuery('#params_table_' + i + ' textarea').each(fn_copy);
				jQuery('#params_table_' + i + ' select').each(fn_copy);
				jQuery('#params_table_' + i + ' input:checkbox').each(function(){
					var dest_id = jQuery(this).attr('id');
					var src_num = i+1;
					var src_id = dest_id.replace(/^(.*)_[0-9]+(_[0-9]+)$/, '$1' + '_' + src_num + '$2');
					jQuery(this).attr('checked', jQuery('#'+src_id).attr('checked'));
				});

				// エラーメッセージのクリア
				jQuery('#params_table_' + i + ' span').each(function(){
					var elem = jQuery(this);
					var src_id = elem.attr('id');
					if (!src_id) {
						return;
					}
					elem.remove();
				});

				// エラーメッセージのコピー
				jQuery('#params_table_' + (i+1) + ' span').each(function(){
					var src_id = jQuery(this).attr('id');
					if (!src_id) {
						return;
					}
					var dest_id= src_id.replace(/^note_(.*)_[0-9]+(.*)$/, '$1' + '_' + i + '$2');
			                elem_error = document.createElement('span');
			                elem_error.setAttribute("id", "note_" + dest_id);
			                elem_error.className = "t_strong red block";
			                elem_error.innerHTML = jQuery(this).text();
					elem_error_td = document.getElementById('td_' + dest_id);
					elem_error_td.appendChild(elem_error);
				});
			}

			// 値・エラーメッセージのクリア（最後の要素）
			jQuery('#params_table_' + max_params + ' input:text').each(function(){jQuery(this).val('');});
			jQuery('#params_table_' + max_params + ' textarea').each(function(){jQuery(this).val('');});
			jQuery('#params_table_' + max_params + ' select').each(function(){jQuery(this).val('');});
			jQuery('#params_table_' + max_params + ' input:checkbox').each(function(){jQuery(this).attr('checked', false);});
			jQuery('#params_table_' + max_params + ' span').each(function(){
				var elem = jQuery(this);
				var src_id = elem.attr('id');
				if (!src_id) {
					return;
				}
				elem.remove();
			});

			for (i=2; i<max_params; ++i) {
				jQuery('#params_table_' + i).show();
			}
			jQuery('#params_table_' + max_params).hide();
			--max_params;
			max_params_elem.val(max_params);
		});
		jQuery('#btn_add_params').show();

	});

	// 画面オープン時の同時参加者表示
	var max_params_elem = jQuery('input[name=p_max_params]');
	var max_params = parseInt(max_params_elem.val());
	for(var i=2; i<=max_params; ++i) {
		jQuery('#params_table_' + i).show();
	}
	if (5 <= max_params) {
		jQuery('#btn_add_params').hide();
	}

});

