/*!
 * jQuery JavaScript Library v1.3.2
 * http://jquery.com/
 *
 * Copyright (c) 2009 Luciano Souza
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * Date: 2009-12-10 9:13:21 -0300 (Thu, 10 Dec 2009)
 */
(function ($) {
	jQuery.fn.googlemaps = function(htmlOptions) {
	
		// Width x Height
		if((htmlOptions.width) && (htmlOptions.height)){
			$(this).css({
				'width' : htmlOptions.width + 'px',
				'height' : htmlOptions.height + 'px'
			});
		}
		
		// ZOOM
		var map_zoom = 10;
		if(htmlOptions.zoom){
			map_zoom = parseInt(htmlOptions.zoom);
		}
		
		var map_type = 'map';
		if(htmlOptions.map_type){
			map_type = htmlOptions.map_type;
		}
		
		switch (map_type) {
			case "satellite":
				map_type = google.maps.MapTypeId.SATELLITE;
				break
			case "hybrid":
				map_type = google.maps.MapTypeId.HYBRID;
				break
			case "terrain":
				map_type = google.maps.MapTypeId.TERRAIN;
				break
			default:
				map_type = google.maps.MapTypeId.ROADMAP;
		}
		
		var map_navigation_status = false;
		var map_navigation_scale = false;
		var map_navigation = '';
		
		var map_typecontrol_status = false;
		var map_typecontrol = '';
		
		if(htmlOptions.controls){
			if(htmlOptions.controls.navigation){
				map_navigation_status = true;

				switch (htmlOptions.controls.navigation) {
					case "default":
						map_navigation = google.maps.NavigationControlStyle.DEFAULT;
						break
					case "small":
						map_navigation = google.maps.NavigationControlStyle.SMALL;
						break
					case "panoramic":
						map_navigation = google.maps.NavigationControlStyle.ZOOM_PAN;
						break
					case "android":
						map_navigation = google.maps.NavigationControlStyle.ANDROID;
						break
					case "scale":
						map_navigation_scale = true;
						map_typecontrol = google.maps.NavigationControlStyle.DEFAULT;
						break
					default:
						map_navigation_status = false;
						map_navigation = google.maps.NavigationControlStyle.DEFAULT;
				}
			}
			
			if(htmlOptions.controls.map_type_control){
				map_typecontrol_status = true
				
				switch (htmlOptions.controls.map_type_control) {
					case "default":
						map_typecontrol = google.maps.MapTypeControlStyle.DEFAULT;
						break
					case "horizontal":
						map_typecontrol = google.maps.MapTypeControlStyle.HORIZONTAL_BAR;
						break
					case "dropdown":
						map_typecontrol = google.maps.MapTypeControlStyle.DROPDOWN_MENU;
						break
					default:
						map_typecontrol_status = false;
						map_typecontrol = google.maps.MapTypeControlStyle.DEFAULT;
				}
			}
		}
		
		var myLatlng = new google.maps.LatLng(htmlOptions.latitude, htmlOptions.longitude);
		
		

		var myOptions = {
			zoom: map_zoom,

			navigationControl: map_navigation_status,
			navigationControlOptions: {
				style: map_navigation
			},

			mapTypeControl: map_typecontrol_status,
			mapTypeControlOptions: {
				style: map_typecontrol
			},

			scaleControl: map_navigation_scale,

			center: myLatlng,
			mapTypeId: map_type
		}
		
		var map = new google.maps.Map(document.getElementById($(this).attr('id')), myOptions);

		if(htmlOptions.callback){
			if(htmlOptions.callback.zoom_changed){
				google.maps.event.addListener(map, 'zoom_changed', function() {
					htmlOptions.callback.zoom_changed(map);
				});
			}
			
			if((htmlOptions.callback.map_changed)){
				var map_timeout = 0;
				google.maps.event.addListener(map, 'dragend', function() {
					clearTimeout(map_timeout);
					map_timeout = setTimeout(function(){   
						htmlOptions.callback.map_changed(map);
					}, 100);
					
				});
			}
		}
		
		if(htmlOptions.marker){
			var draggable = false;
			if(htmlOptions.marker.draggable){
				draggable = true;
			}
			
			var marker_title = '';
			if(htmlOptions.marker.title){
				marker_title = htmlOptions.marker.title;
			}
			
			var marker = new google.maps.Marker({
				position: myLatlng, 
				map: map,
				draggable: draggable,
				title: marker_title
			});

			if(draggable == true){
				var marker_timeout = 0;
				google.maps.event.addListener(marker, 'dragend', function(event) {
					if(htmlOptions.marker.draggable.centering == true){
						map.panTo(marker.getPosition());
					}
					if(htmlOptions.callback){
						if((htmlOptions.callback.marker_changed)){
							clearTimeout(marker_timeout);
							marker_timeout = setTimeout(function(){
								htmlOptions.callback.marker_changed(marker);
							}, 100);
						}
					}
				});
			}
			
			
			
			if(htmlOptions.marker.click){
				if(htmlOptions.marker.click.html){
					var infowindow = new google.maps.InfoWindow({
						content: htmlOptions.marker.click.html
					});

					google.maps.event.addListener(marker, 'click', function() {
						infowindow.open(map,marker);
					});
				}
			}
		}
	};
})(jQuery);