TGMap = {
  /**
   * 設定情報初期値
   */
  maxMarkerCount :  10,                                          //表示するマーカーの数
  maxNaviCount   :  5,                                          //表示するマーカーの数
  maxPgmCount    :  20,                                         //ページング含めマップ上のプログラム数
  jsonUrl        : '',
  gmapKey        : '',
  gmapUrl        : 'http://maps.google.com/maps?file=api&v=2&key=',

  affiliateId    : '',                                          //アフィリエイトId
  //アフィリエイトUrl
  affiliateUrl   : 'http://tabihatsu.jp/affiliate.php?org={affiliateId}&nextpage=program/{pgmId}.html',
  //プログラムのリンク先
  pgmUrl         : 'http://tabihatsu.jp/program/{pgmId}.html',
  defaultCenter  : { lat : 0,  lng: 0 , zoom: 10},       //初期表示位置

  shadowIcon : '',
  markerIcon : 'img_{index}.png',
  listIcon   : 'img_{index}.png',

  markerOnsenIcon : 'img_{index}.png',
  listOnsenIcon   : 'img_{index}.png',

  mapId      : 'gmapbase',
  listId     : 'gmaplist',
  totalId     : 'gmapTotal',
  baseUrl     : '',

  linkTarget : 'tabihatsu',

  msgDataNotFond : '付近の体験プログラムが見つかりませんでした。',
  msgPgmNotFond : '付近の体験プログラムが見つかりませんでした。地図の移動または縮尺を変えてみてください',

  /**
   * プロパティ
   */
  logging  : false,
  gmap     : null,
  httpObj  : null,
  baseIcon : null,
  allPgms      : null,
  containsPgms : null,
  dspMarkers   : [],
  dummyMarker  : null,
  current      : null,

  log : function (obj) {
     if( !this.logging ) return ;
     if(typeof console != 'undefined' ){
       console.log(obj);
     };
   },

  init : function() {
    if( ! window.addEventListener ) {
      window.addEventListener = function(evType, fn, f){
        window.attachEvent("on"+evType, fn);
      }
    }
    window.addEventListener('load', function(){TGMap.load()} ,false);
    window.addEventListener('unload', function(){TGMap.unload()} ,false);

    //プログラムデータを読み込む
    this.addScript(this.jsonUrl+'?cache='+(new Date()).getTime());
    //Goolge Mapを読み込む
    this.addScript(this.gmapUrl+this.gmapKey);
  },
  addScript : function( src ) {
    document.write('<scr'+'ipt src="'+src+'"type="text/javascript"></scr'+'ipt>');
  },

  load : function () {
      var mapsize = new GSize(148, 164);
      var opts = {size:mapsize};
      var map = new GMap2(document.getElementById(this.mapId),opts);

//      var map = new GMap2(document.getElementById(this.mapId));
      map.setCenter(new GLatLng(this.defaultCenter.lat, this.defaultCenter.lng) , this.defaultCenter.zoom);//中心地
      map.addControl(new GSmallMapControl()); //スクロールバーを表示
      //map.addControl(new GMapTypeControl());//地図のマップタイプを切り替える
      //map.addControl(new GOverviewMapControl());  // 縮小地図の表示
      //map.addControl(new GScaleControl());    // 縮尺の表示

      map.enableDoubleClickZoom();            // ダブルクリックでズームイン
      map.enableScrollWheelZoom();          // マウスのホイールでズームイン/アウト
      map.enableContinuousZoom();             // ズームを滑らかに
      this.gmap = map;

      //マーカーのベースになるアイコンを作成
      var baseIcon = new GIcon();
      baseIcon.shadow = this.shadowIcon;
      baseIcon.iconSize = new GSize(27.0, 40.0);
      baseIcon.shadowSize = new GSize(27.0, 40.0);
      baseIcon.iconAnchor = new GPoint(14.0, 40.0);
      baseIcon.infoWindowAnchor = new GPoint(18.0, 11.0);


      this.baseIcon = baseIcon;
//      window.alert("start");
      //jsonファイルが存在しない場合
      if( typeof(TGMap_programs) == 'undefined') {
//        window.alert("aa");
        //var innerEle = document.getElementById(this.listId);
        //innerEle.innerHTML = this.msgDataNotFond;
       return;
      }


      this.allPgms = TGMap_programs;
       // イベント登録
      GEvent.addListener(map, 'zoomend', function(){TGMap.createMap();});
      GEvent.addListener(map, 'dragend', function(){TGMap.createMap();});
      GEvent.addListener(map, 'click', function(marker){TGMap.log(marker);TGMap.displayInfoWindow(marker);});
      GEvent.addListener(map, 'infowindowopen', function(){TGMap.moveInfoWindow();});
      GEvent.addListener(map, 'infowindowclose', function(){TGMap.moveoutInfoWindow();});


      TGMap.createMap();
  },

  unload : function () {
      GUnload();
  },

  /**
   * 表示領域内のプログラムを絞り込む
   */
  updateContains : function () {
      var area = this.gmap.getBounds();//地図の表示範囲を取得
      var conains = [];
      for (var i = 0 ; i < this.allPgms.length; i++) {
        var pgm = this.allPgms[i];
        if( !pgm.latlngObj ) {
           pgm.latlngObj = new GLatLng(pgm.lat, pgm.lng);
        }

        if(area.contains(pgm.latlngObj)){
          conains.push( pgm );
        }
      }
      this.containsPgms = conains;
  },

  /**
   * googleMap作成処理
   */
  createMap : function () {
      this.updateContains();
      this.displayPage(1);
  },

  /**
   * ページ表示処理
   */
  displayPage : function ( page ) {
      this.clearMarker(); // マーカーのみを消去
//      this.clearList();
      pager = this.getPagenate( page );
      var markers = [];
      var listItem = [];
      for (var i = 0 ; i < pager.pgms.length; i++) {
          var pgm = pager.pgms[i];
          markers.push(this.createMarker(pgm, i)  );
          listItem.push(this.createListItem(pgm, i));
      }
      this.displayMarker( markers );
//      this.displayList( listItem, pager );
//      this.displayTotal( pager );
      this.log(pager);
  },

  /**
   * ページャー処理
   */
  getPagenate : function ( page ) {
      var pgms = this.containsPgms;

      var total_count  = ( pgms.length > this.maxPgmCount ) ? this.maxPgmCount : pgms.length;
      var total_pages =   Math.ceil( total_count / this.maxMarkerCount );
      page = ( page > total_pages ) ? total_pages : page;

     //ナビのリンク数を絞る
     if (  total_pages > this.maxNaviCount  ) {
        var navi_start = page - Math.floor( this.maxNaviCount / 2 );
        var navi_end   = page + Math.floor( this.maxNaviCount / 2 ) ;
        if ( navi_start < 1 ) {
           navi_end += -( navi_start-1 );
           navi_start = 1;
        }else if( navi_end > total_pages){
           navi_start += -( navi_end - total_pages );
           navi_end = total_pages;
        }
     }else {
       var navi_start = 1;
       var navi_end = total_pages;
     }

      var offset = ( page-1 ) * this.maxMarkerCount;
      var limit = ( ( offset + this.maxMarkerCount ) > total_count )  ? total_count : offset + this.maxMarkerCount ;
      var pagenate_pgms =  pgms.slice( offset, limit);

      var next = (page+1) <= total_pages ? page+1 : null;
      var prev = (page-1) >= 1           ? page-1 : null;

      return {
        'page'      : page,       //現在のページ
        'start'     : offset+1,
        'end'       : limit,
        'next_page' : next,
        'prev_page' : prev,
        'total_pages' : total_pages,
        'total_count' : total_count,
        'navi_start'  : navi_start,
        'navi_end'    : navi_end,
        'pgms' : pagenate_pgms
      }
  },


  /**
   * プログラム詳細ページのURLを取得
   * affiliateIdが指定されていた場合、アフィリエイトのURLを追加する
   */
   getPgmUrl  :function (pgm) {
     if ( this.affiliateId == '' ) {
       return this.pgmUrl.replace('{pgmId}', pgm.id) ;
     }else{
       return this.affiliateUrl
         .replace('{pgmId}', pgm.id)
         .replace('{affiliateId}', this.affiliateId);
     }
   },

  /**
   * googleMapマーカ作成
   */
  createMarker: function(pgm, index) {

    var pIndex = index + 1;
    pIndex = ( pIndex < 10 ) ? '0'+pIndex : pIndex;

    var letter = String.fromCharCode("A".charCodeAt(0) + index);

    //var imageUrl = this.markerIcon.replace('{index}', pIndex);

    var imageUrl = this.markerIcon;

    if(pgm.onsen_flag == '1') {
    	imageUrl = this.markerOnsenIcon;
    }
    var letteredIcon = new GIcon(this.baseIcon);
    letteredIcon.image = imageUrl;

    markerOptions = { icon:letteredIcon };
    var marker = new GMarker(new GLatLng(pgm.lat, pgm.lng), markerOptions);

    marker.pgm = pgm; //情報ウィンドウ用にプログラム情報設定する

    return marker;
  },

  /**
   * 表示対象のマーカーを非表示にする
   */
  clearMarker : function() {
    for(var i=0; i < this.dspMarkers.length; i++ ) {
      this.gmap.removeOverlay(this.dspMarkers[i]);
    }
   this.dspMarkers = [];
  },

  /**
   * 表示対象に指定されてるマーカーを表示する
   */
  displayMarker : function(markers) {
    for(var i=0; i < markers.length; i++ ) {
     this.gmap.addOverlay(markers[i]);
    }
    this.dspMarkers = markers;
  },

  /**
   * プログラム一覧用アイテム作成
   */
  createListItem : function(pgm, index) {
    var pIndex = index + 1;
    pIndex = ( pIndex < 10 ) ? '0'+pIndex : pIndex;

    var iconUrl = this.listIcon;
    if(pgm.onsen_flag == '1') {
    	iconUrl = this.listOnsenIcon;
    }

     var target = this.linkTarget ? 'target="'+this.linkTarget+'"' : '';
     var url = this.getPgmUrl(pgm);
     var html ='';
     html += '<dl>';
     html += '<dt><img src="'+iconUrl+'" width="27" height="27" alt="" /></dt>';
     html += '<dd><a href="'+url+'" title="'+pgm.name+'" target="_blank">'+pgm.name+'</a></dd>';
     html += '</dl>';

     return html;
   },

  /**
   * プログラム一覧初期化
   */
/*
  clearList: function(){
    document.getElementById(this.listId).innerHTML = "";
  },
*/
  /**
   * プログラム一覧表示
   */
/*
  displayList: function(list, pager){
    var innerEle = document.getElementById(this.listId);
    var html='';

    if (list.length == 0 ) { return ; }
    var cnt = list.length

    html +='<ul id="list">';

    for(var i=0; i< cnt ; i++ ) {
		html += '<li class="clearfix">'+list[i]+'</li>';
    }

    html += '</ul>';

    //ページャー作成
      if ( pager.total_pages != 1 ){
        var li_start = pager.navi_start;
        var li_end   = pager.navi_end;
        html += '<ul id="page_navi" class="clearfix">';
        html += pager.prev_page ? '<li class="prev"><a href="#" onclick="TGMap.displayPage('+pager.prev_page+'); return false;" >前へ</a></li>' : '<li class="prev"></li>';
        for( var i=li_start; i <= li_end; i++ ) {
          if(i == pager.page ) {
            html += '<li class="box"><a class="this">'+i+'</a></li>';
          }else {
            html += '<li class="box"><a onclick="TGMap.displayPage('+i+'); return false;" href="#">'+i+'</a></li>';
          }
        }
        html += pager.next_page ? '<li class="next"><a onclick="TGMap.displayPage('+pager.next_page+'); return false;" href="#">次へ</a></li>' : '<li class="next"></li>';
        html += '</ul>';
      }

    //innerEle.innerHTML = html;
  },
*/

  /**
   * Totalナビ表示
   */
/*
  displayTotal : function ( pager ) {

      var innerEle = document.getElementById(this.totalId);
      var html = '';

      if( pager.total_count == 0) {
        var innerListEle = document.getElementById(this.listId);
        innerListEle.innerHTML = this.msgPgmNotFond;

        innerEle.innerHTML = html;
        return ;
      }

      //件数部作成
      html += '合計<span>'+pager.total_count+'</span>件  '+pager.start+'～'+pager.end+'件目を表示';

      //innerEle.innerHTML = html;
  },
*/

  /**
   *  情報ウインドウを表示
   */
  displayInfoWindow : function(marker) {
    if( !marker || !marker.pgm) return ;

    var pgm = marker.pgm;
    var url = this.getPgmUrl(pgm);
    var target = this.linkTarget ? 'target="'+this.linkTarget+'"' : '';
    var html ='';
    html += '<div id="infoWindow" class="clearfix">';
    html += '<a href="'+url+'" title="'+pgm.name+'" class="photo">';
    html += '<img src="'+pgm.photo+'" width="40" height="30" alt="'+pgm.name+'"/></a>';
    html += '<a href="'+url+'" title="'+pgm.name+'" class="text">'+pgm.name+'</a></div>';
	this.openInfoWindow(marker, html);
  },

  displayInfoWindowByList : function(i) {
    this.displayInfoWindow(this.dspMarkers[i]);
  },

  openInfoWindow : function(marker, html) {
	this.gmap.setCenter(marker.getPoint());
    marker.openInfoWindowHtml(html);
  },
  moveInfoWindow : function(){
	this.gmap.panDirection(.5,3);
  },
  moveoutInfoWindow : function(){
	this.gmap.panDirection(-.5,-3);
  }
};

