# another handy script by <slug@quakenet.org>
# closes dead queries/windows
# do NOT use with chanact - will crash irssi

sub closedoze {
  my ($args, $server, $witem) = @_;
  my $kill = 0;

  if ($args =~ /^-k( (.*))?$/) {
    $args2 = $2;
    $kill = 1;
  } else {
    $args2 = $args;
  }

  if (!($args2 =~ /^(\d+) ?(\d+)?$/)) {
    if ($args2 ne '') {
      Irssi::print "Invalid arguments, /qclose ?-k? ?[start window number] ?end window number??";
      return 1;
    }
  }

  my $start = $1;
  my $end = $2;
  if (!$end) {
    foreach (1..10000) {
      if (!Irssi::window_find_refnum($_)) {
        $end = $_ - 1;
        last;
      }
    }
  }
  $start = 1 if (!$start);
  
  if ($start >= $end) {
    Irssi::print("Start comes before end dipshit.");
    return 2;
  }
  if (!Irssi::window_find_refnum($end)) {
    Irssi::print("Invalid end number!");
    return 3;
  }

  Irssi::print("Beginning window close (" . ($kill?"kill mode, strange":"show mode, killable") . " windows hilighted)...");
  foreach (reverse($start..$end)) {
    my $window = Irssi::window_find_refnum($_);
    my $win = $window->{active};
    my $typ = $win->{type};
    if (($typ eq '') || ($typ eq 'QUERY')) {
      if ($typ eq 'QUERY') {
        if (($win->{name} =~ /^.$/) || ($win->{name} =~ /^=/)) {
          $window->activity(4) if ($kill);
          next;
        }
        if ($kill) {
          Irssi::print("Destroying query $win->{name} ($_)");
        } else {
          $win->destroy()
        }
      } else {
        if ($window->{name} =~ /^.+$/) {
          $window->activity(4) if ($kill);
          next;
        }
        Irssi::print("Destroying dead window $_") if ($kill);
      }
      if (!$kill) {
        $window->activity(4);
      } else {
        $window->destroy();
      }
    }
  }
  Irssi::print("Done.");

}

Irssi::command_bind("qclose", "closedoze");
