(function($){
	$.fn.extend({
		PaymentLocations: function(opts) {
			if (window.google && google.maps) {
				var geocoder = new google.maps.Geocoder(),
				infowindow = new google.maps.InfoWindow();
			}
			$(this).each(function() {
				var $this = $(this),
				opts = $.extend({
					lat: 31.39,
					lon: -99.36,
					zoom: 5,
					ajaxURL: null
				}, opts, $this.ParseClass()),
				markers = [],
				map = new google.maps.Map($this.find("div.map")[0], {
					zoom: opts.zoom,
					center: new google.maps.LatLng(opts.lat, opts.lon),
					mapTypeId: google.maps.MapTypeId.ROADMAP,
					mapTypeControlOptions: {
						mapTypeIds: [
							google.maps.MapTypeId.ROADMAP,
							google.maps.MapTypeId.SATELLITE,
							google.maps.MapTypeId.HYBRID
						]
					}
				});
				
				var clickedElement;
				$(document).click(function(e) {
					clickedElement = e.target;
				});
				$this.parents("form").submit(function() {
					var aElement = (document.activeElement == document.body) ? clickedElement : document.activeElement;
					if (aElement) {
						var aEle = $(aElement).parents().filter(function() {
							return this == $this[0];
						});
						if (!aEle.length) {
							return;
						}
					}
					var tbody = $this.find("table.datatable tbody").empty();
					$.each(markers, function(i, marker) {
						marker.setMap(null);
						delete(marker);
					});
					infowindow.close();
					geocoder.geocode( { 'address': $this.find("input.address").val()}, function(results, status) {
						if (status == google.maps.GeocoderStatus.OK) {
							map.setCenter(results[0].geometry.location);
							var val = $this.find("select").val();
							if (val == 5) {
								map.setZoom(11); 
							} else if (val == 10) {
								map.setZoom(10);
							} else if (val == 25) {
								map.setZoom(9);
							} else if (val == 50) {
								map.setZoom(8);
							}
							
							var location,
							params = {
								radius: $this.find("select.distance").val(),
								address: $this.find("input.address").val()
							};
							try {
								location = results[0].geometry.location;
								params.lat = location.lat();
								params.lng = location.lng();
							} catch(e) {}
							
							$.post(opts.ajaxURL, params, function(data) {
								$.each(data.addresses, function(i, address) {
									try {
										var marker = new google.maps.Marker({
											position: new google.maps.LatLng(address.lat, address.lon)
										});
										marker.setMap(map);
										google.maps.event.addListener(marker, 'click', function() {
											infowindow.setContent(address.tooltip);
											infowindow.open(map,marker);
										});
										markers.push(marker);
									} catch(e) {}
									
									var tr = $(address.tableRow);
									tr.find("a.showMapMarker").click(function() {
										infowindow.setContent(address.tooltip);
										infowindow.open(map,marker);
									});
									tbody.append(tr);
								});
							}, "json");
						}
					});
					
					return false;
				});
				if ($this.find("input").val()) {
					$this.parents("form").triggerHandler("submit");
				}
			});
		}
	});
	$(window).load(function() {
		$("div.paymentLocations").PaymentLocations();
	});
})(jQuery);
