(function($){

  var prepare_url = function(path, method) {
    var base = $.jsonp.base_uri + path;
    if(method == "get") {
      return base + "?_callback=?";
    } else {
      return base + "?_method=" + method + "&_callback=?";
    }
  }
  
  var handle_response = function(url, data, success_callback, failure_callback) {
    if(!isNaN(parseInt(data.status)) && data.status != 200) {
      if(failure_callback) {
        failure_callback(data)
      } else {
        switch(data.status) {
          case 401: $.jsonp.status.unauthorized(url, data.status, data.message); break;
          case 403: $.jsonp.status.forbidden(url, data.status, data.message); break;
          case 404: $.jsonp.status.not_found(url, data.status, data.message); break;
          case 407: $.jsonp.status.proxy_authentication_required(url, data.status, data.message); break;
          default:  $.jsonp.status.other(url, data.status, data.message); break;
        }
      }
    } else {
      if(success_callback) success_callback(data)
    }
  }

  $.jsonp = function(method, path, params, success_callback, failure_callback) {
    var url = prepare_url(path, method)
    params = $.extend({}, params, { authenticity_token: $.jsonp.authenticity_token })
    $.getJSON(url, params, function(response) {
      handle_response(url, response, success_callback, failure_callback);
    });
  };

  $.jsonp.base_uri = "";
  $.jsonp.authenticity_token = "";

  $.jsonp.status = {
    other: function(url, status, message) {
      alert("Unhandled Server Response\n\nurl: " + url + "\nstatus: " + status + "\nmessage: " + message)
    },
    forbidden: function(url, status, message) {
      $.jsonp.status.other(url, status, message)
    },
    ok: function(url, status, message) {
      $.jsonp.status.other(url, status, message)
    },
    not_found: function(url, status, message) {
      $.jsonp.status.other(url, status, message)
    },
    unauthorized: function(url, status, message) {
      $.jsonp.status.other(url, status, message)
    },
    proxy_authentication_required: function(url, status, message) {
      $.jsonp.status.other(url, status, message)
    }
  }

})(jQuery);
