/* $Id: google_map.js 13193 2008-08-22 16:45:40Z jsdalton $ */

var map,
	_points = {};

$(document).ready(function() {
    
	$("div#job-map").each(function(){
		if(initializeMap(this)) {
			/*$(this).click(function(e){
				var_dump(e.target.parentNode.onclick);
				var_dump(e.target.parentNode.onmousedown);
				var_dump(e.target.parentNode.onmouseup);
				var_dump(e.target.onclick);
			});*/
			GEvent.addListener(map, "moveend", function() {
				updateJobMapUrls();
				hideJobMarkersOutsideBounds();
			});
			var urlNe = $("input[@name=urlNe]").val();
			var urlSw = $("input[@name=urlSw]").val();
			getMapCenterFromUrlBounds(urlNe, urlSw);
			map.setCenter(startingPoint, startingZoom);

			loadJobMarkers(urlNe, urlSw);
			updateJobMapUrls();
	        geocoder = new GClientGeocoder();
		}
	});

    $(".map-controls form").submit( function() {
		var address = this.location.value;
		moveToLocation(address);
		updateJobMapUrls();
		return false;
	});
	
	$("div#job-location-map").each(function() {
		if (GBrowserIsCompatible()) {
			map = new GMap2(this);
			map.addControl(new GSmallMapControl());
			var geoTitleContents = $(".geodata-holder").attr("title");
			var geoLocation = geoTitleContents.split(',');
			var startingPoint = new GLatLng(geoLocation[0], geoLocation[1]);
			var startingZoom = 9;
			GEvent.addListener(map, "load", function() {
				//$("div#job-location-map").children("div").contains("Terms of Use").css("font-size",".7em").css("white-space","normal").css("text-align","right").width("12em");
				$("div#job-location-map").children("div").filter(":contains(Terms of Use)").css("font-size",".7em").css("white-space","normal").css("text-align","right").width("12em");
				
			});
			map.setCenter(startingPoint, startingZoom);
			var point = new GLatLng(geoLocation[0], geoLocation[1]);
			var marker = new GMarker(point);
			map.addOverlay(marker);
		}
	});
	
});

function initializeMap(elementId) {
	if (GBrowserIsCompatible()) {
		map = new GMap2(elementId);
	    map.addControl(new GLargeMapControl());
	    map.addControl(new GMapTypeControl());
		return true;
	}
	return false;
}

function moveToLocation(address) {
	if (geocoder) {
    	geocoder.getLocations(
      		address,
      		function(response) {
				if (!response || response.Status.code != 200) {
          			$(".map-controls p.instructions").empty().append("Location not found. Please enter a valid address or city.");
        		} else {
            		place = response.Placemark[0];
					point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
					accuracy = place.AddressDetails.Accuracy;
					zoom = accuracy + 6;
					if (zoom > 9) {
						zoom = 9;
					}
					$(".map-controls p.instructions").empty().append("Location found. View job posting results below.");					
					map.setCenter(point, zoom);
        		}
      		}
    	);
  	}
}

function loadJobMarkers(urlNe, urlSw) {
	//read the url
	var jsonUrl = 'http://'+location.hostname+'/region/view/ne/'+urlNe+'/sw/'+urlSw+'/index.json';

	//get the json for that url
	var html = $.ajax({
		url: jsonUrl,
	 	async: true,
	  	dataType: "json",
		success: function(jobs) {
			for(var i in jobs) {
				createMarker(jobs[i].jobLocation.geoLat, jobs[i].jobLocation.geoLng, jobs[i]);
				$('<div class="list-map-icon"><a href="#content" title="'+jobs[i].jobLocation.geoLat + ',' + jobs[i].jobLocation.geoLng+'"><img src="http://www.google.com/mapfiles/marker.png" class="list-marker-image" alt="map it" /></a></div>').prependTo("#job-id-"+jobs[i].jobId).click( function() {
                	focusOnPoint(jobs[i].jobLocation.geoLat, jobs[i].jobLocation.geoLng);
                	return true;
            	});
			}
			buildMarkers();
		},
		failure: function() {
			alert("Error: Could not load job locations.");
		}
	});
}

function hideJobMarkersOutsideBounds() {
	var alternator = 0;
	var bounds = map.getBounds();
	$(".list-map-icon").each( function() {
		var geoLocation = $(this).children("a").attr("title").split(','),
			geoLtLng = new GLatLng(geoLocation[0],geoLocation[1]),
			elem = $(this).parent("li.job-posting-item");
		if (bounds.contains(geoLtLng)) { 
			elem.removeClass("alt");
			if (alternator == 1) {
				elem.addClass("alt");
				alternator = 0;   
			} else {
				alternator = 1;
			}
			elem.show();
		} else {
			elem.hide();
		}
	});
}

function createMarker(lat, lng, job) {
	
	// something indexable
	var pt = lat + lng;
	
	if(!_points[pt]) {
		_points[pt] = [];
	}
		
	var html = '';
	html += '<div class="job-info-window">';
	html += '<h3><strong>'+job.jobTitle+'</strong> at '+job.employerName+'</h3>';
	html += '<p>'+job.jobLocation.locality;
	if (job.jobLocation.locality != '') {
		html += ', ';
	}
	html += (job.jobLocation.region ? job.jobLocation.region : '');
	html += (job.jobLocation.country ? ', '+job.jobLocation.country : '') +'</p>\n';
	html += '<p>posted '+ job.postedTimeSpan +'</p>\n';
	html += '<p><a href="http://'+ location.hostname +'/jobs/'+ job.jobId +'">view full job details &raquo;</a></p>\n';
	html += '</div>';
	
	//return marker;
	_points[pt].push({
		"title": job.jobTitle,
		"html": html,
		"job_id": job.jobId,
		"lat": lat,
		"lng": lng
	});
}

// based on:
// http://www.econym.demon.co.uk/googlemaps/examples/map10a.htm
function createTabbedMarker(point, htmls, labels, elems) {
	var marker = new GMarker(point);
	var click_fn = function(selected) {
		if (typeof selected != 'number') {
                selected = 0;
        }
		// adjust the width so that the info window is large enough for this many tabs
		if (htmls.length > 2) {
			htmls[0] = '<div class="test" style="width:'+htmls.length*88+'px">' + htmls[0] + '</div>';
		}
		var tabs = [];
		for (var i=0; i<htmls.length; i++) {
			tabs.push(new GInfoWindowTab(labels[i], htmls[i]));
		}
		marker.openInfoWindowTabsHtml(tabs, {selectedTab: selected});
	};
	GEvent.addListener(marker, "click", click_fn);
	if(elems) {
		for(var x = 0; x < elems.length; x++) {
			$(elems[x]).click(function(x){
				return function() {
					click_fn(x);
				}
			}(x));
		}
	}
	
	return marker;
}

function buildMarkers() {
	for(var pt in _points) {
		
		var buttons = _points[pt],
			htmls = [],
			labels = [],
			elems = [];
		
		// go get info for each marker
		for(var z = 0; z < buttons.length; z++) {
			htmls.push(buttons[z].html);
			labels.push(buttons[z].title.substr(0, 5)+'...');
			elems.push(document.getElementById("job-id-"+buttons[z].job_id));
		}
		
		map.addOverlay(createTabbedMarker(new GLatLng(buttons[0].lat, buttons[0].lng), htmls, labels, elems));
	}
}

function focusOnPoint(lat, lng) {
    map.setCenter(new GLatLng(lat, lng), 12);
    return;
}

function updateJobMapUrls() {
	//get the neLat,neLng,swLat,swLng
	var bounds = map.getBounds();
    var coordNe = bounds.getNorthEast();
	var coordSw = bounds.getSouthWest();
	var urlNe = coordNe.toUrlValue(4);
	var urlSw = coordSw.toUrlValue(4);
	var urlString = "ne\/" + urlNe + "\/sw\/" + urlSw + "\/";
	var linkUrl = "\/region\/view\/" + urlString;
	var feedUrl = linkUrl + "index.rss";

	$("a#page-controls-link").attr("href",linkUrl);
	$("a#page-controls-rss").attr("href",feedUrl);
}

function getMapCenterFromUrlBounds(urlNe, urlSw) {
	
	// if the values are set then...
	if (urlNe != "" && urlSw != "") {
		// make them into arrays
		var urlNeArray = urlNe.split(",");
		var urlSwArray = urlSw.split(",");
		
		// instantiate GLatLng objects out of the arrays
		var coordNe = new GLatLng(urlNeArray[0], urlNeArray[1]);
		var coordSw = new GLatLng(urlSwArray[0], urlSwArray[1]);
		
		// get the map center 
		var geobounds = new GLatLngBounds(coordSw, coordNe);
		
		startingPoint = geobounds.getCenter();
		startingZoom = map.getBoundsZoomLevel(geobounds);
	
	// otherwise set to a default value
	} else {
		startingPoint = new GLatLng(37.09024, -95.712891);
		startingZoom = 3;
	}
	
	// return the map center
}