/* Variables
-----------------------------------------------*/
var markerList = [];
var windowOpen = false;
var zoomin = false;
var openMarker;
var holdWindow = false;
var listCfirst = false;

// create the overlay icon
var defaultIcon = new GIcon();
defaultIcon.image = "/theme/myhood/i/pins/red_pin.png";
defaultIcon.iconSize = new GSize(19, 32);
defaultIcon.iconAnchor = new GPoint(6, 20);
defaultIcon.infoWindowAnchor = new GPoint(6, 1);

var clusterIcon = new GIcon(defaultIcon);
clusterIcon.image = "/theme/myhood/i/pins/red_pin_cluster.png";
clusterIcon.iconSize = new GSize(31, 28);

// -----------------------------------------------------------------

function update_markers()
{
  display_markers();
}


function manage_data(pointData){

  // create the point with the given lat/lng
  var point = new GLatLng(pointData.lat, pointData.lng);

  // create the marker
  if(pointData.type == 'm'){
    var marker = create_cat_marker(point, pointData.icon, pointData.width, pointData.height);
  }else{ // end if
    var marker = create_marker(point, pointData.type);
  } // end else


  // setup sidebar links
  // -----------------------------------------------

  if(pointData.type != "m"){
    
    if(!listCfirst && pointData.type == 'c'){
      var listItem2 = document.createElement('li');
      listItem2.id = 'clusterbreak';
      
      listItem2.innerHTML = 'Remaining results are listed within pin clusters:<span id="subline">Please zoom in or refine your search to remove cluster</span>';
      
      if($('listings')) $('listings').appendChild(listItem2);
      
      listCfirst = true;
    } // end if
    

    var listItem = document.createElement('li');
    // add a link to the list item
    var listItemLink = listItem.appendChild(document.createElement('a'));

    var linkText;

    switch(pointData.type){
      case "s":
      // set the href of the listItemLink
      listItemLink.href = "/view/?id=" + pointData.loc_id + "&type=review";
      var linkText = pointData.street;

      var span = document.createElement('span');
      span.innerHTML = '<img src="/theme/myhood/i/ratings/small/rating_' + pointData.overall + '.png" alt="" />';
      listItem.appendChild(span);
      break;
      case "c":
      // set the href of the listItemLink
      listItemLink.href = "/view/?id=0&type=review";
      var linkText = pointData.street;
      break;
    } // end switch

    listItemLink.innerHTML = linkText;

  } // end if

  // -----------------------------------------------

  // by default the list item & marker are not visible
  var visible = false;

  var focusPoint = function() {
    
    // center marker on map
      //map.panTo(point);
      openMarker = pointData.id;
      // a window will be opened by this function, so set the windowOpen var to true
      windowOpen = true;

      if(pointData.type == 'c'){
        var vHTML = '<div class="cluster_infowindow_wrapper">This cluster has ' + pointData.num + ' apartment reviews.<a href="javascript:void(0);" onclick="map.setZoom(map.getZoom() + 2);">Zoom in for locations</a></div>';
        marker.openInfoWindowHtml(vHTML);
      }else{
        var returnmap = map.getCenter();

        var vHTML =  '<div class="review_infowindow_wrapper">'; // wrapper
        vHTML += '<div class="header">';
        vHTML += '<div class="street">' + pointData.street +'</div>';
        vHTML += '</div>';
        vHTML += '<div class="infowin_content_wrapper">';
        vHTML += '<div class="pic">';
        vHTML += '<img src="/user_files/images/thumbs/map/' + pointData.img + '" alt="info window image" />';
        vHTML += '</div>'; // end pic
        vHTML += '<div class="content">';
        vHTML += '<div class="level_one">';
        vHTML += '<div class="has_review"><h3>' + pointData.per_rec + '% recommended</h3><img src="/theme/myhood/i/ratings/small/rating_' + pointData.overall + '.png" alt="' + pointData.overall + '" /> based on ' + pointData.num + ' reviews</div>';
        vHTML += '</div>'; // end level one
        vHTML += '<div class="level_two">';
	//var form_temp = $('options_form');
//	var house_type = form_temp['house_type'];
//	if (house_type[0].checked) {
//	house_type_string = 'apa';
//	}
//	if (house_type[1].checked) {
//	house_type_string = 'roo';
//	}
//	if (house_type[2].checked) {
//	house_type_string = 'sub';
//	}
        vHTML += '<a href="/view/review/?id=' + pointData.loc_id + '&type=reviews&lat=' + returnmap.y + '&lng=' + returnmap.x + '&zoom=' + map.getZoom() + '&page=reviews&' + Form.serialize('options_form') + '" title="Read Review">Read Reviews</a>';
        vHTML += '<a href="/reviews/write/?id=' + pointData.loc_id + '&type=reviews" title="Write Review">Write Review</a>';
        vHTML += '</div>'; // end level two
        vHTML += '</div>'; // end content
        vHTML += '</div>'; // end info win content wrapper
        vHTML += '</div>'; // end wrapper

        // open the window
        marker.openInfoWindowHtml(vHTML);
      }
    
    return false;
    }

  pointData.show = function() {
    if (!visible) {
      // add listItem to sidebar listing
      if($('listings')) $('listings').appendChild(listItem);
      // add marker to map
      map.addOverlay(marker);
      // marker is visible
      visible = true;
    }
  }

  pointData.hide = function() {
    if (visible) {
      // remove listItem from sidebar listing
      if($('listings')) $('listings').removeChild(listItem);
      // remove marker from map
      map.removeOverlay(marker);
      // marker is not visible
      visible = false;
    }
  }
  
  var openTool = function() {
    if(windowOpen != true){
      var tooltipInfo = pointData.street;
      marker.openToolTip(tooltipInfo);
    }
  }
  
  var closeTool = function() {
    marker.closeToolTip();
  }

  if(pointData.type != 'm'){
    
    listItemLink.onclick = focusPoint;
    
    // listen for click of marker & call focusPoint function
    GEvent.addListener(marker, 'click', focusPoint);
    
    // listen for mouseover of marker & call highLightListItem function
    GEvent.addListener(marker, 'mouseover', openTool);
    // listen for mouseout of marker & call removeHighlightListItem function
    GEvent.addListener(marker, 'mouseout', closeTool);
    // listen for mouseover of sidebar item & call openTool function
    listItemLink.onmouseover = openTool;
    // listen for mouseout of sidebar item & call closeTool function
    listItemLink.onmouseout = closeTool;
    
    pointData.show();
  }else{
    var openLocTool = function() {
      if(windowOpen != true){
        var tooltipInfo = pointData.cat_parent + ' - ' + pointData.cat_name;
        marker.openToolTip(tooltipInfo);
      }
    }
  
    var closeLocTool = function() {
      marker.closeToolTip();
    }
    
    // listen for mouseover of marker & call highLightListItem function
    GEvent.addListener(marker, 'mouseover', openLocTool);
    // listen for mouseout of marker & call removeHighlightListItem function
    GEvent.addListener(marker, 'mouseout', closeLocTool);
    map.addOverlay(marker);
  }

  markerList[pointData.id] = marker;

} // end manage_cats function



function display_markers()
{
  var form = Form.serialize('options_form');
  
  listCfirst = false;
  
  map.clearOverlays();

  // get the sidebar list
  var sideList = $('listings');
  // clear the sidebar list
  while (sideList.firstChild){sideList.removeChild(sideList.firstChild);};

  // Get the current bounds of the visible area.
  var bounds = map.getBounds();

  // show loading
  myhood.addLoading();

  // Expand the bounds a little, so things look smoother when scrolling
  // by small amounts.
  var sw = bounds.getSouthWest();
  var ne = bounds.getNorthEast();
  var dx = ne.lng() - sw.lng();
  var dy = ne.lat() - sw.lat();
  dx *= 0.10;
  dy *= 0.10;
  bounds = new GLatLngBounds(
  new GLatLng( sw.lat() - dy, sw.lng() - dx ),
  new GLatLng( ne.lat() + dy, ne.lng() + dx ) );
  var southWest = bounds.getSouthWest();
  var northEast = bounds.getNorthEast();
  var zoom = map.getZoom();
  var getVars = '&ne=' + northEast.toUrlValue()
  + '&sw=' + southWest.toUrlValue() + '&page=review&zoom=' + zoom + '&blank=1&' + form;

  var params = 'action=get_points';
  params += getVars;
  //GLog.writeUrl('/scripts/map_functions.php' + params);
  function handlerFunc(t){
    var points,lat,lng,icon;
    var post = t.responseText;
    //GLog.writeHtml(post);
    eval(post);

    var thecount = 0;
    for(id in points){
      //manage_data(points[id]);
      //GLog.write(points[id].type);

      if(points[id].type == 's'){
        thecount++;
      }

      if(points[id].type == 'c'){
        thecount = thecount + Number(points[id].num);
      }

      manage_data(points[id]);

    } // end for

    if($('listings_header')){
      $('listings_header').innerHTML = '<h3>Results <span>' + thecount + '</span></h3>';
    }
    if($('panel1_results')){
      $('panel1_results').innerHTML = '<h3>Results <span>' + thecount + '</span></h3>';
    }
    // hide loading
    myhood.removeLoading();
  }
  function errFunc(){}
  new Ajax.Request('/scripts/reviews/map_functions.php', {method:'post', postBody:params, onSuccess:handlerFunc, onFailure:errFunc});
}



function setup_search()
{
  var fieldsets = document.getElementsByTagName('div');
  var level_one,level_two,level_three,level_four,level_five,level_six;
  forEach(fieldsets,function(object) {
    if(object.className == 'options')
    {
      forEach(fieldsets,function(object) {
        switch(object.className)
        {
          case "level_one":
          level_one = object;
          break;
          case "level_two":
          level_two = object;
          break;
          case "level_three":
          level_three = object;
          break;
          case "level_four":
          level_four = object;
          break;
          case "level_five":
          level_five = object;
          break;
          default:
          break;
        }
      });
    }
  });

  var level_one_inputs = level_one.getElementsByTagName('select');
  var level_two_inputs = level_two.getElementsByTagName('select');
  var level_three_inputs = level_three.getElementsByTagName('select');
  var level_four_inputs = level_four.getElementsByTagName('select');
  var level_five_inputs = level_five.getElementsByTagName('select');

  // type of housing
  forEach(level_one_inputs,function(object) {
    addEvent(object,'change',update_markers);
  });
  // price
  forEach(level_two_inputs,function(object) {
    addEvent(object,'change',update_markers);
  });
  // bedrooms
  forEach(level_three_inputs,function(object) {
    addEvent(object,'change',update_markers);
  });
  // amenities
  forEach(level_four_inputs,function(object) {
    addEvent(object,'change',update_markers);
  });
  // pets
  forEach(level_five_inputs,function(object) {
    addEvent(object,'change',update_markers);
  });
}

var reinit = function(){
  
  var panel_title_2 = $('panel2').getElementsByTagName('h5');
  var title = panel_title_2[0];
  
  accordion(title);
  
  return false;
}

// -----------------------------------------------------------------

/* init function - setup map */
function init(){
  // check if browser is compatible with google maps
  if (GBrowserIsCompatible()) {
    // browser is compatible
    // setup the map using the variables set in myhood.js
    map = new GMap2($("map"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.addControl(new GOverviewMapControl());
    map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom);
    
    if(map.enableScrollWheelZoom){
      map.enableScrollWheelZoom();
    } // available in upcoming api releases
    
     /*
    var ads = new GAdsManager( map , 'pub-7043911906218941', {maxAdsOnMap:10} )
    ads.enable(); 
    */

    // setup location bar effects
    myhood.initLocationSearch($('search'));

    // hide loading by default
    myhood.removeLoading();

    // needed for homepage search
    check_for_home_search('review');

    setup_search();
    
    if($('viewresultsbutton')){
      $('viewresultsbutton').onclick = reinit;
    } // end if

    setup_search_form('review');

    // setup switch link under listings
    myhood.update_search_link($('search_link'), '/rents/');

    // add listener for info window open
    GEvent.addListener(map,'infowindowopen',function() {
      holdWindow = true;
      //GLog.write('holdwindow');
    });
    // add listener for info window close
    GEvent.addListener(map,'infowindowclose',function() {
      holdWindow = false;
      //updateMarkers();
      openMarker = "";
    });
    // add listener for end of map zoom
    GEvent.addListener(map,'zoomend',function() {
      myhood.update_search_link($('search_link'), '/rents/');
      display_markers();
      zoomin = true;

    });
    // add listener for end of map move
    GEvent.addListener(map,'moveend',function() {
      //GLog.write(holdWindow + ' ' + zoomin);
      if(holdWindow == false && zoomin == false){
        //GLog.write('update');
        display_markers();
        myhood.update_search_link($('search_link'), '/rents/');
      }
      zoomin = false;
    });

  }else{ // end if
    // browser not compatible
    alert('Your browser is not compatible with google maps!');
  } // end else
} // end init function


// initiate accordian
addEvent(window, "load", function(){accordion_init('panels');});
// initiate map scripts
addEvent(window,'load',init);
//clear cache
addEvent(window,'unload',Event.unloadCache);
