/* ================================================================ *
    zip.js ---- ZIP 郵便番号→住所変換ライブラリ
* ================================================================ */
// -----------------------------------------------------------------
// メイン処理
//
// 郵便番号テキストフィールドのonkeyupイベントで実行される処理。リクエストを生成し、レスポンスを取得
//
// 第1引数：郵便番号：必須
// 第2引数：都道府県：必須
// 第3引数：市区町村：必須
// 第4引数：その他：任意
// -----------------------------------------------------------------
function setZip(inZip,inPref,inAddr1,inAddr2){

  //キーイベントがTAB,Shiftの場合、処理しない
  eventObj = windowEvent();
  if(eventObj.keyCode == '9' || eventObj.keyCode == '16'){
     return;
  }

  //住所取得PHP
  var zip_phpscript      = 'index.php';
  var url = '/' + zip_phpscript;

  //フォームオブジェクト取得
  objZip       = document.getElementById(inZip);
  objPref      = document.getElementById(inPref);
  objAddr1     = document.getElementById(inAddr1);
  objAddr2     = document.getElementById(inAddr2);
  objAddr2_flg = true;
  HyphenFlg    = false;

  //存在チェック
  if ( ! objZip )   return;
  if ( ! objPref )  return;
  if ( ! objAddr1 ) return;
  if ( ! objAddr2 ) objAddr2_flg = false;

  //郵便番号取得
  zip_num = objZip.value;

  //郵便番号整合性チェック
  if(!checkZip(zip_num)){
      viewMsg(objZip,'半角数字かハイフンで入力してください');
      //フォーム変更
      initForm(objZip,false);
      return;
  }
  viewMsg(objZip,'');
  initForm(objZip,true);

  //ハイフン削除
  if(HyphenFlg) zip_num = zip_num.replace( /-/,'');

  //初期処理
  if(!init(zip_num)){
     return;
  }

  //非同期通信実行
  new Ajax.Request(url, {
    method: "get",
    parameters: "action_user_service_zipcode_get=true&zipcode=" + zip_num + "&t=" + Math.random(),
    onSuccess: getAddr, 
    ansynchronous: true,
    onFailure: function(){}
  });
}



// -----------------------------------------------------------------
// メイン処理
//
// 郵便番号テキストフィールドのonblurイベントで実行される処理。
// -(ハイフン)がなければ追加
//
// 第1引数：郵便番号：必須
// -----------------------------------------------------------------
function setZipHyphen(inZip){

  var newZip ='';

  //フォームオブジェクト取得
  objZip  = document.getElementById(inZip);

  //存在チェック
  if(!objZip )   return;

  //郵便番号取得
  zip_num = objZip.value;

  //数値7桁チェック
  if(zip_num.match(/^\d{7}$/)){

      //半角チェック --ループ
      for(var cnt=0;cnt<zip_num.length;cnt++){
         //4桁目に-(ハイフン)挿入
         if(cnt == 3){
            newZip = newZip + '-';
         }
         newZip = newZip + zip_num.charAt(cnt);
      }
      objZip.value = newZip;
  }
  return;
}

// -----------------------------------------------------------------
// レスポンス取得後実行
// -----------------------------------------------------------------
function getAddr(xmlHttp) {

  var xmlDoc = xmlHttp.responseXML;
  if (xmlDoc.documentElement){

    //XMLをパース
    var stat = xmlDoc.getElementsByTagName("stat").item(0).firstChild;
    var code = xmlDoc.getElementsByTagName("code").item(0).firstChild;

    //バックエンドから返ってきたステータスがokの場合
    if (stat.data == "ok"){

      var prefecture_id = xmlDoc.getElementsByTagName("prefecture_id").item(0).firstChild;
      var locality      = xmlDoc.getElementsByTagName("locality").item(0).firstChild;
      var town          = xmlDoc.getElementsByTagName("town").item(0).firstChild;

      //各データをフォームに代入する
      if (prefecture_id != null) objPref.value   = prefecture_id.data;
      if (locality != null)      objAddr1.value  = locality.data;
      if (town != null){
         if(objAddr2_flg){
                objAddr2.value  = town.data;
         }else{
                objAddr1.value  = objAddr1.value + town.data;
         }
      }

      //フォーム色変更
      if(objAddr1.value){

         //メッセージ初期化
         viewMsg(objAddr1,'');
         //フォーム初期化
         initForm(objAddr1,true);

         //メッセージ初期化
         viewMsg(objZip,'');
         //フォーム初期化
         initForm(objZip,true);
      }

    //バックエンドから返ってきたステータスがngの場合
    }else if(stat.data == "ng"){

      //エラーメッセージ出力
      if (code != null){
        switch(code.data){
        case '1':
           //成功時
           break;
        case '2':
           //バリデートエラー
           break;
        case '3':
           //住所取得エラー
           viewMsg(objZip,'該当する住所が存在しません');
           //フォーム変更
           initForm(objZip,false);

           break;
        default:
           //その他
        }
      }
    }
  }
  return;
}


// -----------------------------------------------------------------
// 初期設定
// -----------------------------------------------------------------
function init(num){

   //桁数取得
   ziplen = num.length;

   //3桁・7桁なら初期設定終了
   if((ziplen == 3) || (ziplen == 7)){
     return true;
   }

   //7桁以下
   if(ziplen < 7){

      //市区町村初期化
      objAddr1.value = '';

      if(objAddr2_flg){
          objAddr2.value = '';
      }
   }

   //3桁以下
   if(ziplen < 3){

       //都道府県初期化
       objPref.value  = '';

       //メッセージ初期化
       viewMsg(objZip,'');
   }

   return false;
}

// -----------------------------------------------------------------
// フォームの色変更
// -----------------------------------------------------------------
function initForm(element,cflg){

   if(cflg){
       //色ON
       element.addClassName('validation-passed');
       $(element.id+'_msg').removeClassName('validation-advice');

   }else{
       //色OFF
	   $(element.id).removeClassName('validation-passed');
	   element.addClassName('validation-failed');
	   $(element.id+'_msg').removeClassName('validation-failed');
	   $(element.id+'_msg').addClassName('validation-advice');

   }
}

// -----------------------------------------------------------------
// メッセージのみ変更
// -----------------------------------------------------------------
function viewMsg(element,Msg){

   if(Msg == ''){
      $(element.id+'_msg').innerHTML = '';
   }else{
      //メッセージ
      $(element.id+'_msg').innerHTML = "<font color=\"#FF0000\"><b>" + Msg + "</b></font>";
//      window.alert($(element.id+'_msg').innerHTML);
   }
}

// -----------------------------------------------------------------
// 郵便番号チェック
// -----------------------------------------------------------------
function checkZip(num){

   //半角チェック --ループ
   for(var cnt=0;cnt<num.length;cnt++){

      //数値,ハイフン(-)チェック(4桁目)---------------
      if(cnt == 3){
          //ハイフン(-)チェック
          if(num.charAt(cnt).match(/^-$/)){
             //ハイフン
             //alert(num.charAt(cnt) + '⇒' + "ハイフンです");
             HyphenFlg = true;
          }else{
             //ハイフン以外

            //数値チェック
            if(!num.charAt(cnt).match(/^[0-9]$/)){
                //alert(num.charAt(cnt) + '⇒' + "数値エラー");
                return false;
            }
          }
      }

      //数値チェック(4桁目以外)----------------------
      if((cnt < 3) || (cnt > 3)){
          //数値チェック
          if(!num.charAt(cnt).match(/^[0-9]$/)){
             //alert(num.charAt(cnt) + '⇒' + "数値エラー");
             return false;
          }
      }
      
      //八桁目チェック
      if(cnt == 7){
         //ハイフンが存在しない場合,エラー
         if(!HyphenFlg){
            return false;
         }
      }
   }
   return true;
}

// -----------------------------------------------------------------
// イベントオブジェクト取得
// -----------------------------------------------------------------
function windowEvent(){

   if(window.event) return window.event;
   var caller = arguments.callee.caller;
   while(caller){
          var ob = caller.arguments[0];
          if(ob && ob.constructor == KeyboardEvent) return ob;
               caller = caller.caller;
   }
   return null;
}

