
function getHashVars() {
    var vars = [], hash;
    var hashes = parent.location.hash.slice(parent.location.hash.indexOf('#') + 1).split('&');
    for(var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

var mcOptions = { gridSize: 75, maxZoom: 15, averageCenter: true };
var markerCluster = null; 

var display_mode = 0;
var domain = "";
var infowindow = false;
var fetchmarker_request = false;

function fetchmarkers(NE_Lat,NE_Lng, SW_Lat, SW_Lng, map) {
	if (infowindow == false) {
        
        
        var infoWindowOptions = {
             content: ""
             ,disableAutoPan: true
            ,maxWidth: 25
            ,pixelOffset: new google.maps.Size(10, -20)
            ,zIndex: null
            ,boxStyle: { 
              background: "url('/images/tooltip_handle_left.png') no-repeat"
              ,opacity: 1
              ,width: "8px"
             }
            ,closeBoxMargin: "2px -115px 5px 5px"
            ,closeBoxURL: "http://www.google.com/intl/en_us/mapfiles/close.gif"
            ,infoBoxClearance: new google.maps.Size(1, 1)
            ,isHidden: false
            ,pane: "floatPane"
            ,enableEventPropagation: false

        }
     
        infowindow = new InfoBox(
            infoWindowOptions
        );    
    } else {
        infowindow.close();
    }
      
      
    
    var markers = [];
	var displayed_listings;
	displayed_listings = 0;

    
    //map.clearMarkers();

    //if (markerCluster == null) 
    //    markerCluster = new MarkerClusterer(map, null, mcOptions);
    
    //markerCluster.clearMarkers();
    
	var zoomLevel = map.getZoom();
	var lngSpan = map.getCenter().lng();
	var latSpan = map.getCenter().lat();

	parent.location.hash = "lngSpan=" + lngSpan + "&latSpan=" + latSpan + "&zoom="+zoomLevel;
	setCookie('lngSpan',lngSpan,30);
	setCookie('latSpan',latSpan,30);
	setCookie('mapzoom',zoomLevel,30);

    if (fetchmarker_request != false) { fetchmarker_request.abort(); fetchmarker_request= false; }
    
    $('#resultcount').html("<img src=\"/images/loading.gif\" />");
    
	fetchmarker_request = $.getJSON(domain+'/webservices/get_listings.php', { zoom: zoomLevel, nelat: NE_Lat,nelng: NE_Lng, swlat: SW_Lat,swlng: SW_Lng }, function(data) {
       
        var mapicon = domain+'/images/house.png';
		
        map.clearMarkers();
        
        if (markerCluster == null)
          markerCluster = new MarkerClusterer(map, null, mcOptions);
        //}
        
try
{
        
        markerCluster.clearMarkers();
		var result = '<table cellpadding=0 cellspacing=0 id="resultslist" width="100%">';
        display_results = false;
        display_groups = false;
		
        average_price = 0;
        average_price_cnt = 0;
        average_baths = 0;
        average_baths_cnt = 0;
        average_beds = 0;
        average_beds_cnt = 0;
        average_units = 0;
        average_units_cnt = 0;
        average_size = 0;
        average_size_cnt = 0;
        average_lot_size = 0;
        average_lot_size_cnt = 0;
        
        
        for (var i = 0, dataFeed; dataFeed = data[i]; i++) {
			
            if (dataFeed.type == 2)
                displayed_listings += dataFeed.count;
            else {
                displayed_listings++;
                   
            }
			
			mapicon = domain+'/images/house.png';

			/*
            switch (dataFeed.PTYP) {
			case 'PTYP': mapicon = domain+'/images/resi_map.png'; break;
			case 'COND': mapicon = domain+'/images/condo_map.png'; break;
			case 'MULT': mapicon = domain+'/images/multi_map.png'; break;
			case 'VACL': mapicon = domain+'/images/land_map.png'; break;
			case 'FARM': mapicon = domain+'/images/land_map.png'; break;
			case 'BUSO': mapicon = domain+'/images/condo_map.png'; break;
			default: mapicon = domain+'/images/resi_map.png';
			}
			*/            
            
            if (dataFeed.type == 1) {
            
			    result += '<tr>';
			    result += '<td width=20><img src="' + mapicon + '"/></td>';
			    result += '<td><a href="javascript:propclick_ln(' + dataFeed.listing_number + ');">' + dataFeed.address + '</a></td>';
			    result += '<td width=100>' + dataFeed.city + '</td>';
			    result += '<td width=50>' + dataFeed.bedrooms + '</td>';
			    result += '<td width=50>' + dataFeed.bathrooms + '</td>';
			    result += '<td width=50>' + dataFeed.number_of_units + '</td>';
			    result += '<td width=50>' + dataFeed.sqft + '</td>';
			    result += '<td width=70>' + dataFeed.lot_sqft + '</td>';
			    result += '<td width=100>' + dataFeed.listing_price + '</td>';
			    result += '</tr>';
                display_results = true;
            } else {
                
                display_groups = true;
            }
			var total_rows = dataFeed.total_rows;
			    var latLng = new google.maps.LatLng(dataFeed.lat, dataFeed.lng);
			    var marker = new google.maps.Marker( { position: latLng, title: "ID: " + dataFeed.listing_number + ' Price: $' + dataFeed.listing_price, icon: mapicon } );
            
            marker.setClusterCount(dataFeed.count);
			marker.setMarkerType(dataFeed.type);
            
            marker.setMyMarkerBounds(dataFeed.xmin, dataFeed.ymin, dataFeed.xmax, dataFeed.ymax);
            marker.setMarkerStats(dataFeed.price_min, dataFeed.price_max
                                  , dataFeed.beds_min, dataFeed.beds_max
                                  , dataFeed.baths_min, dataFeed.baths_max
                                  , dataFeed.avg_price
                                  , dataFeed.houses
                                  , dataFeed.other
                                  );
            
            
            if (dataFeed.type == 1) {
                marker.setMap(map);
                marker.setVisible(true);
                dataFeed.bedrooms = addCommas("" + parseFloat(dataFeed.bedrooms).toFixed(2));
                dataFeed.bathrooms = addCommas("" + parseFloat(dataFeed.bathrooms).toFixed(2));
                dataFeed.listing_price = parseFloat(dataFeed.listing_price).toFixed(0); //addCommas("" + 
                dataFeed.number_of_units = parseFloat(dataFeed.number_of_units).toFixed(0); //addCommas("" + 
                
                 if (dataFeed.listing_price > 0) {
                        average_price += parseFloat(dataFeed.listing_price);
                        average_price_cnt++;
                    }
                    if (dataFeed.bathrooms > 0) {
                        average_baths += parseFloat(dataFeed.bathrooms);
                        average_baths_cnt++;
                    }
                    
                    if (dataFeed.bedrooms > 0) {
                        average_beds += parseFloat(dataFeed.bedrooms);
                        average_beds_cnt++;
                    }
                    if (dataFeed.number_of_units > 0) {
                        average_units += dataFeed.number_of_units;
                        average_units_cnt++;
                    }
                    
                    if (dataFeed.sqft > 0) {
                        average_size += parseFloat(dataFeed.sqft);
                        average_size_cnt++;
                    }
                    if (dataFeed.lot_sqft > 0) {
                        average_lot_size += parseFloat(dataFeed.lot_sqft);
                        average_lot_size_cnt++;
                    }
                
                dataFeed.sqft = addCommas("" + parseFloat(dataFeed.sqft).toFixed(0));
                dataFeed.lot_sqft = addCommas("" + parseFloat(dataFeed.lot_sqft).toFixed(0));
                
                
            } else {
                marker.setMyID(i);
                marker.setMyMarkerPolygon(dataFeed.polygon);
            }
            
            
            
            if (dataFeed.type == 1) {
                var ev = new google.maps.event.addListener(marker,'click',propclick(dataFeed));
                var ev2 = new google.maps.event.addListener(marker,'mouseover',makeInfoWindow(marker, dataFeed, mapicon));
                //var ev3 = new google.maps.event.addListener(marker,'mouseout',removeInfoWindow());
            }

			markers.push(marker);
            
            
		}
		if (total_rows > 100 || display_groups) {
			$('#total_reduced').show();
			$('#totalcount').show();
			$('#totalcount').html(number_format(total_rows,0) + ' total listings');
			$('#resultcount').html(displayed_listings + ' displayed');
		} else {
			$('#total_reduced').hide();
			$('#totalcount').hide();
			$('#resultcount').html(displayed_listings + ' results');
		}

        if ( display_results) {
		    result += '</table>';
            $('#bottom_pane').show();
		    $('#mapresults').html(result);
            
            
            $('#statPrice').html((average_price/Math.max(1, average_price_cnt)).toFixed(1));
            $('#statBath').html((average_baths/Math.max(1, average_baths_cnt)).toFixed(1));
            $('#statBeds').html((average_beds/Math.max(1, average_beds_cnt)).toFixed(1));
            $('#statUnits').html((average_units/Math.max(1, average_units_cnt)).toFixed(1));
            
            $('#statSQFT').html((average_size/Math.max(1, average_size_cnt)).toFixed(1));
            $('#statLotSQFT').html((average_lot_size/Math.max(1, average_lot_size_cnt)).toFixed(1));
            
            
        } else {
            $('#bottom_pane').hide();
        }

        if (display_groups)
		    markerCluster.addMarkers(markers, false);
    } catch(err) {
        txt="There was an error on this page.\n\n";
        txt+="Error description: " + err.description + "\n\n";
        txt+="Click OK to continue.\n\n";
        alert(txt);
    }            

	} );
}



function makeInfoWindow(marker, data, mapicon) {
    
    
    return function() { 
        
        if (data.type == 1) {  
        
          var boxText = document.createElement("div");
          boxText.style.cssText = "margin-left: 8px; border: 2px solid black; margin-top: 0px; background: #F6F6F6; padding: 5px; width: 105px; height: 144px;";
          boxText.innerHTML = '<table width="105px" style="font-size: 9pt">'
                + '<tr>'
                + '<td align="center">'+(data.img != "" ? '<img src="' + data.img + '" width="73" height="55" />' : "No Image<BR />Available")+'</td>'
                + "</tr>"
                + '<tr>'
                //+ '<td nowrap align="center"><a href="javascript:propclick_ln(' + data.listing_number + ');">' + data.address + '</a></td>'
                + '<td nowrap align="center">' + (data.community != '' ? data.community.substring(0,13) + ( data.community.length > 16 ? '...' : '') : data.city.substring(0,13) + ( data.city.length > 16 ? '...' : ''))+ '</a></td>'
                + "</tr>"
                + '<tr>'
                + '<td align="center">$'+data.listing_price+',&nbsp;' + number_format(data.bedrooms, 0,'.',',') + "/" + number_format(data.bathrooms, 2,'.',',') + '</td>'
                + "</tr>"
                + '<tr><td align="center">Lot:&nbsp;' + ( data.lot_acres < 1 ? (data.lot_sqft == 0 ? "N/A" : data.lot_sqft  + ' sqft.') : (data.lot_acres) + ' acres' )+ '</td></tr>'
                + (data.PTYP == "MULT" ? '<tr><td align="center">Units:&nbsp;' + data.number_of_units + '</td></tr>' : "")
                + '<tr>'
                + '<td align="center"><a href="javascript:propclick_ln(' + data.listing_number + ');">View Details</a></td>'
                + "</tr>"
            +"</table>";
                
          infowindow.setContent(boxText);
            /*infowindow.setContent("<div class='infowin-content'>"+
                '<table>'
                + '<tr>'
                + '<td width=20><img src="' + mapicon + '"/></td>'
                + "</tr>"
                + '<tr>'
                + '<td nowrap><a href="javascript:propclick_ln(' + data.listing_number + ');">' + data.address + '</a></td>'
                + "</tr>"
                + '<tr>'
                + '<td width=100>City:&nbsp;' + data.city + '</td>'
                + "</tr>"
                + '<tr>'
                + '<td width=50>Bedrooms:&nbsp;' + data.bedrooms + '</td>'
                + "</tr>"
                + '<tr>'
                + '<td width=50>Bathrooms:&nbsp;' + data.bathrooms + '</td>'
                + "</tr>"
                + '<tr>'
                + '<td width=50>Number&nbsp;of&nbsp;units:&nbsp;' + data.number_of_units + '</td>'
                + "</tr>"
                + '<tr>'
                + '<td width=50>SQFT:&nbsp;' + data.sqft + '</td>'
                + "</tr>"
                + '<tr>'
                + '<td width=70>LOT&nbsp;SQFT:&nbsp;' + data.lot_sqft + '</td>'
                + "</tr>"
                + '<tr>'
                + '<td width=100>Price:&nbsp;$' + data.listing_price + '</td>'
                + '</tr>'
            +"</table></div>");*/
        } else {
            infowindow.setContent("<div class='infowin-content'>No details available</div>");
            
        }
        
        infowindow.setPosition(marker.getPosition());
        
        infowindow.set("isdomready", false);
        infowindow.open(map, marker);   
        
    };
}

function removeInfoWindow(marker, data) {
    return function() { 
        if (infowindow != false)
            infowindow.close();   
        
    };
}



function propclick(datafeed) {
    
    if (display_mode == 0) {

	return function() {
		$('#areainfo').hide();
		$('#loading-sidebar').show();
	    $('#loaded-sidebar').css({opacity: 0.5});

		$.ajax({
			url: domain+"/webservices/get_mini_listing.php",
			data: "id=" + datafeed.listing_number,
			dataType: "xml",
 			success: function(xml) {
				$(xml).find('listing').each(function() {
					var photos = $(this).find('photos').text();
					var data = $(this).find('data').text();
					var heading = $(this).find('heading').text();
					$('#heading').show();

					if ($('#slideshow2').height() > 0) $('#slideshow2').height(256);
					
					if (photos.length <= 3) {
						$('#slideshow2').hide(0);
                        $('#nav').hide(0);
                        
					} else {
                        
						$('#slideshow2').show(0);
						$('#nav').show(0);
                        $('#slideshow2').html(photos)
						$('#slideshow2').cycle('destroy');
						$('#slideshow2').cycle({ 
							prev:   '#prev',
				        	next:   '#next',
							fit: 	1,
							startingSlide: 0,
							pager:  '#nav',
							pagerAnchorBuilder: function(idx, slide) { 
									return '<li><a href="#"><img src="' + slide.src + '" width="50" height="50" /></a></li>'; 
							},
				        	timeout: 0
				    	});
					}
					$('#heading').html(heading)
					$('#sidebar').html(data);
					$('#loaded-sidebar').show();
				    $('#loaded-sidebar').css({opacity: 1.0});
					$('#loading-sidebar').hide();

				});
			}
		});
	}
} else {
    
    return function() {
        //$('#areainfo').hide();
        //$('#loading-sidebar').show();
        //$('#loaded-sidebar').css({opacity: 0.5});

        url = domain+"/webservices/get_mini_listing.php?id=" + datafeed.listing_number
        $('#details_link').attr("href", url);
        $('#details_link').click();
        
        return true;
      }
    }
}



function propclick_ln(listing_number) {
	
    if (display_mode == 0) {
    $('#areainfo').hide();
	$('#loading-sidebar').show();

		$.ajax({
			url: domain+"/webservices/get_mini_listing.php",
			data: "id=" + listing_number,
			dataType: "xml",
 			success: function(xml) {
				$(xml).find('listing').each(function() {
					var photos = $(this).find('photos').text();
					var data = $(this).find('data').text();
					var heading = $(this).find('heading').text();
					$('#heading').show();
					
					if (photos.length <= 3) {
						$('#slideshow2').hide();
					} else {
						$('#slideshow2').show();
						$('#slideshow2').html(photos)
						$('#slideshow2').cycle('destroy');
						$('#slideshow2').cycle({ 
							prev:   '#prev',
				        	next:   '#next',
							startingSlide: 0,
							pager:  '#nav',
							pagerAnchorBuilder: function(idx, slide) { 
									return '<li><a href="#"><img src="' + slide.src + '" width="50" height="50" /></a></li>'; 
							},
				        	timeout: 0
				    	});
					}
					$('#heading').html(heading)
					$('#sidebar').html(data)
					$('#loading-sidebar').hide();
				});
			}
		});
    } else {
        url = domain+"/webservices/get_mini_listing.php?id=" + listing_number
        $('#details_link').attr("href", url);
        $('#details_link').click();

    }
}



function SearchSubmit() {
	codeAddress($('#area').val());
	return false;
}



function codeAddress(address) {
	geocoder = new google.maps.Geocoder();
	geocoder.geocode( { 'address': address}, function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			map.setCenter(results[0].geometry.location);
		}
	});
}

function setCookie(c_name,value,expiredays) {
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+expiredays);
	document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}

function getCookie(c_name) {
	if (document.cookie.length>0) {
		c_start=document.cookie.indexOf(c_name + "=");
		if (c_start!=-1) {
			c_start=c_start + c_name.length+1;
			c_end=document.cookie.indexOf(";",c_start);
			if (c_end==-1) c_end=document.cookie.length;
			return unescape(document.cookie.substring(c_start,c_end));
		}
	}
	return "";
}

function setSingleCriteria(field,value) {
	$.ajax({ 
		url: domain+"/webservices/set_search_criteria.php?" + field + "=" + value
		, context: document.body
		, success: function() {
			//
		}	
	});
}

function number_format( number, decimals, dec_point, thousands_sep ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://crestidg.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)    
    // *     example 1: number_format(1234.5678, 2, '.', '');
    // *     returns 1: 1234.57     
 
    var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
    var d = dec_point == undefined ? "," : dec_point;
    var t = thousands_sep == undefined ? "." : thousands_sep, s = n < 0 ? "-" : "";
    var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
    
    return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
}



var Counties = {
    
    request: function(o, obj) {
        var opt = obj;
        opt.options.length = 0;
        opt.options[opt.options.length] = new Option('Loading...', '');

        var stateIds = new Array();
        for(var i = 0; i < o.options.length; i++) {
            if(o.options[i].selected == true) {
                stateIds.push(o.options[i].value);
            }
        }   
        if(stateIds[0] == '') {
            opt.length = 0;
            opt.options[opt.options.length] = new Option('-- All Counties --', '');
            return false;
        }
         
        Ajax.post('/webservices/get_counties_by_state.php', { ids: stateIds.join(', ') }, Counties.response, obj);
        
    },
        
    response: function(r) {
        if(r.failure || !r.json) {
            alert('[state]An error occured!');
            return;
        }

        this.options.length = 0;
        this.options[this.options.length] = new Option('-- All Counties --', '');
        for(var prop in r.json) {
            this.options[this.options.length] = new Option(r.json[prop], prop);
        }
        
    }
            
}


var Cities = {

    request: function(o, obj, state) {
        
        var opt = obj;
        opt.options.length = 0;
        opt.options[opt.options.length] = new Option('Loading...', '');
        
        if(state) {
            Ajax.post(domain+'/webservices/getCitiesByState', { 'state' : state }, Cities.response, obj);
         
        } else {
            var countyIds = new Array();
            for(var i = 0; i < o.options.length; i++) {
                if(o.options[i].selected == true) {
                    countyIds.push(o.options[i].value);
                }
            }
            if(countyIds[0] == '') {
                opt.length = 0;
                opt.options[opt.options.length] = new Option('-- All Cities --', '');
                return false;
            }

            Ajax.post(domain+'/webservices/getCitiesByCounty', { ids: countyIds.join(', ') }, Cities.response, obj);
        }
    },

    response: function(r) {
        if(r.failure || !r.json) {
            alert('[county]An error occured!');
            return;
        }

        this.options.length = 0;
        this.options[this.options.length] = new Option('-- All Cities --', '');
        for(var prop in r.json) {
            this.options[this.options.length] = new Option(r.json[prop], prop);
        }

    }

}

var Communities = {
    request: function(o, obj) {

        var opt = obj;
        opt.options.length = 0;
        opt.options[opt.options.length] = new Option('Loading...', '');

        var cityIds = new Array();
        for(var i = 0; i < o.options.length; i++) {
            if(o.options[i].selected == true) {
                cityIds.push(o.options[i].value);
            }
        }
        if(cityIds[0] == '') {
            opt.length = 0;
            opt.options[opt.options.length] = new Option('-- All Neighborhoods --', '');
            return false;
        }

        Ajax.post(domain+'/webservices/getCommunitiesByCity', { ids: cityIds.join(', ') }, Communities.response, obj);

    },

    response: function(r) {
        if(r.failure || !r.json) {
            alert('[city]An error occured!');
            return;
        }

        this.options.length = 0;
        this.options[this.options.length] = new Option('-- All Neighborhoods --', '');
        for(var prop in r.json) {
            this.options[this.options.length] = new Option(r.json[prop], prop);
        }

    }

}


