var map = null;
var geocoder = null;
// Map controls
var gSmallZoomControl;
var markers     = new Array();
var copyrightTimer = null;
var makerTimer = null;
var bounds = null;
var bizLinks = new Array();
var tooltip = null;

//Add marker to google map
function addMarker(latitude, longitude, bizName, streetAddr, otherAddrInfo, suburbAddr, stateAddr, postalCode, iconNumber) {
	var point = new GLatLng(latitude, longitude);
	var icon = getMarkerIcon(iconNumber, true);
	
		function getZIndex(marker, b) {
			return GOverlay.getZIndex(marker.getPoint().lat());
		}
	
	var marker = new GMarker(point, {icon: icon, zIndexProcess:getZIndex});
	//var marker = new GMarker(point);
	markers[iconNumber] = marker;
	marker.tooltip = getTooltip(bizName, streetAddr, otherAddrInfo, suburbAddr, stateAddr, postalCode, iconNumber);
	
		//marker "click" event listener
		GEvent.addListener(marker, "click", function() {    
					
			if(	bizLinks[iconNumber] !=null && bizLinks[iconNumber].length>0) {
				location.href = bizLinks[iconNumber];
			}
		
		});
		
		//marker "mouseover" and "mouseout" listeners  ======
		GEvent.addListener(marker,"mouseover", function() {
			changeIcon(marker, iconNumber, true);
			showTooltip(marker);
			redrawMarker(marker, GOverlay.getZIndex(marker.getPoint().lat()) + 50000);
		});        

		GEvent.addListener(marker,"mouseout", function() {
			changeIcon(marker, iconNumber, false);
			tooltip.style.visibility="hidden"	
			//alert(GOverlay.getZIndex(marker.getPoint().lat()));
			redrawMarker(marker, GOverlay.getZIndex(marker.getPoint().lat()));	
		});
	
	//alert(point);
	map.addOverlay(marker);
	bounds.extend(point);
	
	//map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
}
    
//Redraws a marker with changed zIndex.
function redrawMarker(marker, zIndex) {
	var imagesArray = findImagesArray(marker);
	marker[imagesArray][0].style.zIndex = zIndex;
	marker.redraw(true);
}

function findImagesArray(marker) {
for (var i in marker){
	if (eval("typeof marker." + i) == "object"){
		try {
			if (eval("typeof marker." + i + "[0].src") != "undefined"){
				return i;
			}
		}catch (e) {}
		}
	}
	return '';
}

// Gets a marker loading on demand
function getMarkerIcon(iconNumber, blackIcons) {
var iconFilePrefix;
var mapPinDir = "http://wotaboutme.com.au/images"
	if(blackIcons) {
		iconFilePrefix = mapPinDir + "/bubble";
	}else {
		iconFilePrefix = mapPinDir + "/bubble_orange_";
	}

// if no iconNumber we want star icon
	var newIcon = new GIcon();
	newIcon.image = iconFilePrefix + iconNumber + ".png";
	newIcon.iconSize = new GSize(26, 35);
	newIcon.shadow = mapPinDir + "/Bubble-Shadow.png";
	newIcon.shadowSize = new GSize(46, 35);
	newIcon.iconAnchor = new GPoint(13, 32);
	newIcon.infoWindowAnchor = new GPoint(12, 4);
	newIcon.printImage = iconFilePrefix + iconNumber + ".gif";
	newIcon.mozPrintImage = iconFilePrefix + iconNumber + ".gif";
	return newIcon;
}

function setBoundsCenter2(markersListSize) {
if(markers.length >= markersListSize) {
 window.clearInterval(makerTimer);
 map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
 for(var i=1; i<markers.length; i++) {
	if(markers[i]!=null) {
		map.addOverlay(markers[i]);
	}
   }
  }
}

function setMarkerCenter(marker) {
		map.setCenter(marker.getPoint(), map.getZoom());
  }
// ====== This function displays the tooltip ======
// it can be called from an icon mousover or a side_bar mouseover
function showTooltip(marker) {
	tooltip.innerHTML = marker.tooltip;
	var point = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getSouthWest(), map.getZoom());
	var point2 = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getNorthEast(), map.getZoom());
	var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
	var anchor=marker.getIcon().iconAnchor;
	var width=marker.getIcon().iconSize.width;
	var pos = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize( point2.x - offset.x , - offset.y + point.y +anchor.y)); 
	pos.apply(tooltip);
	tooltip.style.visibility="visible";
}
//Changes marker icon.
function changeIcon(marker, iconNumber, highlight) {
var iconFilePrefix;
var mapPinDir = "http://wotaboutme.com.au/images"
	if(highlight) {
		iconFilePrefix = mapPinDir + "/bubble_orange_";
		iconFilePrefix = iconFilePrefix + iconNumber + ".png";
	} else {
		iconFilePrefix = mapPinDir + "/bubble";
		iconFilePrefix = iconFilePrefix + iconNumber + ".png";
	}
marker.setImage(iconFilePrefix);
}
//changes marker icon for DOM event.
function changeIconForDOMEvent(iconNumber, highlight) {
	if(markers[iconNumber]!=null && iconNumber!='0') {
		changeIcon(markers[iconNumber], iconNumber, highlight);
	}
}
function raiseMouseOverGEvent(iconNumber) {
	if(markers[iconNumber]!=null) {
                        setMarkerCenter(markers[iconNumber]);
	GEvent.trigger(markers[iconNumber],  "mouseover");
	}
}
function raiseMouseOutGEvent(iconNumber) {
	if(markers[iconNumber]!=null) {
		GEvent.trigger(markers[iconNumber], "mouseout");
	}
}
function getEmptyIfNull(element) {
	if(element==null || element=='null' || element=='undefined') {
		return '';
	}else {
		return element;
	}
}
//Gets Tooltip.
function getTooltip(bizName, streetAddr, otherAddrInfo, suburbAddr, stateAddr, postalCode, iconNumber) {
bizName = getEmptyIfNull(bizName);
streetAddr = getEmptyIfNull(streetAddr);
suburbAddr = getEmptyIfNull(suburbAddr);
stateAddr  = getEmptyIfNull(stateAddr);
postalCode = getEmptyIfNull(postalCode);
var html = "<div class=\"markerRolloverStyle\"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" +
"<tr><td class=\"mainBodyCopy2Bold\"><u>" + bizName + "</u></td></tr>" + 
"<tr><td height=\"7\"></td></tr>";
	if(streetAddr!=null && streetAddr.length >0) {					
		html = html + "<tr><td class=\"specificBodyCopy1Normal\">" + streetAddr + "</td></tr>";
	}
	if(otherAddrInfo!=null && otherAddrInfo.length>0) {
		html = html + "<tr><td class=\"specificBodyCopy1Normal\">" + otherAddrInfo + "</td></tr>";
	}
	if(suburbAddr!=null || stateAddr!=null || postalCode!=null) {
		html = html + "<tr><td class=\"specificBodyCopy1Normal\">" + suburbAddr + "&nbsp;&nbsp;" + stateAddr + "&nbsp;&nbsp;" + postalCode +  "</td></tr>"; 
	}
	html = html + "</table></div>";
	return html;
}
//Shows marker triggered.
function showMarker(bubbleId) {
	if(markers[bubbleId]!=null) {
		GEvent.trigger(markers[bubbleId],  "click"); 
	}
}
//Makes copyright font smaller
function makeCopyrightSmaller() {
if (map.isLoaded()) 
{
	for(var i = 0; i < map.getContainer().childNodes.length; ++i) {
		if(map.getContainer().childNodes[i].innerHTML.indexOf(String.fromCharCode(169)) !== -1){
			map.getContainer().childNodes[i].style.fontSize = '9px';
			window.clearInterval(copyrightTimer);
			break;
		}
	}
}
}