function createMarker(point, html) {
  var icon = new GIcon(G_DEFAULT_ICON);
  icon.image = "/images/marker.png";
  icon.flat = true;
  icon.shadowSize = new GSize(0, 0);

  var marker = new GMarker(point, {icon: icon});

  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });
  return marker;
}

function doPartnerSearch()
{
    $(".partnerlist").animate({left:"0px"},600);

    $(".partnerlist").empty().html('<ul><li class="loading"><img src="/images/ajax-loader.gif" /></li></ul>');

    $.post('/async/getpartners',
    {search : $("#tbpartnersearch").val()}
    ,function(resp)
    {
	$(".partnerlist").empty();
	$(".partnerlist").css({left: "0px",overflow:"hidden",width:"9000px"});
	var georange = {};
	georange.lat = {};
	georange.lat.max = -999.999;
	georange.lat.min = 999.999;
	georange.lng = {};
	georange.lng.max = -999.999;
	georange.lng.min = 999.999;
	markers = [];
	map.clearOverlays();
	for(var i = 0; i < resp.length; i++)
        {
	    if (i % 5 == 0)
	    {
		if (i != 0)
		    $(".partnerlist").append(ulList);
		var ulList = $("<ul></ul>");
	    }
	    ulList.append(getPartnerTemplate(resp[i]));

	    if (resp[i].geoaddress.split == undefined)
	    {
		//TODO: do we just drop bad geocodes?
	    }
	    else
	    {
		var geoaddress = resp[i].geoaddress.split(",");
		if (parseFloat(geoaddress[2]) >= georange.lat.max)
		    georange.lat.max = parseFloat(geoaddress[2]);
		if (parseFloat(geoaddress[2]) <= georange.lat.min)
		    georange.lat.min = parseFloat(geoaddress[2]);

		if (parseFloat(geoaddress[3]) >= georange.lng.max)
		    georange.lng.max = parseFloat(geoaddress[3]);
		if (parseFloat(geoaddress[3]) <= georange.lng.min)
		    georange.lng.min = parseFloat(geoaddress[3]);
		var dto = resp[i];

		markers.push([geoaddress[2],geoaddress[3],'<div class="mapResult"><p><strong>'+dto.business_name+'</strong></p><p>'+dto.city+', '+dto.state+'</p><p><a href=\"/partners/request-a-partner?partner='+dto.business_name+'\">Request Partner »</a></p></div>']);
	    }
        }
	$(".partnerlist").append(ulList);


	addPaginator();

	// we estimate a bit of zoom, but this could be better by comparing the min and max
	if (georange.lat.max == -999.999 || georange.lng.max == -999.999)
	    return noResultsFound();
	map.setCenter(new GLatLng((georange.lat.max + georange.lat.min) /2 ,(georange.lng.max + georange.lng.min) /2), getZoom(georange),G_NORMAL_MAP);
	setTimeout(function(){
	    markerInterval = setInterval(loadmarkers,10);
	},2300);
    },'json');
}
function addPaginator()
{
    var pages = $(".partnerlist ul");
    if (pages.length <= 1)
	return;

    var i = 0;
    pages.each(function()
    {

	if (i == 0)
	    $(this).append('<li class="paginator"><a class="shownext" href="#">Next</a></li>');
	else if (i+1 == pages.length)
	    $(this).append('<li class="paginator"><a class="showprevious" href="#">Previous</a></li>');
	else
	    $(this).append('<li class="paginator"><a class="showprevious" href="#">Previous</a> | <a class="shownext" href="#">Next</a></li>');
	i++;
    })
    $(".partnerlist .shownext").click(function()
    {
	var leftSlide = (parseInt($(".partnerlist").css('left')) - 232)+"px";
	$(".partnerlist").animate({left:leftSlide},600);
	return false;
    })
    $(".partnerlist .showprevious").click(function()
    {
	var leftSlide = (parseInt($(".partnerlist").css('left')) + 232)+"px";
	$(".partnerlist").animate({left:leftSlide},600);
	return false;
    })
}
function noResultsFound()
{
    $(".partnerlist").append('<ul><li><p class="title">Oops!</p><p>No results found, but <a href="/partners/request-a-partner">click here and we\'ll find one for you.</a></p></li></ul>');
    markers = [];
    initialize();
    setTimeout(function(){ markerInterval = setInterval(loadmarkers,10); },2300);
}
function getZoom(georange)
{
    if ((georange.lat.max - georange.lat.min) < 0.5 || (georange.lng.max - georange.lng.min) < 0.5 )
	return 11;
    if ((georange.lat.max - georange.lat.min) < 0.9 || (georange.lng.max - georange.lng.min) < 0.9 )
	return 10;
    if ((georange.lat.max - georange.lat.min) < 1 || (georange.lng.max - georange.lng.min) < 1 )
	return 8;
    if ((georange.lat.max - georange.lat.min) < 5 || (georange.lng.max - georange.lng.min) < 5 )
	return 7;
    if ((georange.lat.max - georange.lat.min) < 10 || (georange.lng.max - georange.lng.min) < 10 )
	return 6;
    return 3;
}
function getPartnerTemplate(dto)
{
   return '<li><p class="title"><a href="/partners/request-a-partner?partner='+dto.business_name+'">'+dto.business_name+'</a></p><p>'+dto.city+', '+dto.state+' – <a href="/partners/request-a-partner?partner='+dto.business_name+'">Request »</a></p></li>';
}
function loadmarkers()
{   // if this is our approach, we should clean this up
    for(var i = 0; i < 10; i++)
    {
	if (markers.length == 0) {	clearInterval(markerInterval); 	return; }
	var markerParams = markers.pop();
	map.addOverlay(createMarker(new GLatLng(markerParams[0],markerParams[1]),markerParams[2]));

    }
}
function initialize()
{
  if (GBrowserIsCompatible()) {
   map = new GMap2(document.getElementById("map"));
   map.addControl(new GLargeMapControl());
   map.setCenter(new GLatLng(39.065392,-95.712891), 4,G_NORMAL_MAP);
      }
}
