	// Creating Custom Icons
	var iconYellow = new GIcon(); 
	iconYellow.image = 'http://www.google.com/intl/en_us/mapfiles/ms/micons/yellow.png';
	iconYellow.shadow = 'http://www.google.com/mapfiles/shadow50.png';
	iconYellow.iconSize = new GSize(32, 32);
	iconYellow.shadowSize = new GSize(37, 34);
	iconYellow.iconAnchor = new GPoint(0, 20);
	iconYellow.infoWindowAnchor = new GPoint(11, 1);

	var iconGreen = new GIcon(); 
	iconGreen.image = 'http://www.google.com/intl/en_us/mapfiles/ms/micons/green.png';
	iconGreen.shadow = 'http://www.google.com/mapfiles/shadow50.png';
	iconGreen.iconSize = new GSize(32, 32);
	iconGreen.shadowSize = new GSize(37, 34);
	iconGreen.iconAnchor = new GPoint(0, 20);
	iconGreen.infoWindowAnchor = new GPoint(11, 1);

	var iconRed = new GIcon(); 	
	iconRed.image = 'http://www.google.com/intl/en_us/mapfiles/ms/micons/red.png';
	iconRed.shadow = 'http://www.google.com/mapfiles/shadow50.png';
	iconRed.iconSize = new GSize(32, 32);
	iconRed.shadowSize = new GSize(37, 34);
	iconRed.iconAnchor = new GPoint(0, 20);
	iconRed.infoWindowAnchor = new GPoint(11, 1);	

	var customIcons = [];
	customIcons["1"] = iconYellow;
	customIcons["2"] = iconGreen;
	customIcons["3"] = iconRed;

	var gmarkers = [];
	// load google map.

function load()
{
      if (GBrowserIsCompatible()) 
	  {
        var map = new GMap2(document.getElementById("map"));
		var posValue = document.getElementById("pos").value;
		
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
		
        switch(posValue)
		{
			case "1":
				map.setCenter(new GLatLng(41.995970723819035,-122.6953125), 4);
				break;
			case "2":
				map.setCenter(new GLatLng(40.87586457681004,-109.86328125), 5);
				break;			
			case "3":			
				map.setCenter(new GLatLng(42.839455085286815,-96.85546875), 5);
				break;			
			case "4":
				map.setCenter(new GLatLng(32.35645390756435,-96.85546875), 5);
				break;
			case "5":
				map.setCenter(new GLatLng(41.47127005722945,-86.748046875), 5);
				break;
			case "6":
				map.setCenter(new GLatLng(34.556033964293114,-87.1875), 6);
				break;
			case "7":
				map.setCenter(new GLatLng(42.25671262339815, -76.376953125), 6);
				break;			
			case "8":
				map.setCenter(new GLatLng(43.92532996711856,-70.927734375), 5);
				break;
			case "9":
				map.setCenter(new GLatLng(33.536510894550165,-80.771484375), 5);
				break;
			case "10":
				map.setCenter(new GLatLng(41.69697916677352,-157.1484375), 3);
				break;
			default:
				map.setCenter(new GLatLng(46.07323062540835, -110.7421875), 3);
				break;
		}
		
        GDownloadUrl("../googlemap/php_genxml.php?mapid="+posValue, function(data) 
		{
          var xml = GXml.parse(data);
          var markers = xml.documentElement.getElementsByTagName("marker");
	
          for (var i = 0; i < markers.length; i++) 
		  {
            var name 	= markers[i].getAttribute("name");
            var address = markers[i].getAttribute("address");
            var type 	= markers[i].getAttribute("type");
			var phone 	= markers[i].getAttribute("phone");
			var id 		= markers[i].getAttribute("id");		
			var pub  	= markers[i].getAttribute("public");
			var userid 	= markers[i].getAttribute("userid");
			var eventid = markers[i].getAttribute("eventid");
			
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));
            var marker = createMarker(point, name, address, type, phone, id, pub, userid, eventid);
			map.addOverlay(marker);

			//gmarkers are drew markers on the map.
			gmarkers[id] = marker;
          }
        });
      }
}

function loadDirectMap()
{
      if (GBrowserIsCompatible()) 
	  {
			map = new GMap2(document.getElementById("map"));
			map.addControl(new GSmallMapControl());
			
			var name = 	document.getElementById("name").value;		
			var loc  = 	document.getElementById("loc").value;
			var lat  = 	document.getElementById("lat").value;
			var lng  = 	document.getElementById("lng").value;
			
			var point = new GLatLng(lat,lng); 
			
			map.setCenter(point, 10);
			var marker = new GMarker(point);
			map.addOverlay(marker);
      }
}

	// Construct Markers.
    function createMarker(point, name, address, type, phone, id, pub, userid, eventid) 
	{
		var marker;
		if(type == 1 || type == 2)
		{
			marker= new GMarker(point, customIcons["1"]);
			var html = "Contact information is not yet available.<br />Please check back for updated information.";
		}
		if(type == 3)
		{
			marker= new GMarker(point, customIcons["2"]);
			if(pub == 1)
			{
				//var html = "<H3>" + name + "</H3> <br/>" + address + "<br />" + phone + "<br /><br /><a href='../_hostcp/index.php?cid="+ userid +"'>Click here to access Community Bulletin Board</a><br />";
				var html = "<H3>" + name + "</H3> <br/>" + address + "<br />" + phone + "<br />";
			}
			else
			{
				//var html = "<H3>" + name + "</H3> <br/>" + address + "<br />" + phone + "<br /><br /><a href='../_hostcp/index.php?cid="+ userid +"'>Click here to access Community Bulletin Board</a><br />";
				var html = "<H3>" + name + "</H3> <br/>" + address + "<br />" + phone + "<br />";
			}
		}
		if(type == 4)
		{
			marker= new GMarker(point, customIcons["3"]);
			var html = "This location is full and no longer accepting Contestant Sign Ups.<br />Please choose another Bible Bee location near you in order to enroll.";
		}
	 
	  GEvent.addListener(marker, 'click', function() 
	  {
        marker.openInfoWindowHtml(html);
      });
	  
      return marker;
    }


// Get Address from input and geocode it.
function getNearestDistances()
{
	var myaddress;	
	var mylat;
	var mylng;
	
	//get address from input field
	myaddress =  document.getElementById("zipcode").value;
	
	//address should be more than 4 chars
	if(myaddress.length <= 4)
	{
		alert('Address length should be at least 5 symbols');
		return;
	}
	
	//make progress visible
	document.getElementById("nProgress").style.visibility="visible";
	
	//this is geocoding
	geocoder = new GClientGeocoder();
	geocoder.getLocations(myaddress, function(response)
	{
		if (!response ||response.Status.code != 200) 
		{
			document.getElementById("nProgress").style.visibility="hidden";
			alert ("Could not find the location");
			document.getElementById("nPoints").innerHTML = "";
			return;
		}
		else
		{
			mylng = response.Placemark[0].Point.coordinates[0];
			mylat = response.Placemark[0].Point.coordinates[1];
		
			//my point
			var mypoint = new GLatLng(parseFloat(mylat),parseFloat(mylng));
			getDistances(mypoint, mylat, mylng);
		}
	});
}

var distances 			= new Array();
var pointsinfo			= new Array();

// Recieve Geocoded address point, calculating distances.
function getDistances(mypoint, mylat, mylng)
{
	distances 			= new Array();
	pointsinfo			= new Array();

	var posValue = document.getElementById("pos").value;

	GDownloadUrl("../googlemap/php_genxml.php?task=closestdistance&lat="+mylat+"&lng="+mylng+"&type=1&mapid="+posValue, function(data) 
	{
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");

		for (var i = 0; i < markers.length; i++) 
		{	
			pointsinfo[i]	    = new Array(6);
			
			var id				= markers[i].getAttribute("id"); 			//host id
			var name 			= markers[i].getAttribute("name"); 			//event location name
			var contactname 	= markers[i].getAttribute("contactname"); 	//contact name
			var contestants	  	= markers[i].getAttribute("currentcontestants"); //current contestants
			
			pointsinfo[i][0] = id;
			pointsinfo[i][1] = name;
			pointsinfo[i][2] = contactname;
			pointsinfo[i][3] = contestants;
			pointsinfo[i][4] = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
	   }

	   FireOn(mypoint);
	});
}

function FireOn(mypoint)
{
	var directions = new GDirections();

	GEvent.addListener( directions, 'error', function ()
	{
		if(pointsinfo.length == distances.length) 
		{
			var bgcolor1 = "#dcdcdc";
			var bgcolor2 = "#fbf0a5";
			var bgcolor  = "";
			
			str = "<br/><table width='700px' cellpadding='1' cellspacing='0' border='0'>"+
				  "<tr style='font-weight:bold'>" +
					"	<td width='20px'></td>"+
					"	<td>Local Bible Bee Name</td>"+
					"	<td>Host</td>"+
					"	<td>Appr.Distance</td>"+
					"	<td>Contestants</td>"+
					"	<td>Actions</td>"+
					"</tr>";
					
			bubbleSort(pointsinfo);			

			for(var i = 0; i < distances.length; i++)
			{
				if( i % 2 == 0) bgcolor = bgcolor1;
				else bgcolor = bgcolor2;

				var p = i + 1;
				str +="<tr>"+
							"<td bgcolor=" + bgcolor + ">" + p + "</td>" + 
							
							"<td bgcolor=" + bgcolor + ">" +
							"	<a href='javascript:myclick("+ pointsinfo[i][0] +")'><b>" + pointsinfo[i][1]  + "</b></td>" +
							
							"<td bgcolor=" + bgcolor + ">" + pointsinfo[i][2] + "</td>" +
							
							"<td bgcolor=" + bgcolor + ">" +
							"	<a href='javascript:myclick("+ pointsinfo[i][0] +")'><b>" + pointsinfo[i][5].html  + "</b></td>" +
							
							"<td bgcolor=" + bgcolor + ">" + pointsinfo[i][3] + "</td>" +
							
							"<td bgcolor=" + bgcolor + "></td>" +
						"</tr>";
			}
			
			str += "</table>";
			document.getElementById("nPoints").innerHTML = str;	
			document.getElementById("nProgress").style.visibility="hidden";
			return 1;
		}
	});
	
	GEvent.addListener(directions,"load", function() 
	{
		distances[distances.length] 		= '1';
		pointsinfo[distances.length-1][5] 	= directions.getDistance();
		
		if(pointsinfo.length == distances.length) 
		{
			var bgcolor1 = "#dcdcdc";
			var bgcolor2 = "#fbf0a5";
			var bgcolor  = "";
			
			str = "<br/><table width='700px' cellpadding='1' cellspacing='0' border='0'>"+
				  "<tr style='font-weight:bold'>" +
					"	<td width='20px'></td>"+
					"	<td>Local Bible Bee Name</td>"+
					"	<td>Host</td>"+
					"	<td>Appr.Distance</td>"+
					"	<td>Contestants</td>"+
					"	<td>Actions</td>"+
					"</tr>";
					
			bubbleSort(pointsinfo);			

			for(var i = 0; i < distances.length; i++)
			{
				if( i % 2 == 0) bgcolor = bgcolor1;
				else bgcolor = bgcolor2;

				var p = i + 1;
				str +="<tr>"+
							"<td bgcolor=" + bgcolor + ">" + p + "</td>" + 
							
							"<td bgcolor=" + bgcolor + ">" +
							"	<a href='javascript:myclick("+ pointsinfo[i][0] +")'><b>" + pointsinfo[i][1]  + "</b></td>" +
							
							"<td bgcolor=" + bgcolor + ">" + pointsinfo[i][2] + "</td>" +
							
							"<td bgcolor=" + bgcolor + ">" +
							"	<a href='javascript:myclick("+ pointsinfo[i][0] +")'><b>" + pointsinfo[i][5].html  + "</b></td>" +
							
							"<td bgcolor=" + bgcolor + ">" + pointsinfo[i][3] + "</td>" +
							
							"<td bgcolor=" + bgcolor + "></td>" +
						"</tr>";
			}
			
			str += "</table>";
			document.getElementById("nPoints").innerHTML = str;	
			document.getElementById("nProgress").style.visibility="hidden";
			return 1;
		}
		else { FireOn(mypoint); }
	});

	var temparray = new Array(2);
	temparray[0] = mypoint;
	temparray[1] = pointsinfo[distances.length][4];
	
	directions.loadFromWaypoints(temparray);	
}

function myclick(i) {
	try
	{
		GEvent.trigger(gmarkers[i], "click");
	}catch(e)
	{
		alert("Postcode was not found on the map");
	}
}

function myautoclick(i) 
{
	try
	{		
		GEvent.trigger(gmarkers[i], "click");
	}catch(e)
	{
		setTimeout('GEvent.trigger(gmarkers['+i+'], "click")',3000);
	}
}

function bubbleSort(sortArray)
{
	var n = sortArray.length;
	
	for (var i = n - 1; i > 0; i--)
	{
		for (var j = 0; j < i; j++)
		{
			var t = "";
			if (sortArray[j][5].meters > sortArray[j+1][5].meters)
			{
				//sort id, event name, chairman name, contestants
				t = sortArray[j][0];
				sortArray[j][0] = sortArray[j+1][0];
				sortArray[j+1][0] = t;
				
				//event name
				t = sortArray[j][1];
				sortArray[j][1] = sortArray[j+1][1];
				sortArray[j+1][1] = t;				

				//chairman
				t = sortArray[j][2];
				sortArray[j][2] = sortArray[j+1][2];
				sortArray[j+1][2] = t;

				//contestants
				t = sortArray[j][3];
				sortArray[j][3] = sortArray[j+1][3];
				sortArray[j+1][3] = t;		

				//contestants
				t = sortArray[j][4];
				sortArray[j][4] = sortArray[j+1][4];
				sortArray[j+1][4] = t;		
				
				//sort distance
				t = sortArray[j][5];
				sortArray[j][5] = sortArray[j+1][5];
				sortArray[j+1][5] = t;
			}
		}
	}
	
	return sortArray;
}