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);
			});
			
			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("." + 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);
				
				jQuery('input[name="' + _field_id + '[' + _marker.id + '][address]"]').val(jQuery('#address_' + _field_id).val());
				jQuery('input[name="' + _field_id + '[' + _marker.id + '][city]"]').val(jQuery('#city_' + _field_id).val());
				jQuery('input[name="' + _field_id + '[' + _marker.id + '][zipcode]"]').val(jQuery('#zipcode_' + _field_id).val());
				jQuery('input[name="' + _field_id + '[' + _marker.id + '][state]"]').val(jQuery('#state_' + _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);			
				
			}
	
	},
	
	directions: {},
	latitude: '',
	longitude: '',
	latlong: {},
	maps: {},
	marker: {},
	max_points: {},
	infowindow: {},
	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, icon) {
	     if ( typeof(markers.length) == 'undefined' )
         markers = [markers];
		 	
		
		 i = 0;
		 j = 0;
		for ( i = 0; i<markers.length; i++) {
			$.mxgoogleMaps.addmarker(center, field_id, max_points, cp, markers[i]);
		}
		
		
	},
	updateMarkerPosition: function(latLng, field_id, zoom) {

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

	
		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
									  });
//SET FIELDS!!!
				if (cp) {
					$.mxgoogleMaps.add_hidden_fields(center, field_id, id);
					
					$('input[name="' + field_id + '[' + id + '][address]"]').val(opts.address);
					$('input[name="' + field_id + '[' + id + '][city]"]').val(opts.city);
					$('input[name="' + field_id + '[' + id + '][zipcode]"]').val(opts.zipcode);
					$('input[name="' + field_id + '[' + id + '][state]"]').val(opts.state);
					$('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);
					$.mxgoogleMaps.set_active_marker($.mxgoogleMaps.marker[id], field_id)
						
					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);
					$.mxgoogleMaps.set_input(this, field_id);
				});			
			}	 
			
					 
			google.maps.event.addListener($.mxgoogleMaps.marker[id], 'click', function() {
				$.mxgoogleMaps.set_active_marker(this, field_id);
				$.mxgoogleMaps.set_input(this, field_id);
				$.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) {
				$.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);
	},
	add_hidden_fields :   function(center, field_id, point_id) {
			fields = '<div id="m' + point_id + '"><input name="' + field_id + '[order][]"  value="' + point_id + '" type="hidden"/><input name="' + field_id + '[' + point_id + '][address]"  type="hidden" "/><input name="' + field_id + '[' + point_id + '][city]" type="hidden"/><input name="' + field_id + '[' + point_id + '][state]" type="hidden"/><input name="' + field_id + '[' + point_id + '][zipcode]" type="hidden"/><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) {
				_icon_name = marker.icon_name;	 
				center = marker.getPosition();
				
				$('input[name="' + field_id + '[' + marker.id + '][lat]"]').val(center.lat());
				$('input[name="' + field_id + '[' + marker.id + '][long]"]').val(center.lng());
				$('#address_' + field_id).val($('input[name="' + field_id + '[' + marker.id + '][address]"]').val());
				$('#city_' + field_id).val($('input[name="' + field_id + '[' + marker.id + '][city]"]').val());
				$('#zipcode_' + field_id).val($('input[name="' + field_id + '[' + marker.id + '][zipcode]"]').val());
				$('#state_' + field_id).val($('input[name="' + field_id + '[' + marker.id + '][state]"]').val());
				$('#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.marker[field_id].setPosition(results[0].geometry.location);
						  $.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'
	}
	
}
