/*
  depends jquery.js, json.js
 */

function Criteria(){
  this.condition=new Object();
  this.sortColumns=new Array();
};

Criteria.prototype.condition=null;
Criteria.prototype.sortColumns=null;
Criteria.prototype.offset=null;
Criteria.prototype.limit=null;

Criteria.Rule={
  IsNull:'IsNull',
  IsNotNull:'IsNotNull',
  Equal:'Equal',
  NotEqual:'NotEqual',
  GreaterThan:'GreaterThan',
  LessThan:'LessThan',
  GreaterEqual:'GreaterEqual',
  LessEqual:'LessEqual',
  Like:'Like',
  NotLike:'NotLike',
  In:'In',
  NotIn:'NotIn'
};

Criteria.Direction={
  Ascending:'Ascending',
  Descending:'Descending'
};

Criteria.getError=function(data){
  if(data.error!==undefined)
    return data.error;
  else
    return false;
};

Criteria.prototype.addCondition=function(column,rule,value){
  if(value===undefined)
    value=null;
  if(this.condition[column]===undefined)
    this.condition[column]=new Object();
  this.condition[column][rule]=value;
  return this;
};

Criteria.prototype.addSortColumn=function(column,direction){
  var sortColumn={column:'',direction:Criteria.Direction.Ascending};
  sortColumn.column=column;
  if(direction!==undefined)
    sortColumn.direction=direction;
  this.sortColumns[this.sortColumns.length]=sortColumn;
  return this;
};

Criteria.prototype.setOffset=function(offset){
  this.offset=offset;
  return this;
};

Criteria.prototype.setLimit=function(limit){
  this.limit=limit;
  return this;
};

Criteria.prototype.serialize=function(){
  return $.toJSON(this);
};

Criteria.Result=function(source){
  this.response=$.parseJSON(source);
};

Criteria.Result.prototype.response=null;

Criteria.Result.prototype.isError=function(){
  if(this.response.errorMessage)
    return true;
  else
    return false;
};

Criteria.Result.prototype.getErrorMessage=function(){
  if(this.isError())
    return this.response.errorMessage;
  else
    return false;
};

Criteria.Result.prototype.getDebugMessage=function(){
  if(this.response.debugMessage)
    return this.response.debugMessage;
  else
    return '';
};

Criteria.Result.prototype.getData=function(){
  if(this.isError())
    return null;
  else
    return this.response.data;
};

(function($){
  $.postCriteria=function(url,criteria,callback,parameter){
    var wrapper=function(data,status){
      callback(new Criteria.Result(data),status);
    };
    wrapper.callback=callback;
    if(parameter===undefined)
      parameter=new Object();
    parameter.criteria=criteria.serialize();
    return $.post(url,parameter,wrapper);
  };
})(jQuery);
