var markers = new Array();
var map;
var gLocalSearch;
var baseIcon;
var miniIcon;
var rent_table_html;
var searchEnabled = true;
var center_coordinate_x;
var center_coordinate_y;
var currentCenter;
var minSearchLevel = 10;
var defaultSearchConditions = ""; // default の 検索条件. asp の js で上書きする
var width = [0, 0, 0, 0, 0, 2.1, 1.32, 0.82, 0.52, 0.32,
             0.2, 0.13, 0.085, 0.05, 0.035, 0.02, 0.01, 0.005, 0.003, 0.002, 0.002, 0.002 ];
var room_id;
var room_ids;
var info_html;
var zoom_level;
var buildings;
var keyword;
var address;
var default_coordinate_x = 139.74541783332825;
var default_coordinate_y = 35.65870845033576;
var default_zoom_level = 4;

var placeToPoint = new GClientGeocoder();

function Onload() {
  baseIcon = newBaseIcon();
  miniIcon = newMiniIcon();
  initMap();
  change_rent();
  initialSearch();
}

function initMap(){
  var div = getMapDiv();
  map = new GMap2(div);
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  zoom_level = map.getZoom();
  GEvent.addListener(map, 'moveend', onMoveEnd );
  GEvent.addListener(map, 'zoomend', onZoomEnd );
}

function getMapDiv( ){
  return document.getElementById("map");
}

function initialSearch(){
  if( keyword != "" ){
	document.form_map.keyword.value = keyword;
	localSearch( keyword );
  }else if( address != "" ){
	//document.form_map.address.value = address;
	localSearch( address );
  }else{
    searchEnabled = false;
	map.setCenter(new GLatLng( default_coordinate_y, default_coordinate_x ), default_zoom_level);
    searchEnabled = true;
    zoom_level = map.getZoom();
    currentCenter = map.getCenter();
	center_coordinate_x = currentCenter.lng();
	center_coordinate_y = currentCenter.lat();
	if( default_zoom_level > minSearchLevel ){
	  search_by_point(currentCenter.lng(),currentCenter.lat());
	}
  }
}

function onMoveEnd() {
  currentCenter = map.getCenter();
  if (zoom_level > minSearchLevel){
	if ( ((currentCenter.lng() - center_coordinate_x <= width[zoom_level]) && 
	      (currentCenter.lng() - center_coordinate_x >= width[zoom_level] * -1)) && 
	    ((currentCenter.lat() - center_coordinate_y <= width[zoom_level]) && 
	     (currentCenter.lat() - center_coordinate_y >= width[zoom_level] * -1))) {
           //do nothing
	    // 一定範囲移動しない限り再検索はしない
         } else if( searchEnabled ){
	       search_by_point(currentCenter.lng(),currentCenter.lat());
	       center_coordinate_x = currentCenter.lng();
	       center_coordinate_y = currentCenter.lat();
         }
  }
}

function onZoomEnd(oldZoomLevel, newZoomLevel) {
  zoom_level = newZoomLevel;
  if ( searchEnabled ){
    if (zoom_level > minSearchLevel){
	  currentCenter = map.getCenter();
	  center_coordinate_x = currentCenter.lng();
	  center_coordinate_y = currentCenter.lat();
	  search_by_point(currentCenter.lng(),currentCenter.lat());
    } else {
	  remove_markers();
	  update_rent_table( [ {rooms:["0"]} ] );
    }
  }
}

function localSearch(q) {
  placeToPoint.getLatLng( q, OnLocalSearch );
}

// 検索完了時に呼ばれるコールバック関数
function OnLocalSearch( result ) {
  if( result ){
    searchEnabled = false;
    map.setCenter( result ,15);
    searchEnabled = true;
    zoom_level = 15;
    center_coordinate_x = result.lng();
    center_coordinate_y = result.lat();
    search_by_point( center_coordinate_x, center_coordinate_y );
  }
    // その結果の緯度・経度を地図の中心にセット
    // マーカーを立てたり
}


function search_by_center(){
  var center = map.getCenter();
  search_by_point( center.lng(), center.lat() );
}

function search_by_point(x,y) {
  remove_markers();
  var query_string = make_query_string(x,y, "");
  
  new Ajax.Request( search_url , {
    method:  'get',
	parameters: query_string,

    onSuccess:  function(transport) {
	  if( transport.responseText != "null" ){
		buildings = eval(transport.responseText);
	  }else{
		buildings = new Array();
	  }
	  update_rent_table( buildings );
	  
	  create_markers( buildings );
    }
  });
}

function make_query_string(x,y, station){
  var query_string = "";
  var span, rent_min, rent_max, sta;
  if( document.getElementById("price_span") != null ){
	span = document.getElementById("price_span").value;
	rent_min = document.getElementById("price_rent_min").value;
	rent_max = document.getElementById("price_rent_max").value;
  }else{
	span = rent_min = rent_max = "";
  }
  if(document.getElementById("station")) {
	sta = document.getElementById("station").value;
  }else{
	sta = "";
  }

  var inputs = document.getElementsByTagName('input');
  for( var i = 0; i < inputs.length; i++ ){
    var input = inputs[i];
    if( input.type == "CHECKBOX" || input.type == "checkbox" ){
	  if( input.checked ) query_string +=  input.name +"=1&";
    }
  }

  if( sta != "" )
    query_string += "station=" + encodeURI( sta ) + "&";
  if( x != "" && y != "" ) 
    query_string += "coordinate[x]=" + x + "&coordinate[y]=" + y + "&";
  
  query_string +=  "price[span]=" + span  + "&price[rent_min]=" + rent_min + "&price[rent_max]=" + rent_max + "&coordinate[zoom_level]=" + zoom_level + defaultSearchConditions ;
  
  return query_string;
}

function search_by_station(station) {
  remove_markers();
  var query_string = make_query_string( "", "", station );
  new Ajax.Request( search_url, {
    method:  'get',
	parameters: query_string,
    onSuccess:  function(transport) {
    buildings = eval(transport.responseText);
	if( buildings.length > 0 ){
      searchEnabled = false;
	  map.setCenter(new GLatLng(parseFloat(buildings[0].center_y), parseFloat(buildings[0].center_x)),15);
      searchEnabled = true;
      center_coordinate_x = parseFloat(buildings[0].center_x);
      center_coordinate_y = parseFloat(buildings[0].center_y);
	}
	update_rent_table( buildings );
    create_markers( buildings );
  }
  });
}

function search_by_addr(addr) {
  if (addr.station.value != "") {
	search_by_station(addr.station.value);
  } else if (addr.keyword.value != "") {
	localSearch(addr.keyword.value);
  } else {
	search_by_center();
  }
}

function setcenter(x,y) {
  resarch = "1";
  map.setCenter(new GLatLng(y, x),15);
  zoom_level = 15;
  center_coordinate_x = x;
  center_coordinate_y = y;
  return;
}

function setcenter_no_search(x,y,building_id,has_many_rooms) {
  searchEnabled = false;
  map.panTo(new GLatLng(y, x));
  searchEnabled = true;
  for(i = 0; i < buildings.length; i++){
    if (buildings[i].building_id == building_id){
      if (has_many_rooms == "1"){
  	    buildings[i].marker.openInfoWindowHtml( get_info_html2( buildings[i] ) );
      } else {
  	    buildings[i].marker.openInfoWindowHtml( get_info_html( buildings[i] ) );
      }
    }
  }
  return;
}

function change_rent(){
  if (document.getElementById("price_span") != null){
    var rent_size = 9;
    var span = document.getElementById("price_span").value;
    if (span == "rent_day"){
      var rent_select_array = ["指定しない",
                               "2,000円",
                               "3,000円",
                               "4,000円",
                               "5,000円",
                               "6,000円",
                               "7,000円",
                               "8,000円",
                               "9,000円",
                               "10,000円",]
      for (i=0; i <= rent_size; i++){
        document.getElementById("price_rent_min").options[i].text = rent_select_array[i];
      }
      for (i=0; i <= rent_size; i++){
        document.getElementById("price_rent_max").options[i].text = rent_select_array[i];
      }
    } else if (span == "rent_week"){
      var rent_select_array = ["指定しない",
                               "14,000円",
                               "21,000円",
                               "28,000円",
                               "35,000円",
                               "42,000円",
                               "49,000円",
                               "56,000円",
                               "63,000円",
                               "70,000円",]
      for (i=0; i <= rent_size; i++){
        document.getElementById("price_rent_min").options[i].text = rent_select_array[i];
      }
      for (i=0; i <= rent_size; i++){
        document.getElementById("price_rent_max").options[i].text = rent_select_array[i];
      }
    } else {
      var rent_select_array = ["指定しない",
                               "60,000円",
                               "90,000円",
                               "120,000円",
                               "150,000円",
                               "180,000円",
                               "210,000円",
                               "240,000円",
                               "270,000円",
                               "300,000円",]
      for (i=0; i <= rent_size; i++){
        document.getElementById("price_rent_min").options[i].text = rent_select_array[i];
      }
      for (i=0; i <= rent_size; i++){
        document.getElementById("price_rent_max").options[i].text = rent_select_array[i];
      }

    }
  }
}

function update_rent_table( buildings ){
  var div = rent_table_div();
  if( div == null ){
    return;
  }
  var room_num = 1;
  if (buildings[0].rooms == "0"){
    return  empty_rent_table();
  }
  rent_table_html = rent_table_header();
  buildings.sort( building_comparator );
  for(i = 0; i < buildings.length ;i++){
    var b = buildings[i];
    if ( buildings[i].rooms.length == 1){
      rent_table_html = rent_table_html + rent_table_entry( b, b.rooms[0], room_num, false );
      room_num++;
    } else {
      for(j = 0; j < b.rooms.length ;j++){
        rent_table_html = rent_table_html + rent_table_entry( b, b.rooms[j], room_num, true );
        room_num++;
      }
    }
  }
  rent_table_html = rent_table_html + rent_table_footer();
  div.innerHTML = rent_table_html;
  return rent_table_html;
}

function rent_table_div(){
  return document.getElementById('rent_table_html');
}

function building_comparator( b1, b2 ){
  var center = map.getCenter();
  return (Math.abs(center.lng() - b1.x) + Math.abs(center.lat() - b1.y)) - (Math.abs(center.lng() - b2.x) + Math.abs(center.lat() - b2.y));
}

/**************      rent table html     ***********/
function empty_rent_table(){
  return '<div class="googlemap_list_box_t"><table class="googlemap_list" cellpadding="0" cellspacing="1" border="0"><tr><th class="title">物件名</th><th>賃料1</th><th>賃料2</th></tr></table></div><div class="googlemap_list_box"><table class="googlemap_list" cellpadding="0" cellspacing="1" border="0"><tr class="x"><td class="f11" width="300px">物件はありません</font></td><tr></table></div></div>';
}

function rent_table_header(){
  return '<div class="googlemap_list_box_t"><table class="googlemap_list" cellpadding="0" cellspacing="1" border="0"><tr><th class="title">物件名</th><th>賃料1</th><th>賃料2</th></tr></table></div><div class="googlemap_list_box"><table class="googlemap_list" cellpadding="0" cellspacing="1" border="0">';
}

function rent_table_entry( b, r, room_num, is_grouped ){
  var css = ( room_num % 2 == 1 ? 'x' : 'o');
  var room_id = ( is_grouped ? b.rooms[0].id : r.id );
  var set_center_flag = ( is_grouped ? 1 : 0);

  return '<tr class="' + css + '">' + '<td class="title"><p class="bold"><a href="javascript:setcenter_no_search(' + (parseFloat(b.x)+0.0000016) + ',' + (parseFloat(b.y)+0.0016) + ',' + b.building_id + ',' + set_center_flag + ')">' + r.name + '</a></p><div class="f10">' + r.address + r.house_number + '</div></td><td>' + r.rent_per_day + '<div class="tr">円/日</div>' + ( r.rent_per_some_name == null ? "" : r.rent_per_some + '<div class="tr">' + r.rent_per_some_name + '</div>' ) + '</td><td>' + r.rent_per_day2 + '<div class="tr">円/日</div>' + ( r.rent_per_some_name2 == null ? "" :  r.rent_per_some2 + '<div class="tr">' + r.rent_per_some_name2 + '</div>' ) + '</td></tr>';
}

function rent_table_footer(){
  return '</table></div></div>';
}


/**************      info table      ***********/
var tel_url = "";
var detail_url = "";
var search_url = "";
var inquiry_url = "";
var add_favorite_message = "物件をお気に入りに登録しました";
function get_info_html( building ){
  var r = building.rooms[0];
  var info_html = '<table border="0"><tr><td><img src="' + building.img + '"><div class="infowindow_left"><a href="' + detail_url + r.id + '" target="blank">・この物件の詳細へ</a></div><a href="#'+r.id+'" onClick="add_favorite(' + r.id +');alert(add_favorite_message);return false";><b>・お気に入り追加</b></a></td><td class="info_window_right"><div class="infowindow_name"><a href="' + detail_url + r.id + '" target="blank">' + r.name + '</a></div><div class="infowindow_right">' + r.address + r.house_number + '</div><div class="infowindow_right"><span class="infowindow_span">賃料：</span>' + r.rent_per_day + '円/日～</div><div class="infowindow_right"><span class="infowindow_span">最寄駅：</span>' + r.railway + " " + r.station + '</div><div class="infowindow_right"><span class="infowindow_span">築年数：</span>' + r.age + '</div></td></tr></table>' + owner_info( building );
  return info_html;
}

function get_info_html2( building ){
  var info_html = '<div class="infowindow_multi">';
  for(k = 0; k < building.rooms.length; k++){
    var r = building.rooms[k];
    info_html = info_html + '<div class="infowindow_name_multi"><a href="' + detail_url + r.id + '" target="_blank">物件名: ' + r.name + '</a></div><div class="infowindow_right_multi">住所: ' + r.address + r.house_number + '<br>取り扱い業者: ' + r.company_name + '<br>&nbsp;<a href="#'+r.id+'" onClick="add_favorite(' + r.id +');alert(add_favorite_message);return false";>・お気に入り追加</a>&nbsp;&nbsp;<a href="' + detail_url + r.id + '" target="_blank">・詳細</a></div>'
  }
  info_html += '</div>';
  return info_html;
}

function owner_info( building ){
  var r = building.rooms[0];
  var on_click_inquiry = "window.open('" + inquiry_url + r.id +"', 'test', 'scrollbars=yes,WIDTH=620,HEIGHT=650');return false;";
  var on_click_tel = "window.open('" + tel_url + r.id +"', 'test', 'scrollbars=yes,WIDTH=450,HEIGHT=650');return false;";
  return '<div class="infowindow_q">お問い合わせ</div><div class="infowindow_owner"><div class="infowindow_owner_name">' + r.company_name + '</div><div class="infowindow_owner_tel"><span class="infowindow_span2">お電話：</span><a href="'+ tel_url + r.id + '" target="_blank" onClick="' + on_click_tel + '">お電話番号はこちら</a></div><div class="infowindow_owner_mail"><a href="' + inquiry_url + r.id +  '" target="_blank" onClick="' + on_click_inquiry + '">メールでお問い合わせ</a></div></div>';
}


var hook_for_after_on_load;
// onload の後に実行する。
function afterOnLoad(){
  if( hook_for_after_on_load ){
	hook_for_after_on_load.call();
  }
}
/*******************
 * markar 関連
 * 
 * 
 */


function createMarker(point,building,has_many_rooms) {
    // Create a lettered icon for this point using our icon class
  var icon = newIcon();
  var marker = new GMarker(point, icon);
  GEvent.addListener(marker, "click", function() {
	if (has_many_rooms == "1"){
	  marker.openInfoWindowHtml( get_info_html2(building) );
	} else {
	  marker.openInfoWindowHtml( get_info_html(building) );
	}
  });
  return marker;
}

function newIcon(){
  var icon = null;
  if( zoom_level > 15 ){ 
	icon = new GIcon(baseIcon);
	icon.image = "http://man3.jp/img/man3_icon_a.png";
  }else{
	icon = new GIcon(miniIcon);
	icon.image = "http://man3.jp/img/man3_icon_mini.png";
  }
  return icon;
}


function create_markers( buildings ){
  room_ids = new Array();
  remove_markers();
  markers = new Array();
  if (buildings[0].rooms != "0"){
    for(i = 0; i < buildings.length ;i++){
      room_id = buildings[i].rooms[0].id;
      room_ids.push( room_id );
      var point = new GLatLng(buildings[i].y, buildings[i].x);
      if (buildings[i].rooms.length == 1){
        markers.push( createMarker(point,buildings[i],"0") );
      } else {
        markers.push( createMarker(point,buildings[i],"1") );
      }
      map.addOverlay( markers[markers.length-1] );
      buildings[i].marker = markers[markers.length-1];
    }
  }
}

function remove_markers(){
  for(i = 0; i < markers.length; i++) {
    map.removeOverlay(markers[i]);
  }
}


function newBaseIcon(){
  var icon = new GIcon();
  icon.iconSize = new GSize(58, 46);
  icon.iconAnchor = new GPoint(8, 46);
  icon.infoWindowAnchor = new GPoint(9, 2);
  return icon;
}

function newMiniIcon(){
  var icon = new GIcon();
  icon.iconSize = new GSize( 42, 34 );
  icon.iconAnchor = new GPoint(6, 34);
  icon.infoWindowAnchor = new GPoint(7, 2);
  return icon;
}


