
var GonePaddling = (function($) {
	var public = {
		init: function(id) {
			nav.id = id;
			
			$(function() {
				nav.onLoad();
			});
			
			$.address.internalChange(function(event) {
				nav.addressChange(event, true);
			}).externalChange(function(event) {
				nav.addressChange(event, false);
			});
		},
		
		loadSponsorPage: function() {
			$(function() {
				sponsors.init();
			});
		},
		
		loadTracker: function(trackerData, blogData) {
			$(function() {
				tracker.init(trackerData, blogData);
			});
		}
	};
	
	var GonePaddlingOverlay = function(image, bounds) {
		this.bounds_ = bounds;
		this.image_ = image;
		this.map_ = null;
		this.div_ = null;
	}
	
	GonePaddlingOverlay.prototype = new google.maps.Overlay();
	
	GonePaddlingOverlay.prototype.initialize = function(map) {
		var div = document.createElement('DIV');
		div.style.border = "none";
		div.style.borderWidth = "0px";
		div.style.position = "absolute";
		
		var img = document.createElement("img");
		img.src = this.image_;
		img.style.width = "100%";
		img.style.height = "100%";
		div.appendChild(img);
		
		this.div_ = div;
		this.map_ = map;
		
		var pane = map.getPane(G_MAP_OVERLAY_LAYER_PANE);
		pane.appendChild(div);
	}
	
	GonePaddlingOverlay.prototype.redraw = function() {
		
		var sw = this.map_.fromLatLngToDivPixel(this.bounds_.getSouthWest());
		var ne = this.map_.fromLatLngToDivPixel(this.bounds_.getNorthEast());
		
		var div = this.div_;
		
		div.style.left = sw.x + 'px';
		div.style.top = ne.y + 'px';
		div.style.width = (ne.x - sw.x) + 'px';
		div.style.height = (sw.y - ne.y) + 'px';
	}
	
	GonePaddlingOverlay.prototype.remove = function() {
		this.div_.parentNode.removeChild(this.div_);
		this.div_ = null;
		this.map_ = null;
	}
			
	var tracker = {
		metresToMiles: function(metres) {
			return Math.round(metres * 0.000621371192);
		},
		
		init: function(trackerData, blogData) {
			// Create map
			var map = new google.maps.Map2(document.getElementById("map"));
			map.enableScrollWheelZoom();
			map.addMapType(G_PHYSICAL_MAP);
			
			var centerPoint = new google.maps.LatLng(54.47,-2.88);
			
			map.setCenter(centerPoint, 6, G_PHYSICAL_MAP);
			
			// Create small icon
			
			var smallIcon = new google.maps.Icon(G_DEFAULT_ICON);
			smallIcon.image = "/images/point.gif";
			smallIcon.iconSize = new google.maps.Size(10,10);
			smallIcon.shadow = null;
			smallIcon.iconAnchor = new google.maps.Point(5,5);
			smallIcon.infoWindowAnchor = new google.maps.Point(10,0);
			
			// Create route line
			//var routeData = [[50.151288,-5.062723],[49.951752,-5.02121],[49.937611,-5.32058],[49.997669,-5.69686],[50.067711,-5.84472],[50.25774,-5.69641],[50.32793,-5.39978],[50.569279,-5.1416],[50.792042,-4.72412],[51.09317,-4.58129],[51.580479,-4.70214],[51.549751,-4.99877],[51.716808,-5.37231],[51.788231,-5.31738],[51.852741,-5.48767],[52.005169,-5.34484],[52.311829,-4.37805],[52.429218,-4.20776],[52.596371,-4.19677],[52.752911,-4.4165],[52.703011,-4.84497],[52.8857,-4.8999],[53.080818,-4.44397],[53.32431,-3.94958],[53.49131,-4.37255],[54.117378,-4.46044],[54.319721,-4.26818],[54.361351,-4.35607],[54.444489,-4.3341],[54.42532,-4.48242],[54.651588,-4.44397],[54.626148,-4.88342],[54.686531,-5.05371],[54.79435,-5.07568],[54.939758,-5.24597],[55.0532,-5.20202],[55.26033,-4.91088],[55.429008,-5.06469],[55.37598,-5.3833],[55.29475,-5.6195],[55.275982,-5.85022],[55.64349,-5.85571],[56.047501,-5.72937],[56.200588,-5.67443],[56.492821,-5.63598],[56.553421,-5.95459],[56.662258,-6.03149],[56.698471,-6.27868],[56.944969,-6.06445],[57.20771,-5.66894],[57.273102,-5.64147],[57.29388,-5.86669],[57.592442,-5.89965],[57.888569,-5.83923],[57.94693,-5.6195],[57.967331,-5.34484],[58.104,-5.50415],[58.1707,-5.36682],[58.277729,-5.47668],[58.292171,-5.20202],[58.43623,-5.20752],[58.462101,-5.10864],[58.51952,-5.20202],[58.65694,-5.02624],[58.568249,-4.32312],[58.622631,-4.02648],[58.696918,-3.36181],[58.662651,-2.98278],[58.470718,-2.98828],[58.28928,-3.18054],[58.228588,-3.38928],[57.967331,-3.92211],[57.871052,-3.71887],[57.745209,-3.29589],[57.730549,-2.01599],[57.568878,-1.66442],[57.127289,-1.85119],[56.983898,-2.11486],[56.731628,-2.18078],[56.583691,-2.37854],[56.48069,-2.66967],[56.380459,-2.68066],[56.286049,-2.54333],[56.206699,-2.66418],[56.038288,-2.5653],[55.92458,-2.05444],[55.745659,-1.80725],[55.537949,-1.49963],[55.062641,-1.33483],[54.724621,-1.14807],[54.565689,-0.63171],[54.239552,-0.20874],[54.117378,0.06591],[54.020679,-0.10986],[53.59576,0.28015],[53.159939,0.38452],[53.03791,0.53283],[53.011471,1.42272],[52.656391,1.87866],[52.150341,1.77429],[51.76104,1.27441],[51.597542,0.97778],[51.443729,0.95581],[51.40263,1.07116],[51.443729,1.45019],[51.358059,1.56005],[51.292839,1.45568],[51.11731,1.4447],[51.02066,1.0382],[50.8857,1.04919],[50.878769,0.7965],[50.792042,0.43945],[50.684269,0.2362],[50.76078,-0.21972],[50.701672,-0.76355],[50.750351,-0.99975],[50.663391,-0.99975],[50.639011,-1.1206],[50.537868,-1.2854],[50.670349,-1.604],[50.677311,-1.86767],[50.55183,-1.9281],[50.569279,-2.3291],[50.474979,-2.43896],[50.677311,-2.85644],[50.614609,-3.22448],[50.52739,-3.41125],[50.43301,-3.47717],[50.33844,-3.42224],[50.120571,-3.65295],[50.134659,-3.97705],[50.25423,-4.03747],[50.306881,-4.4165],[50.219093,-4.732361],[50.176899,-4.844971],[50.151288,-5.062723]];
			
			//var routeCoords = [];
			
			//for(x in routeData) {
			//	routeCoords.push(new google.maps.LatLng(routeData[x][0], routeData[x][1]));
			//}
			
			//var routeLine = new google.maps.Polyline(routeCoords, "#ff8358", 5, 1);
			//map.addOverlay(routeLine);
			
			var startEndCoord = new google.maps.LatLng(50.151288, -5.062723);
			
			// Create tracker line
			
			var trackerCoords, nightMarker, distance, latestCoord, dateParts, dateStringParts, jsDate, infoBoxHtml, blogHtml, prevDate, addingBlogData;
			var trackerLines = {};
			var totalDistance = 0, dayCount = 0, dayNo = 0;
			
			var startDate = new Date(2010,3,20);
			
			for(date in trackerData) {
				dayCount++;
				if(prevDate) {
					trackerData[prevDate]['nextDate'] = date;
				}
				prevDate = date;
			}
			
			for(date in trackerData) {
				dayNo++;
				trackerCoords = [];
				
				if(latestCoord) {
					trackerCoords.push(latestCoord);
				}
				
				for(x in trackerData[date]) {
					if(x == 'nextDate')
						continue;
					trackerCoords.push(new google.maps.LatLng(trackerData[date][x][0], trackerData[date][x][1]));
				}
				
				latestCoord = trackerCoords[trackerCoords.length-1];
				
				//trackerLines[date] = new google.maps.Polyline(trackerCoords, "#5883ff", 5, 1);
				trackerLines[date] = new google.maps.Polyline(trackerCoords, "#ff8358", 5, 1);
				
				map.addOverlay(trackerLines[date]);
				
				distance = trackerLines[date].getLength();
				totalDistance += distance;
				
				if(dayNo == dayCount) {
					continue;
				}
				
				dateParts = date.split("-");
				jsDate = (new Date(dateParts[0],dateParts[1]-1,dateParts[2]))
				dateStringParts = jsDate.toDateString().split(" ");
				
				// Retrieve blog data
				blogHtml = '';
				addingBlogData = false;
				for(x in blogData) {
					if(x == date)
						addingBlogData = true;
					if(trackerData[date]['nextDate'] && x == trackerData[date]['nextDate'])
						break;
					
					if(addingBlogData) {
						for(iBlog in blogData[x]) {
							blogHtml += '<div class="bubbleBlogTitle"><a href="' + blogData[x][iBlog].link + '">' + blogData[x][iBlog].title + '</a></div>';
							blogHtml += blogData[x][iBlog].excerpt;
						}
					}
				}
				
				infoBoxHtml = $('#nightLocationContainer')
									.html()
									.replace('#DATE#',dateStringParts[0] + " " + dateStringParts[2] + " " + dateStringParts[1] + " " + dateStringParts[3])
									.replace('#NIGHT#',Math.ceil((jsDate.getTime() - startDate.getTime()) / 86400000)+1)
									.replace('#DISTANCE#',tracker.metresToMiles(distance))
									.replace('#TOTAL#',tracker.metresToMiles(totalDistance))
									.replace('#BLOGHTML#',blogHtml);
				
				nightMarker = new google.maps.Marker(trackerCoords[trackerCoords.length-1], {icon:smallIcon});
				map.addOverlay(nightMarker);
				nightMarker.bindInfoWindowHtml(infoBoxHtml);
			}
			
			$('#currentLocationContainer').html($('#currentLocationContainer').html().replace('##', tracker.metresToMiles(totalDistance)));
			
			// Create current location marker/info box
			
			var currentLocation = new google.maps.Marker(latestCoord);
			map.addOverlay(currentLocation);
			
			currentLocation.bindInfoWindow($('#currentLocationContainer>div.trackerMapBubble')[0]);
			currentLocation.openInfoWindow($('#currentLocationContainer>div.trackerMapBubble')[0]);
			
			// Create start/end marker/info box
			var startPoint = new google.maps.Marker(startEndCoord, {icon:smallIcon});
			map.addOverlay(startPoint);
			
			startPoint.bindInfoWindow($('#startTextContainer>div.trackerMapBubble')[0]);
			
			// Initialise overlay object
			
			var swBound = new google.maps.LatLng(49.68, -7.825);
			var neBound = new google.maps.LatLng(58.76, 2.07);
			var bounds = new google.maps.LatLngBounds(swBound, neBound);
			
			var srcImage = 'images/map-overlay.png';
			
			var overlay = new GonePaddlingOverlay(srcImage, bounds);
			map.addOverlay(overlay);
			
			var listenerMove, listenerZoom, listenerOver;
			
			var removeFn = function() {
				$(overlay.div_).clearQueue().fadeTo(200, 0, function() {
					map.removeOverlay(overlay);
				});
				
				map.addControl(new google.maps.SmallMapControl());
				map.addControl(new google.maps.MenuMapTypeControl());
				
				google.maps.Event.removeListener(listenerMove);
				google.maps.Event.removeListener(listenerZoom);
				google.maps.Event.removeListener(listenerOver);
				google.maps.Event.removeListener(listenerOut);
			};
			
			var popupListener;
			
			popupListener = google.maps.Event.addListener(map, 'infowindowopen', function() {
				map.setCenter(centerPoint);
				
				listenerMove = google.maps.Event.addListener(map, 'move', removeFn);
				listenerZoom = google.maps.Event.addListener(map, 'zoomend', removeFn);
				
				listenerOver = google.maps.Event.addListener(map, 'mouseover', function() {
					$(overlay.div_).clearQueue().fadeTo(200, 0.5);
				});
				
				listenerOut = google.maps.Event.addListener(map, 'mouseout', function() {
					$(overlay.div_).clearQueue().fadeTo(200, 1);
				});
				
				google.maps.Event.removeListener(popupListener);
			});
		}
	};
	
	var nav = {
		id: null,
		hasLoaded: false,
		
		onLoad: function() {
			nav.hasLoaded = true;
			nav.navLinks = $(".mainNavigation a");
			nav.scrollEl = $(".mainContainerInner");
			nav.container = $(".mainContainer");
			nav.content = $(".mainContent");
			nav.baseContentPage = $(".mainContentPage");
			
			nav.currentPage = nav.content.children();
			
			setTimeout(function() {
				nav.container.height(nav.baseContentPage.height());
			}, 0);
			
			nav.navLinks.address();
			
			nav.navLinks.click(function() {
				$(this).blur();
			});
			
			// Load other pages
			$.getJSON("ajax/pageData.php", {"ex":this.id}, function(data) {nav.loadPages(data);});
		},
		
		loadPages: function(data) {
			var i;
			
			for(i=data.before.length-1; i>=0; i--) {
				nav.content.prepend(data.before[i]);
			}
			
			for(i=0; i<data.after.length; i++) {
				nav.content.append(data.after[i]);
			}
			
			$('a.internal').address();
			
			var pages = nav.content.children(".mainContentPage");
			var singleWidth = nav.scrollEl.width();
			
			nav.content.width(singleWidth * pages.length);
			
			// Show previously requested page when loaded
			if(nav.goToPageOnLoad) {
				nav.showPage(nav.goToPageOnLoad.page, nav.goToPageOnLoad.animate);
			} else {
				// Scroll back to correct page having added extra content
				nav.scrollEl.scrollTo(nav.currentPage);
			}
		},
		
		goToPageOnLoad: null,
		
		showPage: function(i, animate) {
			var targetPage = $("#page-"+i);
			
			$(".page").removeClass("current");
			$(".page-"+i).addClass("current");
			
			nav.currentPage = $('#page-' + i);
			
			// Target page not yet loaded, show when loaded
			if(targetPage.length == 0) {
				nav.goToPageOnLoad = {page: i, animate: animate};
				if(!animate)
					nav.content.hide();
				return;
			} else {
				nav.goToPageOnLoad = null;
				nav.content.show();
			}
			
			nav.scrollEl.scrollTo(targetPage, animate ? 300 : 0, {
				onAfter: function() {
					var currentHeight = nav.container.height();
					var newHeight = Math.max(478, targetPage.height());
					nav.container.animate({height: newHeight}, animate ? 200 : 0, 'easeInExpo');
				},
				'easing':	'easeInExpo'
			});
		},
		
		addressChange: function(event, internal) {
			
			// Click 'back' to start page or go to root
			if(event.value == "/" && !internal) {
				if(nav.hasLoaded)	// 'back' to start page
					nav.showPage(nav.id, false);
				return;
			}
			
			// Click link or back button
			var matches = event.value.match(/\?.*p=([^&]+)/);
			if(!matches)
				return;
			
			this.showPage(matches[1], internal);
		}
	};
	
	var sponsors = {
		init: function() {
			sponsors.logoContainer = $('.sponsorLogos');
			sponsors.logos = sponsors.logoContainer.children('li');
			
			sponsors.infoContainer = $('.sponsorInfoContainer');
			sponsors.infoContainer.css({
				'visibility': 'visible',
				'opacity'	: 0
			});
			
			sponsors.infoDivs = sponsors.infoContainer.children('div.sponsorInfo');
			
			sponsors.topArrow = sponsors.infoContainer.children('img.sponsorInfoArrow:not(.arrowBottom)');
			sponsors.bottomArrow = sponsors.infoContainer.children('img.sponsorInfoArrow.arrowBottom');
			
			sponsors.infoArrow = sponsors.infoContainer.children('img.sponsorInfoArrow');
			
			sponsors.logos.hover(function() {
				var id = $(this).children('a').attr('rel');
				var div = sponsors.infoDivs.filter('#sponsor-' + id);
				
				if(div.length == 0)
					return;
				
				if($(this).parents('ul').hasClass('logosBottom')) {
					sponsors.topArrow.css('visibility','hidden');
					sponsors.bottomArrow.css('visibility','visible');
				} else {
					sponsors.topArrow.css('visibility','visible');
					sponsors.bottomArrow.css('visibility','hidden');
				}
				
				clearTimeout(sponsors.infoTimeout);
				
				var img = $('img', this);
				
				sponsors.infoDivs.hide();
				div.show();
				sponsors.infoContainer.stop().clearQueue().fadeTo(300, 1);
				
				var position = img.position().left + img.width()/2 - sponsors.infoArrow.width()/2;
				sponsors.infoArrow.css('marginLeft', position);
				
			}, function() {
				sponsors.infoTimeout = setTimeout(function() {
					sponsors.infoContainer.stop().clearQueue().fadeTo(300, 0, function() {
						//$(this).hide();
					});
				}, 100);
			});
		}
	};
	
	return public;
})(jQuery);
