if(jQuery().mxgoogleMaps) {}
else{
jQuery.fn.mxgoogleMaps = function(options) {

	var opts = jQuery.extend({}, jQuery.mxgoogleMaps.defaults, options);

	return this.each(function() {
	
		jQuery.mxgoogleMaps.gMap[opts.field_id]= new google.maps.Map(this, opts);
		
		google.maps.event.trigger(jQuery.mxgoogleMaps.gMap[opts.field_id], 'resize');

		jQuery.mxgoogleMaps.geocoder = new google.maps.Geocoder();
		
		jQuery.mxgoogleMaps.mapsConfiguration(opts);	

		if (opts.cp){
			google.maps.event.addListener(jQuery.mxgoogleMaps.gMap[opts.field_id], "dragend", function() {
						jQuery.mxgoogleMaps.set_field_data(opts.field_id);
			});			
			
			google.maps.event.addListener(jQuery.mxgoogleMaps.gMap[opts.field_id], 'zoom_changed', function() {
						jQuery.mxgoogleMaps.set_field_data(opts.field_id);	
			});	
			
			jQuery("." + opts.field_id+"_btn_geocode").click(function() {
				jQuery.mxgoogleMaps.geocode_address(opts.field_id);
			});

			jQuery("." + opts.field_id+"_btn_addmarker").click(function() {		
				jQuery.mxgoogleMaps.addmarker(jQuery.mxgoogleMaps.gMap[opts.field_id].getCenter(), opts.field_id, opts.max_points, true, false, opts.custom_fields);
			});
			
			jQuery("." + opts.field_id+"_btn_cmarker").click(function() { 
				jQuery.mxgoogleMaps.marker[opts.field_id].setPosition(jQuery.mxgoogleMaps.gMap[opts.field_id].getCenter());
			});
			
			jQuery("#hold_"+(opts.field_id).replace("_id_","_") + " .hide_field span").click(function() { 
				google.maps.event.trigger(jQuery.mxgoogleMaps.gMap[opts.field_id], 'resize');			
				//jQuery.mxgoogleMaps.gMap[opts.field_id].setCenter(center, opts.zoom);
			});

			jQuery("." + opts.field_id + "_btn_apply").click(function() { 
				var  _field_id = jQuery(this).attr('rel');
				var _marker = jQuery.mxgoogleMaps.marker[jQuery.mxgoogleMaps.activePoint[_field_id]];
				var _icon_name = jQuery("#gmap-icon_" + _field_id ).val();
	
				_marker.icon_name = _icon_name;	
				_marker.setIcon(marker_icons_path + _icon_name);

				 for ( var g_id in opts.custom_fields) {
						jQuery('input[name="' + _field_id + '[' + _marker.id + '][' + opts.custom_fields[g_id].f_name + ']"]').val(jQuery('#' + opts.custom_fields[g_id].f_name + '_' + _field_id).val());
				};

				jQuery('input[name="' + _field_id + '[' + _marker.id + '][icon]"]').val(jQuery('#gmap-icon_' + _field_id).val());
				
			});
			jQuery("." + opts.field_id+"_btn_move").click(function() { 
				jQuery.mxgoogleMaps.marker[jQuery.mxgoogleMaps.activePoint[jQuery(this).attr('rel')]].setPosition(jQuery.mxgoogleMaps.gMap[opts.field_id].getCenter());
			});
			
			jQuery("." + opts.field_id+"_btn_delete").click(function() { 
				jQuery.mxgoogleMaps.max_points[jQuery(this).attr('rel')] = jQuery.mxgoogleMaps.max_points[jQuery(this).attr('rel')]-1;
				jQuery.mxgoogleMaps.marker[jQuery.mxgoogleMaps.activePoint[jQuery(this).attr('rel')]].setMap(null);
				jQuery("#m" + jQuery.mxgoogleMaps.activePoint[jQuery(this).attr('rel')]).remove();
				
			});
		};
		
	});

};
}


jQuery.mxgoogleMaps = {
	mapsConfiguration: function(opts) {
	
			var center = $.mxgoogleMaps.mapLatLong(opts.latitude, opts.longitude);
	
			$.mxgoogleMaps.gMap[opts.field_id].setCenter(center, opts.zoom);

			if (opts.markers){
				$.mxgoogleMaps.max_points[opts.field_id]=0;
				$.mxgoogleMaps.icon[opts.field_id]  = opts.icon;
				$.mxgoogleMaps.mapMarkers(center, opts.markers, opts.field_id, opts.max_points, opts.cp, opts.custom_fields);			
			}
			
			if (opts.overlays){
				$.mxgoogleMaps.addOverlay(center, opts.overlays, center, markers, opts.cp);
			}
			
			if (opts.custom_fields) {
				 field_list = "";
				 for ( var g_id in opts.custom_fields) {
				 	field_list = field_list + '<label  for="' + opts.custom_fields[g_id].f_name + '">' + opts.custom_fields[g_id].label + '</label>';
					field_list = field_list + '<input autocomplete="off" spellcheck="false" id="' + opts.custom_fields[g_id].f_name + '_' + opts.field_id + '" name="' + opts.custom_fields[g_id].f_name + '" type="text">';			
				};
				jQuery('#panel_main_el_' + opts.field_id+ ' .custom_fields').html(field_list);
			}
	},
	
	directions: {},
	latitude: '',
	longitude: '',
	latlong: {},
	maps: {},
	marker: {},
	markers: {},
	max_points: {},
	infowindow: {},
	imageBounds:{},
	overlays:{},
	overlay:{},
	gMap: {},
	activePoint: {},
	geocoder:{},
	cp: false,
	field_id: '',
	icon: {},
	mapLatLong: function(latitude, longitude) {
		return new google.maps.LatLng(latitude, longitude);
	},
	mapMarkers: function(center, markers, field_id, max_points, cp, custom_fields) {
	     if ( typeof(markers.length) == 'undefined' )
			markers = [markers];

		
		 i = 0;
		 j = 0;
		 for ( var g_id in markers) {
		
			$.mxgoogleMaps.addmarker(center, field_id, max_points, cp, markers[g_id], custom_fields);
			
		}
		
		
	},
	updateMarkerPosition: function(latLng, field_id, zoom) {

	}, 
	addOverlay:  function(center, field_id, max_points, cp, opts) {

	}, 
	addmarker : function(center, field_id, max_points, cp, opts, custom_fields) {

		if ($.mxgoogleMaps.max_points[field_id] < max_points || !cp) {

			if (opts)  {
				id = opts.marker_id;
				$.mxgoogleMaps.marker[id] = new google.maps.Marker({
										position: new google.maps.LatLng(opts.latitude, opts.longitude)
										,map: $.mxgoogleMaps.gMap[field_id]
										,id: id
										,icon_name: opts.icon
										,opts : opts
									  });

									  
				 if (typeof(opts.infow) != 'undefined' ){
				 
				 $.mxgoogleMaps.infowindow[id] = new google.maps.InfoWindow({content: opts.infow});
					
					google.maps.event.addListener($.mxgoogleMaps.marker[id], 'click', function() {
						$.mxgoogleMaps.infowindow[this.id].open(this.map,this);
					});
				 };
				 
				if (cp) {
					$.mxgoogleMaps.add_hidden_fields(center, field_id, id, custom_fields);
					 //alert (g_id);
					for ( var g_id in custom_fields) {
						$('input[name="' + field_id + '[' + id + '][' + custom_fields[g_id].f_name + ']"]').val(opts[custom_fields[g_id].f_name]);
					};
				
					$('input[name="' + field_id + '[' + id + '][icon]"]').val(opts.icon);	
					$('input[name="' + field_id + '[' + id + '][lat]"]').val(opts.latitude);
					$('input[name="' + field_id + '[' + id + '][long]"]').val(opts.longitude);
				}
				
					if (opts.icon != 'default'){
						$.mxgoogleMaps.marker[id].setIcon(marker_icons_path + opts.icon);
					}
			}
			else {
			
				id = Math.floor( Math.random ( ) *1000 + 1);
				
				$.mxgoogleMaps.marker[id] = new google.maps.Marker({
											position: center
											,map: $.mxgoogleMaps.gMap[field_id]
											,id: id
											,icon_name: $.mxgoogleMaps.icon[field_id]
										  });
				if (cp) {						  
					$.mxgoogleMaps.add_hidden_fields(center, field_id, id, custom_fields);
					$.mxgoogleMaps.set_active_marker($.mxgoogleMaps.marker[id], field_id, custom_fields)
						
					if ($.mxgoogleMaps.icon[field_id] != 'default'){				
						$.mxgoogleMaps.marker[id].setIcon(marker_icons_path + $.mxgoogleMaps.icon[field_id]);
					}
				}
			}
	
			
			if (cp) {
				$.mxgoogleMaps.marker[id].draggable = true;
				google.maps.event.addListener($.mxgoogleMaps.marker[id], "dragend", function() {
					$.mxgoogleMaps.set_active_marker(this, field_id, custom_fields);
					$.mxgoogleMaps.set_input(this, field_id, custom_fields);
				});	
				
				google.maps.event.addListener($.mxgoogleMaps.marker[id], 'click', function() {
					$.mxgoogleMaps.set_active_marker(this, field_id, custom_fields);
					$.mxgoogleMaps.set_input(this, field_id, custom_fields);
					$.mxgoogleMaps.gMap[this.map.field_id].setCenter(this.getPosition());
					$.mxgoogleMaps.set_field_data(field_id);
				});
				
			}	 
			
					 

			
			$.mxgoogleMaps.max_points[field_id] += 1;
					
			}
	},
	set_active_marker :   function(marker, field_id, custom_fields) {
				$.mxgoogleMaps.updateMarkerPosition(marker.getPosition(),  field_id, $.mxgoogleMaps.gMap[field_id].getZoom());		
				$.mxgoogleMaps.geocodePosition(marker.getPosition(), field_id);
				$.mxgoogleMaps.activePoint[marker.map.field_id] = marker.id;
				$.mxgoogleMaps.set_input(marker, field_id, custom_fields);
	},
	add_hidden_fields :   function(center, field_id, point_id, custom_fields) {
				
			fields = "";
				
			 for ( var g_id in custom_fields) {
				fields = fields + '<input name="' + field_id + '[' + point_id + '][' + custom_fields[g_id].f_name + ']"  type="hidden" "/>';				
			};
	
			fields = '<div id="m' + point_id + '"><input name="' + field_id + '[order][]"  value="' + point_id + '" type="hidden"/>' + fields + '<input name="' + field_id + '[' + point_id + '][lat]"  value="' + center.lat() + '"type="hidden"/><input name="' + field_id + '[' + point_id + '][long]" value="' + center.lng() + '" type="hidden"/><input name="' + field_id + '[' + point_id + '][icon]" type="hidden"/></div>';
			
			 $("#" + field_id + "_data").append(fields);
	}, 
	set_field_data :   function(field_id) {
	    center = $.mxgoogleMaps.gMap[field_id].getCenter();
		var data = center.lat() + "|" + center.lng() + '|' + $.mxgoogleMaps.gMap[field_id].getZoom();
		$('input[name="' + field_id + '[field_data]"]').val(data);	
	},
	set_input :   function(marker, field_id, custom_fields) {
				_icon_name = marker.icon_name;	 
				center = marker.getPosition();
			
				
				 for ( var g_id in custom_fields) {
					$('#' + custom_fields[g_id].f_name +  '_' + field_id ).val($('input[name="' + field_id + '[' + marker.id + '][' + custom_fields[g_id].f_name + ']"]').val());
				};				
				$('input[name="' + field_id + '[' + marker.id + '][lat]"]').val(center.lat());
				$('input[name="' + field_id + '[' + marker.id + '][long]"]').val(center.lng());
				$('#latitude_' + field_id).val(center.lat());
				$('#longitude_' + field_id).val(center.lng());
				$("#gmap-icon_" + field_id ).val(_icon_name);
	},
	geocode_address : function(field_id) {
				var address = document.getElementById(field_id+"_address").value;
				
				$.mxgoogleMaps.geocoder.geocode({
				  "address": address,
				  "partialmatch": true}, function(results, status) {
					  if (status == "OK" && results.length > 0) {
						  $.mxgoogleMaps.gMap[field_id].fitBounds(results[0].geometry.viewport);
						  $.mxgoogleMaps.set_field_data(field_id);
						  $.mxgoogleMaps.updateMarkerPosition(results[0].geometry.location,field_id, $.mxgoogleMaps.gMap[field_id].getZoom());
						  
					} else {
					  alert("Geocode was not successful for the following reason: " + status);
					}});
	},
	
	geocodePosition: function(pos, field_id) {

			 $.mxgoogleMaps.geocoder.geocode({
				latLng: pos
			  }, function(responses) {
				if (responses && responses.length > 0) {
					$("#"+field_id+"_address").val(responses[0].formatted_address);
				} else {
					alert("Cannot determine address at this location.");
				}
			  });
	},
	defaults: {
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		zoom: 8,
		draggable: true,
		navigationControl: true,
		scaleControl: true,
		mapTypeControl: true,
		scrollwheel: true,
		max_points: 1,
		cp: false,
		icon:'default'
	}
	
}
