#!/usr/bin/perl

use strict;
push(@INC,'/home/oc/cgi-bin/');
use lib '/home/oc/cgi-bin/';
use OC;
use CGI qw/:standard/;;
use HTML::Template;
use Tie::IxHash;

use vars qw/
%CONFIG
$template
%form
%cookie
$self_url
$TITLE
@LINKS
$BODY
$PANEL
%CATEGORY
@DISPLAYED
$CAN_EDIT
$LOGGED_IN
@NOTE
$NAVIGATION
$USERNAME
$AC_TYPE
$PAGE
/;


sub Initialize {
    %form=();
    my $query=new CGI;
    foreach ($query->param) {
        $form{$_}=$query->param($_);
    }  
    %cookie=();
    foreach ($query->cookie) {
        $cookie{$_}=$query->cookie($_);
    }  
 
    %CONFIG=%OC::CONFIG;
#    $CONFIG{project_url}="/cgi-bin/project2.cgi";
    $self_url=$CONFIG{project_url};

#    $self_url=$ENV{REQUEST_URI};
#    $self_url=~s/^(.*)\?.*$/$1/;
#    $self_url=~s/^(.*.cgi).*$/$1/;

    @DISPLAYED=();
    %CATEGORY=();
    tie (%CATEGORY,'Tie::IxHash');
    @LINKS=();
    $TITLE='';
    $BODY='';
    $PANEL='';
    $PAGE='';
    $CAN_EDIT=0;
    $LOGGED_IN=0;
    @NOTE=();
    $NAVIGATION='';
    $USERNAME=undef;
    $AC_TYPE='';


}


sub ConnectToDatabase {
    if (!defined $::db) {
      $::db = DBI->connect("DBI:mysql:$CONFIG{db_name}:$CONFIG{db_host}:
        $CONFIG{db_port}",$CONFIG{db_username},$CONFIG{db_password})
        || die "Can't connect to database server.";
    }
}

sub PrepareSQL {
    my ($str) = (@_);
    $::sth=$::db->prepare($str);
}
 
sub ExecuteSQL {
    $::sth->execute(@_) || die "Could not execute SQL statement";
}

sub SendSQL {
    PrepareSQL(@_); 
    ExecuteSQL();
}

sub FetchSQLData {
    return $::sth->fetchrow_array();
}

sub Note {
    push(@NOTE,$_[0]);
}

sub Output_Notes {
    my $result="<font color=red>";
    foreach (@NOTE) {
        $result.="$_<br>";
    }
    $result.="</font><p>";
    return $result;
}

sub Right_Table {
    my $selected=$_[0];
    my $table='<b>Navigation</b>';
    unless ($LOGGED_IN) {
        $table.=OC::Li("<a href='$CONFIG{account_url}?cmd=login'>Login</a>");
    }    
    if ($selected eq 'browse_projects') {
        $table.=OC::Li("Browse projects");
    } else {
        $table.=OC::Li("<a href='$self_url'>Browse projects</a>");
    }
    if ($selected eq 'start_new_project') {
        $table.=OC::Li('Start new project');
    } else {
        $table.=OC::Li("<a href='$self_url?request=form'>Start new project</a>");
    }

=comment

    $table.="<p><b>Filter</b>";

    my $link="";
    if ($form{category} eq '') {
         $link="None";
    } else {
          $link="<a href='$self_url'>None</a>";
    }
    $table.=OC::Li($link);

    foreach (keys %CATEGORY) {
        my $display=OC::Truncate($CATEGORY{$_}{display_name},12);
        if ($form{category} ne $_) {
            $link="<a href='$self_url?category=$_'>$display</a>";
        } else {
            $link="$display";
        }
        $table.=OC::Li($link);
    }

=cut

    return $table;
}

sub Prepare_Template {
    $template=HTML::Template->new(
	filename=>$_[0],
        die_on_bad_params=>0,
        loop_context_vars=>1,
        global_vars=>0,
        shared_cache=>0,
    );
    $template->param(table_color1=>$CONFIG{color}{table1});
    $template->param(table_color3=>$CONFIG{color}{table3});
}

sub Append_Body {
    my ($title,$body,$edit_link)=@_;
    $edit_link='' unless($edit_link);
    $BODY.="<b><font size=+1>$title</font></b> $edit_link<p>" if ($title ne '');
    $BODY.="$body<p>";
}

sub Block_Edit_Link {
    my ($pname,$page,$block)=@_;
    $page=$PAGE if ($page eq '');
    if ($CAN_EDIT) {
        $page=~s/ /\%20/g;
        $block=~s/ /\%20/g;
        $page=~s/&/\%26/g;
        $block=~s/&/\%26/g;
        my $link="<a href='$self_url/$pname/admin?edit_used_block=txt&page=$page&used_block=$block'>
          <img src='$CONFIG{edit_image}' border=0 alt='Click here to edit this block'></a>";
        return $link;
    }
}

sub Last_Updated { 
    my ($pname)=@_;
    my $time=time;
    SendSQL("update project set modified=$time where name='$pname'");
}

sub Tmpl_Details {
    my ($category,$updated,$created,$wbc,$stage,$mailinglist)=@_;
    my $created=OC::Time_To_Str($created,'nice');
    my $updated=OC::Time_To_Str($updated,'nice');
    SendSQL("select display_name from project_category where name='$category'");
    my $cat_desc=FetchSQLData;
    my $body="Category: <a href='$self_url?category=$category'>$cat_desc</a><br>Last updated: $updated<br>Created: $created<br>";
    $wbc=$wbc>0 ? "Yes" : "No";
    $body.="Wishbone compliant core: $wbc<br>";
    SendSQL("select display_name from project_stage where name='$stage'");
    $stage=FetchSQLData;
    $body.="Stage: $stage<br>";
    $body.="Mailing list: <a href='$CONFIG{forum_url}/$mailinglist'>".ucfirst($mailinglist)."</a>";
    Append_Body('Details',$body);
    return $cat_desc;
}

sub Tmpl_Files {
    my ($pname)=@_;
    my @table=();
    my @row=();
    push(@row,'Date','Description','Link');
    push(@table,\@row);
    SendSQL("select file,cvs,description,added from project_files where project='$pname' order by added desc");
    while (my @result=FetchSQLData) {
        my $date=OC::Time_To_Str($result[3],'nice');
        my $description=${OC::Smart_Reformat(\$result[2])};
        my $filename;
        if ($result[1]) {
            $result[0]=~s!/$!!g;
        }
        if (rindex($result[0],'/')<length($result[0])) {
            $filename=substr($result[0],rindex($result[0],'/')+1);
        } else {
           $filename=$result[0];
        }
        my $dl_url;
        unless ($result[1]) {
            $result[0]=~s!^$CONFIG{cores_folder}/$pname/!!;
            $dl_url=$result[0];
        } else {
            $dl_url=OC::To_Url($result[0]);
        }
        $dl_url=~s! !%20!gs;
        my $link="<a href='$dl_url'>$filename</a>";
        my @row=();
        $description='&nbsp;' if ($description eq '');
        push(@row,$date,$description,$link);
        push(@table,\@row);
    }
    my $body=OC::Html_Table(\@table);
    Append_Body('Downloads',$body,Block_Edit_Link($pname,$form{page},'files'));
}

sub Tmpl_Maintainers {
    my ($pname)=@_;
    my @username=();
    SendSQL("select username from project_maintainers where project='$pname'");
    while (my $user=FetchSQLData) {
        push(@username,$user);
    }
    my $body='<ul>';
    foreach my $user (@username) {
        SendSQL("select fullname from account where username='$user'");
        my $fullname=FetchSQLData;
        $fullname=ucfirst($user) if ($fullname eq '');
        $body.="<li><a href='$CONFIG{account_url}/$user'>$fullname</a></li>";
    }
    $body.="</ul>";
    Append_Body('Maintainers',$body,Block_Edit_Link($pname,$form{page},'maintainers'));
}

sub Tmpl_Block {
    my ($pname,$block,$page)=@_;
    SendSQL("select title,body from project_blocks where project='$pname' and block='$block'");
    my ($title,$body)=FetchSQLData;
    $title="<font color=#c0c0c0>$block</font>" if($title eq '' && $CAN_EDIT);
    $title=ucfirst($title);
    $body=ucfirst($body);
    $body=${OC::Smart_Reformat(\$body)};
    Append_Body($title,$body,Block_Edit_Link($pname,$page,$block));
}

sub Tmpl_News {
    my ($pname)=@_;
    my @table=();
    my @row=();
    push(@row,'Date','News');
    push(@table,\@row);
    SendSQL("select news, added from project_news where project='$pname' order by added desc");
    while (my ($news,$date)=FetchSQLData) {
        $date=OC::Time_To_Str($date,'nice');
        my @row=();
        push(@row,$date,${OC::Smart_Reformat(\$news)});
        push(@table,\@row);
    }
    Append_Body('Project news',OC::Html_Table(\@table),Block_Edit_Link($pname,$form{page},'news'));
}

sub Tmpl_Changes {
    my ($pname)=@_;
    my @table=();
    my @row=();
    push(@row,'Date','Changes');
    push(@table,\@row);
    SendSQL("select changes, added from project_changes where project='$pname'");
    while (my ($changes,$date)=FetchSQLData) {
        $date=OC::Time_To_Str($date,'nice');
        my @row=();
        push(@row,$date,${OC::Smart_Reformat(\$changes)});
        push(@table,\@row);
    }
    Append_Body('Changes',OC::Html_Table(\@table),Block_Edit_Link($pname,$form{page},'changes'));
}

sub Tmpl_Links {
    my ($pname,$page)=@_;
    my %link=();
    tie (%link,'Tie::IxHash');
    @LINKS=();
    SendSQL("select distinct(page) from project_pages where project='$pname' and visible=1 order by id");
    while (my $result=FetchSQLData) {
        $link{$result}=1;
    }
    if ($CAN_EDIT) {
        my %row=();
        $row{link}="$self_url/$pname/admin" unless($page eq 'admin');
        $row{name}='Admin';
        push(@LINKS,\%row);
    }
    foreach my $result (keys %link) {
        my %row=();
        my $url_result=$result;
        $url_result=~s/ /%20/g;
        $url_result=~s/&/%26/g;
        $row{link}="$self_url/$pname/$url_result" if ($page ne $result);
        $row{name}=ucfirst($result);
        push(@LINKS,\%row);
    }

}

sub Tmpl_Image {
    my ($pname,$block,$title,$body)=@_;
    if ($title) {
        $title="<br><i>$title</i>";
    }
    $BODY.="<center><img src='".OC::Url($body)."' border=0>$title</center><p>";
}

sub Tmpl_Comments {
    my ($pname)=@_;
    $BODY.="<b>Comments</b>";
    $BODY.="<p><a href='$self_url/$pname?cmd=add_comment_screen&page=$form{page}'>Add your comment</a><p>";
    my @comment=();
    SendSQL("select added,email,comment from project_comments where project='$pname' order by added desc");
    while (my @result=FetchSQLData) {
        my %row=();
        $row{added}=OC::Time_To_Str($result[0],'nice');
        $row{email}=$result[1];
        $row{comment}=$result[2];
        push(@comment,\%row);
    }
    if (scalar(@comment)) {
        $BODY.="<table border=0 width=100% cellpadding=0 cellspacing=0 border=0><tr><td bgcolor=$CONFIG{color}{bg0}>";
        $BODY.="<table border=0 width=100% cellspacing=1 cellpadding=4>";
        $BODY.="<tr bgcolor=$CONFIG{color}{table1}><td><b>Date/Author</b></td><td><b>Comment</b></td></tr>";
        my ($color2,$color1)=($CONFIG{color}{table2},$CONFIG{color}{table3});
        foreach (@comment) {
            ($color1,$color2)=($color2,$color1);
            my %row=%{$_};
            my $email=OC::Store_Email($row{email});
            $email="<a href='$CONFIG{forum_url}/post?to=$email'>$row{email}</a>";
            $email=${OC::Filter_Emails(\$email)};
            $BODY.="<tr bgcolor='$color1'><td valign=top>$row{added}<br>$email</td>
              <td valign=top>".${OC::Smart_Reformat(\$row{comment})}."</td></tr>";
        }
        $BODY.="</table></td></tr></table>";
    } else {
        $BODY.="No comments yet.<p>";
    }
    $BODY.="<p><a href='$self_url/$pname?cmd=add_comment_screen&page=$form{page}'>Add your comment</a><p>";
}

sub Navigation {
    my ($pname,$page,$block)=@_;
    my $nav="<a href='$self_url/$pname'>Project</a>";
    if (defined $page) {
        $nav.=" > <a href='$self_url/$pname/admin'>Admin</a>";
    } else {
        $nav.=" > Admin";
    }
    if (defined $page && !defined $block) {
        $nav.=" > $page";
    } elsif(defined $page && defined $block) {
        my $link=$page;
        $link=~s/ /%20/g;
        $link=~s/&/%26/g;
        $nav.=" > <a href='$self_url/$pname/admin?edit_page=edit&page=$link'>$page</a>";
    }
    if (defined $block) {
        $nav.=" > $block";
    }
    $nav.="<p>";
    $NAVIGATION=$nav;
}

sub Admin_Screen {
    my ($pname)=@_;
    Navigation($pname);
    Tmpl_Links($pname,'admin');
    $TITLE="Edit project: $pname";

    SendSQL("select count(page) from project_pages where project='$pname'");
    my $size=FetchSQLData;
    $size++;
    SendSQL("select display_name,category,mailing_list,short_desc,stage,wbc,cvs_folder from project where name='$pname'");
    my ($display_name,$category,$mailinglist,$short_desc,$stage,$wbc,$cvs_folder)=FetchSQLData;
    $BODY.="<form action='$self_url/$pname/admin/' method=post>
      <font size=+1><b>Project properties</b></font><p>
      <table>
      <tr><td>Project display name</td><td>
      <input type=query name=display_name value='$display_name' size=40 maxlength=64></td></tr>
      <tr><td>Project category</td><td><select name=category>";

    SendSQL("select name,display_name from project_category order by display_name");
    while (my ($name,$display_name)=FetchSQLData) {
        my $selected='';
        $selected=' selected ' if ($category eq $name);
        $BODY.="<option $selected value='$name'>$display_name</option>";
    }

    $BODY.="</select></td></tr><tr><td>
      Stage </td><td><select name=stage>";

 
    SendSQL("select name,display_name from project_stage order by id");
    while (my @result=FetchSQLData) {
        my $selected='';
        $selected=' selected ' if ($stage eq $result[0]);
        $BODY.="<option $selected value='$result[0]'>$result[1]</option>";
    }
    my $wbc_checkbox=' checked ' if ($wbc);
    $cvs_folder=$pname unless($cvs_folder);
    $BODY.="</select></td></tr><tr><td>
        Wishbone compliant core</td><td>
        <input type=checkbox name=wbc $wbc_checkbox></td></tr><tr><td>
        CVS folder </td><td><input type=query name=cvs_folder value='$cvs_folder'></td></tr><tr><td>
        Mailing list</td><td><select name=mailinglist>";

    foreach (OC::Get_Mailing_Lists()) {
        my $selected='';
        $selected=' selected ' if ($mailinglist eq $_);
        $BODY.="<option $selected value='$_'>".ucfirst($_)."</option>";
    }

    $BODY.="</select></td></tr></table><p><table><tr><td>
      Short description<br><textarea rows=5 cols=70 name=short_desc wrap=soft>$short_desc</textarea><br>
      <input type=submit name=save_properties value='Save'> <input type=reset value='Reset'>
      </td></tr></table>
      <p><form action='$self_url/$pname/admin/' method=post>
      <font size=+1><b>Project pages</b></font><p>
      <table><tr><td valign=center align=right>
      <input type=submit name=move_page_up value='up'><br>
      <input type=submit name=move_page_down value='down'>
      </td><td><select name=page size=$size>";
    SendSQL("select page from project_pages where project='$pname' order by id");
    while (my $page=FetchSQLData) {
        my $selected='';
        if ($page eq $form{page}) {
            $selected=' selected ';
        }
        $BODY.="<option $selected value=\"$page\">$page</option>";
    }
    my %block=%{Get_Project_Blocks()};
    my $bsize=scalar(keys %block);
    $BODY.="</select></td></tr><tr><td></td><td>
      <input type=submit name=edit_page value='Edit'>
      <input type=submit name=delete_page value='Delete'></td></tr></table>
      <p><input type=query name=newpage value=''><input type=submit name=create_page value='Create page'></form><p>";
}

sub Display_Project {
    my $pname=$_[0];
    my $page=$form{page};
    SendSQL("select count(page) from project_pages where project='$pname' and page='$page'");
    unless (FetchSQLData) {
        if (OC::File_Type("$CONFIG{cores_folder}/$pname/$form{page}")==$OC::_FILE) {
            my $cat_result=OC::Cat_File("$CONFIG{cores_folder}/$pname/$form{page}");
            if ($cat_result) {
                $page='';
            } else {
                exit;
            }
        } else {
            $page='';
        }
    }
    unless ($page) {
        SendSQL("select page from project_pages where project='$pname' and visible=1 order by id");
        $page=FetchSQLData;
        $PAGE=$page;
    }
    SendSQL("select project_page_block.block,
        project_blocks.type,project_blocks.title, project_blocks.body
        from project_page_block,project_blocks where project_page_block.project='$pname' 
        and project_page_block.page='$page' and project_blocks.project='$pname' 
        and project_page_block.block=project_blocks.block order by project_page_block.id");
    my @blocks=();
    while (my ($block,$type,$title,$body)=FetchSQLData) {
        my %tmp=();
        $tmp{block}=$block;
        $tmp{type}=$type;
        $tmp{title}=$title;
        $tmp{body}=$body;
        push(@blocks,\%tmp);
    }

    SendSQL("select name, category, display_name, mailing_list, cvs_folder, modified, 
      created, wbc, stage from project where name='$pname'");
    my ($name, $category, $display_name, $mailing_list, $cvs_folder, 
     $modified, $created, $wbc, $stage)=FetchSQLData;
 
    $template->param(page_title=>"project: $display_name");

    $BODY.=OC::Title("Project: $display_name");
    my $cat_display='';

    SendSQL("select name,display_name from project where category='$category' and name<>'$pname'");
    my %similar=();
    while (my @result=FetchSQLData) {
       $similar{$result[0]}=$result[1];
    }
    if (scalar(%similar)) {
        my $table='';
        $PANEL.="<b>".OC::Truncate($cat_display,15)."</b>";
        foreach (keys %similar) {
            $similar{$_}=OC::Truncate($similar{$_},15);
            $PANEL.=OC::Li("<a href='$self_url/$_'>$similar{$_}</a><br>");
        }
    }
    Tmpl_Links($pname,$page);

    foreach (@blocks) {
        my %tmp=%{$_};
        my $block=$tmp{block};
        my $type=$tmp{type};
        if ($type eq 'image') {
            Tmpl_Image($pname,$block,$tmp{title},$tmp{body});
        } elsif ($block eq 'details') {
            $cat_display=Tmpl_Details($category,$modified,$created,$wbc,$stage,$mailing_list);
        } elsif ($block eq 'files') {
            Tmpl_Files($pname);
        } elsif ($block eq 'maintainers') {
            Tmpl_Maintainers($pname);
        } elsif ($block eq 'news') {
            Tmpl_News($pname);
        } elsif ($block eq 'changes') {
            Tmpl_Changes($pname);
        } elsif ($block eq 'comments') {
            Tmpl_Comments($pname);
        } elsif ($block eq 'wishlist') {
            Tmpl_Wishlist($pname,$page);
        } else {
            Tmpl_Block($pname,$block,$page);
        }
        push(@DISPLAYED,$block);
    }


}

sub Delete_Page {
    my ($pname,$page)=@_;
    SendSQL("delete from project_pages where project='$pname' and page='$page'");
    SendSQL("delete from project_page_block where project='$pname' and page='$page'");
    Last_Updated($pname);
}

sub Create_Page {
    my ($pname,$page)=@_;
    if ($page eq '') {
        Note("Error: invalid page name");
        return;
    }
    SendSQL("select count(page) from project_pages where project='$pname' and page='$page'");
    if (FetchSQLData()>0) {
        Note("Error: page already exists!");
        return;
    }
    PrepareSQL("insert into project_pages (project,page,visible) values (?,?,?)");
    ExecuteSQL($pname,$page,0);
    Last_Updated($pname);
}

sub Add_Block {
    my ($pname,$page,$block)=@_;
    SendSQL("select count(block) from project_page_block where project='$pname' and page='$page' and block='$block'");
    unless (FetchSQLData) {
        if ($block ne '') {
            PrepareSQL("insert into project_page_block (project,page,block) values (?,?,?)");
            ExecuteSQL($pname,$page,$block);
        }
    }
    Last_Updated($pname);
}

sub Remove_Block {
    my ($pname,$page,$block)=@_;
    if ($block ne '') {
        SendSQL("delete from project_page_block where project='$pname' and page='$page' and block='$block'");
    }
    Last_Updated($pname);
}

sub Get_Project_Blocks {
    my ($pname)=@_;
    my %block=();
    tie (%block,'Tie::IxHash');
    SendSQL("select block from project_blocks where project='$pname'");
    while (my $block=FetchSQLData) {
        $block{$block}='unused';
    }
    SendSQL("select block from project_page_block where project='$pname'");
    while (my $block=FetchSQLData) {
        $block{$block}='used';
    }
    return \%block;
}

sub Create_Block {
    my ($pname,$block)=@_;
    SendSQL("select count(block) from project_blocks where project='$pname' and block='$block'");
    my $exists=FetchSQLData;
    if ($pname ne '' && $block ne '' && !$exists) {
        PrepareSQL("insert into project_blocks (project,block,title,deletable) values (?,?,?,?)");
        ExecuteSQL($pname,$block,ucfirst($block),1);
    } elsif ($exists) {
        Note("Block already exists!");
    } else {
        Note("Invalid block name!");
    }
    Last_Updated($pname);
}

sub Upload_Image {
    my ($pname)=@_;
    SendSQL("select folder from project where name='$pname'");
    my $project_folder=FetchSQLData();
    if ($project_folder eq '') {
        $project_folder=$CONFIG{cores_folder}."/".$pname;
    }
    $project_folder.='/' unless ($project_folder=~m/\/$/);
    my $fh=$form{file};
    my $new_filename=$fh;
    $new_filename=substr($new_filename,rindex($new_filename,'\\')+1);
    $new_filename=substr($new_filename,rindex($new_filename,'/')+1);
    my $line;
    if (defined $fh) {
      if ($line=<$fh>) {
        my $fexists=scalar(stat($project_folder.$new_filename));
        if (open(FILE,">$project_folder$new_filename")) {
            print FILE $line;
            while ($line=<$fh>) {
                print FILE $line;
 	    }  
	    close(FILE);
            Note("Old file was owerwriten") if ($fexists);
            my $url=$project_folder.$new_filename;
            PrepareSQL("insert into project_blocks (project,block,title,body,type,deletable) values (?,?,?,?,?,?)");
            ExecuteSQL($pname,"image $new_filename",$form{title},$url,"image",1);
        } else {
            Note("$project_folder$new_filename");
            Note($!);
        }
      }  
    }
}

sub Delete_Block {
    my ($pname,$block)=@_;
    my %block=%{Get_Project_Blocks($pname)};
    if ($block{$block} eq 'unused') {
        SendSQL("select type,body from project_blocks where project='$pname' and block='$block'");
        my @result=FetchSQLData;
        if ($result[0] eq 'image') {
            unlink($result[1]);
        }
        SendSQL("select count(block) from project_blocks where project='$pname' and block='$block' and deletable=1");
        if (FetchSQLData) {
            SendSQL("delete from project_blocks where project='$pname' and block='$block' and deletable=1");
        } else {
            Note("ERROR: this block is not deletable.");
        }
    } else {
        Note("ERROR: cannot delete used block $block!");
    }
    Last_Updated($pname);
}

sub Edit_Page {
    my ($pname,$page)=@_;
    PrepareSQL("select count(page) from project_pages where project=? and page=?");
    ExecuteSQL($pname,$page);
    unless (FetchSQLData>0) {
        Note("ERROR: invalid page '$page'!");
        Admin_Screen($pname);
        return;
    }
    Navigation($pname,$page);
    my %block=%{Get_Project_Blocks($pname)};
    my %this_page=();
    tie (%this_page,'Tie::IxHash');
    SendSQL("select block from project_page_block where project='$pname' and page='$page' order by id");
    while (my $block=FetchSQLData) {
        $this_page{$block}='1';
    }
    my $size=scalar(keys %block);
    $size++;
    $size=16 if ($size>16);
    my @pages=();
    SendSQL("select page from project_pages where project='$pname' order by id");
    while (my $result=FetchSQLData) {
        push(@pages,$result);
    } 
    $BODY.="<form action='$self_url/$pname/admin/' method=post enctype='multipart/form-data'>";
    
    my ($selected_1,$selected_0)='';
    SendSQL("select visible from project_pages where project='$pname' and page='$page'");
    if (FetchSQLData eq '1') {
        $selected_1=' selected ';
    } else {
        $selected_0=' selected ';
    }

    $BODY.="<p>Page status <select name=visible><option $selected_1 value='1'>visible</option>
      <option $selected_0 value='0'>hidden</option></select><input type=submit name=set_visible value='set'><p>
      <input type=hidden name=page value='$page'>
      <b>Block</b><table><tr>
      <td valign=center align=right><input type=submit name=move_block_up value='up'><br>
      <input type=submit name=move_block_down value='down'></td>
      <td valign=top><font size=-1>Used blocks</font><br><select name=used_block size=$size>";
    foreach my $key (keys %this_page) {
        my $selected='';
        $selected=' selected ' if ($form{used_block} eq $key || $form{unused_block} eq $key);
        $BODY.="<option $selected value='$key'>$key</option>";
    }
    $BODY.="</select><br><input type=submit name='edit_used_block' value='Edit'></td>
      <td valign=center><input type=submit name='add_block' value='<-'><p>
      <input type=submit name='remove_block' value='->'></td><td valign=top>
      <font size=-1>Unused blocks</font><br><select name=unused_block size=$size>";
    foreach my $key (keys %block) {
        my $selected='';
        $selected=' selected ' if ($form{unused_block} eq $key || $form{used_block} eq $key);
        if ($block{$key} eq 'unused') {
            $BODY.="<option $selected value='$key'>$key</option>";
        }
    }
    $BODY.="</select><br><input type=submit name=edit_unused_block value='Edit'>
      <input type=submit name=delete_block value='Delete'></td></tr></table><p>
      Create block<br>
      <input type=query name=new_block value=''><input type=submit name=create_block value='Create'><p>
      <table><tr><td>
      <b>Image</b><p>
      Description<br><input type=query name=title value='' size=40 maxlength=250><br>
      File <br><input type=file name=file size=30><br>
      <hr><center>
      <input type=submit name=upload_image value='Upload'>
      </td></tr></table>
      </forum>";    
}

sub Save_Properties {
    my ($pname)=@_;
#    if ($form{short_desc} ne '' && $form{display_name} ne '') {
        my $wbc=0;
        $wbc=1 if (lc($form{wbc}) eq 'on');
        PrepareSQL("update project set display_name=?, category=?, mailing_list=?, short_desc=?,
          stage=?, wbc=?, cvs_folder=? where name='$pname'");
        ExecuteSQL($form{display_name},$form{category},$form{mailinglist},$form{short_desc},
        $form{stage}, $wbc, $form{cvs_folder});
#    }
    Last_Updated($pname);
}

sub Add_News {
    my ($pname,$news)=@_;
    if ($pname && $news) {
        PrepareSQL("insert into project_news (project,news,added) values (?,?,?)");
        ExecuteSQL($pname,$news,time);
    }
    Last_Updated($pname);
}

sub Delete_News {
    my ($pname,$id)=@_;
    if ($pname && $id) {
        SendSQL("delete from project_news where project='$pname' and id='$id'");
    } 
    Last_Updated($pname);
}

sub Edit_News {
    my ($pname)=@_;
    my @table=();
    my @row=();
    $row[0]="Date";
    $row[1]="News";
    $row[2]="Delete";
    push(@table,\@row);
    SendSQL("select added,news,id from project_news where project='$pname' order by added desc");
    while(my @result=FetchSQLData) {
        my @row=();
        $row[0]=OC::Time_To_Str($result[0],'nice');
        $row[1]=${OC::Smart_Reformat(\$result[1])};
        $row[2]="<a href='$self_url/$pname/admin/?delete_news=1&id=$result[2]&page=$form{page}'>Delete</a>";
        push(@table,\@row);
    }
    $BODY.="<form action='$self_url/$pname/admin/' method=post>".OC::Html_Table(\@table).
    "<p><textarea name=new_news cols=70 rows=10 wrap=soft></textarea><br>
    <input type=submit name=add_news value='Add'>
    <input type=hidden name=page value='$form{page}'>";

    $BODY.="</form>";
}

sub Edit_Files {
    my ($pname)=@_;
    my @table=();
    my @row=();
    $row[0]="File";
    $row[1]="Description";
    $row[2]="Date";
    $row[3]="Action";
    push(@table,\@row);
    SendSQL("select file,cvs,description,added,id from project_files where project='$pname' order by added desc");
    while(my @result=FetchSQLData) {
        my @row=();
        $row[0]=$result[0];
        $row[0]=~s!.*/([^/]+)!$1!g;
        $row[1]=${OC::Smart_Reformat(\$result[2])};
        $row[2]=OC::Time_To_Str($result[3],'nice');
        $row[3]="<a href='$self_url/$pname/admin?delete_file=$result[4]&page=$form{page}'>Delete</a>";
        push(@table,\@row);
    }
    $BODY.="<form action='$self_url/$pname/admin/' enctype='multipart/form-data' method='POST'>".OC::Html_Table(\@table);
    $BODY.="<br> &nbsp;<table><tr><td valign=top><b>Add file</b><p>";
    $BODY.="File description<br><textarea name=file_desc cols=40 rows=5 wrap=soft></textarea><p>
      Enter a cvs path: (ex. ethmac/docs/spec.pdf)<br>
      <input type=query name=cvs_file value='' size=40><input type=submit name=add_cvs_file value='Add'>
      <center><p>
      OR<p></center>
      Upload file<br><input type=file name=filename size=30><input type=submit name=add_uploaded_file value='Add'>
      <input type=hidden name=page value='$form{page}'>";
    $BODY.="</td><td valign=top align=right>";
    
    $BODY.="<table width=90% bgcolor=#000000 cellpadding=1 cellspacing=0 border=0><tr><td>
            <table width=100% bgcolor=$CONFIG{color}{bg2} cellspacing=0 cellpadding=8 border=0><tr><td>";
  
    $BODY.="<b>Help</b><p>
      There are two ways how to add files to 'Download table'. 
      You can add files that are already in OpenCores CVS repository or
      upload them from your hard disk. <p>
      <font color=red>It is recommended to import all the files into CVS, including 
      binary files,</font> because this is the easiest way to 
      manage your files. <p>
      <b>How to add files/folders from CVS</b><br>
      <li>Import your files to CVS using your favorite CVS client</li>
      <li>Use CVSWeb to find exact path to files you want to add</li>
      <li>Enter relative path into filed</li>
      <li>Enter file description and click 'Add button'<p>
      <b>How to upload files</b><br>
      <li>Enter file description</li>
      <li>Browse to file on your disk and click 'Add button'</li><br>&nbsp;";

    $BODY.="</td></tr></table></td></tr></table>";

    $BODY.="</td></tr></table></form>";
}

sub Delete_File {
    my ($pname)=@_;
    PrepareSQL("select file,cvs from project_files where project=? and id=?");
    ExecuteSQL($pname,$form{delete_file});
    my ($file,$cvs)=FetchSQLData;
    SendSQL("delete from project_files where project=? and id=?");
    ExecuteSQL($pname,$form{delete_file});
    unless ($cvs) {
        unlink($file);
    }
    Last_Updated($pname);
}
 
sub Add_Cvs_File {
    my ($pname)=@_;
    return if ($form{cvs_file} eq '');
    my $cvs_file=$CONFIG{cvsroot}."/$form{cvs_file}";
    $cvs_file=~s!/$!!g;
    my $exists=0;
    if (OC::File_Type($cvs_file)) {
        $exists=1;
    } elsif(OC::File_Type($cvs_file.",v")) {
#        $form{cvs_file}.=",v";
        $exists=1;
    }
    unless($exists) {
        Note("File or folder doen't exist in CVS");
    } else {
        SendSQL("select count(file) from project_files where file='$form{cvs_file}' and project='$pname'");
        if (FetchSQLData) {
            Note("File already in the table!");
        } else {
            PrepareSQL("insert into project_files (project,username,file,cvs,description,added) values (?,?,?,?,?,?)");
            ExecuteSQL($pname,$USERNAME,$form{cvs_file},1,$form{file_desc},time);
        }
    }
    Last_Updated($pname);
}

sub Add_Uploaded_File {
    my ($pname)=@_;
    my $CURRENT_FOLDER="$CONFIG{cores_folder}/$pname/";
#    $CURRENT_FOLDER.="/" unless ($CURRNET_FOLDER=~m!/$!);
    mkdir($CURRENT_FOLDER,'493');
    my $fh=$form{filename};
    my $new_filename=$fh;
    $new_filename=substr($new_filename,rindex($new_filename,'\\')+1);
    $new_filename=substr($new_filename,rindex($new_filename,'/')+1);
    my $line;
#    if (!Valid_Path($CURRENT_FOLDER.$new_filename)) {
#        Note("Invalid filename: $CURRENT_FOLDER$new_filename; 
#        File probably exists but you don't have access to it.");
#        return;
#    }
    if (defined $fh) {
      if ($line=<$fh>) {
        my $fexists=scalar(stat($CURRENT_FOLDER.$new_filename));
        if (open(FILE,">$CURRENT_FOLDER$new_filename")) {
            print FILE $line;
            while ($line=<$fh>) {
                print FILE $line;
            }  
            close(FILE);
            PrepareSQL("insert into project_files (project,username,file,cvs,description,added) values (?,?,?,?,?,?)");
            ExecuteSQL($pname,$USERNAME,$CURRENT_FOLDER.$new_filename,0,$form{file_desc},time);
            Note("Old file was owerwriten") if ($fexists);
            if ($fexists) {
#                Log("Owerwriten: $CURRENT_FOLDER$new_filename");
            } else {
#                Log("$CURRENT_FOLDER$new_filename");
            }
        } else {
            Note("Error: $!");
#            Log("Error: $!");
        }
      }
    }
    $form{filename}=$CURRENT_FOLDER.$new_filename;
    Last_Updated($pname);
}

sub Add_Changes {
    my ($pname,$changes)=@_;
    if ($pname && $changes) {
        PrepareSQL("insert into project_changes (project,changes,added) values (?,?,?)");
        ExecuteSQL($pname,$changes,time);
    }
    Last_Updated($pname);
}

sub Delete_Changes {
    my ($pname,$id)=@_;
    if ($pname && $id) {
        SendSQL("delete from project_changes where project='$pname' and id='$id'");
    } 
    Last_Updated($pname);
}

sub Edit_Changes {
    my ($pname,$page)=@_;
    my @table=();
    my @row=();
    $row[0]='Date';
    $row[1]='Changes';
    $row[2]='Action';
    push(@table,\@row);
    SendSQL("select added,changes,id from project_changes where project='$pname' order by added desc");
    while(my @result=FetchSQLData) {
        my @row=();
        $row[0]=OC::Time_To_Str($result[0],'nice');
        $row[1]=${OC::Smart_Reformat(\$result[1])};
        $row[2]="<a href='$self_url/$pname/admin/?delete_changes=1&id=$result[2]&page=$form{page}'>Delete</a>";
        push(@table,\@row);
    }
    $BODY.="<form action='$self_url/$pname/admin/' method=post>".OC::Html_Table(\@table).
    "<p><textarea name=new_changes cols=70 rows=10  wrap=soft></textarea><br>
     <input type=hidden name=page value='$page'>
    <input type=submit name=add_changes value='Add'>";

    $BODY.="</form>";
}

sub Edit_Maintainers {
    my ($pname)=@_;
    my @maintainers=();
    my @table=();
    my @row=();
    $row[0]='Username';
    $row[1]='Action';
    push(@table,\@row);
    SendSQL("select username from project_maintainers where project='$pname'");
    while (my $result=FetchSQLData) {
        my @row=();
        $row[0]=$result;
        $row[1]="<a href='$self_url/$pname/admin/?delete_maintainer=$result&page=$form{page}'>Delete</a>";
        push(@table,\@row);
    }
    $BODY.="<form action='$self_url/$pname/admin/' method=post>".OC::Html_Table(\@table).
    "<p>Add new maintainer to this project<p>
    <input type=hidden name=page value='$form{page}'>
    Username <input type=query name=maintainer value=''>
    <input type=submit name=add_maintainer value='Add'></form>
    ";
}
 
sub Add_Maintainer {
    my ($pname,$maintainer)=@_;
    SendSQL("select count(username) from account where username='$maintainer'");
    if (scalar (FetchSQLData)>0) {
        SendSQL("select count(username) from project_maintainers where project='$pname' and username='$maintainer'");
        if (FetchSQLData==0) {
            PrepareSQL("insert into project_maintainers (project,username) values(?,?)");
            ExecuteSQL($pname,$maintainer);
        }
    }
    Last_Updated($pname);
}

sub Delete_Maintainer {
    my ($pname,$maintainer)=@_;
    if ($maintainer ne '') {
        SendSQL("delete from project_maintainers where project='$pname' and username='$maintainer'");
    }
    Last_Updated($pname);
}

sub Save_Block {
    my ($pname,$block)=@_;
    if ($block) {
        PrepareSQL("update project_blocks set title=?, body=? where project=? and block=?");
        ExecuteSQL($form{title},$form{body},$pname,$block);
    }
    Last_Updated($pname);
}

sub Justify_Block {
    my ($pname,$block)=@_;
    my $body=$form{body};

    $body=~s/([^\n^\r]+)\r?\n +([^-]{1})/$1 $2/sg;
    $body=~s/(\r?\n) +([^ ^\n^\r]{1})/$1$2/sg;

    if ($block) {
        PrepareSQL("update project_blocks set title=?, body=? where project=? and block=?");
        ExecuteSQL($form{title},$body,$pname,$block);
    }
    Last_Updated($pname);
}

sub Edit_Block {
    my ($pname,$block)=@_;
    unless ($block) {
        Edit_Page($pname,$form{page});
        return;
    }
    unless ($block eq 'details') {
        Navigation($pname,$form{page},$block);
    }
    if ($block eq 'details') {
        Note("Error: block '$block' is not editable!");
        if ($form{page}) {
            Edit_Page($pname,$form{page});
        } else {
            Admin_Screen($pname);
        }
        return;
    } elsif ($block eq 'comments') {
        Note("Error: block '$block' is not editable!");
        if ($form{page}) {
            Edit_Page($pname,$form{page});
        } else {
            Admin_Screen($pname);
        }
        return;
    } elsif ($block eq 'wishlist') {
        Note("Error: block '$block' is not editable!");
        if ($form{page}) {
            Edit_Page($pname,$form{page});
        } else {
            Admin_Screen($pname);
        }
        return;
    } elsif ($block eq 'news') {
        Edit_News($pname);
        return;
    } elsif ($block eq 'changes') {
        Edit_Changes($pname,$form{page});
        return;
    } elsif ($block eq 'maintainers') {
        Edit_Maintainers($pname);
        return;
    } elsif ($block eq 'files') {
        Edit_Files($pname);
        return;
    }

    SendSQL("select title,body from project_blocks where project='$pname' and block='$block'");
    my ($title,$body)=FetchSQLData();
    $BODY.="<form action='$self_url/$pname/admin' method=post>
      Block title<br>
      <input type=query name=title value='$title'><p>
      <textarea name=body rows=20 cols=70 wrap=soft>$body</textarea><p>
      <input type=submit name=save_block value='Save'> 
      <input type=submit name=justify_block value='Justify'>
      <input type=reset name=reset value='Reset'>
      <input type=hidden name=block value='$block'>
      <input type=hidden name=page value='$form{page}'></form>";
}

sub Move_Page {
    my ($pname,$page,$desc)=@_;
    my $prev;
    my $id;
    my $move_to;
    SendSQL("select id,page from project_pages where project='$pname' order by id $desc");
    while (my @result=FetchSQLData) {
        if ($page eq $result[1]) {
            $id=$result[0];
            $move_to=$prev;
            last;
        }
        $prev=$result[0];
    }
    if ($id && $move_to && $id!=$move_to) {
        SendSQL("select max(id) from project_pages");
        my $tmp_id=FetchSQLData;
        $tmp_id++;
        SendSQL("update project_pages set id=$tmp_id where id=$move_to");
        SendSQL("update project_pages set id=$move_to where id=$id");
        SendSQL("update project_pages set id=$id where id=$tmp_id");
    }
    Tmpl_Links($pname,'admin');
}

sub Move_Block {
    my ($pname,$page,$block,$desc)=@_;
    my $prev;
    my $id;
    my $move_to;
    SendSQL("select id,block from project_page_block where project='$pname' and page='$page' order by id $desc");
    while (my @result=FetchSQLData) {
        if ($block eq $result[1]) {
            $id=$result[0];
            $move_to=$prev;
            last;
        }
        $prev=$result[0];
    }
    if ($id && $move_to && $id!=$move_to) {
        SendSQL("select max(id) from project_page_block");
        my $tmp_id=FetchSQLData;
        $tmp_id++;
        SendSQL("update project_page_block set id=$tmp_id where id=$move_to");
        SendSQL("update project_page_block set id=$move_to where id=$id");
        SendSQL("update project_page_block set id=$id where id=$tmp_id");
    }
}

sub Set_Visible {
    my ($pname,$page,$visible)=@_;
    if ($pname && $page && $visible ne '') {
        SendSQL("update project_pages set visible=$visible where project='$pname' && page='$page'");
    }
    Tmpl_Links($pname,'admin');
    Last_Updated($pname);
}

sub Admin {
    $template->param(no_panel=>1);
    my ($pname)=@_;
    Tmpl_Links($pname,'admin');
    $TITLE="Edit project: $pname";


    if ($form{delete_page}) {
        Delete_Page($pname,$form{page});
        Admin_Screen($pname);
    } elsif ($form{create_page}) {
        Create_Page($pname,$form{newpage});
        Admin_Screen($pname);
    } elsif ($form{edit_page}) {
        Edit_Page($pname,$form{page});
    } elsif ($form{add_block}) {
        Add_Block($pname,$form{page},$form{unused_block});
        Edit_Page($pname,$form{page});
    } elsif ($form{remove_block}) {
        Remove_Block($pname,$form{page},$form{used_block});
        Edit_Page($pname,$form{page});
    } elsif ($form{save_properties}) {
        Save_Properties($pname);
        Admin_Screen($pname);
    } elsif ($form{create_block}) {
        Create_Block($pname,$form{new_block});
        Edit_Page($pname,$form{page});
    } elsif ($form{upload_image}) {
        Upload_Image($pname);
        Edit_Page($pname,$form{page});
    } elsif ($form{edit_used_block}) {
        Edit_Block($pname,$form{used_block});
    } elsif ($form{edit_unused_block}) {
        Edit_Block($pname,$form{unused_block});
    } elsif ($form{delete_block}) {
        Delete_Block($pname,$form{unused_block});
        Edit_Page($pname,$form{page});
    } elsif ($form{move_page_up}) {
        Move_Page($pname,$form{page});
        Admin_Screen($pname);
    } elsif ($form{move_page_down}) {
        Move_Page($pname,$form{page},'desc');
        Admin_Screen($pname);
    } elsif ($form{move_block_up}) {
        Move_Block($pname,$form{page},$form{used_block});
        Edit_Page($pname,$form{page});
    } elsif ($form{move_block_down}) {
        Move_Block($pname,$form{page},$form{used_block},'desc');
        Edit_Page($pname,$form{page});
    } elsif ($form{set_visible}) {
        Set_Visible($pname,$form{page},$form{visible});
        Edit_Page($pname,$form{page});
    } elsif ($form{add_news}) {
        Add_News($pname,$form{new_news});
        Edit_Block($pname,'news');
    } elsif ($form{delete_news}) {
        Delete_News($pname,$form{id});
        Edit_Block($pname,'news');
    } elsif ($form{add_changes}) {
        Add_Changes($pname,$form{new_changes});
        Edit_Block($pname,'changes');
    } elsif ($form{delete_changes}) {
        Delete_Changes($pname,$form{id});
        Edit_Block($pname,'changes');
    } elsif ($form{delete_maintainer}) {
        Delete_Maintainer($pname,$form{delete_maintainer});
        Edit_Block($pname,'maintainers');
    } elsif ($form{add_maintainer}) {
        Add_Maintainer($pname,$form{maintainer});
        Edit_Block($pname,'maintainers');
    } elsif ($form{save_block}) {
        Save_Block($pname,$form{block});
        Edit_Block($pname,$form{block});
    } elsif ($form{justify_block}) {
        Justify_Block($pname,$form{block});
        Edit_Block($pname,$form{block});
    } elsif ($form{add_cvs_file}) {
        Add_Cvs_File($pname);
        Edit_Block($pname,'files');
    } elsif ($form{add_uploaded_file}) {
        Add_Uploaded_File($pname);
        Edit_Block($pname,'files');
    } elsif ($form{delete_file}) {
        Delete_File($pname);
        Edit_Block($pname,'files');
    } else {
        Admin_Screen($pname);
    }

    $BODY=$NAVIGATION.Output_Notes.$BODY;
}

sub Display_All_Groups {
    $template->param(page_title=>'projects by category');

    $TITLE='Projects';
    $BODY.="
      <p>We use a few icons to help identify projects:
      <ul>    
      <table cellpadding=2 cellspacing=0 border=0>
      <tr><td><img src=/images/new.gif border=0 align=center></td><td valign=top>Indicates new project, that has been added in the last 30 days.</td></tr>
      <tr><td><img src=/images/done.gif border=0 align=center></td><td valign=top>Indicates project that is ready to use</td></tr>
      <tr><td><img src=/images/wbc.gif border=0 align=center></td><td valign=top>Indicates a WISHBONE Compliant Core</td></tr>
      </table>
      </ul>";

    $BODY.="Click on category to see only its projects<p>";

    my %group=();
    tie (%group,'Tie::IxHash');
    SendSQL("select name,display_name,description from project_category order by display_name");
    while (my @result=FetchSQLData) {
        $group{$result[0]}{display_name}=$result[1];
    }
    my $gcount=scalar(keys %group) /2 ;
    $BODY.="<table width=100%><tr><td valign=top>";

    my $gcount=scalar(keys %group) /2 ;
    my $cnt=0;
    foreach my $category(keys %group) {
        $cnt++;
        $BODY.="<b><a href='$CONFIG{project_url}?category=$category'><font color='#000000'>$group{$category}{display_name}</font></a></b><ul>";
        SendSQL("select name,display_name,created,wbc,stage from project where category='$category' and hidden<1 order by display_name");
        while (my @result=FetchSQLData) {
            my ($done,$wbc,$new);
            if ($result[4] eq 'development4' || $result[4] eq 'development5') {
                $done="<img src=/images/done.gif border=0 align=center>";
            }
            if ($result[3] ==1) {
                $wbc="<img src=/images/wbc.gif border=0 align=center>";
            }
            if ((time-$result[2])<3600*24*30) {
                $new='<img src=/images/new.gif border=0 align=center>';
            }
            if (length($result[1])>44) {
                $result[1]=substr($result[1],0,40).'...';
            }
            $BODY.="<a href='$self_url/$result[0]/'>$result[1]$done$wbc$new</a><br>";
        }
        $BODY.="</ul><p>";

        if ($cnt>$gcount) {
            $BODY.="</td><td valign=top>";
            $gcount=$gcount*3;
        }
    }

    $BODY.="</td></tr></table>";

    $PANEL.=Right_Table('browse_projects');

}


sub Display_Group {
    my %editable=();
    if (LOGGED_IN) {
        SendSQL("select project from project_maintainers where username='$USERNAME'");
        while(my $result=FetchSQLData) {
            $editable{$result}=1;
        }
    }
    SendSQL("select name,display_name,description from project_category where name='$form{category}'");
    my ($group_name,$group_display_name,$group_description)=FetchSQLData;
    $TITLE="Category: $group_display_name";
#    $BODY.="<table width=100%><tr><td>$group_description<p>";
    SendSQL("select name,display_name,short_desc,created,wbc,stage from project where category='$form{category}' and hidden<1 order by display_name");
    while(my @result=FetchSQLData) {
        my $edit_link="";
        if ($editable{$result[0]}==1) {
            $edit_link="<a href='$self_url/$result[0]/admin'><img src='/images/edit.gif' border=0></a>";
        }
        my ($done,$wbc,$new);
        if ($result[5] eq 'development4' || $result[4] eq 'development5') {
            $done="<img src=/images/done.gif border=0 align=center>";
        }
        if ($result[4] ==1) {
            $wbc="<img src=/images/wbc.gif border=0 align=center>";
        } 
        if ((time-$result[3])<30) {
            $new='<img src=/images/new.gif border=0 align=center>';
        }

        $BODY.="<b><a href='$self_url/$result[0]/'>$result[1]$done$wbc$new</a> $edit_link</b><p>$result[2]<p>";
    }
#    $BODY.="</td><td valign=top align=right>".Right_Table('browse_projects')."</td></tr></table>";

    $PANEL.=Right_Table('browse_projects');
    
}

sub Browse_Projects {
    if ($AC_TYPE eq 'admin') {
        my %row=();
        $row{name}='Project queue';
        $row{link}="$self_url?queue=show";
        push(@LINKS,\%row);
    }
#    if ($LOGGED_IN) {
#        my %row=();
#        $row{name}='Start new project';
#        $row{link}="$self_url?request=form";
#        push(@LINKS,\%row);
#    }
    if (exists $form{category}) {
        SendSQL("select count(name) from project_category where name='$form{category}'");
        if (FetchSQLData>0) {
            Display_Group();
        } else {
            Display_All_Groups();
        }
    } else {
        Display_All_Groups();
    }
}

sub Request_Form {
    my %cat=();
    SendSQL("select name,display_name from project_category");
    while (my @result=FetchSQLData) {
        $cat{$result[0]}=$result[1];
    }

    $TITLE='Start new project';


    if (!$LOGGED_IN) {
        $BODY.="You must be logged in to submit new project! Cleck 
          <a href='$CONFIG{account_url}?cmd=login_screen'>here</a> to login or 
          <a href='$CONFIG{account_url}?request=form'>here</a> to get account.";
    } elsif ($AC_TYPE ne 'project' && $AC_TYPE ne 'admin') {
        $BODY.="Your account type is not project maintainer!";
    } else {
        $BODY.=Output_Notes;
        $BODY.="Fill this form to submit new project. If you would like to join an existing one then
        you should contact project maintaners.<p>
        <p>";
        $BODY.="<form action='$self_url' method=post><table><tr><td>";    
        $BODY.="<b>Name</b><br>
        <font size=-1>This will be used to generate a /projects/&lt;name>/ URL for your project.</font>
        <br><input type=query name=name value='$form{name}' maxlength=15 size=40><p>";
        $BODY.="<b>Display name</b><br><input type=query name=display_name value='$form{display_name}' maxlengh=60 size=40><p>";
        $BODY.="<b>Category</b><br><select name=category>";
    
        foreach (keys %cat) {
            my $selected=$_ eq $form{category} ? ' selected ' : '' ; 
            $BODY.="<option $selected value='$_'>$cat{$_}</option>";
        }

        $BODY.="</select><p><b>Short description</b><br>";
        $BODY.="<textarea name=short_desc rows=5 cols=50 wrap=soft>$form{short_desc}</textarea><p>";
        $BODY.="<b>Other info about project</b><br><textarea name=info rows=5 cols=50  wrap=soft>$form{info}</textarea><center>";
        $BODY.="<hr noshade size=1><input type=submit name=request value='Submit'></form></td></tr></table>";
    }
}

sub Submit_Request {
    @NOTE=();
    my $pname=lc($form{name});
    unless ($pname=~m/^[0-9A-Z_-]{3,15}$/i) {
        Note("Invalid project name!");
    }
    unless ($form{display_name}=~m/^[0-9A-Z _-]{4,100}/i) {
        Note("Invalid display name!");
    }
    unless (length($form{short_desc})>10) {
        Note("Short description is too short!");
    }
    SendSQL("select count(name) from project where name='$pname'");
    if (FetchSQLData) {
        Note("Project with name '$pname' already exists!");
    }
    if (scalar(@NOTE)) {
        Request_Form;
        return;
    } else {
        my $mailinglist=lc($form{mailinglist}) eq 'on' ? 1 : 0;
        PrepareSQL("insert into project_queue (name,display_name,short_desc,info,category,mailinglist,username,status) values (?,?,?,?,?,?,?,?)");
        ExecuteSQL($pname,$form{display_name},$form{short_desc},$form{info},$form{category},$mailinglist,$cookie{username},'pending');
        $TITLE="Request project";
        $BODY.="Request was posted to opencores administration team.
          In next 24 hours project will be approved or rejected.
          You will receive an email. Also you can check project status
          on you personal page";
    }
    OC::Mail_Webmaster("Request for project '$pname'. Please check http://www.opencores.org/projects?queue=show");
}

sub Show_Queue {
    $TITLE="Project queue";
    $BODY.=Output_Notes;
    my $cnt=0;
    my @queue=();
    SendSQL("select name,display_name,short_desc,info,category,mailinglist,username,id from project_queue where status='pending'");
    while(my @result=FetchSQLData) {
        push(@queue,\@result);
    }
    if (scalar(@queue)) {
        $BODY.="The following projects are waiting for approval<p>";
        $BODY.="<table width=100%>";

        foreach (@queue) {
            my @result=@{$_};
#            if ($cnt % 2==0) {
                $BODY.="<tr bgcolor=#f0f0f0><td><table width=100%>";
#            } else {
#                $BODY.="<tr bgcolor=#f0c0c0><td><table width=100%>";
#            }

            $BODY.="<tr><td>Name</td><td width=80%>$result[0]</td></tr>
              <tr><td>Display_name</td><td>$result[1]</td></tr>
              <tr><td valign=top>Short desc.</td><td>".${OC::Smart_Reformat(\$result[2])}."</td></tr>
              <tr><td valign=top>Info</td><td>".${OC::Smart_Reformat(\$result[3])}."</td></tr>
              <tr><td>Category</td><td>$result[4]</td></tr>
              <tr><td>Mailinglist</td><td>$result[5]</td></tr>
              <tr><td>Username</td><td>$result[6]</td></tr>
              <tr><td colspan=2><table><tr><td>Action comment<br>
              <form action='$self_url' method=post>
              <textarea name=response cols=40 rows=5 wrap=soft></textarea><br><center>
              <input type=submit name=approve_project value='Approve'>
              <input type=submit name=reject_project value='Reject'>
              <input type=hidden name=project value='$result[7]'></form>
              </td></tr></table></td></tr>";

            $BODY.="</table></td></td>";
            $cnt++;
        }
        $BODY.="</table>";
    } else {
        $BODY.="No projects in queue";
    }
}

sub Approve_Project {
    my $id=$form{project};
    SendSQL("select name from project_queue where id=$id");
    my $pname=FetchSQLData;
    SendSQL("select count(name) from project where id='$pname'");
    if (FetchSQLData>0) {
        Note("Project already exeist!! You will have to reject it!");
        return;
    }
    my $project_folder=$CONFIG{cores_folder}."/".$pname;
    my $cvs_folder="$pname";
    PrepareSQL("update project_queue set status=?, response=? where name='$pname'");
    ExecuteSQL("approved",$form{response});
    SendSQL("select display_name,short_desc,category,username from project_queue where name='$pname'");
    my @result=FetchSQLData;
    PrepareSQL("insert into project (name,display_name,short_desc,category,created,folder,cvs_folder,stage,mailing_list) values (?,?,?,?,?,?,?,?,?)");
    ExecuteSQL($pname,$result[0],$result[1],$result[2],time,$project_folder,$cvs_folder,'development1',$CONFIG{default_mailinglist});

    SendSQL("insert into project_pages (project,page,visible) values ('$pname','Overview',1)");
    SendSQL("insert into project_pages (project,page,visible) values ('$pname','Wishlist',1)");

    PrepareSQL("insert into project_blocks (project,block,title,deletable) values (?,?,?,?)");
    ExecuteSQL($pname,'description','Description',1);
    ExecuteSQL($pname,'maintainers','Maintainers',0);
    ExecuteSQL($pname,'changes','Changes',0);
    ExecuteSQL($pname,'news','News',0);
    ExecuteSQL($pname,'files','Files',0);
    ExecuteSQL($pname,'comments','Comments',0);
    ExecuteSQL($pname,'details','Details',0);
    ExecuteSQL($pname,'wishlist','Wishlist',0);
    PrepareSQL("insert into project_blocks (project,block,title,body,deletable) values (?,?,?,?,?)");
    ExecuteSQL($pname,'features','Features',"- feature1\n- feature2\n",1);
    ExecuteSQL($pname,'status','Status',"- ...\n- ...\n",1);

    PrepareSQL("insert into project_page_block (project,page,block) values (?,?,?)");
    ExecuteSQL($pname,'Overview','details');
    ExecuteSQL($pname,'Overview','description');
    ExecuteSQL($pname,'Overview','features');
    ExecuteSQL($pname,'Overview','status');
    ExecuteSQL($pname,'Overview','news');
    ExecuteSQL($pname,'Overview','maintainers');
    ExecuteSQL($pname,'Wishlist','wishlist');

    my $time=time;
    SendSQL("insert into project_maintainers (project,username,added) values ('$pname','$result[3]',$time)");
    SendSQL("insert into project_news (project,news,added) values ('$pname','Project started',$time)");

    mkdir($project_folder,'493');
    if (open(FILE,$CONFIG{account_config_file})) {
        my $body='';
        while(my $line=<FILE>) {
            my ($un,$pw,$group,$folders,$skin)=split(/:/,$line);
            if ($un eq $result[3]) {
                my @folders=split(/;/,$folders);
                push(@folders,$project_folder);
                $folders=join(';',@folders);
                $line=join(':',$un,$pw,$group,$folders,$skin);
            } 
            $body.=$line;
        }
        close(FILE);
        open(FILE,">$CONFIG{account_config_file}");
        print FILE $body;
        close(FILE);
    } else {
        Note("Cannot open account config file: ".$CONFIG{account_config_file});
    }
}

sub Reject_Project {
    my $pname=$form{project};
    PrepareSQL("update project_queue set status=?, response=? where id=?");
    ExecuteSQL('rejected',$form{response},$pname);
}

sub Add_Comment_Screen {
    my ($pname)=@_;
    Tmpl_Links($pname);
    SendSQL("select email from account where username='$cookie{username}'");
    my $email=FetchSQLData;
    $TITLE="Add comment";
        $BODY.="Project: $pname<p>";
    unless ($CAN_EDIT && $AC_TYPE ne 'admin') {
        $BODY.="<table><form action='$self_url/$pname' method=post>
        <tr><td>Email <input type=query name=email value='$email'><br>
        <textarea name=comment cols=50 rows=10 wrap=soft></textarea>
        <center><hr noshade size=1>
        <input type=submit value='Add comment'>
        <input type=hidden name=cmd value='add_comment'>
        <input type=hidden name=page value='$form{page}'>
        </td></tr></table>";
    } else {
        $BODY.="You cannot add comment to your own project!";
    }
}

sub Add_Comment {
    my ($pname)=@_;
    PrepareSQL("insert into project_comments (project,added,email,comment) values(?,?,?,?)");
    ExecuteSQL($pname,time,$form{email},$form{comment});
}

sub Output {
    $template->param(
        links=>\@LINKS,
        title=>$TITLE,
        body=>$BODY,
#        panel=>$PANEL,
        no_panel=>1,
    );
    print $template->output;
}


# command line part

sub First_Page_Last_Updated {
    my $body="";
    SendSQL("select name,display_name,modified from project where hidden<1 order by modified desc limit 10");
    while (my @result=FetchSQLData) {
        my $date=OC::Time_To_Str($result[2],'nice');
        my $link=$CONFIG{project_url}."/$result[0]";
        my $name=$result[1];
        $body.=OC::Li("<a href='$link'>$name</a>");
    }
    print $body;
}



# Wishlist part

my @WLNOTES=();

sub WLNote {
    my %note=();
    $note{note}=$_[0];
    push(@WLNOTES,\%note);
}

sub Tmpl_Wishlist_Update {
    `lynx -source http://www.opencores.org/$CONFIG{wishlist_url}`;
}

sub Tmpl_Wishlist_Result {
    my ($msg,$params,$pname,$page)=@_;
    my %param=();
    if (defined $params) {
        %param=%{$params};
    }
    print header(-type  =>  'text/html',-charset=>'') if ($param{no_header} eq '');
    my $template=HTML::Template->new(
        filename=>$CONFIG{shtml_wishlist_result_file},
        die_on_bad_params=>0,
        loop_context_vars=>1,
        global_vars=>0,
        shared_cache=>0,
    );
    $msg.="<p><a href=$self_url/$pname/$page>Back to wishlist</a>";
    $template->param(result=>$msg,project=>$pname);
    $BODY.=$template->output;
    Output;
    exit;
}

sub Tmpl_Wishlist {
    my ($pname,$page)=@_;
    $BODY.="<b><font size=+1>Wishlist/Todolist</font></b><p>";
    if ($form{block} eq 'wishlist') {
        if ($form{cmd} eq 'add') {
            Tmpl_Wishlist_Add($pname,$page);
            return;
        }
        if ($form{cmd} eq 'edit') {
            Tmpl_Wishlist_Edit($pname,$page);
            return;
        }
        if ($form{cmd} eq 'work') {
            Tmpl_Wishlist_Assign($pname,$page);
            return;
        }
        if ($form{cmd} eq 'rate') {
            Tmpl_Wishlist_Rate($pname,$page);
            return;
        }
    }

    my $project=$pname;
    my @list=();
    my %fullname=();
    SendSQL("select username, fullname from account");
    while (my @row=FetchSQLData()) {
        $row[1]=$row[0] if ($row[1] eq '');
        $fullname{$row[0]}=$row[1];
    }

    my %display_name=();
 	SendSQL("select name,display_name from project");
	while(my @result=FetchSQLData()) {
	$display_name{$result[0]}=$result[1];
    }

    SendSQL("select id,author,email,type,status,title,body,links,date,project,
	  assigned_to,rated1,rated2,rated3,rated4,rated5,comment from wishlist where project='$pname' order by date desc");

    while (my @result=FetchSQLData()) {

        my %entry=();
        ($entry{id},$entry{author},$entry{email},$entry{type},$entry{status},$entry{title},$entry{body},
          $entry{links},$entry{date},$entry{project},$entry{assigned_to},$entry{rated1},$entry{rated2},
          $entry{rated3},$entry{rated4},$entry{rated5},$entry{comment})=@result;

        $entry{date}=OC::Time_To_Str($entry{date},'nice');

        my $link=OC::Store_Email($entry{email});
        $link=$CONFIG{post_url}."?to=$link";
        $entry{email}=$link;

        foreach (1..5) {
            $entry{"rated$_"}=0 unless (defined $entry{"rated$_"});
        }
        $entry{rating}=OC::Average($entry{rated1},$entry{rated2},$entry{rated3},$entry{rated4},$entry{rated5});

        my @tmpl_links=();
        my @links=split(/\n/,$entry{links});
        foreach (@links) {
            my %link=();
            ($link{url},$link{desc})=split(/ /,$_,2);
            unless ($link{url}=~m!^http://!) {
                $link{url}="http://$link{url}";
            }
            $link{desc}=$link{url} if ($link{desc} eq '');
            push(@tmpl_links,\%link);
        }
        my %assigned_to=();
        foreach (split(/ +/,$entry{assigned_to})) {
            $assigned_to{$_}=$fullname{$_};
        }
        my @assigned_to=();
        foreach (keys %assigned_to) {
            my %item=();
            $item{link}="$CONFIG{account_url}/$_";
            $item{fullname}="$assigned_to{$_}";
            push(@assigned_to,\%item);
        }
	if ($entry{project} ne '') {
	    $entry{project_link}="$CONFIG{project_url}/$entry{project}";
            $entry{project_display_name}=$display_name{$entry{project}};
	}
        $entry{assigned_to}=\@assigned_to;
        $entry{links}=\@tmpl_links;
        $entry{add_link}="$self_url/$pname/$page?block=wishlist&cmd=work&subcmd=add&id=$entry{id}";
        $entry{remove_link}="$self_url/$pname/$page?block=wishlist&cmd=work&subcmd=remove&id=$entry{id}";
        $entry{edit_link}="$self_url/$pname/$page?block=wishlist&cmd=edit&id=$entry{id}";
        $entry{self_url}="$self_url/$pname/$page";
        $entry{vote_count}=$entry{rated1}+$entry{rated2}+$entry{rated3}+$entry{rated4}+$entry{rated5};
        $entry{color1}=$OC::CONFIG{color}{bg0};
        $entry{color2}=$OC::CONFIG{color}{bg2};
        $entry{block}='wishlist';
        push(@list,\%entry);
    }

#    my $add_link="$CONFIG{wishlist_url}?cmd=add";
    my $add_link="$self_url/$pname/$page?block=wishlist&cmd=add";

    my $template=HTML::Template->new(
        filename=>$CONFIG{shtml_wishlist_list_file},
        die_on_bad_params=>0,
        loop_context_vars=>1,
        global_vars=>0,
        shared_cache=>0,
    );
    $template->param(
        project=>$project,
        add_link=>$add_link,
        list=>\@list,
        self_url=>"$self_url/$pname/$page",
        wishlist_list_url=>$CONFIG{wishlist_list_url},
    );
    $BODY.=$template->output();
}


sub Tmpl_Wishlist_Add {
    my ($pname,$page)=@_;

    my $project=$pname;

    my ($display_name,$name);
    if ($project ne '') {
        SendSQL("select display_name,name from project where name='$project'");
        ($display_name,$name)=FetchSQLData();
        $display_name=$name if ($display_name eq '');
        if ($name eq '') {
            WLNote("Project doesn't exist: $project");
        }
    }

    my $template=HTML::Template->new(
        filename=>$CONFIG{shtml_wishlist_add_file},
        die_on_bad_params=>0,
        loop_context_vars=>1,
        global_vars=>0,
        shared_cache=>0,
    );

    if ($form{save} ne '') {
        my $error=0;
        foreach ('author','email','type','title','body') {
            if ($form{$_} eq '') {
                $error=1;
                $template->param("error_$_"=>1);
            }
        }
        unless ($form{email}=~m/^.+\@.+\..+/) {
            $error=1;
            $template->param(error_email=>1);
        }
        my $assigned_to="";
        if ($form{type} eq 'proposal' || $form{type} eq 'reminder') {
            if ($cookie{username} ne '') {
                $assigned_to=$cookie{username};
            } else {
                $error=1;
                $template->param("error_type_no_username"=>1);
            }
        }
        unless ($error) {
            PrepareSQL("insert into wishlist (author,email,type,title,body,links,date,project,assigned_to) 
              values (?,?,?,?,?,?,?,?,?)");
            ExecuteSQL($form{author},$form{email},$form{type},$form{title},$form{body},
              $form{links},time,$project,$assigned_to);
            Tmpl_Wishlist_Result("<font color=black>Entry successfuly added!</font>",undef,$pname,$page);
        }
    }

    foreach (keys %form) {
        $template->param($_=>$form{$_});
    }

    $template->param(
        notes=>\@WLNOTES,
        project=>$project,
        block=>'wishlist',
        project_display_name=>$display_name,
        list_all_link=>"$self_url/$pname/$page",
        self_url=>"$self_url/$pname/$page",
    );
    print header(-type  =>  'text/html',-charset=>'');
    $BODY.=$template->output;
    Tmpl_Wishlist_Update;
}

sub Tmpl_Wishlist_Edit {
    my ($pname,$page)=@_;
    @WLNOTES=();
    my $id=$form{id};
    unless (OC::Login($cookie{username},$cookie{password})) {
        Tmpl_Wishlist_Result("You must log in first!",undef,$pname,$page);
    }
    unless ($form{id}=~m!^\d+$!) {
        Tmpl_Wishlist_Result("Invalid id: $form{id}",undef,$pname,$page);
    }

    my %display_name=();
    SendSQL("select project.name,project.display_name from project,project_maintainers 
      where project.name=project_maintainers.project and  project_maintainers.username='$cookie{username}'");
    while (my @result=FetchSQLData()) {
        $display_name{$result[0]}=$result[1];
    }

    SendSQL("select id,author,email,type,title,body,links,date,project,assigned_to,comment 
      from wishlist where id=$id");
    ($id, my($author,$email,$type,$title,$body,$links,$date,$project,$assigned_to,$comment))=FetchSQLData;

    my @assigned_to=split(/ +/,$assigned_to);
    my $found=0;
    foreach (@assigned_to) {
        if ($_ eq $cookie{username}) {
            $found++;
        }
    }
    unless ($found) {
        Tmpl_Wishlist_Result("Only developers working on this $type can edit it.",undef,$pname,$page);
    }

    unless ($id=~m!^\d+$!) {
        Tmpl_Wishlist_Result("Invalid id: $form{id}",undef,$pname,$page);
    }

    if ($form{subcmd} eq 'comment') {
        PrepareSQL("update wishlist set comment=? where id=?");
        ExecuteSQL($form{comment},$form{id});
        WLNote("<font color=green>Comment updated successfully.</font>");
    } elsif ($form{subcmd} eq 'unlink') {
        SendSQL("update wishlist set project='' where id=$id");
        WLNote("<font color=green>Entry unlinked successfully.</font>");
    } elsif ($form{subcmd} eq 'link') {
        if (exists $display_name{$form{project}}) {
            SendSQL("update wishlist set project='$form{project}' where id=$id");
            WLNote("<font color=green>Entry linked successfully.</font>");
        } else {
            WLNote("Error: you are not maintainer of project: $form{project}");
        }
    }
    
    SendSQL("select id,author,email,type,title,body,links,date,project,assigned_to,comment from wishlist where id=$id");
    ($id,$author,$email,$type,$title,$body,$links,$date,$project,$assigned_to,$comment)=FetchSQLData;

    my $template=HTML::Template->new(
        filename=>$CONFIG{shtml_wishlist_edit_file},
        die_on_bad_params=>0,
        loop_context_vars=>1,
        global_vars=>0,
        shared_cache=>0,
    );

    my @projects=();
    foreach my $key (keys %display_name) {
        my %row=();
        $row{project}=$key;
        $row{project_display_name}=$display_name{$key};
        push(@projects,\%row);
    }

    my $project_link="$self_url/$pname/$page";
    my $unlink_link="$self_url/$pname/$page?block=wishlist&cmd=edit&subcmd=unlink&id=$id";

    $comment=~s!<!&lt;!si;

    $template->param(
        block=>'wishlist',
        projects=>\@projects,
        notes=>\@WLNOTES,
        page_title=>0,
        title=>$title,
        body=>$body,
        type=>$type,
        project=>$project,
        project_link=>$project_link,
        unlink_link=>$unlink_link,
        project_display_name=>$display_name{$project},
        comment=>$comment,
        id=>$id,
        list_all_link=>"$self_url/$pname/$page",
        self_url=>"$self_url/$pname/$page",
    );
    $BODY.=$template->output;
}


sub Tmpl_Wishlist_Assign {
    my ($pname,$page)=@_;
    unless (OC::Login($cookie{username},$cookie{password})) {
        Tmpl_Wishlist_Result("You must log in first!",undef,$pname,$page);
    }
    SendSQL("select project,assigned_to,type from wishlist where id=$form{id}");
    my ($project,$assigned_to,$type)=(undef,undef,undef);
    unless (($project,$assigned_to,$type)=FetchSQLData()) {
        Tmpl_Wishlist_Result("Invalid task id: $form{id}",undef,$pname,$page);
    }
    if ($project ne '') {
        SendSQL("select count(username) from project_maintainers 
          where project='$project' and username='$cookie{username}'");
        unless (FetchSQLData>0) {
            Tmpl_Wishlist_Result("Only project's maintainers can work on this $type!",undef,$pname,$page);
        }
    }
    my %assigned_to=();
    foreach (split(/ +/,$assigned_to)) {
        $assigned_to{$_}=1;
        if ($_ eq $cookie{username} && $form{subcmd} eq 'add') {
            Tmpl_Wishlist_Result("You are already assigned to work on this $type.",undef,$pname,$page);
        }
    }
    my @assigned_to=();
    foreach (keys %assigned_to) {
        unless ($form{subcmd} eq 'remove' && $_ eq $cookie{username}) {
            push(@assigned_to,$_);
        }
    }
    if ($form{subcmd} eq 'add') {
        push(@assigned_to,$cookie{username});        
    }
    $assigned_to=join(' ',@assigned_to);
    SendSQL("update wishlist set assigned_to='$assigned_to' where id=$form{id}");
    Tmpl_Wishlist_Update;
    if ($form{subcmd} eq 'add') {
        Tmpl_Wishlist_Result("You have been successfully added to the list.",undef,$pname,$page);
    } elsif ($form{subcmd} eq 'remove') {
        Tmpl_Wishlist_Result("You have been successfully removed from the list.",undef,$pname,$page);
    }
}


sub Tmpl_Wishlist_Rate {
    my ($pname,$page)=@_;
    unless ($form{value}=~m/^[12345]{1,1}$/) {
        Tmpl_Wishlist_Result("Invalid rate value: $form{value}",undef,$pname,$page);
    }
    my ($result,$type);
    SendSQL("select id,type from wishlist where id=$form{id}");
    unless (($result,$type)=FetchSQLData) {
        Tmpl_Wishlist_Result("Invalid $type id: $form{id}",undef,$pname,$page);
    }
    SendSQL("select rated$form{value} from wishlist where id=$form{id}");
    my $result;

    if ($cookie{"wishlist_$form{id}"} ne '') {
        Tmpl_Wishlist_Result("You already reted this $type",undef,$pname,$page);
    }
    $result++;
    SendSQL("update wishlist set rated$form{value}=$result where id=$form{id}");
    my $cookie=cookie(
        -name=>"wishlist_$form{id}",
        -value=>"yes",
    );
    print header(
        -type  =>  'text/html',
        -charset=>'',
        -cookie=>[$cookie],
    );
    my %param=();
    $param{no_header}=1;
    Tmpl_Wishlist_Update;
    Tmpl_Wishlist_Result("Thanks for rating this $type.",\%param,$pname,$page);
}


sub Main {
    Initialize;
    ConnectToDatabase();
    my ($junk,$pname,$cmd,@path)=split(/\//,$ENV{PATH_INFO});
    if ($ARGV[0] eq '-lu') {
        First_Page_Last_Updated;
        exit;
    }
    if (!($ENV{PATH_INFO}=~m!/$!) && $pname ne '' && $cmd eq '') {
        redirect("$ENV{SCRIPT_NAME}$ENV{PATH_INFO}/");
    }
    SendSQL("select name,display_name from project_category order by display_name");
    while (my @result=FetchSQLData) {
        $CATEGORY{$result[0]}{display_name}=$result[1];
        $CATEGORY{$result[0]}{description}=$result[2];
    }
    my ($crypted_pass,$type)=OC::Login($cookie{username},$cookie{password});
    $AC_TYPE=$type;
    if ($crypted_pass) {
        $LOGGED_IN=1;
        $USERNAME=$cookie{username};
    }
    Prepare_Template($CONFIG{tmpl_project_file});
    SendSQL("select count(name) from project where name='$pname'");
    if (FetchSQLData()<1) {
        if ($form{request} eq 'form') {
            Request_Form;
        } elsif(lc($form{request}) eq 'submit') {
            Submit_Request;
        } elsif($form{queue} eq 'show' && $AC_TYPE eq 'admin') {
            Show_Queue;
        } elsif($form{approve_project} && $AC_TYPE eq 'admin') {
            Approve_Project;
            Show_Queue;
        } elsif($form{reject_project} && $AC_TYPE eq 'admin') {
            Reject_Project;
            Show_Queue;
        } elsif ($form{cmd} eq 'add_comment_screen') {
            Add_Comment();
        }  else {
            Browse_Projects;
        }
    } else {
        if ($LOGGED_IN) {
            SendSQL("select count(project) from project_maintainers where project='$pname' and username='$USERNAME'");
            if (FetchSQLData>0 || $type eq 'admin') {
                $CAN_EDIT=1;
            }
        }
        if ($form{cmd} eq 'add_comment_screen') {
            Add_Comment_Screen($pname);
        } elsif ($form{cmd} eq 'add_comment') {
            Add_Comment($pname);
            Display_Project($pname);
        } elsif ($cmd ne 'admin') {
            $form{page}=join('/',($cmd,@path));
            Display_Project($pname);
        } else {
            if ($cmd eq 'admin' && $CAN_EDIT) {
                Admin($pname);
            } else {
                Display_Project($pname);
            }
        }

    }
    unless ($form{block} eq 'wishlist' && $form{cmd} eq 'rate') {
        print header(-type  =>  'text/html',-charset=>'');
    }
    Output;
}


Main;
