Index: trunk/FACT++/src/InterpreterV8.cc
===================================================================
--- trunk/FACT++/src/InterpreterV8.cc	(revision 14705)
+++ trunk/FACT++/src/InterpreterV8.cc	(revision 14709)
@@ -1250,5 +1250,5 @@
 }
 
-Handle<Value> InterpreterV8::LocalDist(const Arguments &args)
+Handle<Value> InterpreterV8::CalcDist(const Arguments &args, const bool local)
 {
     if (args.Length()!=2)
@@ -1266,13 +1266,17 @@
     };
 
-    const Handle<String> s_zd = String::New("zd");
-    const Handle<String> s_az = String::New("az");
-
-    const double zd0 = obj[0]->Get(s_zd)->NumberValue() * M_PI/180;
-    const double az0 = obj[0]->Get(s_az)->NumberValue() * M_PI/180;
-    const double zd1 = obj[1]->Get(s_zd)->NumberValue() * M_PI/180;
-    const double az1 = obj[1]->Get(s_az)->NumberValue() * M_PI/180;
-
-    if (!finite(zd0) || !finite(zd1) || !finite(az0) || !finite(az1))
+    const Handle<String> s_theta = String::New(local?"zd":"dec"); // was: zd
+    const Handle<String> s_phi   = String::New(local?"az":"ra");  // was: az
+
+    const double conv_t = M_PI/180;
+    const double conv_p = local ? -M_PI/180 : M_PI/12;
+    const double offset = local ? 0 : M_PI;
+
+    const double theta0 = offset - obj[0]->Get(s_theta)->NumberValue() * conv_t;
+    const double phi0   =          obj[0]->Get(s_phi  )->NumberValue() * conv_p;
+    const double theta1 = offset - obj[1]->Get(s_theta)->NumberValue() * conv_t;
+    const double phi1   =          obj[1]->Get(s_phi  )->NumberValue() * conv_p;
+
+    if (!finite(theta0) || !finite(theta1) || !finite(phi0) || !finite(phi1))
         return ThrowException(String::New("some values not valid or not finite."));
 
@@ -1291,10 +1295,20 @@
     // cos(az1-az0) = cos(az1)*cos(az0) + sin(az1)*sin(az0)
 
-    const double x = sin(zd0) * sin(zd1) * cos(az1-az0);
-    const double y = cos(zd0) * cos(zd1);
+    const double x = sin(theta0) * sin(theta1) * cos(phi1-phi0);
+    const double y = cos(theta0) * cos(theta1);
 
     const double res = acos(x + y) * 180/M_PI;
 
     return handle_scope.Close(Number::New(res));
+}
+
+Handle<Value> InterpreterV8::LocalDist(const Arguments &args)
+{
+    return CalcDist(args, true);
+}
+
+Handle<Value> InterpreterV8::SkyDist(const Arguments &args)
+{
+    return CalcDist(args, false);
 }
 
@@ -1970,4 +1984,5 @@
     Handle<FunctionTemplate> sky = FunctionTemplate::New(ConstructorSky);
     sky->SetClassName(String::New("Sky"));
+    sky->Set(String::New("dist"),  FunctionTemplate::New(SkyDist), ReadOnly);
     global->Set(String::New("Sky"), sky, ReadOnly);
 
Index: trunk/FACT++/src/InterpreterV8.h
===================================================================
--- trunk/FACT++/src/InterpreterV8.h	(revision 14705)
+++ trunk/FACT++/src/InterpreterV8.h	(revision 14709)
@@ -92,8 +92,11 @@
     static double GetDataMember(const v8::Arguments &args, const char *name);
 
+    static v8::Handle<v8::Value> CalcDist(const v8::Arguments &args, const bool);
+
     static v8::Handle<v8::Value> LocalToString(const v8::Arguments &args);
     static v8::Handle<v8::Value> SkyToString(const v8::Arguments &args);
     static v8::Handle<v8::Value> MoonToString(const v8::Arguments &args);
     static v8::Handle<v8::Value> LocalDist(const v8::Arguments &args);
+    static v8::Handle<v8::Value> SkyDist(const v8::Arguments &args);
     static v8::Handle<v8::Value> MoonDisk(const v8::Arguments &args);
     static v8::Handle<v8::Value> LocalToSky(const v8::Arguments &args);
