Your coding in the for loop is the culprit here. You are creating a new InfoBox every time in the loop so you are left with new InfoBox with every marker.
This code is the one that creates a new InfoBox every time in the loop:
var boxText = document.createElement("div");
boxText.style.cssText = "border: 1px solid black;";
boxText.innerHTML = item.name;
var myOptions = {
content: boxText,
boxStyle: {
opacity: 0.75,
width: "280px"
},
closeBoxMargin: "12px 4px 2px 2px",
};
var ib = new InfoBox(myOptions);
So to have a single instance of InfoBox, write the above code before the loop, so that you are only initializing the InfoBox once.
Since boxText.innerHTML is dynamic in the above code, set this content in the AddListener function.
So the final code should be-
for (i = 0; i < data.length; i++) {
var item = data[i];
var myLatlng = new google.maps.LatLng(item.lat, item.longs);
var contentString = item.name;
var marker = new google.maps.Marker({
position: myLatlng,
map: map,
title: item.name,
icon: item.type + ".png"
}); // end add new marker
AddInfoBox(marker, contentString); //function call
} //end for loop
function AddInfoBox(myMarker, content)
{
google.maps.event.addListener(myMarker,'click',function() {
ib.setContent(content); //not sure about this statement
ib.open(map, this);
}
});
}