/* Google Maps v3: http://code.google.com/apis/maps/documentation/v3 */

var map;
var markers = [];

var boundsChangedListener;

function MapWindow(opts) {
	google.maps.OverlayView.call(this);
	this.marker_ = opts.marker;

	this.offsetVertical_ = 0;
	this.offsetHorizontal_ = 0;

	this.location_ = locations[opts.location].title;
	this.results_ = locations[opts.location].results;

	var selfref = this;

	this.boundsChangedListener_ = google.maps.event.addListener(map, "bounds_changed", function() {
		return selfref.panMap.apply(selfref);
	});

	this.setMap(map);
}

function removeMapWindow(mw) {
	return function() {
		mw.div_.remove();
		mw.setMap(null);
	};
}

MapWindow.prototype = new google.maps.OverlayView();
MapWindow.prototype.remove = function() { if (this.div_) { this.div_.remove(); this.div_ = null; } };
MapWindow.prototype.draw = function() {
	this.createElement();
	if (!this.div_) { return; }

	var pixPosition = this.getProjection().fromLatLngToDivPixel(this.marker_.getPosition());
	if (!pixPosition) { return; }

	this.div_.css({top:pixPosition.y + this.offsetVertical_, left:pixPosition.x + this.offsetHorizontal_});
};

MapWindow.prototype.createElement = function() {
	var panes = this.getPanes();

	if ( !this.div_ ) {
		this.div_ = $('<div class="map-window">'+$('div#map-window-template div:first').html()+'</div>');
		this.div_.find('.headline').html(this.location_);

		var template = this.div_.find('.result:first');
		var results = template.parent();

		results.empty();

		jQuery.each(this.results_, function(){
			var result = template.clone();

			result.find("a.title").attr('href', this.url).text(this.title);
			result.find(".summary").text(this.summary);

			results.append(result);
		});

		google.maps.event.addDomListener(this.div_[0], 'mousedown', this.onClick_);
		google.maps.event.addDomListener(this.div_[0], 'dblclick', this.onClick_);
		google.maps.event.addDomListener(this.div_[0], 'DOMMouseScroll', this.onClick_);

		google.maps.event.addDomListener(this.div_.find('div.close')[0], 'click', removeMapWindow(this));

		$(panes.floatPane).append(this.div_);

		this.panMap();
	} else if ( this.div_.parent() != $(panes.floatPane) ) {
		this.div_.remove();
		$(panes.floatPane).append(this.div_);
	}
};

MapWindow.prototype.onClick_ = function(e) {
	if(navigator.userAgent.toLowerCase().indexOf('msie') != -1 && document.all) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	} else {
		e.stopPropagation();
	}
};

MapWindow.prototype.panMap = function() {
	var bounds = map.getBounds();
	if (!bounds) { return; }

	var position = this.marker_.getPosition();

	var mapDiv = map.getDiv();
	var mapWidth = mapDiv.offsetWidth;
	var mapHeight = mapDiv.offsetHeight;

	var boundsSpan = bounds.toSpan();
	var longSpan = boundsSpan.lng();
	var latSpan = boundsSpan.lat();

	var degPixelX = longSpan / mapWidth;
	var degPixelY = latSpan / mapHeight;

	var southWest = new google.maps.LatLng(Number(position.lat()) - this.div_.height()*degPixelY, Number(position.lng()));
	var northEast = new google.maps.LatLng(Number(position.lat()), Number(position.lng()) + this.div_.width()*degPixelX);

	var iwBounds = new google.maps.LatLngBounds(southWest,northEast);

	map.setCenter(iwBounds.getCenter());

	google.maps.event.removeListener(this.boundsChangedListener_);
	this.boundsChangedListener_ = null;
};

function map_populate()
{
	google.maps.event.removeListener(boundsChangedListener); 

	jQuery.each(locations, function(){
		var locid = this.id;

		var marker = new google.maps.Marker({
			position: new google.maps.LatLng(Number(this.latitude), Number(this.longitude)),
			map: map,
			title: this.title,
			icon: '/images/explore/map_icon.png',
			flat: true
		});

		google.maps.event.addListener(marker, "click", function(e) {
			var infowindow = new MapWindow({marker: marker, location: locid});
		});

		markers.push(marker);

		jQuery.each(this.results, function(){
			if ( this.latitude != 0 && this.longitude != 0 )
			{
				var gemUrl = this.url;

				var gem = new google.maps.Marker({
					position: new google.maps.LatLng(Number(this.latitude), Number(this.longitude)),
					map: map,
					title: this.title,
					icon: '/images/explore/icon_gem_blue.png',
					flat: true
				});

				google.maps.event.addListener(gem, "click", function(e) { window.location = gemUrl; });
			}
		});
	});
}

function map_init() {
	var myOptions = {
		navigationControl: true,
		mapTypeControl: false,
		scaleControl: true,
		mapTypeId: google.maps.MapTypeId.TERRAIN
	};

	map = new google.maps.Map(document.getElementById("map-canvas"), myOptions);

	if (typeof(mapbounds) !== 'undefined') {
		map.fitBounds(mapbounds);
	} else {
		map.setCenter(new google.maps.LatLng(37.0625,-95.677068));
		map.set_zoom(4);
	}

	if (typeof(locations) !== 'undefined') 
	{
		boundsChangedListener = google.maps.event.addListener(map, 'bounds_changed', map_populate);
	}
}

$(function() {
	map_init();

	$('dl.search #filter').toggle(
		function(){
			$(this).closest('#advanced-search').find('dl.filters:first').slideDown();
		},
		function(){
			$(this).closest('#advanced-search').find('dl.filters:first').slideUp();
		}
	);

	$('dl.submit button').click(function(){
		$(this).closest('form').submit(); return false;
	});

	$('a.suggested-searches').click(function(){
		$(this).closest('div#content').find('div#mapOverlay').fadeIn('fast'); return false;
	});

	$('a.search-help').click(function(){
		$(this).closest('div#content').find('div#helpSearchOverlay').fadeIn('fast'); return false;
	});

	$('a.map-help').click(function(){
		$(this).closest('div#content').find('div#mapSearchOverlay').fadeIn('fast'); return false;
	});

	$('a.overlayClose').click(function(){
		$(this).closest('div.overlay').fadeOut('fast'); return false;
	});

	$('div.results a#toggle-view').toggle(
		function(){
			var toggle = $(this);
			var banner = toggle.next();
			var autoflow = banner.next();

			banner.fadeOut('fast');

			autoflow.fadeOut('fast', function(){
				$(this).css({width:'766px'});
				$(this).find('th.title, td.title').css({width:'500px'});

				$(this).find('th:not(.title), td:not(.title)').show();

				$(this).closest('div.inner:first').animate({left:'-500px'}, 2000, function(){
					banner.addClass('showMap');
					toggle.addClass('showMap');

					banner.fadeIn();
					autoflow.fadeIn();
				});
			});
		},
		function(){
			var toggle = $(this);
			var banner = toggle.next();
			var autoflow = banner.next();

			banner.fadeOut('fast');

			autoflow.fadeOut('fast', function(){
				$(this).css({width:'266px'});
				$(this).find('th.title, td.title').css({width:'100%'});

				$(this).find('th:not(.title), td:not(.title)').hide();

				$(this).closest('div.inner:first').animate({left:'0px'}, 2000, function(){
					banner.removeClass('showMap');
					toggle.removeClass('showMap');

					banner.fadeIn();
					autoflow.fadeIn();
				});
			});
		}
	);

	if ( $('div.results table.tablesorter').length )
	{
		$('div.results table.tablesorter').tablesorter({ 
			widthFixed: true, 
			widgets: ['zebra']
		});
	}

	if ( $("input#autolocate").length )
	{
		$("input#autolocate").tokenInput("/admin/autocomplete/location", {
			hintText: "Type in location names (city first)",
			noResultsText: "No results",
			searchingText: "Searching...",
			minChars: "3",
			tokenLimit: 1
		});
	}

});