var googleMap;

var qsParm = new Array(); // query string params

   function qs() {
      var query = window.location.search.substring(1);
      var parms = query.split('&');
      for (var i=0; i<parms.length; i++) {
	var pos = parms[i].indexOf('=');
	if (pos > 0) {
	  var key = parms[i].substring(0,pos);
	  var val = parms[i].substring(pos+1);
	  qsParm[key] = val;
	}
      }
   }

   function formatForBox( listings, zip ) {     
     var htmlRet = "<ul class='grayArrowList'>";
     if( listings.rec.length == 0 ) {
        htmlRet += "No listings found."
     } else {
       $.each( listings.rec, function( i, listing ) {
            if( i < 8 ) {
                htmlRet +=  ("<li>$"+ (listing.pricecode/1000000).toFixed(1) + "M  - "+listing.city+", MA</li>" );
            }
          }
       );
     }
     return (htmlRet + "</ul>");
   }

   function formatWithDetails( listings, zip ) {     
     var htmlRet;
     if( zip == 'most_expensive' ) {
        htmlRet = "<h2>Most expensive recent home sales</h2><ul class='grayArrowList'>";
     } else {
        htmlRet = "<h2>Recent $1M+ home sales near zip "+formatZip(zip)+"</h2><ul class='grayArrowList'>";
     }
     if( listings.rec.length == 0 ) {
        htmlRet += "No listings for zip code '"+zip+"' are currently available."
     } else {
        $.each( listings.rec, function( i, listing ) {
          htmlInner = (""+listing.address+", "+listing.city);
          htmlInner += (" - $"+ (listing.pricecode/1000000).toFixed(2) + " M</li>" );
          htmlRet += sideBar(htmlInner, i);
          }
        );
     }
     return (htmlRet + "</ul>");
   }

   function formatZip( zip ) {
      if( zip.length < 5 ) {
          while(zip.length < 5 ) zip += "x";
      }
      return zip;
   }

	function sideBar(line, j){
		var txt = "<li><a href='#' onclick='GEvent.trigger(marker["+j+"],\"click\")' ";
		txt += "onmouseover='GEvent.trigger(marker["+j+"],\"mouseover\")' ";
		txt += "onmouseout='GEvent.trigger(marker["+j+"],\"mouseout\")' >";
		txt += (line + "</a></li>");
		return txt;
	}

      // ================================================================
      // === process the JSON file ===


   function displayLocalListings( myzip, useMap ) {
   
       GDownloadUrl("/datasrv/cache/homesales/"+myzip+".json",
		    function(doc, responseCode ) {

 // To ensure against HTTP errors that result in null or bad data,
  // check that status code is equal to 200 before processing the data
	  if(responseCode == 200) {
	       var local_listings = eval('(' + doc + ')');//getRecentSalesList( myzip, 5 );
	       $( '#homeListings_box' ).html( formatForBox(local_listings, myzip) );
	       $( '#homeListings' ).html( formatWithDetails(local_listings, myzip) );
	       if( useMap ) setMapMarkers( local_listings );
	  } else if(responseCode == -1) {
	    //alert("Request for data timed out.  Please try again later.");
	    $('#homeListings_box' ).html("Data request timed out. Please try later.");
	    $('#homeListings').html("Data request timed out. Please try later.");
            removeMapMarkers();
	  } else { 
	    $('#homeListings_box').html("No listings for zip code '"+myzip+"' are currently available.");
	    $('#homeListings').html("No listings for zip code '"+myzip+"' are currently available.");
	    if( useMap ) clearMap();
	  }
      } )

   } 

var marker = [];
var nMarkers = 0;
var zipmarker = null;

var bounds = new GLatLngBounds();
var markerImage = [
	G_DEFAULT_ICON.image,
	"http://maps.google.com/mapfiles/dd-start.png",
	"http://maps.google.com/mapfiles/dd-end.png",
	"http://esa.ilmari.googlepages.com/markeryellow.png",//3 yellow
	"http://www.google.com/uds/samples/places/temp_marker.png"//4 turquoise
];

function removeMapMarkers() {
	for( i=0; i<nMarkers; ++i ) {
		if( marker[i] ) {
		   googleMap.removeOverlay( marker[i] );
	    }
	}
	if( zipmarker ) {
	  googleMap.removeOverlay( zipmarker );
	  zipmarker = null;
	}
	nMarkers = 0;
}

function ZMarker(point,info,imInd,i,visited) {
   var tooltip = "Click for details";
   if( i >= nMarkers ) nMarkers = i+1;
   
   marker[i] = new GMarker(point,{title:tooltip});
   googleMap.addOverlay(marker[i]);
   marker[i].setImage(markerImage[imInd]);
   marker[i].visited = visited;

   GEvent.addListener(marker[i], "click", function() {
      marker[i].openInfoWindowHtml(info);
      marker[i].visited = true;
      GEvent.trigger(marker[i],"mouseout");
   });

	GEvent.addListener(marker[i],'mouseover',function(){
	   marker[i].setImage(markerImage[3]);
	   document.getElementById("homeListings").getElementsByTagName("a")[i].style.background ="yellow";
	});
	
	GEvent.addListener(marker[i],'mouseout',function(){
		if(marker[i].visited){
			marker[i].setImage(markerImage[4]);
			document.getElementById("homeListings").getElementsByTagName("a")[i].style.color ="gray";
		}else{
			marker[i].setImage(markerImage[0]);
			//document.getElementById("homeListings").getElementsByTagName("a")[i].style.color ="black";
		}
		document.getElementById("homeListings").getElementsByTagName("a")[i].style.background ="#EEEEEE";
	});
	
///	GEvent.addListener(marker[i], "infowindowclose", function() {
///		googleMap.removeOverlay(marker[i]);
///		ZMarker(point,label, 4,i,marker[i].visited);
///	})
}

	function formatListingInfo( listing ) {
	   var millions = (listing.pricecode/1000000);
	   var thousands = (listing.pricecode/1000);
	   var html = "";
	   html += "<h1>$"+(listing.pricecode/1000000).toFixed(2)+" Million"+"</h1>";
	   html += "<br/><b>"+listing.address+", </b>"
           html += "<br/><b>"+listing.city+", "+listing.state+" "+listing.zip+"</b>"
	   html += "<br/>"
	   html += "<br/>Bedrooms: "+listing.bedrooms+" Bathrooms: "+listing.bathrooms
	   html += "<br/>Lot size: "+listing.lotsize+" sq. ft."
	   html += "<br/>Year built: "+listing.yearbuilt
	   return html;
	}

    function clearMap() {
      var map = googleMap;
      removeMapMarkers();
      var bounds = new GLatLngBounds();
      map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds));
    }

    function setMapMarkers( local_listings ) {

        removeMapMarkers();

        var map = googleMap;
	    var bounds = new GLatLngBounds();
	    var zippoint = null;

		// "tiny" marker icon
		var tiny = new GIcon();
		tiny.image = "http://labs.google.com/ridefinder/images/mm_20_green.png";
		tiny.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
		tiny.iconSize = new GSize(12, 20);
		tiny.shadowSize = new GSize(22, 20);
		tiny.iconAnchor = new GPoint(6, 20);
		tiny.infoWindowAnchor = new GPoint(5, 1);
	
        if( local_listings.lat && local_listings.lon ) {
		    zippoint = new GLatLng(local_listings.lat,local_listings.lon);

            zipmarker = new GMarker(zippoint,{icon:tiny, title:("zip "+local_listings.zip)});
            map.addOverlay(zipmarker);
        }
	
        $.each( local_listings.rec, function( i, listing ) {
             var point = new GLatLng(listing.lat,listing.lon);
     ///   GLog.write( "Lat="+listing.lat+" Lon="+listing.lon);
             bounds.extend(point);

             var titletxt = formatListingInfo( listing );
             ZMarker(point,titletxt,0,i,null);

        });
		// Fit and zoom out one 'click'
		map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds));
		if( zippoint ) {
			map.zoomOut();//map.zoomOut();            
		}
    }

  //document.ready function -- runs when DOM is loaded
   $(function(){

     var useGoogleMaps = GBrowserIsCompatible();

     $("#zipSearchGoButton").click(function(e){
       // send request
        var myzip =  $("#searchZip").val();

        if( ! myzip || myzip.length < 5 ) {
          alert( "please enter a valid zip code" );
          //myzip = "02481";
        } else {
          Set_Cookie('ll.local_zip', myzip, 30 );
          displayLocalListings( myzip, useGoogleMaps );
        }
        // stop normal submit
        return false;
     });

     // code related to Google Map API
     if (useGoogleMaps) {


        var zipLatLng = new GLatLng( 42.294546, -71.299201);
        var map = new GMap2(document.getElementById("map"));
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.setCenter(zipLatLng, 12);
        map.setMapType(G_HYBRID_MAP);
        googleMap = map;

		//overview
		var ovSize=new GSize(160, 120)
		var ovMap=new GOverviewMapControl(ovSize);
		map.addControl(ovMap);
		var mini=ovMap.getOverviewMap();

        // hide map controls while mouse is not over the map
        map.hideControls();
        ////'mouseover' listener shows controls
        GEvent.addListener( map, "mouseover", function(){ map.showControls();} );
        ////'mouseout' listener hides controls
        GEvent.addListener( map, "mouseout", function(){ map.hideControls();} );

     }

//check whether user has previously specified a zip code
     qsParm['zip'] = null;
     qs();

     var myzip;
     if( qsParm['zip'] && qsParm['zip'].length >= 5 ) {
       myzip = qsParm['zip'] ;
     } else {
       myzip = Get_Cookie('ll.local_zip');
     }
     if( myzip && myzip.length > 4 ) {
         if( myzip == 'most_expensive' ) {
             $("#searchZip").val( '' );
         } else {
             $("#searchZip").val( myzip );
         }
         displayLocalListings( myzip, useGoogleMaps );
     } else {
        $("#searchZip").val("");
     }

   })

