Index: location.views.inc
===================================================================
--- location.views.inc	(revision 5021)
+++ location.views.inc	(working copy)
@@ -51,6 +51,9 @@
       'location_handler_argument_location_province' => array(
         'parent' => 'views_handler_argument',
       ),
+      'location_handler_argument_location_proximity' => array(
+        'parent' => 'views_handler_argument',
+      ),
       'location_handler_field_location_address' => array(
         'parent' => 'views_handler_field',
       ),
@@ -306,6 +309,9 @@
     'filter' => array(
       'handler' => 'location_views_handler_filter_proximity',
     ),
+    'argument' => array(
+      'handler' => 'location_handler_argument_location_proximity',
+    ),
 //    'relationship' => array(
 //      'handler' => 'location_handler_relationship_location_distance',
 //    ),
Index: handlers/location_handler_argument_location_proximity.inc
===================================================================
--- handlers/location_handler_argument_location_proximity.inc	(revision 0)
+++ handlers/location_handler_argument_location_proximity.inc	(revision 0)
@@ -0,0 +1,111 @@
+<?php
+// $Id: location_handler_argument_location_proximity,v 1.0 2010/02/19 12:11:09 gravisrs Exp $
+
+/**
+ * Argument handler to accept lat/lon location and distance proximity.
+ */
+class location_handler_argument_location_proximity extends views_handler_argument {
+
+	function options_form(&$form, &$form_state) {
+		parent::options_form($form, $form_state);
+
+		//turn off unhandled options
+		unset($form['default_action']['#options']['summary asc']);
+		unset($form['default_action']['#options']['summary desc']);
+		unset($form['wildcard']);
+		unset($form['wildcard_substitution']);
+
+		//proximity function used
+		$form['operator'] = array(
+			'#type' => 'select',
+			'#title' => t('Proximity type'),
+			'#weight' => -47,
+			'#description' => t('Square (faster) or circle (more accurate)?'),
+			'#default_value' => $this->options['operator'],
+			'#options' => array('mbr' => t('Square'),'dist' => t('Circular'))
+		);
+
+		$form['help'] = array(
+			'#type' => 'item',
+			'#weight' => -50,
+			'#title' => t('Parameter usage'),
+			'#description' => t('This parameter accepts 3 values separated by underscore:  <br/><b>lat_lon[_dist]</b><br/><br/>lat - latitude float number<br/>lon - longitude float number<br/>dist - distance in selected units integer (optional, defaults to setting below)<br><br> example usages: <br>12.345;23.456<br>12.345;23.456;100'),
+		);
+
+		//units used
+		$form['search_units'] = array(
+			'#type' => 'select',
+			'#title' => t('Distance unit'),
+			'#weight' => -49,
+			'#options' => array(
+				'km' => t('Kilometers'),
+				'm' => t('Meters'),
+				'mile' => t('Miles'),
+			),
+			'#default_value' => $this->options['search_units'],
+		);
+
+		//default 3rd parameter
+		$form['default_distance'] = array(
+			'#weight' => -48,
+			'#type' => 'textfield',
+			'#title' => t('Default Distance'),
+			'#default_value' => $this->options['default_distance'],
+			'#description' => t('When 3rd number is ommitted'),
+		);
+
+	}
+
+	function option_definition() {
+		$options = parent::option_definition();
+		$options['operator'] = array('default' => 'dist');
+		$options['search_units'] = array('default' => 'm');
+		$options['default_distance'] = array('default' => '100');
+		return $options;
+	}
+
+	function admin_summary() {
+		return '';
+	}
+
+	//splitting argument to 3 vals
+	function break_arg($arg) {
+		$argv = explode('_',$arg);
+		$argc = count($argv);
+		if ($argc==3) {
+			//distnce is int - see _location_convert_distance_to_meters() why
+			return array(floatval($argv[0]),floatval($argv[1]),intval($argv[2]));
+		}
+		if ($argc==2) {
+			return array(floatval($argv[0]),floatval($argv[1]),intval($this->options['default_distance']));
+		}
+		return false;
+	}
+
+
+	function query() {
+		if (!$this->coords = $this->break_arg($this->argument)) return;
+		$this->ensure_my_table();
+
+		$lat = $this->coords[0];
+		$lon = $this->coords[1];
+		$distance = $this->coords[2];
+		if ($this->options['search_units'] =='m')
+			$distance_meters = $distance;
+		else
+			$distance_meters = _location_convert_distance_to_meters($distance, $this->options['search_units']);
+
+		$latrange = earth_latitude_range($lon, $lat, $distance_meters);
+		$lonrange = earth_longitude_range($lon, $lat, $distance_meters);
+
+		// Add MBR check (always.)
+		$this->query->add_where($this->options['group'], "$this->table_alias.latitude > %f AND $this->table_alias.latitude < %f AND $this->table_alias.longitude > %f AND $this->table_alias.longitude < %f", $latrange[0], $latrange[1], $lonrange[0], $lonrange[1]);
+
+		if ($this->operator == 'dist') {
+			// Add radius check.
+			$this->query->add_where($this->options['group'], earth_distance_sql($lon, $lat, $this->table_alias) .' < %f', $distance_meters);
+		}
+		
+	}
+	
+}
