(function($)
{

	$.fn.Route = function(arrConfig)
	{

		// --Config variabele instellen
		var arrConfig = $.extend(true, {}, $.fn.Route.defaults, arrConfig)
		arrConfig.container = this.attr("id");

		// --Defaults instellen aan het route object
		$.fn.Route.defaults = arrConfig;

		// --Map genereren
		$.fn.createMap();

		return this;
	};

	/**
	* Ophalen van de route met ajax
	*/
	$.fn.getRoute = function(arrOptions)
	{
		// --Opties samenvoegen
		var arrOptions = $.extend($.fn.Route.defaults, arrOptions);

		$.each($.fn.Route.defaults.itemno, function(intCounter, intItemno)
		{
			var strParams = "itemno=" + intItemno + "&simplifier=" + $.fn.Route.defaults.simplifier;

			// --Ophalen van de data van de routes
			$.post($.fn.Route.defaults.path + "ajax_route.php", strParams, $.fn.responseGetRoute, "json");
		});

	}

	/**
	* Response van de ajax-call
	*/
	$.fn.responseGetRoute = function(objResponse)
	{
		var arrLineOptions = {};

		// --Controleren of er een priority is meegegeven
		if (objResponse.priority != false)
		{
			arrLineOptions.strokeColor = "#" + objResponse.priority.colorcode;
		}

		// --Controleren of er coordinaten zijn
		var objParams = {lineOptions: arrLineOptions, itemno: objResponse.itemno};

		$.fn.createDirections(objResponse.coordinates, objParams);

		// --Adressen tonen
		if ($.fn.Route.defaults.showAddresses == true)
		{
			$.fn.addAddressesOnRoute(objResponse.addresses);
		}
	}

	/**
	* Creeren van de volledige route
	*/
	$.fn.createDirections = function(arrCoordinates, objParams)
	{

		if (arrCoordinates != null)
		{
			var arrPolylines = Array();
			var objPreviousLatLng = null;

			if($.fn.Route.defaults.useDirectionsService == true)
			{

				$.each(arrCoordinates, function(intCount, objObject)
				{

					// --Mag enkel vanaf het 2de punt uitgevoerd worden( je kan geen
					// punt naar zichzelf trekken de eerste keer)
					if (intCount > 1)
					{
						var objPolyline = $.fn.createDirection(objPreviousLatLng, new google.maps.LatLng(objObject.latittude, objObject.longitude), objParams);
					}


					// --Vorig punt opslaan
					var objLatLng = new google.maps.LatLng(objObject.latittude, objObject.longitude);

					// --LatLng toevoegen aan array
					$.fn.Route.defaults.LatLng.push(objLatLng);

					// --Vorige LatLng maken.
					objPreviousLatLng = objLatLng;

				});

				// --Centreren van de map.
				$.fn.centerMap($.fn.Route.defaults.LatLng);
			}
			else
			{

				var arrOptions = $.extend({}, $.fn.Route.defaults, objParams);
				var arrPath = new Array();

				// --De line opties (kleur, ...)
				var arrPolylineOptions =
				{
					map : $.fn.Route.defaults.googlemaps,
					strokeColor : arrOptions.lineOptions.strokeColor,
					strokeWeight : arrOptions.lineOptions.strokeWeight,
					strokeOpacity : arrOptions.lineOptions.strokeOpacity
				};

				$.each(arrCoordinates, function(intCount, objObject)
				{
					// --Vorig punt opslaan
					var objLatLng = new google.maps.LatLng(objObject.latittude, objObject.longitude);
					arrPath.push(objLatLng);

					// --LatLng toevoegen aan array
					$.fn.Route.defaults.LatLng.push(objLatLng);

				});

				// --Centreren van de map.
				$.fn.centerMap($.fn.Route.defaults.LatLng);


				// --Path toevoegen aan de PolylineOptions
				arrPolylineOptions["path"] = arrPath;

				// --Nieuwe polyline maken
				var objPolyline = new google.maps.Polyline(arrPolylineOptions);

				$.fn.Route.defaults.overlaysRoutes.push(objPolyline);


				// --Itemno
				var intItemno = objParams.itemno;

				if (arrOptions.mapOptions.useDraggable == false)
				{
					// --Nieuwe polyline maken
					var objPolyline = new google.maps.Polyline(arrPolylineOptions);

					$.fn.Route.defaults.overlaysRoutes.push(objPolyline);

					if($.fn.Route.defaults.showPopUpRoute == true)
					{
						InfoWindow = new google.maps.InfoWindow(
						{
							size : new google.maps.Size(300, 300)
						});

						google.maps.event.addListener(objPolyline, 'click', function(objEvent)
						{
							InfoWindow.setContent("<iframe src='" + $.fn.Route.defaults.path + "google-maps-route.php?itemno=" + intItemno +"' frameborder='0' width='300px' height='200px'></iframe>");
							InfoWindow.setPosition(objEvent.latLng);

							InfoWindow.open($.fn.Route.defaults.googlemaps);
						});
					}
				}
			}
		}
	}

	/**
	* Creeren van een direction(punt A naar B)
	*/
	$.fn.createDirection = function(objStart, objEnd, objParams)
	{
		var arrOptions = $.extend({}, $.fn.Route.defaults, objParams);

		var arrPath = new Array();
		var arrRequest =
		{
			origin : objStart,
			destination : objEnd,
			travelMode : arrOptions.mapOptions.travelMode,
			unitSystem: arrOptions.mapOptions.unitSystem,
			provideRouteAlternatives: arrOptions.mapOptions.provideRouteAlternatives,
			avoidHighways: arrOptions.mapOptions.avoidHighways,
			avoidTolls: arrOptions.mapOptions.avoidTolls,
			optimizeWaypoints: arrOptions.mapOptions.optimizeWaypoints
		};

		// --De line opties (kleur, ...)
		var arrPolylineOptions =
		{
			map : $.fn.Route.defaults.googlemaps,
			strokeColor : arrOptions.lineOptions.strokeColor,
			strokeWeight : arrOptions.lineOptions.strokeWeight,
			strokeOpacity : arrOptions.lineOptions.strokeOpacity
		};



		// --DirectionDisplay object initialiseren om een route omschrijving te
		// kunnen tonen
		if ($.fn.Route.defaults.directionsDisplay != "")
		{
			$.fn.Route.defaults.directionsDisplay.setMap(null);
		}

		var objRendererOptions = {
			draggable : arrOptions.mapOptions.useDraggable,
			polylineOptions: arrPolylineOptions,
			suppressMarkers: arrOptions.mapOptions.suppressMarkers
		};

		$.fn.Route.defaults.directionsDisplay = new google.maps.DirectionsRenderer(objRendererOptions);

		if ($.fn.Route.defaults.directionsPanel != "")
		{
			$.fn.Route.defaults.directionsDisplay.setPanel(document.getElementById($.fn.Route.defaults.directionsPanel));
		}

		if($.fn.Route.defaults.useDirectionsService == true)
		{

			// --Directionservice object initialiseren om een route te bewerken
			var directionsService = new google.maps.DirectionsService();

			directionsService.route(arrRequest, function(objResponse, intStatus)
			{
				// --Controleren of de status ok is
				if (intStatus == google.maps.DirectionsStatus.OK)
				{
					// --Wanneer men in streetview staat => terugkeren naar de
					// kaartweergave
					$.fn.Route.defaults.googlemaps.getStreetView().setVisible(false);

					// --Leeg maken van de eventuele route beschrijving
					if ($.fn.Route.defaults.directionsPanel != "")
					{
						$("#" + $.fn.Route.defaults.directionsPanel).html("");
					}

					if ($.fn.Route.defaults.errorPanelId != "")
					{
						$("#" + $.fn.Route.defaults.errorPanelId).html("");
						$("#" + $.fn.Route.defaults.errorPanelId).css("display", "none");
					}

					// --Alle lat en lng ophalen en in het path stoppen die
					// gebruikt wordt om te tekenen
					$.each(objResponse.routes[0].overview_path, function(intIndex, objLatLng)
					{
						arrPath.push(objLatLng);
					});

					// --Path toevoegen aan de PolylineOptions
					arrPolylineOptions["path"] = arrPath;

					// --Itemno
					var intItemno = objParams.itemno;

					if (arrOptions.mapOptions.useDraggable == false)
					{
						// --Nieuwe polyline maken
						var objPolyline = new google.maps.Polyline(arrPolylineOptions);

						$.fn.Route.defaults.overlaysRoutes.push(objPolyline);

						if($.fn.Route.defaults.showPopUpRoute == true)
						{
							InfoWindow = new google.maps.InfoWindow(
							{
								size : new google.maps.Size(300, 300)
							});

							google.maps.event.addListener(objPolyline, 'click', function(objEvent)
							{
								InfoWindow.setContent("<iframe src='" + $.fn.Route.defaults.path + "google-maps-route.php?itemno=" + intItemno +"' frameborder='0' width='300px' height='200px'></iframe>");
								InfoWindow.setPosition(objEvent.latLng);

								InfoWindow.open($.fn.Route.defaults.googlemaps);
							});
						}
					}
					else
					{
						$.fn.Route.defaults.directionsDisplay.setMap($.fn.Route.defaults.googlemaps);
						$.fn.Route.defaults.directionsDisplay.setDirections(objResponse);
					}
				}
				else
				{
					// --Leeg maken van de eventuele route beschrijving
					if ($.fn.Route.defaults.directionsPanel != "")
					{
						$("#" + $.fn.Route.defaults.directionsPanel).html("");
					}

					var strMessage = "";

					switch (intStatus)
					{
						case "NOT_FOUND":
						strMessage = arrOptions.messages.GoogleMapsErrorNotFound;
						break;
						case "ZERO_RESULTS":
						strMessage = arrOptions.messages.GoogleMapsErrorNotZeroResults;
						break;
						case "MAX_WAYPOINTS_EXCEEDED":
						strMessage = arrOptions.messages.GoogleMapsErrorNotMaxWaypointsExceeded;
						break;
						case "INVALID_REQUEST":
						strMessage = arrOptions.messages.GoogleMapsErrorNotInvalidRequest;
						break;
						case "OVER_QUERY_LIMIT":
						strMessage = arrOptions.messages.GoogleMapsErrorOverQueryLimit;
						break;
						case "REQUEST_DENIED":
						strMessage = arrOptions.messages.GoogleMapsErrorRequestDenied;
						break;
						case "UNKNOWN_ERROR":
						strMessage = arrOptions.messages.GoogleMapsErrorUnkownError;
						break;
					}

					if (strMessage == "") strMessage = intStatus;

					// --Alerten van de status als het mislukt is.
					if ($.fn.Route.defaults.errorPanelId != "")
					{
						$("#" + $.fn.Route.defaults.errorPanelId).html(strMessage);
						$("#" + $.fn.Route.defaults.errorPanelId).css("display", "block");
					}
					else
					{
						alert(strMessage);
					}
				}
			});
		}
		else
		{
			/*
			// --Toevoegen van de start en einde
			arrPath.push(objStart);
			arrPath.push(objEnd);

			// --Path toevoegen aan de PolylineOptions
			arrPolylineOptions["path"] = arrPath;

			// --Nieuwe polyline maken
			var objPolyline = new google.maps.Polyline(arrPolylineOptions);

			$.fn.Route.defaults.overlaysRoutes.push(objPolyline);

			// --Itemno
			var intItemno = objParams.itemno;

			if (arrOptions.mapOptions.useDraggable == false)
			{
			// --Nieuwe polyline maken
			var objPolyline = new google.maps.Polyline(arrPolylineOptions);

			$.fn.Route.defaults.overlaysRoutes.push(objPolyline);

			if($.fn.Route.defaults.showPopUpRoute == true)
			{
			InfoWindow = new google.maps.InfoWindow(
			{
			size : new google.maps.Size(300, 300)
			});

			google.maps.event.addListener(objPolyline, 'click', function(objEvent)
			{
			InfoWindow.setContent("<iframe src='" + $.fn.Route.defaults.path + "google-maps-route.php?itemno=" + intItemno +"' frameborder='0' width='300px' height='200px'></iframe>");
			InfoWindow.setPosition(objEvent.latLng);

			InfoWindow.open($.fn.Route.defaults.googlemaps);
			});
			}
			}
			else
			{
			$.fn.Route.defaults.directionsDisplay.setMap($.fn.Route.defaults.googlemaps);
			$.fn.Route.defaults.directionsDisplay.setDirections(objResponse);
			}
			*/
		}
	}

	/**
	* Creeren van een google-maps adhv de container
	*/

	$.fn.createMap = function()
	{
		var strMap = "" + $.fn.Route.defaults.container;
		var objMap = new google.maps.Map(document.getElementById(strMap), $.fn.Route.defaults.mapOptions);

		// --Toevoegen van het googlemaps object aan de opties.
		$.extend($.fn.Route.defaults,
		{
			googlemaps : objMap
		});
	}

	// --Bepaalde markers tonen die op de route geplaatst werden.

	/**
	* Centreren van de kaart
	*/
	$.fn.centerMap = function(arrObjects)
	{
		var objLatLngBounds = new google.maps.LatLngBounds();

		$.each(arrObjects, function(intCounter, objObject)
		{
			objLatLngBounds.extend(objObject);
		});

		$.fn.Route.defaults.googlemaps.setCenter(objLatLngBounds.getCenter());
		$.fn.Route.defaults.googlemaps.fitBounds(objLatLngBounds);
	}

	/**
	* Toevoegen van adressen die gekoppeld zijn aan een route.
	*/
	$.fn.addAddressesOnRoute = function(arrAddresses)
	{
		// --Alle adressen overlopen en tonen op de google maps kaart
		$.each(arrAddresses, function(intCounter, objAddress)
		{
			var objOptions =
			{
				typeno : objAddress.related_typeno,
				addressno : objAddress.addressno,
				showInfoWindow: true,
				icon: new google.maps.MarkerImage(
				"http://groteroutepaden.dmcloud.be/images/marker.png",
				new google.maps.Size(28, 41),
				new google.maps.Point(0, 0),
				new google.maps.Point(14, 41)
				),
				shadow: new google.maps.MarkerImage(
				"http://groteroutepaden.dmcloud.be/images/marker_shadow.png",
				new google.maps.Size(36, 49),
				new google.maps.Point(0, 0),
				new google.maps.Point(15, 42)
				)
			};

			// --Marker maken
			$.fn.createMarker(new google.maps.LatLng(objAddress.latittude, objAddress.longitude), objOptions);
		});
	}

	/**
	* Toevoegen van een marker op de map
	*/
	$.fn.createMarker = function(objLatLng, objOptions)
	{
		var objMarker = new google.maps.Marker(
		{
			map : $.fn.Route.defaults.googlemaps,
			position : objLatLng,
			title : objOptions.title,
			icon: objOptions.icon,
			shadow: objOptions.shadow
		});

		$.fn.Route.defaults.overlaysMarkers.push(objMarker);

		if(objOptions.showInfoWindow == true)
		{
			var bKeepShow = false;

			if (!objOptions.customInfoWindow)
			{
				var InfoWindow = new google.maps.InfoWindow(
				{
					content : "<iframe src='" + $.fn.Route.defaults.path + "google-maps-address.php?addressno=" + objOptions.addressno + "&map=1&related_typeno=" + objOptions.typeno + "' frameborder='0' width='300px' height='200px'></iframe>",
					size : new google.maps.Size(300, 300)
				});
			}
			else
			{
				var InfoWindow = objOptions.customInfoWindow;
			}

			if (objOptions.showInfoWindowOnHover == true)
			{
				google.maps.event.addListener(objMarker, 'mouseover', function() {
					bKeepShow = false;
					InfoWindow.open($.fn.Route.defaults.googlemaps, objMarker);
				});

				google.maps.event.addListener(objMarker, 'mouseout', function() {
					if (bKeepShow === false) InfoWindow.close();
				});

				if (objOptions.stickyInfoWindowOnClick)
				{
					google.maps.event.addListener(objMarker, 'click', function() {
						bKeepShow = true;
					});
				}
			}
			else
			{
				google.maps.event.addListener(objMarker, 'click', function()
				{
					InfoWindow.open($.fn.Route.defaults.googlemaps, objMarker);
				});
			}
		}
	}


	$.fn.findLocation = function(strAddress, arrOptions)
	{

		var arrOptions = $.extend({}, $.fn.Route.defaults.locationOptions, arrOptions);
		var objGeocoder = new google.maps.Geocoder();
		var arrGeocoderRequest = {address: strAddress}

		objGeocoder.geocode(arrGeocoderRequest, function(objGeocoderResult)
		{
			var objOptions =
			{
				showInfoWindow: false
			};
			var objLatLng = objGeocoderResult[0].geometry.location;
			$.fn.createMarker(objLatLng, objOptions);

			$.fn.Route.defaults.googlemaps.setZoom(arrOptions.zoom);
			$.fn.Route.defaults.googlemaps.panTo(objLatLng);
		});
	}

	$.fn.clearMap = function()
	{
		$.fn.clearRoutes();
		$.fn.clearMarkers();
	}

	$.fn.clearRoutes = function()
	{
		$.each($.fn.Route.defaults.overlaysRoutes, function(intIndex, objObject)
		{
			objObject.setMap(null);

		});

		$.fn.Route.defaults.overlaysRoutes.length = 0;
	}

	$.fn.clearMarkers = function()
	{
		$.each($.fn.Route.defaults.overlaysMarkers, function(intIndex, objObject)
		{
			objObject.setMap(null);

		});

		$.fn.Route.defaults.overlaysMarkers.length = 0;
	}

	/**
	* Defaults van het route object
	*/
	$.fn.Route.defaults =
	{
		path : "/",
		container : "",
		directionsPanel : "",
		directionsDisplay : "",
		errorPanelId : "",
		mapOptions :
		{
			zoom : 5,
			center : new google.maps.LatLng(50.84458421266998, 4.363798636718684),
			mapTypeId : google.maps.MapTypeId.TERRAIN,
			streetViewControl : false,
			mapTypeControl : false,
			mapTypeControlOptions:
			{
				style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
			},
			scrollwheel : false,
			navigationControl: true,
			scaleControl: true,
			travelMode: google.maps.DirectionsTravelMode.WALKING,
			unitSystem: google.maps.DirectionsUnitSystem.METRIC,
			provideRouteAlternatives: false,
			avoidHighways: false,
			avoidTolls: true,
			optimizeWaypoints: true,
			useDraggable: false,
			suppressMarkers: true
		},
		lineOptions :
		{
			strokeColor : "#000000",
			strokeWeight : 5,
			strokeOpacity : 1.0
		},
		locationOptions :
		{
			zoom: 13,
			showInfoWindo: false
		},
		messages :
		{
			GoogleMapsErrorNotFound : "At least one of the locations specified in the requests's origin, destination, or waypoints could not be geocoded.",
			GoogleMapsErrorNotZeroResults : "No route could be found between the origin and destination.",
			GoogleMapsErrorNotMaxWaypointsExceeded : "Too many waypointss were provided in the request.",
			GoogleMapsErrorNotInvalidRequest : "The provided request was invalid.",
			GoogleMapsErrorOverQueryLimit : "The service has received too many requests from your application within the allowed time period.",
			GoogleMapsErrorRequestDenied : "The service denied use of the directions service by your application.",
			GoogleMapsErrorUnkownError : "A directions request could not be processed due to a server error. The request may succeed if you try again."
		},
		LatLng : Array(),
		showAddresses : true,
		showPopUpRoute : true,
		overlaysRoutes : Array(), // --Array met alle overlays die gebruikt wordt om
		overlaysMarkers : Array(), // --Array met alle overlays die gebruikt wordt om
		// de map te clearen.
		useDirectionsService: true,
		simplifier: 0 //--Int die aanduid of je een versimpelde versie wil van de route (hoe hoger het getal, hoe simpeler de route)
	}

})(jQuery);
