--- imagecache\imagecache.module	2007-06-16 15:22:40.000000000 -0200
+++ imagecache_new\imagecache.module	2007-11-01 10:05:47.500000000 -0200
@@ -370,7 +370,33 @@ function _imagecache_keyword_filter($val
 function imagecache_admin() {
   drupal_set_title('Imagecache administration');
   $form = array();
-  $form['title'] = array('#type' => 'markup', '#value' => t('Imagecache presets'));
+  
+  $form['general'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('General parameters'),
+    '#tree' => TRUE
+  );
+  $form['general']['cleanperiod'] = array(
+    '#type' => 'select',
+    '#title' => t('Delete orphan cached images every'),
+    '#default_value' => variable_get('imagecache_clean_period',1440),
+    '#options' => array(
+      '1440' => t('1 day'),
+      '2880' => t('2 days'),
+      '4320' => t('3 days'),
+      '10080' => t('1 week'),
+      '20160' => t('2 weeks'),
+      '40320' => t('4 weeks')
+    ),
+    '#description' => t('How often should orphan cached images be deleted? Requires cron to be running.'),
+  );
+  $form['general']['update'] = array(
+    '#type' => 'submit',
+    '#name' => 'update',
+    '#value' => t('Update'),
+  );
+
+  $form['label'] = array('#type' => 'markup', '#value' => '<b>'.t('Imagecache presets').'</b>');
   $form['presets']['#tree'] = TRUE;
   
   $presets = _imagecache_get_presets();
@@ -445,6 +471,10 @@ function imagecache_admin_validate($form
 }
 
 function imagecache_admin_submit($form_id, $form_values) {
+  if ( $_POST['update'] == t('Update') ) {
+    variable_set( 'imagecache_clean_period', $form_values['general']['cleanperiod'] );
+    drupal_set_message(t('General parameters updated.'));
+  }
   if (is_array($_POST['preset-op'])) {
     foreach ($_POST['preset-op'] as $presetid => $op) {
       $presetid = check_plain($presetid);
@@ -756,3 +786,53 @@ function imagecache_image_flush($path) {
     file_delete($ipath);
   }
 }
+ 
+/**
+ * Implementation of hook_cron().
+ * Deletes orphan cached images periodically.
+ */
+function imagecache_cron() {
+  $period = variable_get('imagecache_clean_period',1440);
+  $last_run = variable_get('imagecache_last_run',0);
+  if ( $last_run+$period*60 > time() )
+    return;
+  $presets = _imagecache_get_presets();
+  foreach ($presets as $presetid => $presetname) {
+    _scan_directory( $presetname, "" );
+  }
+  variable_set( 'imagecache_last_run', time() );
+  watchdog( 'imagecache', "orphan images cleaned" );
+}
+
+/**
+ * Scans an image cache folder deleting orphan cached images.
+ *
+ * @param preset
+ *    preset to scan
+ * @param folder
+ *    preset folder to scan
+ */
+function _scan_directory( $preset, $folder ) {
+  $cache_folder = file_directory_path().'/imagecache/'.$preset;
+  $img_folder = file_directory_path();
+  if ( !empty($folder) ) {
+    $cache_folder = $cache_folder.'/'.$folder;
+    $img_folder = $img_folder.'/'.$folder;
+  }
+  if (($handle = @opendir($cache_folder)) == FALSE)
+    return;
+  while (($file = readdir($handle)) != FALSE) {
+    if ( ($file == ".") || ($file == "..") )
+      continue;
+    if ( is_dir($cache_folder.'/'.$file) ) {
+      _scan_directory( $preset, empty($folder)?$file:$folder.'/'.$file );
+      continue;
+    }
+    if ( !file_exists($img_folder.'/'.$file) ) {
+      unlink( $cache_folder.'/'.$file );
+      watchdog( 'imagecache', "file $cache_folder/$file deleted" );
+    }
+  }
+  closedir($handle); 
+}
+
