# ==================================================================
# Gossamer Links - enhanced directory management system
#
#   Website  : http://gossamer-threads.com/
#   Support  : http://gossamer-threads.com/scripts/support/
#   CVS Info : 087,071,086,086,085      
#   Revision : $Id: Treecats.pm,v 1.3 2006/09/12 06:07:12 brewt Exp $
#
# Copyright (c) 2006 Gossamer Threads Inc.  All Rights Reserved.
# Redistribution in part or in whole strictly prohibited. Please
# see LICENSE file for full details.
# ==================================================================

package Links::User::Treecats;
# ==================================================================
use strict;
use Links qw/:objects/;

sub handle {
# Fetch these categories (and select them)
    my @cid = $IN->param('cid');
# Fetch these links (and select them)
    my @lid = $IN->param('lid');
# Fetch these categories
    my @id = $IN->param('id');
# Fetch links as well as Categories
    my $fetchlinks = $IN->param('links');

    my $category = $DB->table('Category');
    my $catlinks = $DB->table('CatLinks', 'Links');

# Fetching selected categories
    if (@cid) {
        @lid = ();
        @id = @cid;
        $fetchlinks = 0;
    }
# Fetching selected links
    elsif (@lid) {
# Get all the categories that the links are in
        @id = $catlinks->select('CategoryID', { LinkID => \@lid }, VIEWABLE)->fetchall_list;
        $fetchlinks = 1;
    }
# Fetching categories/links
    else {
        @cid = ();
        @lid = ();
        @id = (0) unless @id;
    }

    my %vars;
# Only allow the use of treecats.cgi if db_gen_category_list == 2 or if
# treecats_enabled (hidden config option) is true
    if ($CFG->{db_gen_category_list} != 2 and not $CFG->{treecats_enabled}) {
        $vars{error} = 'Permission denied - treecats is currently disabled.';
    }
    else {
        my @fetchlinks;
        my $cond;
        if (@cid or @lid) {
            my $parents = $category->parents(\@id);
            my @ids;
            my @fids = (0);
            for (keys %$parents) {
# Fetch all the parents and their children
                push @ids, @{$parents->{$_}};
                push @fids, @{$parents->{$_}};
# Fetch the category itself
                push @ids, $_;
# When pre-selecting links, @id contains the category the link(s) are in.  To
# completely draw the tree, the children of those categories need to be
# retreived as well.
                if (@lid) {
                    push @fids, $_;
                    push @fetchlinks, $_;
                }
                push @fetchlinks, @{$parents->{$_}};
            }
            $cond = GT::SQL::Condition->new(ID => IN => \@ids, FatherID => IN => \@fids);
            $cond->bool('OR');
        }
        else {
            push @fetchlinks, @id;
            $cond = GT::SQL::Condition->new(FatherID => IN => \@id);
        }
        $category->select_options("ORDER BY Full_Name");
        $vars{categories} = $category->select($cond)->fetchall_hashref;

# Find the children counts of all the categories and check if they should be selected or not
        my @cats;
        for (@{$vars{categories}}) {
            push @cats, $_->{ID};
        }
        $category->select_options("GROUP BY FatherID");
        my %children = $category->select('FatherID', 'COUNT(*)', { FatherID => \@cats })->fetchall_list;
        my %selected = map { $_ => 1 } @cid;
        for (@{$vars{categories}}) {
            $_->{children} = $children{$_->{ID}} || 0;
            $_->{selected} = $selected{$_->{ID}} || 0;
        }

        if ($fetchlinks and @fetchlinks) {
# Remove CategoryID = 0 (shouldn't normally happen)
            @fetchlinks = grep $_, @fetchlinks;
            $catlinks->select_options("ORDER BY CategoryID, Title");
            $vars{links} = $catlinks->select({ CategoryID => \@fetchlinks }, VIEWABLE)->fetchall_hashref;

            %selected = map { $_ => 1 } @lid;
            for (@{$vars{links}}) {
                $_->{selected} = $selected{$_->{ID}} || 0;
            }
        }
    }

    print $IN->header('text/xml');
    print Links::user_page('treecats.xml', \%vars);
}

1;
