/** MiniCookie */
var cookie = {
  get:function(n,m){return (m=('; '+document.cookie+';').match('; '+n+'=(.*?);'))?decodeURIComponent(m[1]):''},
  set:function(n,v){document.cookie=n+'='+encodeURIComponent(v)+'; expires=Mon, 31-Dec-2029 23:59:59 GMT'}
}
// googleMap のGmap2クラスのインスタンス
var map;
// 初期表示時の中心座標
var defaultCenter = new GLatLng(
  cookie.get("lat") == "" ? 36.80928470205937 : parseFloat(cookie.get("lat")),
  cookie.get("lng") == "" ? 133.59375 : parseFloat(cookie.get("lng"))
);
// 初期表示時のズーム
var defaultZoom = cookie.get("zoom") == "" ? 4 : parseInt(cookie.get("zoom"));
// 会社情報詳細表示時のズーム
var detailZoom = 17;
// shadow, icon dimensions, etc.
var baseIcon = new GIcon();
baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
baseIcon.iconSize = new GSize(20, 34);
baseIcon.shadowSize = new GSize(37, 34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);

//オリジナルのポインタを使用する場合はtrue
var isOrgPointOn = false;
var orgPointImg = "/img/knockpoint";
var orgPointShadowImg = "/img/shadow";
var filetype = ".png";


/*
 * GoogleMapを表示
 * 
 * @param fqdn 
 */
function makeOrgPointIcon(letter){
  var icon = new GIcon();
  if(letter == undefined){
    icon.image  = "http://" + location.host + orgPointImg + filetype;
  }else{
    icon.image  = "http://" + location.host + orgPointImg + letter + filetype;
  }
  icon.shadow = "http://" + location.host + orgPointShadowImg + filetype;
  icon.iconSize = new GSize(50, 34);
  icon.shadowSize = new GSize(37, 34);
  icon.iconAnchor = new GPoint(9, 34);
  icon.infoWindowAnchor = new GPoint(9, 2);
  icon.infoShadowAnchor = new GPoint(18, 25);
  return icon;
}

/*
 * GoogleMapを表示
 * 
 * @param lat 中心の緯度
 * @param lng 中心の経度
 */
function gmapLoad(lat,lng){
    // for googlemap
    //地図のインスタンスを生成します
    map = new GMap2(document.getElementById("map"));
    if ( typeof lat == 'undefined' || typeof lng == 'undefined' ){
      center = defaultCenter;
    }else{
      center = new GLatLng(lat,lng);
    }

    // 中心座標とズームを指定
    map.setCenter( center,defaultZoom);
    // パン移動とスライダーズームの使える大きなコントロール
    map.addControl(new GLargeMapControl());
    // マップ/サテライト切り替えボタンの表示
    map.addControl( new GMapTypeControl() );
    
    // マーカー管理クラスのインスタンスを生成
    gmarkers = new GMarkers();

}

/*
 * corporates/index.htmlt表示時
 */
function gmapLoadForSearch(){
    // for googlemap
    //地図のインスタンスを生成します
    map = new GMap2(document.getElementById("map"));
    // 中心座標とズームを指定
    map.setCenter( defaultCenter,defaultZoom);
    // パン移動とスライダーズームの使える大きなコントロール
    map.addControl(new GLargeMapControl());
    // マップ/サテライト切り替えボタンの表示
    // map.addControl( new GMapTypeControl() );

    // GUI検索クラスのインスタンスを生成
    gui = new GUIsearch();
    gui.init(map);

    // マーカー管理クラスのインスタンスを生成
    gmarkers = new GMarkers();

    // 地図の移動もしくはズームを変更したらcookieに保存
    GEvent.addListener(map, 'moveend',
                       function() {
        var xy = map.getCenter();
        cookie.set("lat",xy.lat());
        cookie.set("lng",xy.lng());
    });
    GEvent.addListener(map, 'zoomend',
                       function() {
        cookie.set("zoom",map.getZoom());
    });
}
/**
 * 都道府県をズームするドロップダウンリストを選択したときのイベント
 *
 * @param selected 選択されたドロップダウンリスト
 */
function zoomParentChanged(selected){
	cookie.set('zoomParent',selected);

	var latlng=selected.split(' ');
	SmartyAjax.update('zoomChild', '/Searchcorp/nextZoom', 'get', 'scs_id='+latlng[0]);
	zoomRect(latlng[1],latlng[2],latlng[3],latlng[4],0);
}
/**
 * 市町村をズームするドロップダウンリストを選択したときのイベント
 *
 * @param selected 選択されたドロップダウンリスト
 */
function zoomChildChanged(selected){
	cookie.set('zoomChild',selected);

	var latlng=selected.split(' ');
	zoomRect(latlng[1],latlng[2],latlng[3],latlng[4],1);
}
/**
 * 矩形指定した範囲が収まる様に中心とズームを設定
 *
 * @param lat1 対角1の緯度
 * @param lng1 対角1の経度
 * @param lat2 対角2の緯度
 * @param lng2 対角2の経度
 * @param zoomLevelOffset ズームレベルのオフセット
 */
function zoomRect(lat1,lng1,lat2,lng2,zoomLevelOffset){
  if ( lat1 == undefined  || lng1 == undefined || lat2 == undefined || lng2 == undefined ){
	  return;
	}
  gb = new GLatLngBounds( new GLatLng(lat1,lng1), new GLatLng(lat2,lng2) );
  map.setCenter( gb.getCenter(), map.getBoundsZoomLevel( gb ) + zoomLevelOffset );
}
/*
 * マウスでクリックした位置に緯度経度を更新する
 *
 * @param lat 緯度
 * @param lng 経度
 */
function clickEventAdd(){
  // マウスを押したときのイベントを設定
  GEvent.addListener(map,'click',function(overlay,point){
    /* コントロールキーのも押されていればそこにマーカーを追加 */
      createMarker(point);
  });
}
/*
 * 会社情報編集画面に表示するマーカーを初期化
 *
 * @param lat 緯度
 * @param lng 経度
 */
function corpEditInit(lat,lng){
  // マーカーの位置
  var position =  new GLatLng(lat,lng);
  // マーカーの位置に中心を設定
  map.setCenter(position,detailZoom)
  // 新しいマーカーを追加してGoogleMapに表示
  createMarker(position);
}

/*
 * 会社情報詳細画面に表示するマーカーを初期化
 *
 * @param lat 緯度
 * @param lng 経度
 */
function corpDetailInit(lat,lng){
  // 中心をマーカーの座標
  var position =  new GLatLng(lat,lng);
  // ズームを調整
  map.setCenter(position,detailZoom);
  // オリジナルポイントを使用する場合
  var icon = null;
  if(isOrgPointOn){
    icon = makeOrgPointIcon();
  }
  // マーカーを表示
  var newMarker = new GMarker(position, icon);
  map.addOverlay(newMarker);
}

/**
 * 指定された位置に新しいマーカーを追加して、テキストボックスの緯度/経度を更新する
 *
 * @param point マーカーを設定する先のGMarker
 */
function createMarker(point){
  // 成功したら地図からマーカーを削除
  map.clearOverlays();

  // オリジナルポイントを使用する場合
  var icon = null;
  if(isOrgPointOn){
    icon = makeOrgPointIcon();
  }
  var newMarker = new GMarker( point,{icon: icon, draggable:true});
  GEvent.addListener(newMarker,"dragend",function(){
    // ドラッグの座標を取得
    var draggedPoint = newMarker.getPoint();
    // 緯度及び経度のテキストボックスの座標を更新
    document.getElementsByName('lat')[0].value=draggedPoint.lat();
    document.getElementsByName('lng')[0].value=draggedPoint.lng();
  });
  map.addOverlay(newMarker);

  // 現在のマーカーの緯度経度をテキストボックスに設定
  document.getElementsByName('lat')[0].value=point.lat();
  document.getElementsByName('lng')[0].value=point.lng();
  // マーカーを返します
  return newMarker;

}
/*
 * 住所から緯度/経度に変換して、GoogleMapの表示を更新
 *
 * @param address 住所
 */
function address2LatLng(address){
  var geocode = new GClientGeocoder();
  // 住所から緯度/経度に変換
  geocode.getLatLng(address, function(point){
    if ( point != null ) {
      var marker = createMarker(point);
      // マーカーの位置に中心を移動
      map.setCenter(point);
      // マーカーが収まる縮尺にします
      gb = new GLatLngBounds( marker.getPoint(), marker.getPoint() );
      map.setCenter( gb.getCenter(), map.getBoundsZoomLevel( gb ) );
    } else {
      // 失敗したらダイアログを表示する
      alert('住所から緯度及び経度を求められませんでした');
    }
  });

}


/**
 * GoogleMapの中心を示す記号を表示
 *
 */
function makeCenterMark(){
  //cross_px：十字の横幅・縦幅（ピクセル）
  //cross_td：十字の太さ（ピクセル）
  //cross_cr：十字の色（スタイルシートと同様の書式）
  var cross_px = 16;
  var cross_td = 2;
  var cross_cr = "black";

  //十字の縦線のエレメントを設定    
  var cross_h_emt =  document.createElement("div");
  //IE用にfontSizeを最小値
  cross_h_emt.style.fontSize = "1px";
  cross_h_emt.style.margin = "0px";
  cross_h_emt.style.padding = "0px";
  cross_h_emt.style.width = cross_px + "px";
  cross_h_emt.style.height = cross_td + "px";
  cross_h_emt.style.backgroundColor = cross_cr;

  //十字の横線のエレメントを設定
  var cross_v_emt =  document.createElement("div");
  cross_v_emt.style.margin = "0px";
  cross_v_emt.style.padding = "0px";
  cross_v_emt.style.width = cross_td+"px";
  cross_v_emt.style.height = cross_px + "px";
  cross_v_emt.style.backgroundColor = cross_cr;

  //十字（縦・横線）の位置を計算
  var MapPX = map.getSize();
  var mycenterHX = MapPX.width  / 2 - cross_px / 2;
  var mycenterHY = MapPX.height / 2 - cross_td / 2;
  var mycenterVX = MapPX.width  / 2 - cross_td / 2;
  var mycenterVY = MapPX.height / 2 - cross_px / 2;

  var mycenter_H = new GSize(mycenterHX,mycenterHY);
  var myposH = new GControlPosition(G_ANCHOR_TOP_LEFT, mycenter_H);
  myposH.apply(cross_h_emt);
  map.getContainer().appendChild(cross_h_emt); 

  var mycenter_V = new GSize(mycenterVX,mycenterVY);
  var myposV = new GControlPosition(G_ANCHOR_TOP_LEFT, mycenter_V);
  myposV.apply(cross_v_emt); 
  map.getContainer().appendChild(cross_v_emt);
}

/**
 * 会社名と住所が入力されたときのイベント
 *
 * 空白ならsubmitのイベントを解除する
 * @return true:会社名もしくは住所が空白でない/false:会社名と住所の方法が空白
 */
function searchFormSubmit(){
  var ret = false;
/*
  var tagLists = document.getElementById('searchForm').getElementsByTagName("input");
  for ( var i=0; i < tagLists.length; i++){
    if ( tagLists[i].value != "" ){
        ret = true;
    }
  }
*/
  var name  = document.getElementById('searchForm').CorporateName.value;
//  var addr  = document.getElementById('searchForm').CorporateAddress.value;
  var oname = document.getElementById('searchForm').oCorporateName.value;
//  var oaddr = document.getElementById('searchForm').oCorporateAddress.value;
//  if(name != "" || addr != "") ret = true;  

  var annVal = document.getElementById('searchForm').announce.value;

  //デフォルトワードなのでなにもしない
  if(name == "会社名もしくは住所を入力") {
    return false;
  }
  //初期状態の入力なしなのでなにもしない
  if(name == "" && annVal == "1"){
    return false;
  }

  if(name != "") {
  	ret = true;
  	document.getElementById('searchForm').announce.value = "0";
  } else {
  	// 検索無とします
  	gmarkers.clearCorpMarker();
  	mouseCursorNormal();
  	document.getElementById("result").innerHTML = "<div class='result-none'> 検索結果はありません。</div><div class='pagelink'> </div>";
  }

//  if(name != oname || addr != oaddr){
  if(name != oname){
	document.getElementById('searchForm').start.value = 1;
	document.getElementById('searchForm').oCorporateName.value = name;
//	document.getElementById('searchForm').oCorporateAddress.value = addr;
  }
  return ret;
}

function rectSearchFormSubmit(){
  return true;
}

/**
 * 検索中は一時的にマウスカーソルを待ち状態にする
 */
function mouseCursorWait(){
  document.getElementById('content').style.cursor  ="wait";
}
/**
 *　マウスカーソルを元に戻す。
 */
function mouseCursorNormal(){
  document.getElementById('content').style.cursor ="default";
}
function gmapGetCenter(){
	center = map.getCenter();
	var str = "(緯度,経度,ZOOM)=(" + center.lat() + "," + center.lng() + "," + map.getZoom()+ ")";
	alert(str);
}

/* ****************************************************************************
 * GmapStreetView class
 * GoogleMapにおいてストリートビューを制御するクラス
 **************************************************************************** */ 
var GmapStreetView={
  gmap:null, // GoogleMapのインスタンス
  streetviewMarker:null,// ストリートビューの表示位置を表すマーカー
  panorama:null, // ストリートビューの路上の風景
  client:null, // ストリートビューのデータがある座標
  lastMarkerLocation : null, // 最後に表示に成功した位置
  overlayInstance:null,// ストリートビューのデータが存在する場所の青い線

  /**
   * 初期化
   */
  init:function(gmap,lat,lng){
    this.gmap = gmap;

    this.client = new GStreetviewClient();
    this.lastMarkerLocation = this.gmap.getCenter();

    // GooleMapに表示する人形のアイコン
    var streetviewIcon= new GIcon(G_DEFAULT_ICON);
    streetviewIcon.image = "http://maps.google.com/intl/en_us/mapfiles/cb/man_arrow-0.png";
    streetviewIcon.transparent = "http://maps.google.com/intl/en_us/mapfiles/cb/man-pick.png";
    streetviewIcon.imageMap = [
        26,13, 30,14, 32,28, 27,28, 28,36, 18,35, 18,27, 16,26,
        16,20, 16,14, 19,13, 22,8
     ];
    streetviewIcon.iconSize = new GSize(49, 52);
    streetviewIcon.iconAnchor = new GPoint(25, 35);
    streetviewIcon.infoWindowAnchor = new GPoint(25, 5);
    this.streetviewMarker = new GMarker(this.lastMarkerLocation, {icon: streetviewIcon, draggable: true});
    map.addOverlay(this.streetviewMarker);

    GEvent.addListener(this.streetviewMarker, "dragend", this.onDragEnd);
    //GEvent.addListener(this.streetviewMarker, "click", this.openPanoramaBubble);
    this.openPanoramaBubble();
    this.toggleOverlay();
  },
  /**
   * ストリートビューを表示する部分
   */
  openPanoramaBubble : function() {

    if ( document.getElementById('pano') == null ){
        // ストリービューを表示するマーカーの吹き出しを描画するdiv
        var panoNode = document.createElement('div');
        panoNode.id='pano';
        panoNode.style.width = '260px';
        panoNode.style.height = '240px';
        document.body.appendChild(panoNode);
    }
    // ストリートビュー自体を表示するdiv
    var contentNode = document.createElement('div');
    contentNode.id = 'pano-content';
    contentNode.style.textAlign = 'center';
    contentNode.style.width = '650px'; // Full screen 時の幅
    contentNode.style.height = '330px'; // Full screen 時の高さ
    contentNode.innerHTML = '';
    document.body.appendChild(contentNode);

    GmapStreetView.streetviewMarker.openInfoWindow(
      document.getElementById('pano')
      // , {maxContent: contentNode, maxTitle: "Full screen"}
    );

    GmapStreetView.panorama = new GStreetviewPanorama(document.getElementById("pano"));
    GmapStreetView.panorama.setLocationAndPOV(GmapStreetView.streetviewMarker.getLatLng(), null);

    // ストリートビューで移動した
    GEvent.addListener(GmapStreetView.panorama, "initialized", GmapStreetView.onNewLocation);
    // カメラの角度が変わった
    GEvent.addListener(GmapStreetView.panorama, "yawchanged", GmapStreetView.onYawChange); 

    var iw = GmapStreetView.gmap.getInfoWindow();
    GEvent.addListener(iw, "maximizeend", function() {
      GmapStreetView.panorama.setContainer(contentNode);  
      window.setTimeout("GmapStreetView.panorama.checkResize()", 5);
    });
  },
  /**
   * ストリートビューのデータが存在する場所を表す青い線の表示を切り替える
   */
  toggleOverlay : function() {
    if (!this.overlayInstance) {
      this.overlayInstance = new GStreetviewOverlay();
      this.gmap.addOverlay(this.overlayInstance);
    } else {
      this.gmap.removeOverlay(this.overlayInstance);
      this.overlayInstance = null;
    }
  },
  /**
   * カメラの方向を変えた時のイベント
   * マーカーのカメラの向きを表すアイコンを変更する
   */
  onYawChange : function(newYaw) {
    var GUY_NUM_ICONS = 16;
    var GUY_ANGULAR_RES = 360/GUY_NUM_ICONS;
    if (newYaw < 0) {
      newYaw += 360;
    }
    guyImageNum = Math.round(newYaw/GUY_ANGULAR_RES) % GUY_NUM_ICONS;
    guyImageUrl = "http://maps.google.com/intl/en_us/mapfiles/cb/man_arrow-" + guyImageNum + ".png";
    GmapStreetView.streetviewMarker.setImage(guyImageUrl);
  },
  /**
   * マーカーの位置を変えたとき
   */
  onNewLocation : function(loc) {
    // 移動量を調べる
    var oldMarkerLoc = GmapStreetView.streetviewMarker.getLatLng();
    var center = GmapStreetView.gmap.getCenter();
    var offsetLat = oldMarkerLoc.lat() - loc.lat;
    var offsetLng = oldMarkerLoc.lng() - loc.lng;

    // 地図の中心を移動
    GmapStreetView.gmap.setCenter(new GLatLng(center.lat() - offsetLat, center.lng() - offsetLng));

    // マーカーを移動
    GmapStreetView.streetviewMarker.setLatLng(loc.latlng);

    // ストリートビューを表示しているinfoWindowの位置を更新
    var infoWin = GmapStreetView.gmap.getInfoWindow();
    var oldInfoWinLoc = infoWin.getPoint();
    infoWin.reset(new GLatLng(oldInfoWinLoc.lat() - offsetLat, oldInfoWinLoc.lng() - offsetLng));

  },
  /**
   * マーカーの位置をドラッグで変更した
   * 新しいマーカーの位置に合わせて、ストリートビューの表示を更新する
   */
  onDragEnd : function() {
    var latlng = GmapStreetView.streetviewMarker.getLatLng();
    if (GmapStreetView.panorama) {
      GmapStreetView.client.getNearestPanorama(latlng, GmapStreetView.onResponse);
   }
  },
  /**
   * ストリービューの更新の実体
   */
  onResponse : function(response) {
    if (response.code != 200) {
      GmapStreetView.streetviewMarker.setLatLng(GmapStreetView.lastMarkerLocation);
    } else {
      var latlng = new GLatLng(response.Location.lat, response.Location.lng);
      GmapStreetView.streetviewMarker.setLatLng(latlng);
      lastMarkerLocation = latlng;
      GmapStreetView.openPanoramaBubble();
    }
  }
}

/* ****************************************************************************
 * GMarkers Class
 * 会社を表示するMarkerを管理するクラス
 **************************************************************************** */ 
var gmarkers;
function GMarkers(){
  this.markers = new Object();
  this.lastZindex = 0;
}
/*
 * マーカーを追加する。
 * 引数marker_alphabetは一致に指定する必要があります。
 * @param lat 緯度
 * @param lng 経度
 * @param marker_alphabet マーカーに表示するアルファベット
 * @param infoContent マーカーをクリックした時に表示するコンテンツ
 */
GMarkers.prototype.addCorpMarker = function (lat,lng,infoContent,marker_alphabet){
  // マーカーにアルファベットの連番を使う
  if(isOrgPointOn){
    var icon = makeOrgPointIcon(letter);
  }else{
    var icon = new GIcon(baseIcon);
    icon.image = this.getIconUrl(marker_alphabet);
  }

  // 新しいマーカーを追加してGoogleMapに表示
  var newMarker = new GMarker( new GLatLng(lat,lng),{icon:icon, zIndexProcess:getLastZindex});
  // マーカーをクリックしたらコンテンツを表示
  GEvent.addListener(newMarker,"click",function(){newMarker.openInfoWindowHtml(infoContent); });
  // マーカーの上にマウスが乗ったら、アクティブ表示
  GEvent.addListener(newMarker,"mouseover",function(){gmarkers.redrawMarker(marker_alphabet);gmarkers.showActiveMarker(marker_alphabet);gmarkers.showAcviveList(marker_alphabet);});
  GEvent.addListener(newMarker,"mouseout",function(){gmarkers.hiddenActiveMarker(marker_alphabet);gmarkers.hiddenAcviveList(marker_alphabet)});

  map.addOverlay(newMarker);

  // 追加したマーカーをPrototype.jsのHashに保存しておく
  var m= {
    "alphabe" : marker_alphabet,
    "lat" : lat,
    "lng" : lng,
    "infoContent": infoContent,
    "marker" : newMarker
  };
  this.markers[marker_alphabet] = m;

  return m;

}
/**
 * GoogleMapのマーカーを指定されたアルファベトから決定する
 *
 * @param marker_alphabet a-zのアルファベット
 *
 * @return マーカーの画像のパス
 */
GMarkers.prototype.getIconUrl=function(marker_alphabet){
  return "/img/marker/default/marker" + marker_alphabet + ".png";
}
/*
 * オリジナルの画像を使ってマーカーを追加します
 * @param lat 緯度
 * @param lng 経度
 * @param imgfile オリジナルの画像へのURL
 */
GMarkers.prototype.addCorpOrgMarker = function(lat,lng,imgfile) {
  // アイコンにオリジナル画像を使います
  var icon = new GIcon(baseIcon);
  icon.image = imgfile;
  // 中心をマーカーの座標
  var position =  new GLatLng(lat,lng);
  // 新しいマーカーを追加してGoogleMapに表示
  var newMarker = new GMarker(position, icon);
  map.addOverlay(newMarker);
  // 追加したマーカーを配列に保存しておく
  var m= {
    "imgfile" : imgfile,
    "lthis.at" : lat,
    "lng" : lng,
    "infoContent": "",
    "marker" : newMarker
  };
  this.markers[imgfile] = m;
  // 全てのマーカーが収まる縮尺にします
  this.putMarkerRange();
}

/**
 * マーカーを再表示する
 * 引数marker_alphabetはaddCorpMarkerの引数marker_alphabetで指定した
 * 値を用いる必要があります
 *
 * @param marker_alphabet マーカーに表示されているアルファベット
 * 
 */
GMarkers.prototype.redrawMarker= function(marker_alphabet){
  if ( !( marker_alphabet in this.markers )){
    return;
  }

  // 既存のマーカーを同じ座標に再設定することで、z-indexを変更する
  // 実装依存な動き？
  var exists_marker = this.markers[marker_alphabet];
  exists_marker["marker"].setLatLng(new GLatLng(exists_marker["lat"],exists_marker["lng"]));

}
/**
 * アクティブなマーカーを目立たせるためにマーカーの画像を差し替える
 */
GMarkers.prototype.showActiveMarker = function(marker_alphabet){
  if ( marker_alphabet in  this.markers){
    this.markers[marker_alphabet]["marker"].setImage("/img/marker/yellow/marker" + marker_alphabet + ".png");
  }
}
/**
 * アクティブなマーカーに連動させて、検索結果一覧を目立たせる
 */
GMarkers.prototype.showAcviveList = function(marker_alphabet){
  if ( ! marker_alphabet in  this.markers){
    return;
  }
  var e = document.getElementById("result-elements-"+marker_alphabet);
  if ( e != null ){
    e.className="onmouse";
  }
}
/**
 * アクティブなマーカーを元に戻す
 */
GMarkers.prototype.hiddenActiveMarker = function(marker_alphabet){
  if (!  marker_alphabet in this.markers){
    return;
  }
  this.markers[marker_alphabet]["marker"].setImage(this.getIconUrl(marker_alphabet));
}
/**
 * アクティブなマーカーに連動させて、検索結果一覧を目立たせる
 */
GMarkers.prototype.hiddenAcviveList = function(marker_alphabet){
  if ( ! marker_alphabet in  this.markers){
    return;
  }
  var e = document.getElementById("result-elements-"+marker_alphabet);
  if ( e != null ){
    e.className="";
  }
}
/**
 * GoogleMap上のマーカーに対してイベントを発動させるよよよ
 */
GMarkers.prototype.eventTrigger = function(marker_alphabet,event_name){
  GEvent.trigger(this.markers[marker_alphabet]["marker"],event_name);
}
/*
 * マーカーがあれば削除
 */
GMarkers.prototype.clearCorpMarker = function (){
  // 矩形選択の範囲を示す線を削除
  gui.clearOverlays()

  if ( this.count() < 1){
    return;
  }
  for ( var m in this.markers ){
    var marker = this.markers[m]
    // マーカーのイベントを削除
    GEvent.clearInstanceListeners(marker["marker"]);
    // マーカーを削除
    map.removeOverlay(marker["marker"]);
  }

  // マーカーの一覧をクリア
  this.markers = new Object();
  // z-indexを初期化
  this.lastZindex = 0;
}
/*
 * 全てのマーカーが収まる様に中心とズームを設定
 */
GMarkers.prototype.putMarkerRange = function (){
  var gb;
  var first = 1;
 
  // マーカーが無ければ何もしない
  if ( this.count() < 1 ){
    return;
  }
  for( var exists_marker in  this.markers){
    var marker = this.markers[exists_marker]["marker"]
    if( first ){
      gb = new GLatLngBounds( marker.getPoint(), marker.getPoint() );
      first = 0;
    }else{
      var point = marker.getPoint();
      gb.extend( point );
    }
  }
  map.setCenter( gb.getCenter(), map.getBoundsZoomLevel( gb ) );
}
/**
 * 現在保持しているマーカーの数を取得する
 */
GMarkers.prototype.count = function(){
  var i=0;
  for ( var v in this.markers){
    i++;
  }
  return i;
}
/**
 * マーカーのZ-indexを取得する
 */
GMarkers.prototype.getLastZindex = function(){
 return this.lastZindex++;
}
/* ****************************************************************************
/**
 * マーカーのZ-indexを取得する
 * GMarkerのzindexprocessのコールバック
 */
function getLastZindex(marker){
 return gmarkers.getLastZindex();
}
/* ****************************************************************************
 * GUIsearch Class
 * GoogleMapを使ったGUI的な検索を司るクラス
 **************************************************************************** */ 
var gui ;
/*
 * GUIsearchクラス　コンストラクタ
 * 
 * メンバー編集の初期化
 */ 
function GUIsearch(){
  
  // クラス全体で参照する変数を初期化
  this.rectSearchBtn = document.getElementById("rectSearchBtn");
  this.mapParentLayer = document.getElementById("mapParent"); // GoogleMapの最上位
  this.rectLayer = document.getElementById("rectLayer"); // 選択用レイヤー
  this.rectChoiceLayer = document.getElementById("rectChoiceLayer"); // 選択範囲
}
GUIsearch.prototype={
  gmap:null, // googleMap
  mapParentLayer:null, // GoogleMapの最上位div
  rectLayer:null, // 矩形検索用のレイヤー
  rectChoiceLayer:null, // 矩形選択の範囲を表すレイヤー
  rectSearchBtn:null, // 矩形検索を開始するボタン
  rectIsChoice:false, // 今選択中？
  rectStartX:0, // 矩形検索の始点 画面上でのX座標
  rectStartY:0, // 矩形検索の始点 画面上でのY座標
  rectEndX:0, // 矩形検索の終点 画面上でのX座標
  rectEndY:0, // 矩形検索の終点 画面上でのY座標
  rectRange:null // 選択範囲を示す線 GPolylineのインスタンス
};
/*
 * googleMapに対する初期化
 */
GUIsearch.prototype.init = function(map){
  this.gmap = map;

  // イベントハンドラ
  // 始点をマウスで押したとき
  GEvent.addDomListener(this.rectLayer,'mousedown',function(e) {
    gui.rectChoiceStart(e);
  });
  // マウスを移動したときのイベント
  GEvent.addDomListener(this.rectLayer,'mousemove',function(e) {
    gui.rectChoiceMove(e);
  });
  // マウスのボタンを離したときのイベント
  GEvent.addDomListener(this.rectLayer,'mouseup',function(e) {
    gui.rectChoiceEnd(e);
  });

};
/*
 * 矩形選択用レイヤーの表示/非表示
 */
GUIsearch.prototype.rectLayerSwitch = function(){
    if ( this.rectLayer.style.visibility == "visible" ){
      this.rectLayer.style.visibility="hidden";
      this.rectSearchBtn.style.backgroundImage = "url(/img/map_ref.png)";
//      this.rectSearchBtn.value ="地図上から検索";
    } else {
      this.rectLayer.style.visibility="visible";
      this.rectSearchBtn.style.backgroundImage = "url(/img/cancel.png)";
//      this.rectSearchBtn.value ="　　　中　　止　　";
      this.rectChoiceInit(); // 矩形選択の範囲を初期化
    }
};

/*
 * 矩形選択範囲を初期化
 */ 
GUIsearch.prototype.rectChoiceInit = function(){
  // 開始/終了座標を0に設定
  this.rectStartX = 0;
  this.rectStartY = 0;
  this.rectEndX = 0;
  this.rectEndY = 0;

  // 矩形選択を始めていない
  this.rectIsChoice = false;

};
/*
 * 矩形選択開始のイベント
 *
 * @param e Eventオブジェクト
 */
GUIsearch.prototype.rectChoiceStart = function(e){

  // 矩形選択を始める
  this.rectIsChoice = true;

  // 画面上でクリックした位置を取得。開始位置として保存
  mousePos = this.getMousePos(e);

  // クリックされた座標を始点及び終点に設定
  this.rectStartX = mousePos.x;
  this.rectStartY = mousePos.y;
  this.rectEndX = mousePos.x;
  this.rectEndY = mousePos.y;

  // 選択範囲を描画
  this.rectChoiceDraw();

};

/*
 * 選択中にマウスを移動させたイベント
 *
 * @param e Eventオブジェクト
 */
GUIsearch.prototype.rectChoiceMove = function(e){

  // 選択中でなければ、何もしない
  if ( !this.rectIsChoice ){
      return;
  }

  // 画面上でクリックした位置を取得。開始位置として保存
  mousePos = this.getMousePos(e);

  // 移動した先を終点に設定
  this.rectEndX = mousePos.x;
  this.rectEndY = mousePos.y;

  // 選択範囲を描画
  this.rectChoiceDraw();

};

/*
 * 選択中にマウスを離したイベント
 *
 * @param e Eventオブジェクト
 */
GUIsearch.prototype.rectChoiceEnd = function(e){

  // 選択中でなければ、何もしない
  if ( !this.rectIsChoice ){
      return;
  }

  // マウスを離した位置を取得
  mousePos = this.getMousePos(e);

  // 離した位置を終点に設定
  this.rectEndX = mousePos.x;
  this.rectEndY = mousePos.y;

  // 選択範囲を表すレイヤーを非表示にする
  this.rectChoiceLayer.style.visibility = "hidden";

  // 始点/終点をフォームに書き込むために、緯度/経度に変換する。小さい方が先になっている
  mapPos = this.PixelToLatLng(this.rectLayer);

  // フォームに書き込み
  document.getElementById('rectSearchForm').start.value = 1;
  document.getElementById("CorporateStartx").value = mapPos.pos1.x;
  document.getElementById("CorporateStarty").value = mapPos.pos1.y;
  document.getElementById("CorporateEndx").value = mapPos.pos2.x;
  document.getElementById("CorporateEndy").value = mapPos.pos2.y;
  // 上でendyを書き込んだ時点で、prototype.jsのイベントが動き出して
  // 非同期で検索が行なわれます

  // 選択終了
  this.rectIsChoice = false;
  this.rectLayerSwitch();
};

/*
 * 画面上の座標を緯度/経度に変換する。
 *
 * @param element GoogleMapを描画しているdivタグのelement
 *
 * @return 2点の座標を入れたオブジェクト。
 */
GUIsearch.prototype.PixelToLatLng = function(element){

  // 始点/終点を小さい方を先にして取得
  var screenPos = this.normalizePoint();
//alert(screenPos.x1+"::"+screenPos.y1+"::"+screenPos.x2+"::"+ screenPos.y2);

  // 始点/終点をレイヤー内の相対座標に変換
  var rectLayerPos = this.getElementPosition(element);

  // 画面上の座標を緯度/経度に変換
  var mapPos1 = this.gmap.fromContainerPixelToLatLng(new GPoint(screenPos.x1 - rectLayerPos.x ,screenPos.y1 - rectLayerPos.y));
  var mapPos2 = this.gmap.fromContainerPixelToLatLng(new GPoint(screenPos.x2 - rectLayerPos.x ,screenPos.y2 - rectLayerPos.y));

  return { pos1:mapPos1, pos2:mapPos2 };
}

/*
 * 選択範囲を表す四角をdivタグを使って描画
 */
GUIsearch.prototype.rectChoiceDraw = function(){
  // XとYのそれぞれの値が小さい方を左上にする
  var pos = this.normalizePoint();

  // 矩形選択レイヤーの画面上での位置を取得
  var rectLayerPos = this.getElementPosition(this.rectLayer);

  // マウスと矩形選択レイヤーの位置から選択範囲レイヤーの左上座標を指定
  this.rectChoiceLayer.style.left = pos.x1 - rectLayerPos.x + "px";
  this.rectChoiceLayer.style.top = pos.y1 - rectLayerPos.y + "px";

  // 開始座標との相対値で高さと幅を指定
  this.rectChoiceLayer.style.height = pos.y2 - pos.y1 + "px";
  this.rectChoiceLayer.style.width = pos.x2 - pos.x1 + "px";

  // 選択範囲レイヤーを表示
  this.rectChoiceLayer.style.visibility = "visible";

};

/*
 * 選択範囲をGPolylineを使って描画
 */
GUIsearch.prototype.rectChoiceGPolylineDraw = function(){

  // 範囲選択を行った際の始点/終点の緯度/経度を使って描画
  var x1 = document.getElementById("CorporateStartx").value;
  var y1 = document.getElementById("CorporateStarty").value;
  var x2 = document.getElementById("CorporateEndx").value;
  var y2 = document.getElementById("CorporateEndy").value;
  var linePoints = new Array( new GLatLng(y1,x1),
                              new GLatLng(y2,x1),
                              new GLatLng(y2,x2),
                              new GLatLng(y1,x2),
                              new GLatLng(y1,x1)
                            );
  // 線のインスタンスを生成
  this.rectRange = new GPolyline(linePoints,"#FF0000", 3, 0.5);
  // GoogleMapに表示
  this.gmap.addOverlay(this.rectRange );

}

/*
 * GooleMapに表示しているマーカーやポリラインなどのオーバーレイを全て消す
 */
GUIsearch.prototype.clearOverlays = function(){
  // 矩形選択の範囲を示す線を削除
  if ( this.rectRange != null ){
    this.gmap.removeOverlay(this.rectRange);
    this.gmap.rectRange = null;
  }
}
/*
 * マウスの画面上での座標を取得する
 * @param e eventオブジェクト
 * @return Object Object.x=上,o.y=左
 */
GUIsearch.prototype.getMousePos = function(e){
 var posX = 0;
 var posY = 0;
 if (!e) var e = window.event;
 if (e.pageX || e.pageY) {
   posX = e.pageX;
   posY = e.pageY;
 } else if (e.clientX || e.clientY){
   posX = e.clientX +
     (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
   posY = e.clientY +
     (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
 }

 return {x: posX, y: posY};

};
 
 /**
 * 特定のエレメントの画面上での座標を取得する
 * @param {Object} 対象エレメント
 * @return {Object} Describes position
 */
GUIsearch.prototype.getElementPosition = function(element) {
 var leftPos = element.offsetLeft; // initialize var to store calculations
 var topPos = element.offsetTop; // initialize var to store calculations
 var parElement = element.offsetParent; // identify first offset parent element
 // 上位エレメントへ遡って画面上での座標を決定する
 while (parElement != null ) { // move up through element hierarchy
   leftPos += parElement.offsetLeft; // appending left offset of each parent
   topPos += parElement.offsetTop;
   parElement = parElement.offsetParent; // until no more offset parents exist
  }
 return {x: leftPos, y: topPos};
};


/*
 * 始点/終点を x1 < x2及びy1 < y2 となるように入れ替えて返却
 *
 * @return {Object} 入れ替えを行なった後の座標
 */
GUIsearch.prototype.normalizePoint = function(){

  if ( this.rectStartX < this.rectEndX ) {
    x1 = this.rectStartX;
    x2 = this.rectEndX;
  }else{
    x2 = this.rectStartX;
    x1 = this.rectEndX;
  }
  if ( this.rectStartY < this.rectEndY ) {
    y1 = this.rectStartY;
    y2 = this.rectEndY;
  }else{
    y2 = this.rectStartY;
    y1 = this.rectEndY;
  }

  return{x1:x1, y1:y1, x2:x2, y2:y2 };
};

