Merge branch 'master' of https://github.com/szmoore/MCTX3420.git
[matches/MCTX3420.git] / testing / MCTXWeb / public_html / static / mctx.gui.js
index 089e93c..773fa23 100644 (file)
@@ -1,14 +1,28 @@
 /**
  * MCTX3420 2013 GUI stuff.
+ * Coding style:
+ *  - Always end statements with semicolons
+ *  - Egyptian brackets are highly recommended (*cough*).
+ *  - Don't use synchronous stuff - hook events into callbacks
+ *  - $.fn functions should return either themselves or some useful object
+ *    to allow for chaining of method calls
  */
 
 mctx = {};
-mctx.location = location.protocol + "//" + location.host + "/";
-mctx.api = mctx.location + "/api/";
+//Don't use this in the final version
+mctx.location = window.location.pathname;
+mctx.location = mctx.location.substring(0, mctx.location.lastIndexOf('/')) + "/";
+//mctx.location = location.protocol + "//" + location.host + "/";
+mctx.api = location.protocol + "//" + location.host + "/" + "api/";
 mctx.expected_api_version = 0;
 mctx.has_control = false;
+mctx.debug = true;
 
-mctx.return_codes = {
+mctx.statusCodes = {
+  STATUS_OK : 1
+};
+
+mctx.statusCodesDescription = {
   "1" : "Ok",
   "-1" : "General error",
   "-2" : "Unauthorized",
@@ -37,39 +51,64 @@ mctx.strain_gauges = {};
 mctx.strain_gauges.ids = [0, 1, 2, 3];
 mctx.strain_gauges.time_limit = 20;
 
-function debugLog (msg) {
-  if (typeof console === "undefined" || typeof console.log === "undefined") {
-    alert(msg);
-  } else {
-    console.log(msg);
+/**
+ * Logs a message if mctx.debug is enabled. This function takes
+ * a variable number of arguments and passes them 
+ * to alert or console.log (based on browser support).
+ * @returns {undefined}
+ */
+function debugLog () {
+  if (mctx.debug) {
+    if (typeof console === "undefined" || typeof console.log === "undefined") {
+      for (var i = 0; i < arguments.length; i++) {
+        alert(arguments[i]);
+      }
+    } else {
+      console.log.apply(this, arguments);
+    }
   }
 }
 
 /**
  * Writes the current date to wherever it's called.
  */
-function getDate(){
+function getDate() {
        document.write((new Date()).toDateString());
 }
 
+/**
+ * Should be run before the load of any GUI page.
+ * To hook events to be called after this function runs,
+ * use the 'always' method, e.g runBeforeLoad().always(function() {my stuff});
+ * @param {type} isLoginPage
+ * @returns The return value of calling $.ajax
+ */
 function runBeforeLoad(isLoginPage) {
-  $.ajax({
+  return $.ajax({
     url : mctx.api + "identify"
   }).done(function (data) {
     if (data.logged_in && isLoginPage) {
+      if (mctx.debug) {
+        debugLog("Redirect disabled!");
+      } else {
         window.location = mctx.location;
+      }
     } else if (!data.logged_in && !isLoginPage) {
-      //Note: this only clears the nameless cookie
-      document.cookie = ""; 
-      window.location = mctx.location + "login.html";
+      if (mctx.debug) {
+        debugLog("Redirect disabled!");
+      } else {
+        //Note: this only clears the nameless cookie
+        document.cookie = ""; 
+        window.location = mctx.location + "login.html";
+      }
     } else {
       mctx.friendlyName = data.friendly_name;
     }
   }).fail(function (jqHXR) {
-    if (!isLoginPage) {
-      window.location = mctx.location + "login.html";
-    } else {
+    if (mctx.debug) {
       debugLog("Failed to ident server. Is API running?")
+    } else if (!isLoginPage) {
+      window.location = mctx.location + "login.html";
     }
   });
 }
@@ -120,6 +159,7 @@ $.fn.populateNavbar = function () {
 
 /**
  * Sets the camera autoupdater
+ * Obsolete?
  * @returns {$.fn}
  */
 $.fn.setCamera = function () {
@@ -149,6 +189,10 @@ $.fn.setCamera = function () {
   return this;
 };
 
+/**
+ * Sets the strain graphs to graph stuff. Obsolete?
+ * @returns {$.fn}
+ */
 $.fn.setStrainGraphs = function () {
   var sensor_url = mctx.api + "sensors";
   var graphdiv = this;
@@ -174,13 +218,16 @@ $.fn.setStrainGraphs = function () {
       }
       $.plot(graphdiv, data);
       setTimeout(updater, 500);
-    }, function () {alert("It crashed");});
+    }, function () {debugLog("It crashed");});
   };
   
   updater();
   return this;
 };
 
+/**
+ * Performs a login attempt.
+ * @returns The AJAX object of the login request */
 $.fn.login = function () {
   var username = this.find("input[name='username']").val();
   var password = this.find("input[name='pass']").val();
@@ -192,15 +239,21 @@ $.fn.login = function () {
   out.removeAttr("class");
   out.text("Logging in...");
   
-  $.ajax({
+  return $.ajax({
     url : mctx.api + "bind",
     data : {user: username, pass : password}
   }).done(function (data) {
-    //todo: error check
-    mctx.has_control = true;
-    out.attr("class", "pass");
-    out.text("Login ok!");
-    setTimeout(redirect, 1000);
+    if (data.status < 0) {
+      mctx.has_control = false;
+      out.attr("class", "fail");
+      out.text("Login failed: " + data.description);
+    } else {
+      //todo: error check
+      mctx.has_control = true;
+      out.attr("class", "pass");
+      out.text("Login ok!");
+      setTimeout(redirect, 800);      
+    }
   }).fail(function (jqXHR) {
     mctx.has_control = false;
     out.attr("class", "fail");
@@ -208,16 +261,25 @@ $.fn.login = function () {
   });
 };
 
+/**
+ * Performs a logout request. The nameless cookie is
+ * always cleared and the browser redirected to the login page,
+ * independent of whether or not logout succeeded.
+ * @returns  The AJAX object of the logout request.
+ */
 $.fn.logout = function () {
-  $.ajax({
+  return $.ajax({
     url : mctx.api + "unbind"
   }).always(function () {
     //Note: this only clears the nameless cookie
     document.cookie = ""; 
     window.location = mctx.location + "login.html";
   });
-}
+};
 
+/**
+ * Sets the error log to continuously update.
+ * @returns itself */
 $.fn.setErrorLog = function () {
   var url = mctx.api + "errorlog";
   var outdiv = this;
@@ -228,16 +290,17 @@ $.fn.setErrorLog = function () {
       outdiv.scrollTop(
         outdiv[0].scrollHeight - outdiv.height()
       );
-      setTimeout(updater, 1000);
+      setTimeout(updater, 2000);
     }).fail(function (jqXHR) {
       if (jqXHR.status === 502 || jqXHR.status === 0) {
         outdiv.text("Failed to retrieve the error log.");
       }
-      setTimeout(updater, 1500);
+      setTimeout(updater, 4000);
     });
   };
   
   updater();
+  return this;
 };
 
 $(document).ajaxError(function (event, jqXHR) {

UCC git Repository :: git.ucc.asn.au