/**
 * jQuery gMap
 *
 * @url		http://gmap.nurtext.de/
 * @author	Cedric Kastner <cedric@nur-text.de>
 * @version	1.0.4
 */
(function($)
{
	// Main plugin function
	$.fn.gMap = function(options)
	{
		// Check if the browser is compatible with Google Maps
		// if (!window.GBrowserIsCompatible || !GBrowserIsCompatible()) return this;

		// Build main options before element iteration
		var opts = $.extend({}, $.fn.gMap.defaults, options);

		// Iterate each matched element
		return this.each(function()
		{

			// Try to center to the first marker
			if (!opts.lat && !opts.lon)
			{
				// Check for at least one marker
				if ($.isArray(opts.markers) && opts.markers.length >= 1)
				{
					// Center to the first marker
					opts.lat  =  opts.markers[0].lat;
					opts.lon =  opts.markers[0].lon;
				}
				else
				{
					// Center Earth and lower zoom
					opts.lat = 34.885931;
					opts.lon = 9.84375;
					opts.zoom = 2;
				}
			}

            // Create new map and set initial options
            $gmap = new google.maps.Map(this, opts);


			// Check for custom map controls
			if (opts.controls.length == 0)
			{
				// Default map controls
				// $gmap.setUIToDefault();
			}
			else
			{
				// Add custom map controls
				for (var i = 0; i < opts.controls.length; i++)
				{
					// Eval is evil - I know. ;)
					eval('$gmap.addControl(new ' + opts.controls[i] + '());');
				}
			}

			// Check if scrollwheel should be enabled when using custom controls
			if (opts.scrollwheel == true && opts.controls.length != 0) { $gmap.enableScrollWheelZoom(); }

			// Add all map markers
			for (var j = 0; j < opts.markers.length; j++)
			{
				// Get the options from current marker
				marker = opts.markers[j];

                /*
				// Create new icon
				gicon = new google.maps.MarkerImage();

				// Set icon properties from global options
				gicon.image = opts.icon.image;
				gicon.shadow = opts.icon.shadow;
				gicon.iconSize = ($.isArray(opts.icon.iconsize)) ? new google.maps.Size(opts.icon.iconsize[0], opts.icon.iconsize[1]) : opts.icon.iconsize;
				gicon.shadowSize = ($.isArray(opts.icon.shadowsize)) ? new google.maps.Size(opts.icon.shadowsize[0], opts.icon.shadowsize[1]) : opts.icon.shadowsize;
				gicon.iconAnchor = ($.isArray(opts.icon.iconanchor)) ? new google.maps.Point(opts.icon.iconanchor[0], opts.icon.iconanchor[1]) : opts.icon.iconanchor;
				gicon.infoWindowAnchor = ($.isArray(opts.icon.infowindowanchor)) ? new google.maps.Point(opts.icon.infowindowanchor[0], opts.icon.infowindowanchor[1]) : opts.icon.infowindowanchor;

				if (marker.icon)
				{
					// Overwrite global options with ther marker one's
					gicon.image = marker.icon.image;
					gicon.shadow = marker.icon.shadow;
					gicon.iconSize = ($.isArray(marker.icon.iconsize)) ? new google.maps.Size(marker.icon.iconsize[0], marker.icon.iconsize[1]) : marker.icon.iconsize;
					gicon.shadowSize = ($.isArray(marker.icon.shadowsize)) ? new google.maps.Size(marker.icon.shadowsize[0], marker.icon.shadowsize[1]) : marker.icon.shadowsize;
					gicon.iconAnchor = ($.isArray(marker.icon.iconanchor)) ? new google.maps.Point(marker.icon.iconanchor[0], marker.icon.iconanchor[1]) : marker.icon.iconanchor;
					gicon.infoWindowAnchor = ($.isArray(marker.icon.infowindowanchor)) ? new google.maps.Point(marker.icon.infowindowanchor[0], marker.icon.infowindowanchor[1]) : marker.icon.infowindowanchor;

				}
				*/

				// Only display info window if the marker contains a description
				if (marker.html)
				{
					// Bind the info window to marker
                    var gmarker = new google.maps.Marker({map: $gmap,
                        position: new google.maps.LatLng(marker.lat, marker.lon),
                        clickable: true,
                        title: opts.html_prepend + marker.html + opts.html_append});


                    var infowindow = new google.maps.InfoWindow({
                        content: opts.html_prepend + marker.html + opts.html_append
                    });

                    google.maps.event.addListener(gmarker, 'click', function() {
                        var infowindow = new google.maps.InfoWindow({
                            content: this.title
                        });
                        infowindow.open($gmap, this);
                    });
				}
				else
				{
                    new google.maps.Marker({map: $gmap,
                        position: new google.maps.LatLng(marker.lat, marker.lon),
                        clickable: true});
				}

			}
            var bounds = $.fn.markerBoundingBox(opts.markers);


            // Add the trail if it's there
            if(opts.trail) {
                bounds = $.fn.setSelectedTrail(opts.trail, opts);
            }

            // Center the map and set the maptype
            $gmap.setCenter(new google.maps.LatLng(opts.lat, opts.lon), opts.zoom);
            $gmap.setMapTypeId(opts.maptypeId);
            if(opts.markers.length > 1) {
               $gmap.fitBounds(bounds);
	    } else {
               $gmap.setZoom(16);
            }

});
	};

    $.fn.setSelectedTrail = function(trail, opts) {
        var coords = new Array();
        var points = trail.points;
        for(var j=0 ; j < points.length ; j++) {
          coords.push(new google.maps.LatLng(points[j].y, points[j].x));
        }
        var currentTrail = new google.maps.Polyline({
              path: coords,
              strokeColor: "#FF0000",
              strokeOpacity: 1.0,
              strokeWeight: 2
            });
        currentTrail.setMap($gmap);

        // Add the start and end points
        new google.maps.Marker({
          position: coords[0],
          map: $gmap,
          title: "Start"
        });
        new google.maps.Marker({
          position: coords[coords.length-1],
          map: $gmap,
          title: "Arrival"
        });

        updateTrailSummary(trail, coords[0], coords[coords.length-1]);
        return $.fn.trailBoundingBox(coords);
    };


    $.fn.markerBoundingBox = function(markers) {
        if(markers && markers.length) {
            var min = new google.maps.LatLng(markers[0].lat, markers[0].lon);
            var max = new google.maps.LatLng(markers[0].lat, markers[0].lon);
            for(var k=1 ; k < markers.length ; k++) {
              var lat = markers[k].lat;
              var lng = markers[k].lon;
              if(lat < min.lat()) {
                  min = new google.maps.LatLng(lat, min.lng());
              }
              if(lng < min.lng()) {
                  min = new google.maps.LatLng(min.lat(), lng);
              }
              if(lat > max.lat()) {
                  max = new google.maps.LatLng(lat, max.lng());
              }
              if(lng > max.lng()) {
                  max = new google.maps.LatLng(max.lat(), lng);
              }
            }
            return new google.maps.LatLngBounds(min, max);
        } else {
            return new google.maps.LatLngBounds();
        }
    };

    $.fn.trailBoundingBox = function(coords) {
          var min = coords[0];
          var max = coords[0];
          for(var k=1 ; k < coords.length ; k++) {
            var lat = coords[k].lat();
            var lng = coords[k].lng();
            if(lat < min.lat()) {
                min = new google.maps.LatLng(lat, min.lng());
            }
            if(lng < min.lng()) {
                min = new google.maps.LatLng(min.lat(), lng);
            }
            if(lat > max.lat()) {
                max = new google.maps.LatLng(lat, max.lng());
            }
            if(lng > max.lng()) {
                max = new google.maps.LatLng(max.lat(), lng);
            }
          }
          return new google.maps.LatLngBounds(min, max);
    };

	// Set default settings
	$.fn.gMap.defaults =
	{
		lat:				0,
		lon:				0,
		zoom:					6,
        trail:                  null,
		markers:				[],
		controls:				[],
		scrollwheel:			true,
		maptypeId:				google.maps.MapTypeId.SATELLITE,
		html_prepend:			'<div class="gmap_marker">',
		html_append:			'</div>',
		icon:
		{
			image:				"http://www.aerisgolf.com/images/golf.png",
			shadow:				"http://www.google.com/mapfiles/shadow50.png",
			iconsize:			[32, 32],
			shadowsize:			[37, 34],
			iconanchor:			[9, 34],
			infowindowanchor:	[9, 2]

		}

	};

})(jQuery);
