function hbFilterSpec (layername)
{
  this.spec = new Object ();
  this.layername = layername;
}

hbFilterSpec.prototype.equals = function (rhs)
{
  if (!rhs)
  {
    return false;
  }

  if (rhs.layername != this.layername)
  {
    return false;
  }

  if (!rhs.spec)
  {
    return false;
  }

  var count = 0;

  for (var m in this.spec)
  {
    if (!(m in rhs.spec))
    {
      return false;
    }

    if (this.spec [m] != rhs.spec [m])
    {
      return false;
    }

    ++count;
  }

  for (var m in rhs.spec)
  {
    --count;
  }

  if (0 != count)
  {
    return false;
  }

  return true;
}

hbFilterSpec.prototype.addFilter = function (field, crit2Valu)
{
  this.spec [field] = crit2Valu;
}

hbFilterSpec.prototype.filter = function (toFilter)
{
  var result = true;

  for (var field in this.spec)
  {
    if (! toFilter [field])
    {
      result = true;
      break;
    }

    for (var criterion in this.spec [field])
    {
      var value = this.spec [field] [criterion];

      if ("min" == criterion)
      {
        if (toFilter [field] < value)
        {
          result = false;
          break;
        }
      }
      else if ("max" == criterion)
      {
        if (toFilter [field] > value)
        {
          result = false;
          break;
        }
      }
    }

    if (false == result)
    {
      break;
    }
  }

  return result;
}
