//================================= CLASS CONSTRUCTOR ========================================
function QueryData()
{
//MEMBER VARIABLES
 this.fields = null;
 this.sortField = null;//The field that the sorting is currently on(null if none)
 this.tag = null;
 this.modified = false;
 this.searchInSubdirs = 'false';
 this.initialize();
}

//====================================== STATIC ==============================================
 
//====================================== MEMBERS =============================================
QueryData.prototype.setDefaults = function()
{
 this.fields = null;
 this.sortField = null;
 this.tag = null;
 this.modified = false;
 this.searchInSubdirs = 'false';
}

QueryData.prototype.initialize = function()
{
 this.setDefaults();
 this.fields = new Array();
}

QueryData.prototype.addField = function()
{
 var
  nfield = new QueryField(this.fields.length,this);

 this.fields.push(nfield);
 return nfield;
}

QueryData.prototype.getFields = function()
{
 return this.fields;
}

QueryData.prototype.getFieldByPosition = function(iposition)
{
 return this.fields[iposition];
}

QueryData.prototype.getFieldById = function(icategoryId,iid)
{
 if( this.fields && this.fields.length )
 {
     for (var i=0;i<this.fields.length;i++)
        if (this.fields[i].getCategoryId() == icategoryId)
            if (this.fields[i].getId() == iid)
                return this.fields[i];
 }
 return null;
}

QueryData.prototype.getSortField = function()
{
 return this.sortField;
}

QueryData.prototype.onSortFieldChanged = function(ifield)
{
//Setting the Globals.SORTORDER_NONE into old field ...
 if (this.sortField != null)
 if (this.sortField.getPosition() != ifield.getPosition())
  this.sortField.setSortOrder(Globals.SORTORDER_NONE);
 this.sortField = ifield;
}

QueryData.prototype.getFieldCount = function()
{
 return this.fields.length;
}

QueryData.prototype.clearFields = function()
{
//Clearing all fields ...
 for (var i=0;i<this.fields.length;i++)
  this.fields[i].finalize();
 this.fields.splice(0,this.fields.length);
}

QueryData.prototype.addFields = function(ifields)
{
 var
  vqfield = null;

//Adding fields from iqData ...
 for (var i=0;i<ifields.length;i++)
 {
  vqfield = this.addField();
  vqfield.copyFrom(ifields[i]);
//The id copyed from iqData might be incorrect ... let's correct it!
  vqfield.setPosition(this.fields.length-1);
//If this field has sort order defined we'll set it inside the queryData ...
  if (vqfield.getSortOrder() != Globals.SORTORDER_NONE)
   this.onSortFieldChanged(vqfield);
 }
}

QueryData.prototype.addFieldsFromQData = function(iqData)
{
 this.addFields(iqData.getFields());
}

QueryData.prototype.addFieldsByBuilder = function(idBuilder)
{
 var
  fieldsVector = null;

 idBuilder.build();
 fieldsVector = idBuilder.get();
 this.addFields(fieldsVector);
}

QueryData.prototype.getTag = function()
{
 return this.tag;
}

QueryData.prototype.setTag = function(itag)
{
 this.tag = itag;
}

QueryData.prototype.getModified = function()
{
 return this.modified;
}

QueryData.prototype.clearModified = function()
{
 this.modified = false;
}

QueryData.prototype.setModified = function()
{
 this.modified = true;
}

QueryData.prototype.copyFrom = function(iqData)
{
//Clearing internal fields ...
 this.clearFields();
//Adding fields ...
 this.addFieldsFromQData(iqData);
//Setting the modified tag ...
 this.modified = iqData.getModified();
//Setting the tag ...
 this.tag = iqData.getTag();
 this.searchInSubdirs = iqData.searchInSubdirs;
}

QueryData.prototype.getServletData = function()
{
 var
  s = null,
  fId = 0,
  nDataFields = 0,
  sortOrd = 0;

//Checking if there are any fields ...
 if (this.fields.length == 0)
  return null;
//Encoding the invalidation flag(modified) ...
 s = DATA_encodeParam("i",(this.modified)?1:0);
//Encoding the sort field ...
 s += "&" + DATA_encodeParam("s",this.sortField.getTag());
 switch (this.sortField.getSortOrder())
 {
  case Globals.SORTORDER_ASC:
   sortOrd = 1;
   break;
  case Globals.SORTORDER_DESC:
   sortOrd = 0;
   break;
  default:
   sortOrd = -1;
 }
 s += "&" + DATA_encodeParam("st",sortOrd);
//Encoding valid field count ...
 for (var i=0;i<this.fields.length;i++)
 if (this.fields[i].hasSvrData())
  nDataFields++;
 s += "&" + DATA_encodeParam("n",nDataFields);
//Encoding fields ...
 for (var i=0;i<this.fields.length;i++)
 {
  if (this.fields[i].hasSvrData() == false)
   continue;
  s += "&"+this.fields[i].getServletData(fId);
  fId++;
 }
 s += "&" + DATA_encodeParam('sd',this.searchInSubdirs);
 return s;
}

QueryData.prototype.finalize = function()
{
//Clearing fields ...
 this.clearFields();
//Setting defaults ...
 this.setDefaults();
}
