//*********** Utility functions ***********
function getUrlParamStreet(ret) {
		ret = cleanEscapes(ret);
		ret = cleanAddress(ret);
		return ret;
}

function cleanEscapes(address) {
	address = unescape(address);
	address = replaceAll( address, "+", " " );
	return address;
}

function cleanAddress(address) {
	address = replaceAll( address, "&", " and " );
	address = replaceAll( address, "#", " " );
	return address;
}

function replaceAll (strOrig, strTarget, strSubString) {
	var intIndexOfMatch = strOrig.indexOf( strTarget );
	while (intIndexOfMatch != -1) {
		strOrig = strOrig.replace( strTarget, strSubString )
		intIndexOfMatch = strOrig.indexOf( strTarget );
	}
	return strOrig;
}

function forEach(array, fn, objThis) {
  objThis = objThis || this;
  var len = array.length;
  for (var n = 0; n < len; n++) {
    var r = fn.call(objThis, array[n], n);
    if (r !== undefined)
      return r;
  }
}

function findInArray(array, find) {
  var index = ForEach(array, function (item, n) { if (item == find) return n; });
  return index === undefined ? -1 : index;
}

//*********** Create icons ***********
		var houseIcon = new GIcon();
		houseIcon.image = "http://www.walkscore.com/images/icons/house.png";
		houseIcon.shadow = "http://www.walkscore.com/images/icons/house-shadow.png";
		houseIcon.iconSize = new GSize(28, 25);
		houseIcon.shadowSize = new GSize(35, 25);
		houseIcon.iconAnchor = new GPoint(14, 21);
		houseIcon.infoWindowAnchor = new GPoint(20, 5);

		var barIcon = new GIcon();
		barIcon.image = "http://www.walkscore.com/images/icons/bar.png";
		barIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		barIcon.iconSize = new GSize(21, 25);
		barIcon.shadowSize = new GSize(32, 25);
		barIcon.iconAnchor = new GPoint(10, 24);
		barIcon.infoWindowAnchor = new GPoint(17, 3);

		var bookstoreIcon = new GIcon();
		bookstoreIcon.image = "http://www.walkscore.com/images/icons/bookstore.png";
		bookstoreIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		bookstoreIcon.iconSize = new GSize(21, 25);
		bookstoreIcon.shadowSize = new GSize(32, 25);
		bookstoreIcon.iconAnchor = new GPoint(10, 24);
		bookstoreIcon.infoWindowAnchor = new GPoint(17, 3);

		var cafeIcon = new GIcon();
		cafeIcon.image = "http://www.walkscore.com/images/icons/cafe.png";
		cafeIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		cafeIcon.iconSize = new GSize(21, 25);
		cafeIcon.shadowSize = new GSize(32, 25);
		cafeIcon.iconAnchor = new GPoint(10, 24);
		cafeIcon.infoWindowAnchor = new GPoint(17, 3);

		var childCareIcon = new GIcon();
		childCareIcon.image = "http://www.walkscore.com/images/icons/child-care.png";
		childCareIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		childCareIcon.iconSize = new GSize(21, 25);
		childCareIcon.shadowSize = new GSize(32, 25);
		childCareIcon.iconAnchor = new GPoint(10, 24);
		childCareIcon.infoWindowAnchor = new GPoint(17, 3);

		var drugStoreIcon = new GIcon();
		drugStoreIcon.image = "http://www.walkscore.com/images/icons/drug-store.png";
		drugStoreIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		drugStoreIcon.iconSize = new GSize(21, 25);
		drugStoreIcon.shadowSize = new GSize(32, 25);
		drugStoreIcon.iconAnchor = new GPoint(10, 24);
		drugStoreIcon.infoWindowAnchor = new GPoint(17, 3);

		var dryCleanerIcon = new GIcon();
		dryCleanerIcon.image = "http://www.walkscore.com/images/icons/dry-cleaner.png";
		dryCleanerIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		dryCleanerIcon.iconSize = new GSize(21, 25);
		dryCleanerIcon.shadowSize = new GSize(32, 25);
		dryCleanerIcon.iconAnchor = new GPoint(10, 24);
		dryCleanerIcon.infoWindowAnchor = new GPoint(17, 3);

		var groceryIcon = new GIcon();
		groceryIcon.image = "http://www.walkscore.com/images/icons/grocery.png";
		groceryIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		groceryIcon.iconSize = new GSize(21, 25);
		groceryIcon.shadowSize = new GSize(32, 25);
		groceryIcon.iconAnchor = new GPoint(10, 24);
		groceryIcon.infoWindowAnchor = new GPoint(17, 3);

		var hardwareIcon = new GIcon();
		hardwareIcon.image = "http://www.walkscore.com/images/icons/hardware.png";
		hardwareIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		hardwareIcon.iconSize = new GSize(21, 25);
		hardwareIcon.shadowSize = new GSize(32, 25);
		hardwareIcon.iconAnchor = new GPoint(10, 24);
		hardwareIcon.infoWindowAnchor = new GPoint(17, 3);

		var libraryIcon = new GIcon();
		libraryIcon.image = "http://www.walkscore.com/images/icons/library.png";
		libraryIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		libraryIcon.iconSize = new GSize(21, 25);
		libraryIcon.shadowSize = new GSize(32, 25);
		libraryIcon.iconAnchor = new GPoint(10, 24);
		libraryIcon.infoWindowAnchor = new GPoint(17, 3);

		var movieTheaterIcon = new GIcon();
		movieTheaterIcon.image = "http://www.walkscore.com/images/icons/movie-theater.png";
		movieTheaterIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		movieTheaterIcon.iconSize = new GSize(21, 25);
		movieTheaterIcon.shadowSize = new GSize(32, 25);
		movieTheaterIcon.iconAnchor = new GPoint(10, 24);
		movieTheaterIcon.infoWindowAnchor = new GPoint(17, 3);

		var parkIcon = new GIcon();
		parkIcon.image = "http://www.walkscore.com/images/icons/park.png";
		parkIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		parkIcon.iconSize = new GSize(21, 25);
		parkIcon.shadowSize = new GSize(32, 25);
		parkIcon.iconAnchor = new GPoint(10, 24);
		parkIcon.infoWindowAnchor = new GPoint(17, 3);

		var restaurantIcon = new GIcon();
		restaurantIcon.image = "http://www.walkscore.com/images/icons/restaurant.png";
		restaurantIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		restaurantIcon.iconSize = new GSize(21, 25);
		restaurantIcon.shadowSize = new GSize(32, 25);
		restaurantIcon.iconAnchor = new GPoint(10, 24);
		restaurantIcon.infoWindowAnchor = new GPoint(17, 3);

		var schoolIcon = new GIcon();
		schoolIcon.image = "http://www.walkscore.com/images/icons/school.png";
		schoolIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		schoolIcon.iconSize = new GSize(21, 25);
		schoolIcon.shadowSize = new GSize(32, 25);
		schoolIcon.iconAnchor = new GPoint(10, 24);
		schoolIcon.infoWindowAnchor = new GPoint(17, 3);

		var fitnessIcon = new GIcon();
		fitnessIcon.image = "http://www.walkscore.com/images/icons/fitness.png";
		fitnessIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		fitnessIcon.iconSize = new GSize(21, 25);
		fitnessIcon.shadowSize = new GSize(32, 25);
		fitnessIcon.iconAnchor = new GPoint(10, 24);
		fitnessIcon.infoWindowAnchor = new GPoint(17, 3);

		var retailIcon = new GIcon();
		retailIcon.image = "http://www.walkscore.com/images/icons/retail.png";
		retailIcon.shadow = "http://www.walkscore.com/images/icons/icon-shadow.png";
		retailIcon.iconSize = new GSize(21, 25);
		retailIcon.shadowSize = new GSize(32, 25);
		retailIcon.iconAnchor = new GPoint(10, 24);
		retailIcon.infoWindowAnchor = new GPoint(17, 3);

//*********** GMap2 Prototype ***********
		GMap2.prototype.goTo = function(point, zoom) {
			var loaded = this.isLoaded();
			this.setCenter(point, zoom);
			if ( !loaded ) {
				this.addControl(new GSmallMapControl());
				this.addControl(new GMapTypeControl());
			}
		}

		GMap2.prototype.plotMarkers = function( results, startIndex, endIndex ) {
			startIndex = (startIndex > 0) ? startIndex : 0;
			endIndex = (endIndex > 0 && endIndex > startIndex) ? endIndex : results.length;
			for (var i=startIndex; i<endIndex; i++) {
				this.addOverlay( results[i].marker() );
			}
		}

		GMap2.prototype.setToBounds = function (bounds) {
			var center_lat = ( bounds.getNorthEast().lat() + bounds.getSouthWest().lat() ) / 2.0;
			var center_lng = ( bounds.getNorthEast().lng() + bounds.getSouthWest().lng() ) / 2.0;
			var center = new GLatLng( center_lat, center_lng );
			var zoom = this.getBoundsZoomLevel( bounds, this.getSize() ) + 1;
			this.goTo( center, zoom );
		}



//*********** RESULT PANEL HELPERS ***********

		function toggleResultPanel(index, forceState) {
			var panelExtension = document.getElementById("resultgroup-" + index + "-all");

			if (panelExtension) {
				if (forceState) {
					panelExtension.style.display = forceState;
					panelStates[index] = (forceState == "block");
					panelRollover(index, false);
				}
				else {
							
					if (panelExtension.style.display == "none") {
						
						for (var i=0; i<12; i++) toggleResultPanel(i, "none");
				
						panelExtension.style.display = "block";
						panelStates[index] = true;
						document.getElementById("main").style.height = "890px";
					}
					else {
						
						panelExtension.style.display = "none";
						panelStates[index] = false;
						document.getElementById("main").style.height = "auto";
					}
					panelRollover(index, true);
				}
			}
		}

		function panelRollover(index, myBool) {
			var panelTop = document.getElementById("panel-top-" + index);
			var mouseState = (myBool)?1:0;
			var panelState = panelStates[index];
			var imageIndex = 2 * panelState + mouseState;
			//panelTop.style.background = "url(" + panelImages[imageIndex] + ")";
		}

		function expandCollapseAllResults(link) {
			if( allPanelsExpanded == false ) { //need to expand them
				for (var i=0; i<panelCount; i++) {
					toggleResultPanel(i, "block");
				}
				link.innerHTML = "Collapse all";
				allPanelsExpanded = true;
			}
			else { //need to collapse them
				for (var i=0; i<panelCount; i++) {
					toggleResultPanel(i, "none");
				}
				link.innerHTML = "Expand all";
				allPanelsExpanded = false;
			}
		}


//*********** RESULT PROCESSING HELPERS ***********
		function sortAndTrim( array, limit ) {
			array.sort( function (a,b) { if (!a.distance_){a.distance_ = .01;} if (!b.distance_){b.distance_ = .01;} return a.distance_-b.distance_; } );
			if ( !limit || limit >= array.length) {return array};
			return array.slice(0,limit);
		}

		function convertMeters(meters, resultsInMetric, addLabel) {
			if (resultsInMetric) {
				var km = Math.round( meters/10 )/100;
				if ( km <= 0) km = .01;
				if (addLabel) km = km + " km";
				return km;
			}
			else {
				var miles = Math.round( 100*meters/1609.34 )/100;
				if ( miles <= 0) miles = .01;
				if (addLabel) miles = miles + " Mi";
				return miles;
			}
		}

		function clearResults ( results, map ) {
			for (var i = 0; i < results.length; i++) {
				for (var j = 0; j < results[i].length; j++) {
					if ( results && results[i] && results[i][j] && results[i][j].marker() )
						map.removeOverlay(results[i][j].marker());
				}
			}
		}
