var api = {};

api.url = new function(){
  /**
   * Pobiera adres url o zadanych parametrach.
   * @param {String} module
   * @param {String} action
   * @param {Object} params
   * @return {String}
   */
  this.get = function(module, action, params){
    var query, scriptName = '', url;
    
    if(module === undefined) return window.location.pathname;
    // Tworzymy liste parametrow.
    query = new Array();
    if(params !== undefined){
      for(var name in params){
        query.push(name +'='+ params[name]);
      }
      query = '?'+ query.join('&');
    }
    // Sprawdzamy czy nalezy umiescic w adresie URL nazwe wykonywanego skryptu.
    if(window.location.pathname.indexOf('.php') !== -1){
      var matches = window.location.pathname.match('\\w+.php');
      if(matches) scriptName = matches[0] +'/';
    }
    // Generujemy adres URL ze skladowych.
    url = window.location.protocol +'//'+ window.location.host +'/'+ scriptName + module;
    if(action !== undefined){
      url += '/'+ action
    }
    url += query;
    return url;
  };
};


api.db = {};

api.db.find = function(params, callbacks)
{
  if(typeof callbacks == 'undefined') callbacks = {};

  $.ajax({
    url: api.url.get('api', 'find'),
    data: { json: JSON.stringify(
        { 
          query: params.query, 
          collection: params.collection,
          fields: params.fields,
          limit: params.limit, 
          skip: params.skip,
          sort: params.sort
        }
      )
    },
    type: 'POST',
    dataType: 'json',
    beforeSend: function(){
      if(typeof params.beforeSend == 'function') params.beforeSend();
    },
    success: function(data, textStatus, request){
      if(typeof params.success == 'function') params.success(data);
    },
    error: function(request, status, error){
      if(typeof params.error == 'function') params.error(request);
    },
    complete: function(){
      if(typeof params.complete == 'function') params.complete();
    }
  });
};

api.db.findOne = function(params, callbacks)
{
  if(typeof callbacks == 'undefined') callbacks = {};

  $.ajax({
    url: api.url.get('api', 'findOne'),
    data: { json: JSON.stringify(
        { 
          query: params.query, 
          collection: params.collection,
          fields: params.fields,
          limit: params.limit, 
          skip: params.skip,
          sort: params.sort
        }
      )
    },
    type: 'POST',
    dataType: 'json',
    beforeSend: function(){
      if(typeof params.beforeSend == 'function') params.beforeSend();
    },
    success: function(data, textStatus, request){
      if(typeof params.success == 'function') params.success(data);
    },
    error: function(request, status, error){
      if(typeof params.error == 'function') params.error(request);
    },
    complete: function(){
      if(typeof params.complete == 'function') params.complete();
    }
  });
};

api.db.save = function(params, callbacks)
{
  if(typeof callbacks == 'undefined') callbacks = {};
  
  $.ajax({
    url: api.url.get('api', 'save'),
    data: { json: JSON.stringify(
        { 
          object: params.object, 
          collection: params.collection
        }
      )
    },
    type: 'POST',
    dataType: 'json',
    beforeSend: function(){
      if(typeof params.beforeSend == 'function') params.beforeSend();
    },
    success: function(data, textStatus, request){
      if(typeof params.success == 'function') params.success(data);
    },
    error: function(request, status, error){
      if(typeof params.error == 'function') params.error(request);
    },
    complete: function(){
      if(typeof params.complete == 'function') params.complete();
    }
  });
};

api.db.remove = function(params, callbacks)
{
  if(typeof callbacks == 'undefined') callbacks = {};
  
  $.ajax({
    url: api.url.get('api', 'remove'),
    data: { json: JSON.stringify(
        { 
          query: params.query, 
          collection: params.collection
        }
      )
    },
    type: 'POST',
    dataType: 'json',
    beforeSend: function(){
      if(typeof params.beforeSend == 'function') params.beforeSend();
    },
    success: function(data, textStatus, request){
      if(typeof params.success == 'function') params.success(data);
    },
    error: function(request, status, error){
      if(typeof params.error == 'function') params.error(request);
    },
    complete: function(){
      if(typeof params.complete == 'function') params.complete();
    }
  });
};

