/*
 外部の県庁所在地の経緯度データを読み込み
 Optionで表示する
 
 //サンプル
  <script src="http://maps.google.com/maps?file=api&v=2&key=GoogleMapsのキー" charset="utf-8" type="text/javascript"></script>
  <script src="./GKenOptions.js" charset="utf-8"></script>
 
 <div>
    ここへ地図を出力します↓
    <div id="map" style="width: 500px; height: 400px;float:left"></div>
  
  <form name="test1" style = "margin:0px">
  <input type    = "button" 
         style   = "width:150px;height:20px;margin:0px;"
         value   = "都道府県名リスト"
         onclick = "Gm2.loadFile('./ken_tky.xml')"><br>
         
  <select name     = "s0"
          style    = "width:150px;height:380px;background-color:#ffdf50;color:#ff9114;"
          size     = "5"
          onchange = "Gm2.res.onselectedOption(this)"> 
    <option selected> --ここへ読み込まれます--
  </select> 
  </form>
 </div>

*/


//外部データ
// XML
// 県庁所在地の経緯度データ 日本測地系(tokyo)
// http://jsgt.org/lib/db/xml/ken_tky.xml

//ネームスペース
var org={jsgt:{lib:{}}};

//上記ネームスペースで使用するクラスとメンバのリスト
org.jsgt.lib.GMap2 = {};
org.jsgt.lib.GMap2.GKenOptions = {};
org.jsgt.lib.GMap2.GKenOptions.loadFile=function (url){};
org.jsgt.lib.GMap2.GKenOptions.on_loadedXML=function (oj){};
org.jsgt.lib.GMap2.GKenOptions.chgXMLtoHTMLOptions=function (xdoc,oj){};
org.jsgt.lib.GMap2.GLatLng_tky = function (la,ln){};

//ネームスペース
org.jsgt.lib.GMap={};
//上記ネームスペースで使用するクラスとメンバのリスト
org.jsgt.lib.GMap.GPoint = function (a,b){};


  ////
  //送信用関数
  //
  org.jsgt.lib.GMap2.GKenOptions.loadFile=function (url)
  {
    var request = GXmlHttp.create();
    request.open("POST",url , true);
    request.onreadystatechange = function() { 
      if (request.readyState == 4) {
        org.jsgt.lib.GMap2.GKenOptions.on_loadedXML(request);
      }
    }
    request.send('') //この引数をnullにするとOpera8.02/8.5/9bが動作しなくなります
  }

  ////
  //コールバック関数 ( 受信時に実行されます )
  //
  org.jsgt.lib.GMap2.GKenOptions.on_loadedXML=function (oj)
  {
    //responseXMLでレスポンスを取得
    var res  =  oj.responseXML;
    //OPTION書き換え作業用オブジェクト
    org.jsgt.lib.GMap2.GKenOptions.res = new org.jsgt.lib.GMap2.GKenOptions.chgXMLtoHTMLOptions(document.test1.s0);
    org.jsgt.lib.GMap2.GKenOptions.res.addOptions(res);

  }

  ////
  // 読み込んだXMLのデータをもとにOPTIONを書き換えるメソッドを作成します
  //
  org.jsgt.lib.GMap2.GKenOptions.chgXMLtoHTMLOptions=function (oj)
  {
    return {
    
      //XMLのitems,value,textを連想配列で返します
      setItems : function (xdoc){
     
        //XML内の"items"という名前のタグ(要素)の配列を作る
        var items = xdoc.getElementsByTagName("items");
  
        //XML内の都道府県名データ"ken"という名前のタグ(要素)の配列を作る
        var ken = xdoc.getElementsByTagName("ken");
        //XML内の経度データ"lon"という名前のタグ(要素)の配列を作る
        var lon = xdoc.getElementsByTagName("lon");
        //XML内の緯度データ"lat"という名前のタグ(要素)の配列を作る
        var lat = xdoc.getElementsByTagName("lat");
        
        return { "items":items,"kens":ken,"lons":lon,"lats":lat };
      
      },
  
      //XMLのデータからオプションを生成します
      addOptions : function (xdoc){
      
        //すべてのオプションを削除します
        this.delAllOptions(oj);
        //XMLデータのオブジェクトを受け取ります
        var data = this.setItems(xdoc);
        //"item"タグが出てきた順に処理します
        for( i = 0 ; i < data.items.length ; i++ ){
          var text  = data.kens[i].firstChild.nodeValue ;
          var value = data.lons[i].firstChild.nodeValue
                    +','+ data.lats[i].firstChild.nodeValue ;
          oj.options[oj.length]=new Option(text,value);
        }
      },
      
      //すべてのオプションを削除します
      delAllOptions : function (oj){
        var optionIndex = oj.options.length  
        for ( i=0 ; i <= optionIndex ; i++ ){
          oj.options[0]=null;
        }
      },
      
      //optionが選択された時の処理
      onselectedOption : function(oj){
        var lon = oj.options[oj.selectedIndex].value.split(',')[0];
        var lat = oj.options[oj.selectedIndex].value.split(',')[1];
        this.show(lat,lon);
        
      },
      //地図表示
      show : function(lat,lon){
        if(GMap2) map.setCenter(new org.jsgt.lib.GMap2.GLatLng_tky(lat,lon));
        else      map.centerAndZoom(new org.jsgt.lib.GMap.GPoint(lon,lat));
        //地図表示時のコールバック処理
        if(org.jsgt.lib.GMap2.GKenOptions.onShowToMap)org.jsgt.lib.GMap2.GKenOptions.onShow(lat,lon);
      }
      
    }
    
  }

  //GLatLngクラスで日本測地系座標を使いたい場合用の代替クラス
  org.jsgt.lib.GMap2.GLatLng_tky = function (la,ln){
        var lat = la - la * 0.00010695  + ln * 0.000017464 + 0.0046017;
        var lng = ln - la * 0.000046038 - ln * 0.000083043 + 0.010040;
        return new GLatLng(lat,lng);
  }

  org.jsgt.lib.GMap.GPoint = function (a,b){
        this.y = b - b * 0.00010695  + a * 0.000017464 + 0.0046017;
        this.x = a - b * 0.000046038 - a * 0.000083043 + 0.010040;
  }
  
