mosaic = $mosaic;
		$this->show_edit_buttons = $show_edit_buttons;
		$this->show_headers = $show_headers;
		$this->show_labels = $show_labels;
	}
	public function html_main()
	{
		echo '
			
';
		$i = 0;
		while ($row = $this->mosaic->getRow())
		{
			[$photos, $what] = $row;
			$this->header($photos);
			$this->$what($photos, ($i++) % 2);
		}
		echo '
			
			';
	}
	protected function header($photos)
	{
		if (!$this->show_headers)
			return;
		$date = $photos[0]->getDateCaptured();
		if (!$date)
			return;
		$header = $date->format('F Y');
		if ($header === $this->previous_header)
			return;
		$name = str_replace(' ', '', strtolower($header));
		echo '
				';
		$this->previous_header = $header;
	}
	protected function photo(Image $image, $className, $width, $height, $crop = true, $fit = true)
	{
		// Prefer thumbnail aspect ratio if available, otherwise use image aspect ratio.
		$aspectRatio = isset($width, $height) ? $width / $height : $image->ratio();
		echo '
				';
		if ($this->show_edit_buttons)
			echo '
					
Edit';
		echo '
					
';
		foreach (['normal-photo', 'blur-photo'] as $className)
		{
			echo '
						
width() >= $width * 2 && $image->height() >= $height * 2)
				echo ' srcset="', $image->getThumbnailUrl($width * 2, $height * 2, $crop, $fit), ' 2x"';
			else
				echo ' srcset="', $image->getThumbnailUrl($image->width(), $image->height(), true), ' 2x"';
			echo ' alt="" title="', $image->getTitle(), '" class="', $className, '" style="aspect-ratio: ', $aspectRatio, '">';
		}
		if ($this->show_labels)
			echo '
						', $image->getTitle(), '
';
		echo '
					
				 ';
	}
	protected function panorama(array $photos, $altLayout)
	{
		foreach ($photos as $image)
		{
			echo '
				
					';
			$this->photo($image, 'panorama', static::PANORAMA_WIDTH, static::PANORAMA_HEIGHT, false, false);
			echo '
					
				 ';
		}
	}
	protected function sixLandscapes(array $photos, $altLayout)
	{
		$chunks = array_chunk($photos, 3);
		$this->sideLandscape($chunks[0], $altLayout);
		$this->threeLandscapes($chunks[1], $altLayout);
	}
	protected function sidePortrait(array $photos, $altLayout)
	{
		$image = array_shift($photos);
		echo '
				
					';
		$this->photo($image, 'portrait', static::PORTRAIT_WIDTH, static::PORTRAIT_HEIGHT, 'centre');
		echo '
					
					
						';
		foreach ($photos as $image)
		{
			echo '
							
';
			$this->photo($image, 'landscape', static::TILE_WIDTH, static::TILE_HEIGHT, 'top');
			echo '
							
';
		}
		echo '
						
 
					 
				 ';
	}
	protected function sideLandscape(array $photos, $altLayout)
	{
		$image = array_shift($photos);
		echo '
				
					';
		$this->photo($image, 'landscape', static::LANDSCAPE_WIDTH, static::LANDSCAPE_HEIGHT, 'top');
		echo '
					
					
						';
		foreach ($photos as $image)
		{
			echo '
							
';
			$this->photo($image, 'landscape', static::TILE_WIDTH, static::TILE_HEIGHT, 'top');
			echo '
							
';
		}
		echo '
						
 
					 
				 ';
	}
	protected function threeLandscapes(array $photos, $altLayout)
	{
		echo '
				';
		foreach ($photos as $image)
		{
			echo '
					
';
			$this->photo($image, 'landscape', static::TILE_WIDTH, static::TILE_HEIGHT, true);
			echo '
					
';
		}
		echo '
				
 ';
	}
	protected function threePortraits(array $photos, $altLayout)
	{
		echo '
				';
		foreach ($photos as $image)
		{
			echo '
					
';
			$this->photo($image, 'portrait', static::PORTRAIT_WIDTH, static::PORTRAIT_HEIGHT, true);
			echo '
					
';
		}
		echo '
				
 ';
	}
	protected function dualLandscapes(array $photos, $altLayout)
	{
		echo '
				';
		foreach ($photos as $image)
		{
			echo '
					
';
			$this->photo($image, 'duo', static::DUO_WIDTH, static::DUO_HEIGHT, true);
			echo '
					
';
		}
		echo '
				
 ';
	}
	protected function dualMixed(array $photos, $altLayout)
	{
		echo '
				
					';
		$image = array_shift($photos);
		$this->photo($image, 'landscape', static::LANDSCAPE_WIDTH, static::LANDSCAPE_HEIGHT, 'top');
		echo '
					
					';
		$image = array_shift($photos);
		$this->photo($image, 'portrait', static::PORTRAIT_WIDTH, static::PORTRAIT_HEIGHT, true);
		echo '
						
					 
				';
	}
	protected function dualPortraits(array $photos, $altLayout)
	{
		// Recycle the row layout so portraits don't appear too large
		$this->threePortraits($photos, $altLayout);
	}
	protected function singleLandscape(array $photos, $altLayout)
	{
		echo '
				
					';
		$image = array_shift($photos);
		$this->photo($image, 'single', static::SINGLE_WIDTH, static::SINGLE_HEIGHT, 'top');
		echo '
					
				 ';
	}
	protected function singlePortrait(array $photos, $altLayout)
	{
		// Recycle the row layout so portraits don't appear too large
		$this->threePortraits($photos, $altLayout);
	}
	public function setUrlSuffix($suffix)
	{
		$this->url_suffix = $suffix;
	}
}