/* 
******************************************************************************
  Filename    : ZipToAddress.js.js
  Language    : JavaScript
  
  Description : 郵便番号・住所データ関連処理
  　　　　　　　※[prototype.js(1.50)]が先に読込されていること
                ※[common.js]は読込されていなくても動作する
  ==============================================================================
  Change Log  :
  
  Date:         Ver:        Description:
  ------------------------------------------------------------------------------
  2007/09/27    1.00        Hishikawa@LimeNet
  2008/01/09    1.01        Hishikawa@LimeNet
  								郵便番号ハイフン「-」プロパティ追加 [zip_bar]
								都道府県名コンバート種別を追加 [pref_convert_type]
****************************************************************************** 
*/

//==============================================================================
//グローバル変数
//==============================================================================

//******************************************************************************
// <summary> 変数が定義されているかをチェックする
// <param  > obj : 変数名
// <returns> bool
// <remarks> 追々別のファイルに移動
function isDefined(obj)
{
	if( obj in window )
	{
		return true;
	}
	return false;
}


//******************************************************************************
// <summary> 郵便番号・住所データ関連処理オブジェクト
// <remarks> JavaScript-prototypeによるオブジェクト指向PG
//           コンストラクタ
var ZipToAddress = function(){};

ZipToAddress.prototype = {

	// 変数
	//===============================================================
	name: "ZipToAddress",
	ver: 1.01,
	address_separator: "",		//都道府県、市区町村、町名を連結する際のセパレータ
	pref_convert:false,			//都道府県名をコード化するか
	pref_convert_type:"no",		//都道府県名コンバート種別→[key]:キー名、[no]:都道府県番号
	zip_bar:true,				//郵便番号にハイフン「-」を必須とするか(true/false/null)
	buf_pref_list:null,			//都道府県リストバッファ	

	//===============================================================
	// <summary> 郵便番号チェック
	// <param  > zip : 郵便番号文字列
	//           bar : ハイフン有無(true/false/null)
	// <returns> 郵便番号
	// <remarks> ※ハイフンの有無は[g_ness_bar_zip]に依存
	isZip: function(zip,bar)
	{
		//郵便番号チェック関数が定義されている場合
		if (isDefined("check_zip"))
		{
			return check_zip(zip);
		}
		else
		{
			bar = (bar == null ? this.zip_bar : bar);
		
			//ハイフン設定が未定義の場合
			if (!isDefined("g_ness_bar_zip"))
			{
				var g_ness_bar_zip = bar;
			}			
			
			//ハイフン必須未設定の場合
			if (g_ness_bar_zip == null)
			{
				check = /^\d{3}\-?\d{4}$/;
			}
			//必須の場合
			else if (g_ness_bar_zip == true)
			{
				check = /^\d{3}\-\d{4}$/;
			}
			//不要の場合
			else
			{
				check = /^\d{7}$/;
			}
			
			if(!zip.match(check))
			{
				return false;
			}
			
			return true;			
		}
	},
	
	//===============================================================
	// <summary> 郵便番号を、要素から取得する
	// <param  > zip1 : 郵便番号(前3桁)の要素ID
	//           zip2 : 郵便番号(後4桁)の要素ID
	// <returns> 郵便番号 / null
	// <remarks> ※[zip2]が[null]の場合は[zip1]に郵便番号7桁があるものとする
	getZipFromInput: function(zip1,zip2)
	{
		try
		{	
			var zip = "";
		
			if (zip1 == null)
			{
				return null;
			}
			
			var e_zip1 = $(zip1);
			if (e_zip1.value.length == 0)
			{
				alert("郵便番号を入力して下さい");
				e_zip1.focus();
				return null;
			}
			
			if (zip2 == null)
			{
				zip = e_zip1.value;
			}
			else
			{
				var e_zip2 = $(zip2);
				if (e_zip2.value.length == 0)
				{
					alert("郵便番号下4桁を入力して下さい");			
					e_zip2.focus();
					return null;
				}
				zip = e_zip1.value + e_zip2.value;
			}
			
			if (!this.isZip(zip))
			{
				alert("正しい郵便番号を入力して下さい");
				e_zip1.focus();
				e_zip1.select();
				return null;
			}
	
			return zip;
		}
		catch(e)
		{
			throw(e);
		}
	},
	
	//===============================================================
	// <summary> 郵便番号から住所情報を取得する
	// <param  > zip : 郵便番号
	// <returns> 配列→[郵便番号,都道府県,市区町村,町名] / null
	// <remarks> 郵便番号検索APIを利用(http://zip.turl.biz/)
	getAddressFromZip: function(zip)
	{
		var _method = "getAddressFromZip";
		var _ret = null;
		
		return _ret;
	},
	
	//===============================================================
	// <summary> 郵便番号から住所情報を取得し、任意項目へセットする
	// <param  > zip1 : 郵便番号(前3桁)の要素ID
	//           zip2 : 郵便番号(後4桁)の要素ID
	//           pref : 都道府県をセットする要素ID
	//           city : 市区町村をセットする要素ID
	//           town : 町名をセットする要素ID
	// <returns> 
	// <remarks> 郵便番号検索APIを利用(http://zip.turl.biz/)
	//           ※[zip2]が[null]の場合は[zip1]に郵便番号7桁があるものとする
	//           ※[town]が[null]の場合は[city]に包含してセットする
	//           ※[city]が[null]の場合は[pref]に包含してセットする
	setAddressFromZip: function(zip1,zip2,pref,city,town)
	{
		var _method = "setAddressFromZip";
		
		try
		{
			//郵便番号を取得
			var zip = this.getZipFromInput(zip1,zip2);
			if (zip == null)
			{
				return;
			}

			//IEではキャッシュで残るためユニークなGETクエリを生成するため
			var msec = (new Date()).getTime();
			var aj = new Ajax.Request
			(
				"./address_ajax.php?zip=" + zip, 	//実行スクリプト(PHP)からの相対パス
				{							 
					method: "get",
					parameters: "cache=" + msec,
					
					onSuccess:function(request)
					{
						//なし
					},
					
					onComplete: function(request)
					{ 
						var xmlData = request.responseXML;				

						//itemタグを取得
						var winTag = xmlData.getElementsByTagName("item");
						if (winTag.length == 0)
						{
							alert("該当する住所データが見つかりませんでした\n入力した郵便番号をお確かめ下さい");
							return;
						}
											
						//子ノードの値を取得
						var _zip = winTag[0].getElementsByTagName("zip")[0].firstChild.nodeValue;
						var _pref = winTag[0].getElementsByTagName("pref")[0].firstChild.nodeValue;
						var _city = winTag[0].getElementsByTagName("city")[0].firstChild.nodeValue;
						var _town = winTag[0].getElementsByTagName("town")[0].firstChild.nodeValue;	
						
						//都道府県をコンバーとする場合
						if (ZipToAddress.prototype.pref_convert)
						{
							//都道府県名をコンバート
							_pref = ZipToAddress.prototype.convertPref(_pref);
						}

						//町名の要素IDが未設定の場合
						if (town == null)
						{
							_city += ZipToAddress.prototype.address_separator + _town;
						}
						
						//市区町村の要素IDが未設定の場合
						if (city == null)
						{
							_pref += ZipToAddress.prototype.address_separator  + _city;
						}

						//各要素にセット
						if (pref != null)
						{
							$(pref).value = _pref;
						}
						if (city != null)
						{
							$(city).value = _city;
						}
						if (town != null)
						{
							$(town).value = _town;
						}						
						
						//$('tableData').innerHTML = request.responseText;						
					}, 			
					
					onFailure:function(request){
						//throw(_method + "::" + "住所データの取得に失敗しました");
						alert("住所データの取得に失敗しました\n" + _method + "::" + request);
					},
					
					onException: function (ajax,request)
					{
						//throw(_method + "::" + request);						
						alert("住所データの取得でエラーが発生しました\n"+ _method + "::" + request);
					}			
			});	

		}
		catch(e)
		{
			throw(e);
		}		
	},
		
	
	//===============================================================
	// <summary> 都道府県リスト取得
	// <param  > 
	// <returns> 
	// <remarks> 
	prefList: function()
	{
		//都道府県名をコード化しない場合、または、既に生成されている場合
		if (!this.pref_convert || this.buf_pref_list != null)
		{
			//終了
			return this.buf_pref_list;
		}
		
		//連想配列を生成
		var _pl = {};

		//コンバート種別で分岐
		switch (this.pref_convert_type)
		{
			case "key":
				_pl.hokkaido = "北海道";
				_pl.aomori = "青森県";
				_pl.akita = "秋田県";
				_pl.iwate = "岩手県";
				_pl.miyagi = "宮城県";
				_pl.yamagata = "山形県";
				_pl.fukushima = "福島県";
						
				_pl.ibaraki = "茨城県";
				_pl.totigi = "栃木県";
				_pl.gunma = "群馬県";
				_pl.saitama = "埼玉県";
				_pl.tiba = "千葉県";
				_pl.kanagawa = "神奈川県";
				_pl.tokyo = "東京都";
						
				_pl.yamanashi = "山梨県";
				_pl.nigata = "新潟県";
				_pl.nagano = "長野県";
				_pl.toyama = "富山県";
				_pl.ishikawa = "石川県";
				_pl.fukui = "福井県";
				_pl.aiti = "愛知県";
				_pl.gifu = "岐阜県";
				_pl.sizuoka = "静岡県";
						
				_pl.mie = "三重県";
				_pl.kyoto = "京都府";
				_pl.shiga = "滋賀県";
				_pl.osaka = "大阪府";
				_pl.nara = "奈良県";
				_pl.wakayama = "和歌山県";
				_pl.hyogo = "兵庫県";
						
				_pl.okayama = "岡山県";
				_pl.hiroshima = "広島県";
				_pl.tottori = "鳥取県";
				_pl.shimane = "島根県";
				_pl.yamaguti = "山口県";
						
				_pl.kagawa = "香川県";
				_pl.tokushima = "徳島県";
				_pl.kouti = "高知県";
				_pl.ehime = "愛媛県";
						
				_pl.fukuoka = "福岡県";
				_pl.saga = "佐賀県";
				_pl.nagasaki = "長崎県";
				_pl.oita = "大分県";
				_pl.kumamoto = "熊本県";
				_pl.miyazaki = "宮崎県";
				_pl.kagoshima = "鹿児島県";
				_pl.okkinawa = "沖縄県";			
				break;
				
			case "no":
				_pl._1 = "北海道";
				_pl._2 = "青森県";
				_pl._3 = "岩手県";
				_pl._4 = "宮城県";
				_pl._5 = "秋田県";		
				_pl._6 = "山形県";
				_pl._7 = "福島県";
						
				_pl._8 = "茨城県";
				_pl._9 = "栃木県";
				_pl._10 = "群馬県";
				_pl._11 = "埼玉県";
				_pl._12 = "千葉県";
				_pl._13 = "東京都";		
				_pl._14 = "神奈川県";
		
				_pl._15 = "新潟県";
				_pl._16 = "富山県";
				_pl._17 = "石川県";
				_pl._18 = "福井県";
				_pl._19 = "山梨県";
				_pl._20 = "長野県";
		
				_pl._21 = "岐阜県";
				_pl._22 = "静岡県";
				_pl._23 = "愛知県";		
						
				_pl._24 = "三重県";
				_pl._25 = "滋賀県";
				_pl._26 = "京都府";		
				_pl._27 = "大阪府";
				_pl._28 = "兵庫県";		
				_pl._29 = "奈良県";
				_pl._30 = "和歌山県";
		
				_pl._31 = "鳥取県";
				_pl._32 = "島根県";				
				_pl._33 = "岡山県";
				_pl._34 = "広島県";
				_pl._35 = "山口県";
						
				_pl._37 = "香川県";
				_pl._36 = "徳島県";
				_pl._38 = "愛媛県";
				_pl._39 = "高知県";
			
				_pl._40 = "福岡県";
				_pl._41 = "佐賀県";
				_pl._42 = "長崎県";
				_pl._43 = "熊本県";
				_pl._44 = "大分県";
				_pl._45 = "宮崎県";
				_pl._46 = "鹿児島県";
		
				_pl._47 = "沖縄県";			
				break;
		}

		//バッファに格納
		this.buf_pref_list = _pl;
		
		return this.buf_pref_list;
	},
	
	//===============================================================
	// <summary> 都道府県名コンバート
	// <param  > pref_nm : 都道府県名
	// <returns> コンバート後の値
	// <remarks> 
	convertPref: function(pref_nm)
	{
		var lst = this.prefList();

		//全ループ
		for(var key in lst)
		{
			//
			if (lst[key] == pref_nm)
			{
				break;
			}
		}

		//都道府県番号の場合は、キー先頭のアンダーバーを除去
		if (this.pref_convert_type == "no")
		{
			key = key.replace("_","");
		}

		return key;
	}	
}

//インスタンス生成
var ZTA = new ZipToAddress();
