package viewquery;
  use URI::Escape;
  my $common="common";

  sub querystring {
    my ($class, $doc) = (@_);
    my $startkey=$ENV{'PAGE_STARTKEY'};
    my $startkey_docid=$ENV{'PAGE_STARTKEY_DOCID'};
    my $map={};
    my @pairs=();
    my $value=undef;
    my $limit="limit";
    # shame perl has no boolean type
    # this is necessary for view queries
    # otherwise booleans are treated as integers
    my $booleans={
      include_docs => 1, descending => 1, inclusive_end => 1,
      group => 1, reduce => 1, update_seq => 1 };
    my $encode={ key => 1, keys => 1, startkey => 1, endkey => 1 };
    my $true="true";
    my $false="false";
    for my $key (keys $doc) {
      $value=$doc->{$key};  
      if($key eq $limit) {
        $value++;
      }
      if($booleans->{$key}) {
        $value = ( $value ? $true : $false );
      }
      if($encode->{$key}) {
        $value=$common->compact($value);
      }
      $map->{$key}=$value;
    }
    # pagination keys should already be JSON encoded
    if(defined($startkey)) {
      $map->{'startkey'}=$startkey;
    }
    if(defined($startkey_docid)) {
      $map->{'startkey_docid'}=$startkey_docid;
    }
    while ( ($key, $value) = each $map ) {
      push @pairs, join "=", map { uri_escape($_) } $key, $value;
    }
    return join "&", @pairs;
  }
1;
