var map;
var mgr;
var gmarkers = []; 
var activeMarker;

function mapInit(){
	map = new GMap2(document.getElementById("map"));
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.setCenter(new GLatLng(33.4709702,-81.9748379),9);
	map.enableDoubleClickZoom();
	
	GEvent.addListener(map, "dragend", updateResults);
	GEvent.addListener(map, "zoomend", updateResults);
	mgr = new MarkerManager(map, { borderPadding: -10 } );
}

function updateResults(){
	closeOverlay();
	$j('#map-message').html('Updating Map...');
	mgr.clearMarkers();
	getResults();
	mgr.refresh();
}

function plotPoints(json)
{
	var point;
	var marker;
	
	mgr.clearMarkers();
	gmarkers = [];
	
	for(var i = 0; i < json.length; i++)
	{
		point = new GLatLng(
			parseFloat(json[i].latitude), 
			parseFloat(json[i].longitude)
		);
		marker = createMarker(point, json[i], i);
		
		gmarkers.push(marker);
		mgr.addMarker(marker, 0, 17);
	}
	
	mgr.refresh();
	
	updateTotalCount(json);
}

function createMarker(point, row, index)
{
	var marker;
	var options;
	var html = createInfoWindowHtml(row);
	var position;
	var title = createMarkerTitle(row);
	var icon = new GIcon();
	
	icon.image = "/wp-content/themes/ep/images/red-tack.png";
	icon.iconSize = new GSize(24, 30);
	icon.iconAnchor = new GPoint(0, 30);
	
	icon.shadow = "/wp-content/themes/ep/images/red-tack-shadow.png";
	icon.shadowSize = new GSize(40, 30);
	
	options = { title: title, icon: icon };
	marker = new GMarker(point, options);
	marker.id = row.mls_number;
	
	GEvent.addListener(marker, "click", function(){
		position = getMarkerPosition(this);
		createOverlay(marker, html);
	});	
	
	return marker;
}

function createInfoWindowHtml(row)
{
	row.markerTitle = createMarkerTitle(row);
	
	row.bathrooms = ((row.fullbaths * 1) + (row.halfbaths * .5));
	
	var template = new Template('\
		<div class="content">\
			<a class="close" onclick="closeOverlay(); return false">close</a>\
			<a href="/property-details/?mlsnumber=#{mls_number}"><img src="#{photo}" alt="#{markerTitle}" /></a>\
			<b class="price">#{price}</b><br />\
			<div class="address">\
				#{streetnumber} #{address}<br />\
				#{city}, #{state}\
			</div>\
			<div class="stats"><b>#{bedrooms}</b> Beds | <b>#{bathrooms}</b> Baths</div>\
			<a href="/property-details/?mlsnumber=#{mls_number}">View Full Details</a>\
		</div>\
	');

	return template.evaluate(row);
}
function createMarkerTitle(row)
{
	row.price = formatCurrency(row.price);
	
	var template = new Template("#{price} - #{streetnumber} #{address}: #{bedrooms} BR, #{fullbaths} BA");
	return template.evaluate(row);
}

function updateTotalCount(json)
{
	$j("#map-message").html(gmarkers.length + ' properties found.');
}

function getResults()
{
	var h;
	var area = $j("#area").val();
	var proptype = $j("#proptype").val();
	var minprice = $j("#minprice").val();
	var maxprice = $j("#maxprice").val();
	var bedrooms = $j("#bedrooms").val();
	var bathrooms = $j("#bathrooms").val();
	var bounds = map.getBounds();
	var swLat = bounds.getSouthWest().lat();
	var swLng = bounds.getSouthWest().lng();
	var neLat = bounds.getNorthEast().lat();
	var neLng = bounds.getNorthEast().lng();
	
	$j.get("/map.php", {area: area, proptype: proptype, minprice: minprice, maxprice: maxprice, bedrooms: bedrooms, bathrooms: bathrooms, swlat: swLat, swlng: swLng, nelat: neLat, nelng: neLng},
	   function(data){
	   	  if (data.error){
	   	  	  $j('#map-message').html(data.error);
	   	  } else {
		      $j('#map-message').html(gmarkers.length + ' properties found.');
		      plotPoints(data);
	   	  }
	   }, "json");
}

function getMarkerPosition(marker){
	var className = "infowindow";
	var center = map.getCenter();
	var latLng = marker.getLatLng();
	var result = {
		className: className,
		offsetX: 0,// horizontal offset
		offsetY: 0 // vertical offset
	};
	
	if(latLng.lat() > center.lat() && latLng.lng() > center.lng()){
		result.className = className + " up-right";
		result.offsetX = 290;
		result.offsetY = 10;
	}
	
	if(latLng.lat() < center.lat() && latLng.lng() < center.lng()){
		result.className = className + " low-left";
		result.offsetX = -5;
		result.offsetY = 185;
	}
	if(latLng.lat() > center.lat() && latLng.lng() < center.lng()){
		result.className = className + " up-left";
		result.offsetX = -5;
		result.offsetY = 5;
	}
	if(latLng.lat() < center.lat() && latLng.lng() > center.lng()){
		result.className = className + " low-right";
		result.offsetX = 290;
		result.offsetY = 185;
	}
	
	return result;
}

function formatCurrency(num){
		var sign;
		var cents;
		
		num = num.toString().replace(/\$|\,/g,'');
		if(isNaN(num)) num = "0";
		
		sign = (num == (num = Math.abs(num)));
		num = Math.floor(num*100+0.50000000001);
		cents = num % 100;
		num = Math.floor(num/100).toString();
		
		if(cents<10) cents = "0" + cents;
		
		for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		{
			num = num.substring(0, num.length-(4*i+3))+','+ num.substring(num.length-(4*i+3));
		}
		
		return (((sign)?'':'-') + '$' + num);
}

function openInfoWindow(id, json)
{
	var position;
	var html;
	
	for(var i = 0; i < gmarkers.length; i++){
		if(gmarkers[i].id == id){
			for(var j = 0; j < json.length; j++){
				if(json[j].mls_number == id){
					html = createInfoWindowHtml(json[j]);
					position = getMarkerPosition(gmarkers[i]);
					createOverlay(gmarkers[i], html);
				}
			}
		}
	}
}

function createOverlay(marker, html){
	var position = getMarkerPosition(marker);
	if(activeMarker) closeOverlay();
	if(!marker.overlay) marker.overlay = new CustomWindow(map, marker, 306, 159, position.className, html, position.offsetX, position.offsetY);
	activeMarker = marker;
	map.addOverlay(marker.overlay);
}

function closeOverlay(){
	if(activeMarker){
		map.removeOverlay(activeMarker.overlay);
		activeMarker.show();
	}
}

function CustomWindow(map, marker, width, height, className, html, anchorOffsetX, anchorOffsetY){
	this.marker = marker;
	this.html = html;
	this.width = width;
	this.height = height;
	this.className = className;
	this.anchorOffsetX = anchorOffsetX;
	this.anchorOffsetY = anchorOffsetY;
	this.map = map;
	
	if(!anchorOffsetX) this.anchorOffsetX = 0;
	if(!anchorOffsetY) this.anchorOffsetY = 0;
}
CustomWindow.prototype = new GOverlay();
CustomWindow.prototype.initialize = function(){
	var div = document.createElement("div");
	div.style.position = "absolute";
	div.style.height = this.height + "px";
	div.style.width = this.width + "px";
	div.className = this.className;
	div.innerHTML = this.html;
	
	div.style.top = (this.map.fromLatLngToDivPixel(this.marker.getPoint()).y - this.anchorOffsetY) + "px";
	div.style.left = (this.map.fromLatLngToDivPixel(this.marker.getPoint()).x - this.anchorOffsetX) + "px";
	
	this.map.getPane(G_MAP_FLOAT_PANE).appendChild(div);
	
	this.div_ = div;
}
CustomWindow.prototype.remove = function(){
	this.div_.parentNode.removeChild(this.div_);
}
CustomWindow.prototype.redraw = function(){
	this.div_.style.top = (this.map.fromLatLngToDivPixel(this.marker.getPoint()).y - this.anchorOffsetY) + "px";
	this.div_.style.left = (this.map.fromLatLngToDivPixel(this.marker.getPoint()).x - this.anchorOffsetX) + "px";
}

function setCenter(address){
	var lat;
	var lng;
	
	switch (address)
	{
	case 'aiken':
		lat = '33.5604168';
		lng = '-81.7195533';
		break;	
	case 'augusta':
		lat = '33.47';
		lng = '-81.975';
		break;	
	case 'north augusta':
		lat = '33.5018026';
		lng = '-81.9651152';
		break;	
	case 'edgefield':
		lat = '33.7895774';
		lng = '-81.9295582';
		break;	
	case 'martinez':
		lat = '33.5173577';
		lng = '-82.0756734';
		break;	
	case 'evans':
		lat = '33.5337464';
		lng = '-82.1306747';
		break;	
	case 'grovetown':
		lat = '33.4504157';
		lng = '-82.1981764';
		break;	
	case 'appling':
		lat = '33.5458333';
		lng = '-82.3158333';
		break;	
	case 'graniteville':
		lat = '33.5636111';
		lng = '-81.8077778';
		break;	
	case 'waynesboro':
		lat = '33.0898731';
		lng = '-82.0156736';
		break;																							
	case 'hephzibah':
		lat = '33.319914';
		lng = '-82.116623';
		break;			
	case 'lincolnton':
		lat = '33.787137';
		lng = '-82.444153';																				
	case 'lincoln':
		lat = '33.787137';
		lng = '-82.444153';																				
	}
	map.setCenter(new GLatLng(lat,lng));
}
