/**
  * 'Opens' the requested file in the current window as an attachment,
  * which pops up the "Save file as" dialog.
  *
  * @TODO test this to make sure it works in all browsers.
  *
  * @return void
  */
 public function downloadScreenshot()
 {
     include_once HV_ROOT_DIR . '/../src/Database/ImgIndex.php';
     include_once HV_ROOT_DIR . '/../src/Helper/HelioviewerLayers.php';
     $imgIndex = new Database_ImgIndex();
     $info = $imgIndex->getScreenshot($this->_params['id']);
     $layers = new Helper_HelioviewerLayers($info['dataSourceString']);
     $dir = sprintf('%s/screenshots/%s/%s/', HV_CACHE_DIR, str_replace('-', '/', substr($info['timestamp'], 0, 10)), $this->_params['id']);
     $filename = sprintf('%s_%s.png', str_replace(array(':', '-', ' '), '_', $info['observationDate']), $layers->toString());
     $filepath = $dir . $filename;
     // If screenshot is no longer cached, regenerate it.
     if (!@file_exists($filepath)) {
         $this->reTakeScreenshot($this->_params['id']);
         if (!@file_exists($filepath)) {
             $filepath = str_replace(HV_CACHE_DIR, '', $filepath);
             throw new Exception('Unable to locate the requested file: ' . $filepath, 24);
         }
     }
     // Set HTTP headers
     header('Pragma: public');
     header('Expires: 0');
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
     // required for certain browsers
     header('Cache-Control: private', false);
     header('Content-Disposition: attachment; filename="' . $filename . '"');
     header('Content-Transfer-Encoding: binary');
     header('Content-Length: ' . @filesize($filepath));
     header('Content-type: image/png');
     echo file_get_contents($filepath);
 }