var map;

function googleHasDirectionsFor(address) {

//  var countries = ["USA","UK","Canada","Albania","Andorra","Austria","Belarus","Belgium","Bosnia",
//  "Herzegovina","Bulgaria","Croatia","Czech Republic","Denmark","Estonia","Finland",
//  "France","Germany","Greece","Hungary","Ireland","Italy","Latvia","Liechtenstein",
//  "Lithuania","Luxembourg","Macedonia","Malta","Moldova","Monaco","Netherlands","Norway",
//  "Poland","Portugal","Romania","Russia","San Marino","Serbia","Montenegro","Slovakia",
//  "Slovak Republic","Slovenia","Spain","Sweden","Switzerland","Ukraine","Vatican City"];

  var countries = ["USA","Canada"];

  var result = false;
  var addr = address.toLowerCase();
  for (var i = 0; i < countries.length; i++) {
	var re = countries[i].toLowerCase() + "$";

 	if (addr.search(re) > -1) {
		result = true;
		break;
	}
  }
  return result;
}


function dId(eleId) { return document.getElementById(eleId); }


function addImages() {
	centerImg = new YImage();
	centerImg.src = 'pix/blue_bubble_b.png';
	centerImg.size = new YSize(30,33);
	centerImg.offsetSmartWindow = new YCoordPoint(0,0);
	rocImg = new YImage();
	rocImg.src = 'pix/wht_bubble_b.png';
	rocImg.size = new YSize(30,33);
	rocImg.offsetSmartWindow = new YCoordPoint(0,0);
}


function makeMap() {
// Create a lat/lon object
  var myPoint = new YGeoPoint(17,-110);
//  var myPoint = new YGeoPoint(10,-40);
//  var myPoint = new YGeoPoint(43.160944,-77.619127);

// Create a map object 
  map = new YMap(document.getElementById('mapContainer'),YAHOO_MAP_HYB);

// Add map type
 map.addTypeControl();

// Add a pan control 
 var pc = new YCoordPoint(0,70);
 map.addPanControl(pc); 

// Add a slider zoom control 
 var zl = new YCoordPoint(13,121);
  map.addZoomLong(zl); 

// Display the map centered on a latitude and longitude 
  map.drawZoomAndCenter(myPoint, 16);
//  map.drawZoomAndCenter(myPoint, 6);

// add markers
  for (var i = 0; i < branches.length; i++) {
    var address2 = null;
    if (googleHasDirectionsFor(branches[i]) && branches[i].search(/^Rochester/) == -1) {
 	  address2 = '43.109353,-77.574973 (Rochester, NY, USA)';
    }
    var descURL = '';
    var descIMG = '';
    var dist = earthSurfaceDistance(lats[i],longs[i],43.109353,-77.574973).toFixed(0) ;
    var miles = ' miles';
    if (dist == 1) {
	  miles = ' mile';
    }
    if (dist == 0) {
	  dist = 'less than 1';
	  miles = ' mile';
    }
    var distance = '<div>Distance to the Rochester branch:&nbsp;' + 
	  addCommas(dist) + miles + '</div>';
    var markerImg = centerImg;
    var labelColor='black';
    var label = counts[i];
    var leftPad = 7;
//    var leftPad = 4;
//    if (label < 10) {
//	  leftPad = 8;
//    }
    if (branches[i].search(/^Rochester/) > -1) {
	  distance = '';
	  markerImg=rocImg;
	  labelColor = 'blue';
      leftPad = 6;
    }
    label = '<font face="arial" style="font-size: 2px;"><br></font><font face="arial" ' +
		'style="font-weight:bold; color:'+labelColor+
		'; font-size: 17px; padding: 0px '+
		leftPad+'px;">'+label+'</font>';
    var now = new Date();
    var markerId = 'marker'+now.getTime()+'_'+i;
    var URL = dmiURL + branchURLs[i];
    var statsURL = branchURLs[i] + '.html';
    var altURL = altURLs[i];
    var picURL = picURLs[i];
    if (!altURL.trim().length) {
    	altURL = 'pix/comingsoon.gif';
    }
    if (!picURL.trim().length) {
    	picURL = 'pix/comingsoon.gif';
    }
    
    var marker = createMapMarker(new YMarker(new YGeoPoint(lats[i],longs[i]),markerImg,markerId),
	  markerId,label,distance,descURL,descIMG,branches[i],address2,URL,statsURL,altURL,picURL,lats[i],longs[i]);
    map.addOverlay(marker);
  }
}

function createMapMarker(m, mId, label, desc, descURL, descIMG, address, address2, URL, statsURL, altURL,
				 picURL, lat, lon) {
	var addressShort = address.replace('<div>','').replace('</div>', '')
	addressShort = addressShort.replace(', USA','');
	addressShort = addressShort.replace(', Canada','');
	if (!descURL || !descURL.trim().length && address.trim().length) {
		address = address.replace('<div>','').replace('</div>', '');
		var latLonAddr = lat +"," + lon + " (" + address.replace('<br>',',') + ")";
		if (!address2)
			descURL = 'http://maps.google.com/?q=' + escape(latLonAddr);
		else {
			address2 = address2.replace('<div>','').replace('</div>', '');
			descURL = 'http://maps.google.com/?q=' + 
				escape(latLonAddr  + ' to ' + address2.replace('<br>',','));
		}
	}
	if (descIMG) {
		var dynImgId = 0;
		desc = desc + ' <img src="' + descIMG + '" valign="top" align="center" border="0" vspace=5 hspace=1>';
	} else {
		var dynImgId = Math.round((Math.random()*1000000));
		desc = desc + ' <img id="' + dynImgId.toString() + '" src="pix/blank.png" valign="top" align="center" border="0" vspace=5 hspace=1 width="250" height="150">';
	}
	
//	var centerMap = '<br><a href="javascript:map.drawZoomAndCenter(new YGeoPoint(' + 
//		lat + ',' + lon + '),map.getZoomLevel() - 1);closeMarkerWindow(\'' + mId + 
//		'\')" class="marker">Center the map on this location</a>';

	var centerMap = '<br><a href="javascript:centerAndZoom(' + lat + ',' + lon + 
		');closeMarkerWindow(\'' + mId + 
		'\')" class="marker">Center the map on this location</a>';


	if (!descURL.trim().length && !desc.trim().length) {
		return m;
	} else if (!descURL.trim().length) {
		desc = desc.trim() + centerMap;
	} else {
		desc = '<a href="' + descURL + '" target="_blank" class="marker">' + desc + '</a>' + centerMap;
	}
    
    desc = '<a href="' + statsURL + '" class="marker">Stats</a>' +
    	'&nbsp;&nbsp;&nbsp;&nbsp;' + 
      '<a href="' + picURL + '" target="_blank" class="marker">Branch Picture</a>' +
    	'&nbsp;&nbsp;&nbsp;&nbsp;' + 
    	'<a href="' + altURL + '" target="_blank" class="marker">Alternate Branch Page</a>' +
    	'<div class="vS"><br clear="all"></div>' + desc;
    
    desc = '<a href="' + URL + '" target="_blank" class="marker2"><b>' + addressShort + '</b></a>' + '<div class="vS"><br clear="all"></div>' + desc; 
	desc = '<div class="markerLabel">' + desc + '</div>';
	m.desc = desc; 
//	m.desc += '<div style="display:inline;margin-right:12px;float:right;"><a href="javascript:map.drawZoomAndCenter(new YGeoPoint(' + lat + ',' + lon + '), map.getZoomLevel()-1);">zoom</a></div>';
	m.dynImgId = dynImgId; 
	m.lat = lat; 
	m.lon = lon;
	YEvent.Capture(m, EventsList.MouseClick, function() { openPointWin(m) } ); 
// add a label
  	m.addLabel(label);

// Add auto expand 
	var _txt = '<div class=l><b>'+addressShort+'</b></div>';
	m.addAutoExpand(_txt);
	return m; 
} 
function createYahooMarker(geopoint,icon,label,text,address,image,url) { 
//	var myImage = new YImage(); 
//	myImage.src = 'http://us.i1.yimg.com/us.yimg.com/i/us/map/gr/mt_ic_c.gif'; 
//	myImage.size = new YSize(20,20); 
//	myImage.offsetSmartWindow = new YCoordPoint(0,0); 
//	var marker = new YMarker(geopoint,myImage); 
	var marker = new YMarker(geopoint); 
	var leftPad = 4;
	if (label < 10) {
		leftPad = 8;
	}
  	marker.addLabel('<font face="arial" style="font-size: 2px;"><br></font><font face="arial" style="font-weight:bold; color:black; font-size: 17px; padding: 0px '+leftPad+'px;">'+label+'</font>');
	var swtext = '<div style="width:260px;"><b>' + text + '</b><br><br>' + address + '</div>'; 
	YEvent.Capture(marker,EventsList.MouseClick, 
		function() { marker.openSmartWindow(swtext) });

// Add auto expand 
	var _txt = '<div style="width:160px;height:50px;"><b>Click to find out who lives here.</b></div>';
	marker.addAutoExpand(_txt);
	return marker; 
} 

function openPointWin(m) {
	m.openSmartWindow(m.desc); 
	if (m.dynImgId) 
		loadMap(m.dynImgId, m.lat, m.lon)
}

function loadMap(imgId, lat, lon) {
	var zoomed = (map.getZoomLevel() <= 3) ? 0 : ((map.getZoomLevel() <= 7) ? 3 : ((map.getZoomLevel() <= 15) ? map.getZoomLevel()-3 : 12));
	if (zoomed == 0) {
		dId(imgId).height = 1;
		dId(imgId).width = 250;
		return;
	} else {
		dId(imgId).height = 150;
		dId(imgId).width = 250;		
	}
	var imageURL = 'http://api.local.yahoo.com/MapsService/V1/mapImage?appid=shakymon.com&image_height=150&image_width=250&latitude=' + lat.toString() + '&longitude=' + lon.toString() + '&zoom=' + zoomed.toString() + '&output=json&callback=loadMapEnd';
	lmId = imgId;
	lmObj = new JSONscriptRequest(imageURL);
	lmObj.buildScriptTag();
	lmObj.addScriptTag();
}

function loadMapEnd(data) {
	dId(lmId).src = data.ResultSet.Result;
	lmObj.removeScriptTag();
}

function addCommas(nStr) {
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function earthSurfaceDistance(lat1, long1, lat2, long2) {
//	var R = 6378.137; // km
	var R = 3963.19059; //mi
	var dist = R*Math.acos(Math.cos(radians(90-lat1))*Math.cos(radians(90-lat2))+Math.sin(radians(90-lat1))*Math.sin(radians(90-lat2))*Math.cos(radians(long1-long2)));
	return Math.abs(dist); 
}

function radians(degrees) {
	return degrees * 0.0174532925;
}

  
function closeMarkerWindow(markerId) {
  	var refMarker = map.getMarkerObject(markerId);
	refMarker.closeSmartWindow();
}


function centerAndZoom(lat,lon) {
	var zoomed = map.getZoomLevel() - 1;
	if (zoomed < 1) {
		 zoomed = 1;
	}
	map.drawZoomAndCenter(new YGeoPoint(lat,lon),zoomed);
}

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };

