#!/usr/bin/perl -Tw

# $Id: contacts,v 1.20 1999/11/07 14:12:32 root Exp root $

# Copyright (c) Mark Summerfield 1999. All Rights Reserved.
# May be used/distributed under the GPL.

# WARNING - this program is provided as an example of QuickForm and QuickData
# use and not as an example of production quality CGI code - it may not be
# secure. 

# TODO Proper validation - field & record

# The table this example is based on was created thus:
#
#    CREATE TABLE contacts (
#         ID        char( 12)
#        ,FORENAME  char( 50)
#        ,SURNAME   char( 50)
#        ,HOMETEL   char( 20)
#        ,WORKTEL   char( 20)
#        ,MOBILE    char( 20)
#        ,FAX       char( 20)
#        ,EMAIL     char( 60)
#        ,HOMEPAGE  char( 60)
#        ,ADDRESS   char(200)
#        ,POSTCODE  char( 10)
#        ,BIRTHDAY  char( 20)
#        ,NOTES     char(200)
#        )


use strict ;

use CGI qw( :standard :html3 ) ;
use CGI::QuickData ;

use vars qw( $VERSION ) ;
$VERSION     = '1.01' ;

# The connect string must be in code, not passed via 'hidden' fields since it
# could contain username/password.
$DB_HANDLE = DBI->connect( "DBI:XBase:/root/web/db/contacts" ) or die $DBI::errstr ;

show_data(
#    -SHOW_SQL           => 1,
    -HEADER             => header . 
                           start_html( 
                                '-title' => 'Contacts',
                                -BGCOLOR => '#FFCAFF',
                                ) .
                           h3( 'Contacts - <:ACTION:>' ),
    -FOOTER             => hr . end_html,
    -INITIAL_ACTION     => 'list',
    -TITLE              => 'Contacts',
    -TABLE              => 'contacts',
    -KEYFIELD           => 'ID',
    -INITIAL_ORDERBY    => 'ID',
    -SIZE               => 25,
    -MAXLEN             => 50,
    -ROWS               =>  3,
    -COLUMNS            => 50,
    -FIELDS             => [ 
            {
                -DB_NAME   => 'ID',
                -DB_QUOTE  => 1,       # 0 for numeric fields
                -DB_HTML   => 'tt',    # e.g. bold, italic, h1, tt, etc.
                -DB_ALIGN  => 'RIGHT', # LEFT (default), CENTER, RIGHT
                -DB_VALIGN => undef,   # BOTTOM, CENTER, TOP 
                -DB_PREFIX => undef,   # e.g. &#163; or $ etc.
                -LABEL     => 'ID',
                -REQUIRED  => 1,
                -maxlen    => 12,
            },
            {
                -DB_NAME   => 'FORENAME',
                -DB_HTML   => undef,
                -LABEL     => 'Forename',
                -REQUIRED  => 1,
            },
            {
                -DB_NAME   => 'SURNAME',
                -DB_HTML   => 'b',
                -LABEL     => 'Surname',
                -REQUIRED  => 1,
            },
            {
                -DB_NAME   => 'HOMETEL',
                -DB_HTML   => undef,
                -LABEL     => 'Home Tel.',
                -VALIDATE  => \&valid_phone,
                -size      => 20,
                -maxlen    => 20,
            },
            {
                -DB_NAME   => 'WORKTEL',
                -DB_HTML   => undef,
                -LABEL     => 'Work Tel.',
                -VALIDATE  => \&valid_phone,
                -size      => 20,
                -maxlen    => 20,
            },
            {
                -DB_NAME   => 'MOBILE',
                -DB_HTML   => undef,
                -LABEL     => 'Mobile',
                -VALIDATE  => \&valid_phone,
                -size      => 20,
                -maxlen    => 20,
            },
            {
                -DB_NAME   => 'FAX',
                -DB_HTML   => undef,
                -LABEL     => 'Fax',
                -VALIDATE  => \&valid_phone,
                -size      => 20,
                -maxlen    => 20,
            },
            {
                -DB_NAME   => 'EMAIL',
                -DB_HTML   => 'mailto',
                -DB_ALIGN  => 'CENTER',
                -LABEL     => 'Email',
                -VALIDATE  =>
                    sub { 
                        local $_ = shift ; 
                        # This is not a real email validation routine. 
                        ( ( ( $_ eq '' ) or ( /^[^@]+@[^@]+\.\w+$/o ) ), 
                        "<I>Should be like <TT>name\@site.com</TT></I>" ) ;
                    },
                -size      => 50,
                -maxlen    => 60,
            },
            {
                -DB_NAME   => 'HOMEPAGE',
                -DB_HTML   => 'url',
                -DB_ALIGN  => 'CENTER',
                -LABEL     => 'Home page',
                -VALIDATE  =>
                    sub { 
                        local $_ = shift ; 
                        # This is not a real web address validation routine. 
                        ( ( ( $_ eq '' ) or ( /.+\..+/o ) ),
                        "<I>Should be like <TT>www.site.com</TT></I>" ) ;
                    },
                -size      => 50,
                -maxlen    => 60,
            },
            {
                -DB_NAME   => 'ADDRESS',
                -DB_HTML   => undef,
                -LABEL     => 'Address',
                -TYPE      => 'textarea',
            },
            {
                -DB_NAME   => 'POSTCODE',
                -DB_HTML   => undef,
                -LABEL     => 'Postcode',
                -size      => 10,
                -maxlen    => 10,
            },
            {
                -DB_NAME   => 'BIRTHDAY',
                -DB_HTML   => undef,
                -DB_ALIGN  => 'RIGHT',
                -LABEL     => 'Birthday',
                -size      => 20,
                -maxlen    => 20,
            },
            {
                -DB_NAME   => 'NOTES',
                -DB_HTML   => undef,
                -LABEL     => 'Notes',
                -TYPE      => 'textarea',
            },
        ], 
) ;


sub valid_phone { 
    local $_ = shift ; 

    # This is not a real phone no. validation routine. 
    ( ( ( $_ eq '' ) or ( /^[-+() \d]*$/o ) ? 1 : 0 ), 
      "<I>Only digits, `(', `)', `+' and `-' allowed.</I>" ) ;
}

