Native.implement([Element,Document,Window,String], {
	fromQueryString : function() {
		switch($type(this)) {
			case "window":
			case "document":
				var url = location.href;
				break;
			case "element":
				switch(this.get("tag")) {
					case "a":
						var url = this.get("href");
						break;
					case "form":
						var url = this.get("action");
						break;
					default:
						return false;
				}
				break;
			case "string":
				var url = this;
				break;
			default:
				return false;
		}

		var parameters = false;

		if(url.contains("?")) {
			if(url.contains("#")) {
				url = url.split("#")[0];
			}

			var query = url.split("?")[1];

			if(query != "") {
				var parameters = new Hash();
				params = query.split("&");
				params.each(function(param) {
					param = param.split("=");
					parameters.set(param[0], param[1]);
				});
			}
		}

		return parameters;
	}
});

var Site = {
	start: function() {
		Site.initSubMenus();

		if(google.maps.BrowserIsCompatible()) {
			Site.initMaps();

			var portsIntroMap = $("ports-intro-map");
			if(portsIntroMap) {
				Site.initPortsMap(portsIntroMap, true);
			}

			var portsMap = $("ports-map");
			if(portsMap) {
				Site.initPortsMap(portsMap, false);
			}

			var portShipsMap = $("port-ships-map");
			if(portShipsMap) {
				Site.initPortShipsMap(portShipsMap);
			}

			var portRouteMap = $("port-route-map");
			if(portRouteMap) {
				Site.initPortRouteMap(portRouteMap);
			}
		}

		var searchCanvas = $("search-canvas");
		if(searchCanvas) {
			var searchControl = new google.search.SearchControl();
			searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET); 

			var siteSearch = new google.search.WebSearch();
			siteSearch.setUserDefinedLabel("Rederij Vooruit");
			siteSearch.setSiteRestriction(_("rederij-vooruit.com"));

			searchControl.addSearcher(siteSearch);
			searchControl.draw(searchCanvas);

			var query = window.fromQueryString();

			if(query) {
				searchControl.execute(query.q);
			}
		}

		var shipsCarousel = $("ships-carousel");
		if(shipsCarousel) {
			new Carousel(shipsCarousel, 145);
		}

		$(document.body).getElements('.ship-details .images').each(function(item) {
			new Carousel(item, 243);
		});
	},

	initMaps: function() {
		Site.icon	= new google.maps.Icon();
		Site.icon.image	= "http://rederij-vooruit.com/styles/maps/icon.png";
		Site.icon.shadow = "http://rederij-vooruit.com/styles/maps/shadow.png";
		Site.icon.iconSize = new google.maps.Size(28.0, 40.0);
		Site.icon.shadowSize = new google.maps.Size(49.0, 40.0);
		Site.icon.iconAnchor = new google.maps.Point(14.0, 40.0);
		Site.icon.infoWindowAnchor = new google.maps.Point(14.0, 20.0);
	}, 

	initPortsMap: function(element, simple) {
		var map = new google.maps.Map2(element);
		if(simple) {
			map.addControl(new google.maps.SmallMapControl());
		} else {
			map.addControl(new google.maps.LargeMapControl());
			map.addControl(new google.maps.MapTypeControl());
		}
		map.setCenter(new google.maps.LatLng(52, 6));

		var bounds	= new google.maps.LatLngBounds();

		new Request.JSON({url: _("/ports/json/"), onComplete: function(ports) {
			ports.each(function(port) {
				var location = new google.maps.LatLng(port.location.x, port.location.y);
				var marker = new google.maps.Marker(location, Site.icon);

				var tabs = [];
				tabs.push(new google.maps.InfoWindowTab("Algemeen", port.info));

				google.maps.Event.addListener(marker, 'click', function() {  
					marker.openInfoWindowTabsHtml(tabs);  
				});

				map.addOverlay(marker);
				bounds.extend(location);
			});

			map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		}}).get();
	}, 

	initPortShipsMap: function(element) {
		var input = element.getElement('input[@name="port-id"]');
		var id = input.get("value");

		var map = new google.maps.Map2(element);
		map.setMapType(G_HYBRID_MAP); 
		map.addControl(new google.maps.LargeMapControl());
		map.addControl(new google.maps.MapTypeControl());
		map.setCenter(new google.maps.LatLng(52, 6));

		var bounds	= new google.maps.LatLngBounds();

		new Request.JSON({url: _("/ports/port/json/"), onComplete: function(port) {
			port.ships.each(function(ship) {
				var location = new google.maps.LatLng(ship.location.x, ship.location.y);
				var marker = new google.maps.Marker(location, Site.icon);

				var tabs = [];  
				tabs.push(new google.maps.InfoWindowTab("Algemeen", ship.info));  

				google.maps.Event.addListener(marker, "click", function() {  
					marker.openInfoWindowTabsHtml(tabs);  
				});

				map.addOverlay(marker);
				bounds.extend(location);
			});

			map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		}}).get({"id": id});
	}, 

	initPortRouteMap: function(element) {
		var input = element.getElement('input[@name="port-id"]');
		var id = input.get("value");

		var map = new google.maps.Map2(element);
		map.addControl(new google.maps.LargeMapControl());
		map.addControl(new google.maps.MapTypeControl());
		map.setCenter(new google.maps.LatLng(52, 6));

		var bounds	= new google.maps.LatLngBounds();

		new Request.JSON({url: _("/ports/port/json/"), onComplete: function(port) {
			var location = new google.maps.LatLng(port.location.x, port.location.y);
			var marker = new google.maps.Marker(location, Site.icon);

			var tabs = [];  
			tabs.push(new google.maps.InfoWindowTab('Algemeen', port.name));  
			tabs.push(new google.maps.InfoWindowTab('Schepen', ''));  

			google.maps.Event.addListener(marker, 'click', function() {  
				marker.openInfoWindowTabsHtml(tabs);  
			});

			map.addOverlay(marker);
			bounds.extend(location);

			var directions = new google.maps.Directions(map, $("directions"));
			google.maps.Event.addListener(directions, "error", function() {
				var status = directions.getStatus();
				alert(status.code);
			});

			var directionsForm = $("directions-form");
			directionsForm.addEvent("submit", function() { 
				var direction = "from: " + $("from-field").get("value") + " to: " + port.address.street + " " + port.address.home;

				var r = directions.load(direction);

				return false;
			});

			map.setCenter(bounds.getCenter(), Site.max(map.getBoundsZoomLevel(bounds), 8));
		}}).get({"id": id});
	}, 

	max: function(value, min) {
		if(value > min) return min;
		return value;
	},

	initSubMenus: function() {
		var anchors = $(document.body).getElements(".sub-menu a");

		anchors.each(function(anchor) {
			if(!anchor.get("href")) {
				var item = anchor.getParent();
				var list = item.getParent();

				if(item.hasClass("active")) {
					list.active = item;
				}

				anchor.addEvent("click", function(event, list, item) {
					if(list.active && list.active != item) {
						list.active.removeClass("active");
					}
					
					list.active = item.toggleClass("active");
				}.bindWithEvent(this, [list, item]));
			}
		});
	}
}

/**
 * Carousel
 */
var Carousel = new Class({
	initialize: function(element, width) {
		this.element = $(element);
		this.width = width;

		this.wrap = this.element.getElement(".wrap");
		this.position = this.wrap.getScroll();

		this.items = this.wrap.getElement("ul");
		this.activeItem = this.items.getFirst();

		this.scroll = new Fx.Scroll(this.wrap);

		var navigationHolder = this.element.getElement(".navigation-holder");
		if(navigationHolder) {
			var navigation = new Element("p", {"class": "navigation"}).inject(navigationHolder);
		} else {
			var navigation = new Element("p", {"class": "navigation"}).inject(this.element, "bottom");
		}

		this.previousLink = new Element("a", {
			"href": "#",
			"class": "previous-link",
			"html": "<span>Vorige</span>",
			"events": {
				"click": this.previousClick.bindWithEvent(this)
			}
		}).inject(navigation);

		this.nextLink = new Element("a", {
			"href": "#",
			"class": "next-link",
			"html": "<span>Volgende</span>",
			"events": {
				"click": this.nextClick.bindWithEvent(this)
			}
		}).inject(navigation);

		this.updateNavigation();
    },

	next: function() {
		this.to(this.activeItem.getNext(), this.width, 0);
	},

	previous: function() {
		this.to(this.activeItem.getPrevious(), -this.width, 0);
	},

	to: function(item, deltaX, deltaY) {

		if(item) {
			this.activeItem = item;
			this.position.x += deltaX;
			this.position.y += deltaY;
			this.scroll.start(this.position.x, 0);
		}

		this.updateNavigation();
	},

	updateNavigation: function() {
		if(this.activeItem) {
			if(this.activeItem.getNext()) {
				this.nextLink.removeClass("disabled");
			} else {
				this.nextLink.addClass("disabled");
			}

			if(this.activeItem.getPrevious()) {
				this.previousLink.removeClass("disabled");
			} else {
				this.previousLink.addClass("disabled");
			}
		} else {
			this.nextLink.addClass("disabled");
			this.previousLink.addClass("disabled");
		}
	},

	nextClick: function(event) {
		event.preventDefault();

		this.next();
	},

	previousClick: function(event) {
		event.preventDefault();

		this.previous();
	}
});

function _(s) {
	if(typeof(i18n) != 'undefined' && i18n[s]) {
		return i18n[s];
	}

	return s;
}

window.addEvent("domready", function() {
	Site.start();
});