var $EUC = encodeURIComponent;

var CreatorAjaxService = function(redirect) {
  var server = new VVAjax("/cgi-bin/creator_backend.py", function() { redirect("index.php?login=true"); });
  return function(params, successCallback, failCallback) {
    return server.go(params, successCallback, failCallback);
  };
};
angular.service("CreatorAjax", CreatorAjaxService, { "$inject" : ["redirect"] });

var StudentAjaxService = function(redirect) {
  var server = new VVAjax("/cgi-bin/student_backend.py", function() { redirect("index.php?login=true"); });
  return function(params, successCallback, failCallback) {
    return server.go(params, successCallback, failCallback);
  };
};
angular.service("StudentAjax", StudentAjaxService, { "$inject" : ["redirect"] });

var DefaultAjaxService = function(redirect) {
  return function(url, params, successCallback, failCallback) {
    var server = new VVAjax(url, function() { });
    return server.go(params, successCallback, failCallback);
  };
};
angular.service("DefaultAjax", DefaultAjaxService, { "$inject" : ["redirect"] });

var VVAjax = function(url, redirect) {
  this.url = url;
  this.redirect = redirect;
};

VVAjax.copyObject = function(from, to) {
  for (key in from) {
    to[key] = from[key];
  }
};

VVAjax.prototype.getQueryString = function(params) {
  var str = "";
  var ctr = 0;
  for (key in params) {
    str += (ctr++ > 0 ? "&" : "") + $EUC(key) + "=" + $EUC(params[key]);
  }
  return str;
};

VVAjax.prototype.go = function(params, successCallback, failCallback) {
  var response = $.ajax({
    url : this.url,
    cache : false,
    type : "POST",
    data : this.getQueryString(params),
    async : false
  }).responseText;
  response = $.trim(response);
  return this.handleResponse(response, successCallback, failCallback);
};

VVAjax.DEBUG = false;
VVAjax.prototype.errorCallback = function(response) {
  if (VVAjax.DEBUG) {
    $("div[id='tmp']").html(response);
    alert("Err:: " + response);  
  }
  $.ajax({
      url : "/cgi-bin/error.py",
      type : "POST",
      data : this.getQueryString({ error : response }),
      async : false
    });
};

VVAjax.prototype.handleResponse = function(response, successCallback, failCallback) {
  alert(response);
  var ret = {};
  try {
    ret = angular.fromJson(response);
  } catch(e) {
    this.errorCallback(response);
    return;
  }
  if (ret.error != undefined) {
    if (ret.error == "no login") {
      this.redirect();
      return;
    }
    failCallback(ret.error);
  } else {
    successCallback(ret);
  }
  return ret;
};

