﻿// JQuery and Google Map API
var Map;
var GeoCoder;
 
$(document).ready(function(){whereToBuyInit();});

function whereToBuyInit()
{
    //$("#GoogleMap").css("display","none");
    
    if (GBrowserIsCompatible()) {
        Map = new GMap2(document.getElementById("GoogleMap"));
        Map.setCenter(new GLatLng(37.4419, -92.1419), 3);
        Map.addControl(new GSmallMapControl());
        Map.addControl(new GMapTypeControl());
      }
    
    $("#Zipcode").focus(function(){if($(this).val()=="Enter Zip")$(this).val("");});
    $("#Zipcode").blur(function(){if($(this).val()=="")$(this).val("Enter Zip");});  
    
    $("#PanoBTN").hover
    (
        function()
        {
            var src=$(this).attr("src").replace("-default.jpg","-over.jpg");
            $(this).attr("src",src);   
        }
        ,
        function()
        {

            var src=$(this).attr("src").replace("-over.jpg","-default.jpg")
            $(this).attr("src",src);

        }
    ); 
}

var LastZip="";
var LastCat="";

function Go()
{
    var Cat=$("#CategorySelect").val();
    if(Cat=="")
    {
        alert("Please select a product category.")
        return;
    }
    
    if($("#Zipcode").val()==LastZip && Cat==LastCat){return;}
    else{LastZip=$("#Zipcode").val();LastCat=Cat;}
    
    if($("#Zipcode").val().length==5)
      {
        var Zip=$("#Zipcode").val(); 
        Map.clearOverlays();
        
        GeoCoder= new GClientGeocoder();
        GeoCoder.getLatLng(
            Zip,
            function(Point){
                if (!Point){alert(Zip + " not found");} 
                else 
                {
                    Map.setCenter(Point, 9);
                    $("#WhereLocations").html("");
                    getLocalDealersAtRange(40,Zip,Cat);
                }
        });
        
      }
}

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

function putAddressMarker(DealerInfo, zip, maxRange, isretry)
{
    var Address=DealerInfo.find("address").text();
    var Zipcode=DealerInfo.find("zipcode").text();
    var Phone=DealerInfo.find("phone").text();
    var Name=DealerInfo.find("name").text();
    var City=DealerInfo.find("city").text();
    var State=DealerInfo.find("state").text();
    
    var ShortAddress=Address+","+Zipcode;
    var LongAddress;
    if(isretry)
    {
        LongAddress=Address+', '+State+' '+Zipcode;
    }
    else
    {
        LongAddress=Address+" "+City+", "+State+" "+Zipcode;
    }
    var DealerHtml = "<b>"+Name+"</b><br/>"+Address+"<br/>"+City+", "+State+" "+Zipcode+"<br/>"+Phone;

    GeoCoder.setBaseCountryCode("US"); 
    GeoCoder.setViewport(Map.getBounds());

    GeoCoder.getLocations(
            LongAddress,
            function(res){
                if(res.Status.code==G_GEO_SUCCESS)
                {
                    var point = new GLatLng(res.Placemark[0].Point.coordinates[1],res.Placemark[0].Point.coordinates[0]);
                    if(zip && maxRange)
                    {
                        sleep(50);
                        GeoCoder.getLocations(zip, function(result)
                        {
                            if(result.Status.code==G_GEO_SUCCESS)
                            {
                                var coords=result.Placemark[0].Point.coordinates;
                                var centerPoint=new GLatLng(coords[1],coords[0]);
                            
                                if(centerPoint.distanceFrom(point) < (maxRange*1609))
                                {
                                    if(zip==Zipcode)
                                        $("#WhereLocations").prepend("<div class=\"Dealer\">"+DealerHtml+"</div>");
                                    else
                                        $("#WhereLocations").append("<div class=\"Dealer\">"+DealerHtml+"</div>");
                                       
                                    var Marker = new GMarker(point);
                                    Map.addOverlay(Marker);
                                    GEvent.addListener(Marker, "click", 
                                    function(){
                                        Marker.openInfoWindowHtml(DealerHtml);
                                    });
                                }
                                else
                                {
                                    //out of range, don't add
                                }    
                            }
                            else if(result.Status.code=G_GEO_UNKNOWN_ADDRESS)
                            {
                                //Geocoder can't find this zip. We should never get here, but just in case:
                                $('WhereLocations').append("<div class='Dealer'>ZIP not found</div>");
                            }
                            else if(result.Status.code=G_GEO_TOO_MANY_QUERIES)
                            {
                                //retry using same data
                                sleep(50);
                                putAddressMarker(DealerInfo, zip, 40);
                            }
                            else
                            {
                                //some other error, silent fail for now
                                //$("#WhereLocations").append("<div class=\"Dealer\">Unknown error</div>");
                            }
                        });
                    }
                    else
                    {
                        $("#WhereLocations").append("<div class=\"Dealer\">"+DealerHtml+"</div>");
                        var Marker = new GMarker(point);
                        Map.addOverlay(Marker);
                        GEvent.addListener(Marker, "click", 
                        function(){
                            Marker.openInfoWindowHtml(DealerHtml);
                        });
                    }
                }
                else if(res.Status.code=G_GEO_UNKNOWN_ADDRESS)
                {
                    //retry using just zipcode
                    if(isretry)
                    {
                        //already tried, silent fail
                    }
                    else
                    {
                        //alert('Bad address:\n'+LongAddress);
                        sleep(50);
                        putAddressMarker(DealerInfo, zip, 40, true);
                    }
                    
                }
                else if(res.Status.code=G_GEO_TOO_MANY_QUERIES)
                {
                    //retry using same data
                    sleep(50);
                    putAddressMarker(DealerInfo, zip, 40);
                }
                else
                {
                    //unknown error, silently fail for now
                    //$("#WhereLocations").append("<div class=\"Dealer\">Unknown error</div>");
                }
   });
}

function getLocalDealersAtRange(miles,zip,cat)
{
    $.ajax({
    type: "GET",
    dataType: "xml",
    url: "/wheretobuy.aspx?zipcode="+zip+"&category="+cat+"&extendrange=false",
    success: function(xml)
        {
            if($("dealer",xml).length<1)
            {
                var MSG="No local dealers found with given parameters.  Please try one of our online retailers.";
                $("#WhereLocations").append("<div class=\"Dealer\">"+MSG+"</div>");
            }
            else
            {
                $("dealer",xml).each(
                    function(index)
                    {
                        var DealerInfo=$(this);
                        putAddressMarker(DealerInfo, zip, miles);
                        sleep(70);
                    }
                );
            }        
        },
    error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            alert("Request Fail:"+textStatus+":"+errorThrown);
        }       
    });
}


function borderchange(id, state) {
            var color;
            if (state === 'on') {
                color = '#7a7a7a';
            } else {
                color = '#e0e0e0';
            }
            document.getElementById(id).style.borderColor = color;
        }