/*==================================================================*/
/* 郵便番号入力→住所入力サポート Ajax                              */
/*                                                                  */
/* Create Date : 2008/09/25                                         */
/* Update Date : ----/--/--                                         */
/*==================================================================*/
// 初期設定
AjaxZip = function () {};
AjaxZip.VERSION = '1.0.0';
AjaxZip.JSONDATA = '../js/data';
AjaxZip.CACHE = [];
AjaxZip.prev = '';
AjaxZip.PREFMAP = [null, '北海道', '青森県', '岩手県', '宮城県', '秋田県', '山形県', '福島県', '茨城県', '栃木県', '群馬県', '埼玉県', '千葉県', '東京都', '神奈川県', '新潟県', '富山県', '石川県', '福井県', '山梨県', '長野県', '岐阜県', '静岡県', '愛知県', '三重県', '滋賀県', '京都府', '大阪府', '兵庫県', '奈良県', '和歌山県', '鳥取県', '島根県', '岡山県', '広島県', '山口県', '徳島県', '香川県', '愛媛県', '高知県', '福岡県', '佐賀県', '長崎県', '熊本県', '大分県', '宮崎県', '鹿児島県', '沖縄県'];
/*------------------------------------------------------------------*/
/* 住所取り込み（JSONデータ照合）                                   */
/*------------------------------------------------------------------*/
AjaxZip.zipCodeAddr = function(objJipCode, objPrefAddress, objAddress) {
  var elementZipCode = AjaxZip.getElementByName(objJipCode);
  var elementPrefAddress = AjaxZip.getElementByName(objPrefAddress, objJipCode);
  var elementAddress = AjaxZip.getElementByName(objAddress, objJipCode);
  if(!elementZipCode) return;
  if(!elementPrefAddress) return;
  if(!elementAddress) return;
  // 郵便番号取得
  var strZipCode = elementZipCode.value;
  if(!strZipCode) return;
  // 郵便番号（-）を取り除く
  strZipCode = strZipCode.replace('-', '');
  if(strZipCode.length != 7) return;
  // JSONデータコールバック
  var callbackJSONData = function(data) {
    var aryZipData = data[strZipCode];
    // Operaバグ対策
    var opera = (strZipCode-0+0xff000000) + "";
    if(!aryZipData && data[opera]) aryZipData = data[opera];
    if(!aryZipData) return;
    // 都道府県ID
    var prefID = aryZipData[0];
    if(!prefID) return;
    // 都道府県名
    var strPrefName = AjaxZip.PREFMAP[prefID];
    if(!strPrefName) return;
    // 市区町村名
    var strCityName = aryZipData[1];
    if(!strCityName) strCityName = '';
    var strTownName  = aryZipData[2];
    if(!strTownName) strTownName = '';
    var strTownAreaName = aryZipData[3];
    if(!strTownAreaName) strTownAreaName = '';
    var nextCursor = elementAddress;
    // HTMLフォーム反映
    elementAddress.value = strPrefName + strCityName + strTownName + strTownAreaName;
    if(!cursor) return;
    if(!cursor.value) return;
    var nextCursorLength = nextCursor.value.length;
    nextCursor.focus();
    if(nextCursor.createTextRange) {
      var txtRange = nextCursor.createTextRange();
      txtRange.move('character', nextCursorLength);
      txtRange.select();
    } else if(nextCursor.setSelectionRange) {
      nextCursor.setSelectionRange(nextCursorLength, nextCursorLength);
    }
  };
  // キャッシュデータ確認
  var cacheZipCode = strZipCode.substr(0, 3);
  var data = AjaxZip.CACHE[cacheZipCode];
  if(data) return callbackJSONData(data);
  // JSONファイル受信
  var JSONDataUrl = AjaxZip.JSONDATA + '/zip-' + cacheZipCode + '.json';
  if(window.Ajax && Ajax.Request) {
    // JSONファイルコールバック
    var callbackJSONFile = function(JSONRequest) {
      if(!JSONRequest) return;
      if(!JSONRequest.responseText) return;
      var strJSONResponse = AjaxZip.getResponseText(JSONRequest);
      data = eval('(' + strJSONResponse + ')');
      AjaxZip.CACHE[cacheZipCode] = data;
      callbackJSONData(data);
    };
    var ajaxRequestOption = {method: 'GET', asynchronous: true, onComplete: callbackJSONFile};
    new Ajax.Request(JSONDataUrl, ajaxRequestOption);
  }
};

// Safari文字化け対応
AjaxZip.getResponseText = function(safariRequest) {
  var safariRequestTxt = safariRequest.responseText;
  if(navigator.appVersion.indexOf('KHTML') > -1) {
    var escsSafariRequestTxt = escape(safariRequestTxt);
    if (escsSafariRequestTxt.indexOf('%u') < 0 && escsSafariRequestTxt.indexOf('%') > -1) {
      safariRequestTxt = decodeURIComponent(escsSafariRequestTxt);
    }
  }
  return safariRequestTxt;
}

// フォームnameから要素を取り出す
AjaxZip.getElementByName = function(strElementName, strSibling) {
  if(typeof(strElementName) == 'string') {
    var formList = document.getElementsByName(strElementName);
    if (!formList) return null;
    if (formList.length > 1 && strSibling && strSibling.form) {
      var siblingForm = strSibling.form.elements;
      for(var i = 0; i < siblingForm.length; i++) {
        if (siblingForm[i].name == strElementName) {
          return siblingForm[i];
        }
      }
    } else {
      return formList[0];
    }
  }
  return strElementName;
}

