Index: trunk/FACT++/src/smartfact.cc
===================================================================
--- trunk/FACT++/src/smartfact.cc	(revision 14135)
+++ trunk/FACT++/src/smartfact.cc	(revision 14136)
@@ -526,20 +526,10 @@
 
     template<class T>
-        void WriteBinary(const EventImp &d, const string &fname, const T &t, double scale, double offset=0)
-    {
-        const Statistics stat(t);
-
-        vector<uint8_t> val(t.size(), 0);
-        for (uint64_t i=0; i<t.size(); i++)
-        {
-            float range = nearbyint(128*(t[i]-offset)/scale); // [-2V; 2V]
-            if (range>127)
-                range=127;
-            if (range<0)
-                range=0;
-            val[i] = (uint8_t)range;
-        }
-
-        const char *ptr = reinterpret_cast<char*>(val.data());
+        void WriteBinaryVec(const EventImp &d, const string &fname, const vector<T> &vec, double scale, double offset=0)
+    {
+        if (vec.size()==0)
+            return;
+
+        const Statistics stat(vec[0]);
 
         ostringstream out;
@@ -550,8 +540,32 @@
         out << stat.min << '\n';
         out << stat.med << '\n';
-        out << stat.max << '\n';
-        out.write(ptr, val.size()*sizeof(uint8_t));
+        out << stat.max << '\0';
+        for (auto it=vec.begin(); it!=vec.end(); it++)
+        {
+            // The valid range is from 1 to 127
+            // \0 is used to seperate different curves
+            vector<uint8_t> val(it->size());
+            for (uint64_t i=0; i<it->size(); i++)
+            {
+                float range = nearbyint(126*(double(it->at(i))-offset)/scale)+1; // [-2V; 2V]
+                if (range>127)
+                    range=127;
+                if (range<1)
+                    range=1;
+                val[i] = (uint8_t)range;
+            }
+
+            const char *ptr = reinterpret_cast<char*>(val.data());
+            out.write(ptr, val.size()*sizeof(uint8_t));
+            out << '\0';
+        }
 
         ofstream(fPath+"/"+fname+".bin") << out.str();
+    }
+
+    template<class T>
+        void WriteBinary(const EventImp &d, const string &fname, const T &t, double scale, double offset=0)
+    {
+        WriteBinaryVec(d, fname, vector<T>(&t, &t+1), scale, offset);
     }
 
Index: trunk/FACT++/www/smartfact/index.js
===================================================================
--- trunk/FACT++/www/smartfact/index.js	(revision 14135)
+++ trunk/FACT++/www/smartfact/index.js	(revision 14136)
@@ -1117,7 +1117,7 @@
 {
     if (col==65533)
-        col = 0;
-
-    var hue = col/128;
+        return HLStoRGB(0);
+
+    var hue = (col-1)/127;
     return HLStoRGB(hue);
 }
@@ -1360,10 +1360,13 @@
 
     // --- data ---
-    if (data.length>1)
-    {
+    for (var j=1; j<data.length; j++)
+    {
+        if (data[j].length<2)
+            continue;
+
         ctx.beginPath();
-        ctx.moveTo(ml, ch-mb-data.charCodeAt(0)/128*h);
-        for (var i=1; i<data.length; i++)
-            ctx.lineTo(ml+w/(data.length-1)*i, ch-mb-data.charCodeAt(i)/128*h);
+        ctx.moveTo(ml, ch-mb-(data[j].charCodeAt(0)-1)/126*h);
+        for (var i=1; i<data[j].length; i++)
+            ctx.lineTo(ml+w/(data[j].length-1)*i, ch-mb-(data[j].charCodeAt(i)-1)/126*h);
 
         // --- finalize data ---
@@ -1426,4 +1429,79 @@
 }
 
+/*
+function drawZd(result)
+{
+    function frac(x)   { return(x-Math.floor(x));     }
+    function Mod(a, b) { return(a-Math.floor(a/b)*b); }
+
+    var z    = $("body").visiblePage;
+    var canv = $("canvas"+z);
+
+    var ctx = canv.getContext("2d");
+
+    // 16:57:58.210572 -  Mrk 421:       Ra=11.074266h Dec= 38.208801deg
+    // 16:57:58.210782 -  Mrk 501:       Ra=16.897867h Dec= 39.760201deg
+    // 16:57:58.210941 -  1ES 2344+51.4: Ra=23.784733h Dec= 51.705002deg
+    // 16:57:58.211060 -  PKS 2155-304:  Ra=21.981134h Dec=-30.225599deg
+    // 16:57:58.211189 -  Crab:          Ra= 5.575539h Dec= 22.014500deg
+    // 16:57:58.211312 -  H 1426+428:    Ra=14.475734h Dec= 42.674702deg
+    // 16:57:58.211429 -  1ES 1959+650:  Ra=19.999933h Dec= 65.148499deg
+    // 16:57:58.211544 -  Dark Patch 3:  Ra= 3.100000h Dec= 31.183333deg
+    // 16:57:58.211651 -  1ES 1218+304:  Ra=12.356089h Dec= 30.176897deg
+
+    var now = new Date();
+
+    var RAD = Math.Pi/180.;
+
+    var lon = -(17.+53./60+26.525/3600) * Math.PI/180;
+    var lat =  (28.+45./60+42.462/3600) * Math.PI/180;
+
+    var ra  = 16.897867 * Math.PI/ 12; //h
+    var dec = 39.760201 * Math.PI/180; //deg
+
+    var arr = "";
+
+    var date = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0);
+    date /= 86400000;
+    date += 40587;
+
+    var coslat = Math.cos(lat);
+    var sinlat = Math.sin(lat); 
+
+    // 21
+    for (var h=-4*12; h<6*12; h++)
+    {
+        var mjd = date + h/(24.*12);      // Modified julian date
+        var t   = (mjd-51544.5) / 36525;  // Julian centuries since J2000.
+
+        // GMST at this UT1
+        var r    = 24110.54841+(8640184.812866+(0.093104-6.2e-6*t)*t)*t;
+        var sum  = r/86400 + frac(mjd);
+        var gmst = frac(sum)*Math.PI*2;
+
+        var lmst = Mod(gmst + lon, Math.PI*2);
+        var lha  = ra - lmst;
+
+        var alt  = Math.asin(sinlat * Math.sin(dec) +
+                             coslat * Math.cos(dec) * Math.cos(lha));
+        alt *= 256/Math.PI; // 128/90*180/Math.Pi
+        if (alt<0)
+            alt = 0;
+        if (alt>127)
+            alt=127;
+
+        arr += String.fromCharCode(alt);
+    }
+
+    var vals = new Array(5);//[] = { 0, 0, 0, 0, 0 };
+    vals[1] = "90";
+    vals[2] = " 0";
+    vals[3] = "  ";
+    vals[4] = "  ";
+    vals[5] = "  ";
+    drawGraph(canv, vals, arr);
+}
+*/
+
 function process_eventdata(result)
 {
@@ -1441,11 +1519,11 @@
     ctx.clearRect(0, 0, canv.width, canv.height);
 
-    var data = result.split('\n');
-    if (result.length<4)
-        return;
-
-    var len = 0;
-    for (var i=0; i<6; i++)
-        len += data[i].length+1;
+    var data = result.split('\0');
+    if (data.length<2)
+        return;
+
+    var header = data[0].split('\n');
+    if (header.length<4)
+        return;
 
     switch (type)
@@ -1453,9 +1531,9 @@
         //case "camera": drawCam(result);     break;
     case "hist":
-        drawGraph(canv, data, result.substr(len));
+        drawGraph(canv, header, data);
         break;
     case "camera":
-        drawFullCam(result.substr(len));
-        drawCamLegend(canv, data);
+        drawFullCam(data[1]);
+        drawCamLegend(canv, header);
         break;
     }
