//---------------------------------------------------------------------

		public bool MoveNext()
		{
			if (atEnd)
				return false;

			if (moveNextNotCalled) {
				InitializeCurrentSite();
				moveNextNotCalled = false;
				return true;
			}

			Location nextLocation = RowMajor.Next(currentSite.Location, landscape.Columns);
			if (nextLocation.Row > landscape.Rows) {
				atEnd = true;
				return false;
			}

			if (currentSite.IsActive) {
				//	current site is the active site etor's Current property
				//  so advance etor to next active site.
				if (activeSiteEtor.MoveNext()) {
					//	There is one or more active sites remaining.
					nextActiveSite = activeSiteEtor.Current;
					if (nextLocation == nextActiveSite.Location) {
						//	Leave current site pointing to active site etor
					}
					else {
						//	Next site is inactive.
						currentSite = inactiveSite;
						inactiveSite.SetLocation(nextLocation);
					}
				}
				else {
					//	No more active sites left to visit, so next site is
					//	inactive.
					nextActiveSite = null;
					currentSite = inactiveSite;
					inactiveSite.SetLocation(nextLocation);
				}
			}
			else {
				//	Current site is inactive
				if (nextActiveSite != null && nextLocation == nextActiveSite.Location)
					currentSite = nextActiveSite;
				else {
					//	Leave current site pointing to the local inactive site
					//	instance, and just change its location.
					inactiveSite.SetLocation(nextLocation);
				}
			}
			return true;
		}
		//---------------------------------------------------------------------

		private void InitializeCurrentSite()
		{
			if (activeSiteEtor.MoveNext()) {
				nextActiveSite = activeSiteEtor.Current;
				if (nextActiveSite.Location == new Location(1,1))
					currentSite = nextActiveSite;
				else
					currentSite = inactiveSite;
			}
			else {
				//	No active sites
				currentSite = inactiveSite;
			}
		}