Index: /trunk/Ohana/src/libohana/include/dvo.h
===================================================================
--- /trunk/Ohana/src/libohana/include/dvo.h	(revision 4992)
+++ /trunk/Ohana/src/libohana/include/dvo.h	(revision 4993)
@@ -9,4 +9,10 @@
 
 /*** named data values (convert all to enums?) ***/
+
+/* DVO table modes */
+enum {DVO_MODE_RAW, DVO_MODE_MEF, DVO_MODE_SPLIT, DVO_MODE_MYSQL} DVOTableMode;
+
+/* DVO table formats */
+enum {DVO_FORMAT_UNDEF, DVO_FORMAT_ELIXIR, DVO_FORMAT_LONEOS, DVO_FORMAT_PANSTARRS} DVOTableFormat;
 
 /* image data modes in RegImage */
Index: /trunk/Ohana/src/libohana/src/dvo_convert.c
===================================================================
--- /trunk/Ohana/src/libohana/src/dvo_convert.c	(revision 4992)
+++ /trunk/Ohana/src/libohana/src/dvo_convert.c	(revision 4993)
@@ -391,2 +391,93 @@
   return (FALSE);
 }
+
+/*** Image Conversions ***/
+
+Image *FtableToImage (FTable *ftable, int *format) {
+
+  int Nimage;
+  Image *image;
+  char extname[80];
+
+  /* extname may be set from outside if the source is RAW not MEF */
+  if (*format == DVO_FORMAT_ELIXIR) {
+    Imagelixir *tmpimage;
+    tmpimage = fits_table_get_AverageElixir (ftable, &Nimage, NULL);
+    image = ImageElixirToInternal (tmpimage, Nimage);
+    free (tmpimage);
+    return (image);
+  }
+
+  /* convert to the internal format */
+  if (!fits_scan (ftable[0].header, "EXTNAME", "%s", 1, extname)) {
+    fprintf (stderr, "EXTNAME missing for average table\n");
+    return (NULL);
+  }
+  if (!strcmp (extname, "DVO_IMAGE")) {
+    image = fits_table_get_Image (ftable, Nimage, NULL);
+    *format = DVO_FORMAT_INTERNAL;
+    return (image);
+  }
+  if (!strcmp (extname, "DVO_IMAGE_ELIXIR")) {
+    ImageElixir *tmpimage;
+    tmpimage = fits_table_get_ImageElixir (ftable, Nimage, NULL);
+    image = ImageElixirToInternal (tmpimage, Nimage);
+    free (tmpimage);
+    *format = DVO_FORMAT_ELIXIR;
+    return (image);
+  }
+  if (!strcmp (extname, "DVO_IMAGE_LONEOS")) {
+    ImageLoneos *tmpimage;
+    tmpimage = fits_table_get_ImageLoneos (ftable, Nimage, NULL);
+    image = ImageLoneosToInternal (tmpimage, Nimage);
+    free (tmpimage);
+    *format = DVO_FORMAT_LONEOS;
+    return (image);
+  }
+  if (!strcmp (extname, "DVO_IMAGE_PANSTARRS")) {
+    ImagePanstarrs *tmpimage;
+    tmpimage = fits_table_get_ImagePanstarrs (ftable, Nimage, NULL);
+    image = ImagePanstarrsToInternal (tmpimage, Nimage);
+    free (tmpimage);
+    *format = DVO_FORMAT_PANSTARRS;
+    return (image);
+  }
+
+  fprintf (stderr, "table format unknown: %s\n", extname);
+
+  *Nimage = 0;
+  return (NULL);
+}
+
+int ImageToFtable (FTable *ftable, Image *image, int Nimage, int format) {
+
+  /* convert from the internal format */
+  if (!strcmp (extname, "DVO_IMAGE")) {
+    fits_table_set_Image (ftable, image, Nimage);
+    return (TRUE);
+  }
+  if (!strcmp (extname, "DVO_IMAGE_ELIXIR")) {
+    ImageElixir *tmpimage;
+    tmpimage = ImageInternalToElixir (image, Nimage);
+    fits_table_set_ImageElixir (ftable, tmpimage, Nimage);
+    free (tmpimage);
+    return (TRUE);
+  }
+  if (!strcmp (extname, "DVO_IMAGE_LONEOS")) {
+    ImageLoneos *tmpimage;
+    tmpimage = ImageInternalToLoneos (image, Nimage);
+    fits_table_set_ImageLoneos (ftable, tmpimage, Nimage);
+    free (tmpimage);
+    return (TRUE);
+  }
+  if (!strcmp (extname, "DVO_IMAGE_PANSTARRS")) {
+    ImagePanstarrs *tmpimage;
+    tmpimage = ImageInternalToPanstarrs (image, Nimage);
+    fits_table_set_ImagePanstarrs (ftable, tmpimage, Nimage);
+    free (tmpimage);
+    return (TRUE);
+  }
+  fprintf (stderr, "table format unknown: %s\n", extname);
+  return (FALSE);
+}
+
Index: /trunk/Ohana/src/libohana/src/dvo_image.c
===================================================================
--- /trunk/Ohana/src/libohana/src/dvo_image.c	(revision 4992)
+++ /trunk/Ohana/src/libohana/src/dvo_image.c	(revision 4993)
@@ -2,10 +2,8 @@
 # include <dvo.h>
 
-enum {FITS, RAW};
-
 /* determine db mode (raw/fits) and read the complete table */
 int dvo_image_load (FITS_DB *db, int VERBOSE, int FORCE_READ) {
 
-  int Naxis, Nrow, Nread, mode, status;
+  int Naxis, Nread, status;
   char buffer[241];
 
@@ -14,8 +12,7 @@
   if (db[0].f == NULL) return (FALSE);
 
-  fseek (db[0].f, 0, SEEK_SET);
-
   /* test for NAXIS == 2 in line 3 */
   bzero (buffer, 241);
+  fseek (db[0].f, 0, SEEK_SET);
   Nread = fread (buffer, 1, 240, db[0].f);
   if (Nread != 240) {
@@ -30,31 +27,34 @@
   fseek (db[0].f, 0, SEEK_SET);
 
-  mode = FITS;
-  if (Naxis == 2) mode = RAW;
-  if (VERBOSE) {
-    switch (mode) {
-      case FITS:
-	fprintf (stderr, "reading images (mode FITS)\n");
-	break;
-      case RAW:
-	fprintf (stderr, "reading images (mode RAW)\n");
-	break;
-      default:
-	fprintf (stderr, "error getting image mode\n");
-	exit (2);
-    }
-  }
-
-  /* read data in appropriate mode */
-  if (mode == FITS) {
-    status = fits_db_load (db);
-  } else {
-    status = dvo_image_load_raw (db, VERBOSE, FORCE_READ);
-  }
-  /* byteswap table data */
-  Nrow = db[0].theader.Naxis[1];
-  fits_convert_Image ((Image *) db[0].ftable.buffer, sizeof(Image), Nrow);
-  db[0].swapped = TRUE;
-
+  /* image table can only be RAW or MEF */
+  db[0].mode = DVO_MODE_MEF;
+  if (Naxis == 2) db[0].mode = DVO_MODE_RAW;
+  switch (db[0].mode) {
+    case DVO_MODE_MEF:
+      if (VERBOSE) fprintf (stderr, "reading images (mode DVO_MODE_MEF)\n");
+      status = fits_db_load (db);
+      db[0].format = UNDEF;
+      break;
+    case DVO_MODE_RAW:
+      if (VERBOSE) fprintf (stderr, "reading images (mode DVO_MODE_RAW)\n");
+      status = dvo_image_load_raw (db, VERBOSE, FORCE_READ);
+      db[0].format = ELIXIR;
+      break;
+    default:
+      fprintf (stderr, "error getting image mode\n");
+      exit (2);
+  }
+  /* convert from external to internal format */
+  /**** this is confused: where does the converted image table go?
+	back in db[0].ftable.buffer? 
+	keep the db[0].ftable.header?
+	sync with the correct format??
+	dvo_image_load_raw creates a new theader for Image 
+	  - should be ImageElixir
+	FtableToImage should create a new theader for Image
+	ImageToFtable should create a new theader for ImageFOO
+  ****/
+  image = FtableToImage (db[0].ftable, &db[0].format);
+  db[0].swapped = FALSE;
   return (TRUE);
 }
@@ -68,4 +68,8 @@
   if (db[0].header.Naxes == 2) mode = RAW;
   
+  /* convert from external to internal format */
+  FtableToImage (db[0].ftable, db[0].format);
+  db[0].swapped = FALSE;
+
   /* byteswap table data */
   Nrow = db[0].theader.Naxis[1];
