CGI Calendar by Jay Eckles - www.jayeckles.com

Copyright 2004 Jay Eckles. Version 2.5 - updated from version 2.4 February 16, 2004 software available for download from http://www.jayeckles.com/calendar/cgicalendar.html

Contents


Setting up CGI Calendar to run on your server

(please read all instructions before beginning your installation):

Note that there have been some improvements made around the way you install CGI Calendar as of version 2.5. Please read these instructions if you're used to previous versions!

IF YOU ARE UPGRADING FROM A PREVIOUS VERSION OF CGI CALENDAR, MAKE A BACKUP OF YOUR DATABASE FILES!!! calendar.db is the default database file. YOU WILL HAVE TO RUN AN UPGRADE SCRIPT ON YOUR BACKED-UP DATABASE BEFORE IT CAN BE USED WITH CGI CALENDAR 2.5. See step 6 below.

Setting up CGI Calendar is not that hard, but you can't be afraid to open a Perl script in a text editor to change the value of a few variables. Don't worry...I'll walk you through it.

  1. In each perl file, that is calendar.pm, dnfunc.pm, jcgi.pm, jconfig.pm, index.cgi, viewday.cgi, editevent.cgi, and addevent.cgi, change the first line to indicate the correct path to perl version 5.00x on your server. The most common location is /usr/bin/perl, and this is how the line currently reads in all the files. If this is where perl is on your server, you need not change the lines. If, however, perl is at a different location,
    /usr/bin/perl5.004
    for example, change the lines to look exactly like this:
    #!/usr/bin/perl5.004
    The same idea applies to all systems. If you're on Windows and perl is at
    C:\Perl\Perl.exe,
    then the line would read
    #!C:\\Perl\\Perl.exe (note the double \'s)
    or an example on a Macintosh (Classic OS) might be
    #!Macintosh HD:Perl Folder:Perl
    So, in general, the first line of each perl file must look like this:
    #!(path to perl)
  2. If your server is configured like mine, you can't server up images or stylesheets from the cgi-bin directory. That means you'll have to move add.gif, delete.gif, edit.gif, and calendar.css to some other location on your web server (anywhere you have HTML web pages saved should suffice).
  3. In jconfig.pm, you'll need to set the values of some variables to match your server. Among the configuration values are the name of your server, the URLs for add.gif, delete.gif, edit.gif, and calendar.css. Read the comments in jconfig.pm for instructions on how to do that.
  4. Make sure that you have the correct permissions set on all the files, specifically
  5. Modify top.html and bot.html to make the calendar look like the page on your site. You will want the calendar to look like the pages on your website.
  6. If you are upgrading and would like to keep your old calendar entries: replace the delivered calendar.db with your backup. From the command line, while in the calendar2 directory, run the database upgrade script. To do this, type the following command: 24to25.pl calendar.db If you have any other databases besides calendar.db, you should upgrade those in the same way. This is necessary because a field (location) was added to the database. If you don't upgrade your databases, you'll have trouble when you try to add a location to an event on a day that already has events scheduled.
  7. (optional) CGI Calendar now uses a Cascading Style Sheet to determine the colors used, the font faces used, and the size of the calendar date cells. This style sheet is called calendar.css. You moved it to some location on your web server in step 2. Feel free to modify the style sheet to make the calendar look more like your website.
  8. (optional) If you would like to prevent random people from adding and deleting events from your calendar, then you need to use your web server's built in authentication procedures. For most of us, that means using HTTP Basic Authentication. This is most often implemented by using a .htaccess file that limits access to the addevent directory to valid users found in a password file. For more information on setting this up, please consult your system administrator.
  9. (optional) If you would like to maintain multiple calendars without installing multiple copies of the software, there is now a way to do it. You'll need to make a database file for each calendar you want to maintain. To do this, just copy empty.db that is included with the software and rename the copy whatever you want. Then, to use the calendar related to that file, access the software with a URL like
    http://yourserver/path/to/index.cgi?db=filename
    Where filename is one of the copies of empty.db. If you don't tack on the ?db=filename to the end of the URL, it will use whatever you specified in jconfig.pm by default.

That's it! You've set up CGI Calendar to run on your server!

If it doesn't work:


Change History

Changes in Version 2.5 from Version 2.4

Changes in Version 2.4 from Version 2.3

Changes in Version 2.3 from Version 2.2

Changes in Version 2.2 from Version 2.1

Change in Version 2.1 from Version 2.0

Changes in Version 2.0 from Version 1.5

Changes in Version 1.5 from Version 1.0

Thanks to the people in comp.infosystems.www.authoring.cgi for pointing out the bugs and suggesting new features to add.


About the Software

CGI Calendar is, as the name implies, a CGI program (or a group of scripts, rather) with the purpose of creating a monthly calendar in the form of an html table. This calendar includes events complete with summary and time by drawing from a calendar database. Events are added to and deleted from the calendar databse (and thus to and from the calendar) by means of one of the scripts in the package, addevent.cgi (using dnfunc.pm). The algorithm used to create the calendar itself (determining the day of week on which a month starts in a particular year and how many days are in the year) makes the calendar good for more years than you'll ever want to use it. It goes as far back as A.D. 1 I think and indefinitely into the future. The software is written to run on the UNIX platform (and I'm sure it'll do fine on any other flavor of UNIX including LINUX since it's a standard Perl script). It may or may not run on other platforms, but there's a real good chance it will work if the platform can run an http server and the Perl interpreter.

This software is distributed under the GNU General Public Licence. A copy of this licence can be found at the Free Software Foundation's GNU Project website, http://www.gnu.org, and a copy is attached to the end of this file. All that I ask from people who modify the code is that they make sure that they send me a copy of any code they change so that I can see what they've done/come up with in order that I may incorporate good modifications into my version. Also, if you know others who would like to use or work with CGI Calendar, please have them come to the www.jayeckles.com server to pick up a copy, don't give them a copy of yours. This will ensure that they have the most up-to-date version, that it is the one designed to be configured for different servers easily, and that I know how many people are using it.

That being said, here's a little info on the files that comprise the software:

CGI Calendar is a collection of Perl scripts, modules, and html files, all of which I created from scratch. The only exception to this is that I based the calendar.pm module in part on a calendar program written by an old computer science professor of mine, Brian Stuart. I decided to create my own jcgi.pm module because I wanted to know exactly how it worked, I wanted to keep it small by including only features that I need, and I wanted it to be as easy to use as possible. The dnfunc.pm module is a small Perl DBMS (database management system) designed to be used as the back end to CGI programs. It contains functions to open, select from, and add to a pipe ( | ) delimited flat file database. Again, this module was built to be small, minimally functional, and very easy to use. It is entirely self-sufficient and can be used with other CGI's besides CGI Calendar.

Index.cgi is the bread-and-butter script in this package. It's the one that actually creates the table and uses the dnfunc functions to get information from the calendar database (calendar.db). It also reads to files, top.html and bot.html. The contents of these two files contain html that should go above the calendar table code and the html that should go below the calendar table code. Minimally, top.html should include the following:

        <html>
        <head>
	<link rel="stylesheet" type="text/css" href="/calendar.css">
        <title>(whatever you want here)</title>
        </head>
        <body>
Likewise, bot.html should minimally include the following:
        </body>
        </html>
However, as you can see by the top.html and bot.html examples given, you can make them much more complex for a design more fitting to your individual website. All you need to remember is that the table that is the calendar goes in between the code from these two files.

Addevent.cgi is the second most important script in the package after index.cgi. This is the script that allows users to add events to the calendar by using the dnfunc functions to add stuff to the databse. Month, date, year, and summary are required by this script for the purpose of adding events, but all the rest of the information from the form generated by addevent.cgi in gen mode (when you click on the add an event link from a day-view page) is optional. Please note that the same top.html and bot.html files used to style the calendar are used to style the addevent form. I recommend using .htaccess or some other method to protect the addevent directory. That way you won't have every yahoo that comes along adding crap to your calendar. Events can be deleted from the calendar using addevent.cgi by clicking on the "delete event" link on the page with the event info.

Editevent.cgi is a script very similar to Addevent.cgi. It allows users to edit events. It is protected by the same HTTP Basic authentication as Addevent.cgi.

Viewday.cgi is a script used to view all of the information on one or all of the events on a given day. It has two modes, one and all. In one mode, it displays all the information for just the event indicated. In all mode, it displays the information for all events on the date specified. It also provides the links to add, edit, and delete an event.


Contact Info

My email address is j.eckles@computer.org. Please let me know of any problems you have with CGI Calendar. People finding problems and reporting them is one of only two ways that the software will ever improve. The other way it will improve is if people play around with the code. If you know Perl, I encourage you to do so, just make sure that you make available to me a copy of your new modified code so that I can incorporate it into future versions and give you proper credit. If you decide to release a modification or derivative of CGI Calendar, make sure you state me as the author and you as the "modifier" or "improver" or something like that. Also, the only licence under which you should ever distribute this code or anything derived from it is the GNU GPL (see end of this file).

About Jay

I am a professional software engineer working for the Vanguard Group on internal Java web applications. On the side in my free time I provide technical advice and custom development services to a select number of clients. My website is located at http://www.jayeckles.com.


GNU GENERAL PUBLIC LICENSE


Version 2, June 1991 

Copyright (C) 1989, 1991 Free Software Foundation, Inc.  
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and 
change it. By contrast, the GNU General Public License is intended to guarantee your 
freedom to share and change free software--to make sure the software is free for all 
its users. This General Public License applies to most of the Free Software 
Foundation's software and to any other program whose authors commit to using it. (Some 
other Free Software Foundation software is covered by the GNU Library General Public 
License instead.) You can apply it to your programs, too. 

When we speak of free software, we are referring to freedom, not price. Our General 
Public Licenses are designed to make sure that you have the freedom to distribute 
copies of free software (and charge for this service if you wish), that you receive 
source code or can get it if you want it, that you can change the software or use 
pieces of it in new free programs; and that you know you can do these things. 

To protect your rights, we need to make restrictions that forbid anyone to deny you 
these rights or to ask you to surrender the rights. These restrictions translate to 
certain responsibilities for you if you distribute copies of the software, or if you 
modify it. 

For example, if you distribute copies of such a program, whether gratis or for a fee, 
you must give the recipients all the rights that you have. You must make sure that 
they, too, receive or can get the source code. And you must show them these terms so 
they know their rights. 

We protect your rights with two steps: (1) copyright the software, and (2) offer you 
this license which gives you legal permission to copy, distribute and/or modify the 
software. 

Also, for each author's protection and ours, we want to make certain that everyone 
understands that there is no warranty for this free software. If the software is 
modified by someone else and passed on, we want its recipients to know that what they 
have is not the original, so that any problems introduced by others will not reflect 
on the original authors' reputations. 

Finally, any free program is threatened constantly by software patents. We wish to 
avoid the danger that redistributors of a free program will individually obtain patent 
licenses, in effect making the program proprietary. To prevent this, we have made it 
clear that any patent must be licensed for everyone's free use or not licensed at all. 

The precise terms and conditions for copying, distribution and modification follow. 

TERMS AND CONDITIONS FOR COPYING,
DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by 
the copyright holder saying it may be distributed under the terms of this General 
Public License. The "Program", below, refers to any such program or work, and a "work 
based on the Program" means either the Program or any derivative work under copyright 
law: that is to say, a work containing the Program or a portion of it, either verbatim 
or with modifications and/or translated into another language. (Hereinafter, 
translation is included without limitation in the term "modification".) Each licensee 
is addressed as "you". 

Activities other than copying, distribution and modification are not covered by this 
License; they are outside its scope. The act of running the Program is not restricted, 
and the output from the Program is covered only if its contents constitute a work 
based on the Program (independent of having been made by running the Program). Whether 
that is true depends on what the Program does. 

1. You may copy and distribute verbatim copies of the Program's source code as you 
receive it, in any medium, provided that you conspicuously and appropriately publish 
on each copy an appropriate copyright notice and disclaimer of warranty; keep intact 
all the notices that refer to this License and to the absence of any warranty; and 
give any other recipients of the Program a copy of this License along with the 
Program. 

You may charge a fee for the physical act of transferring a copy, and you may at your 
option offer warranty protection in exchange for a fee. 

2. You may modify your copy or copies of the Program or any portion of it, thus 
forming a work based on the Program, and copy and distribute such modifications or 
work under the terms of Section 1 above, provided that you also meet all of these 
conditions: 

     a) You must cause the modified files to carry prominent notices stating that you 
        changed the files and the date of any change. 

     b) You must cause any work that you distribute or publish, that in whole or in 
        part contains or is derived from the Program or any part thereof, to be 
        licensed as a whole at no charge to all third parties under the terms of this 
        License. 

     c) If the modified program normally reads commands interactively when run, you 
        must cause it, when started running for such interactive use in the most 
        ordinary way, to print or display an announcement including an appropriate 
        copyright notice and a notice that there is no warranty (or else, saying that 
        you provide a warranty) and that users may redistribute the program under 
        these conditions, and telling the user how to view a copy of this License.
        (Exception: if the Program itself is interactive but does not normally print 
        such an announcement, your work based on the Program is not required to print 
        an announcement.) 

These requirements apply to the modified work as a whole. If identifiable sections of 
that work are not derived from the Program, and can be reasonably considered 
independent and separate works in themselves, then this License, and its terms, do not 
apply to those sections when you distribute them as separate works. But when you 
distribute the same sections as part of a whole which is a work based on the Program, 
the distribution of the whole must be on the terms of this License, whose permissions 
for other licensees extend to the entire whole, and thus to each and every part
regardless of who wrote it. 

Thus, it is not the intent of this section to claim rights or contest your rights to 
work written entirely by you; rather, the intent is to exercise the right to control 
the distribution of derivative or collective works based on the Program. 

In addition, mere aggregation of another work not based on the Program with the 
Program (or with a work based on the Program) on a volume of a storage or distribution 
medium does not bring the other work under the scope of this License. 

3. You may copy and distribute the Program (or a work based on it, under Section 2) in 
object code or executable form under the terms of Sections 1 and 2 above provided that 
you also do one of the following: 

     a) Accompany it with the complete corresponding machine-readable source code, 
        which must be distributed under the terms of Sections 1 and 2 above on a 
        medium customarily used for software interchange; or, 

     b) Accompany it with a written offer, valid for at least three years, to give any 
        third party, for a charge no more than your cost of physically performing 
        source distribution, a complete machine-readable copy of the corresponding 
        source code, to be distributed under the terms of Sections 1 and 2 above on a 
        medium customarily used for software interchange; or, 

     c) Accompany it with the information you received as to the offer to distribute 
        corresponding source code. (This alternative is allowed only for noncommercial 
        distribution and only if you received the program in object code or executable 
        form with such an offer, in accord with Subsection b above.) 

The source code for a work means the preferred form of the work for making 
modifications to it.  For an executable work, complete source code means all the 
source code for all modules it contains, plus any associated interface definition 
files, plus the scripts used to control compilation and installation of the 
executable. However, as a special exception, the source code distributed
need not include anything that is normally distributed (in either source or binary 
form) with the major components (compiler, kernel, and so on) of the operating system 
on which the executable runs, unless that component itself accompanies the executable. 

If distribution of executable or object code is made by offering access to copy from a 
designated place, then offering equivalent access to copy the source code from the 
same place counts as distribution of the source code, even though third parties are 
not compelled to copy the source along with the object code. 

4. You may not copy, modify, sublicense, or distribute the Program except as expressly 
provided under this License. Any attempt otherwise to copy, modify, sublicense or 
distribute the Program is void, and will automatically terminate your rights under 
this License. However, parties who have received copies, or rights, from you under 
this License will not have their licenses terminated so long as such parties remain in 
full compliance. 

5. You are not required to accept this License, since you have not signed it. However, 
nothing else grants you permission to modify or distribute the Program or its 
derivative works. These actions are prohibited by law if you do not accept this 
License. Therefore, by modifying or distributing the Program (or any work based on the 
Program), you indicate your acceptance of this License to do so, and all its terms and 
conditions for copying, distributing or modifying the Program or works based on it. 

6. Each time you redistribute the Program (or any work based on the Program), the 
recipient automatically receives a license from the original licensor to copy, 
distribute or modify the Program subject to these terms and conditions. You may not 
impose any further restrictions on the recipients' exercise of the rights granted 
herein. You are not responsible for enforcing compliance by third parties to this 
License.  

7. If, as a consequence of a court judgment or allegation of patent infringement or 
for any other reason (not limited to patent issues), conditions are imposed on you 
(whether by court order, agreement or otherwise) that contradict the conditions of 
this License, they do not excuse you from the conditions of this License. If you 
cannot distribute so as to satisfy simultaneously your obligations under this License 
and any other pertinent obligations, then as a consequence you may not distribute the 
Program at all. For example, if a patent license would not permit royalty-free  
distribution of the Program by all those who receive copies directly or indirectly 
through you, then the only way you could satisfy both it and this License would be to 
refrain entirely from distribution of the Program. 

If any portion of this section is held invalid or unenforceable under any particular 
circumstance, the balance of the section is intended to apply and the section as a 
whole is intended to apply in other circumstances. 

It is not the purpose of this section to induce you to infringe any patents or other 
property right claims or to contest validity of any such claims; this section has the 
sole purpose of protecting the integrity of the free software distribution system, 
which is implemented by public license practices. Many people have made generous 
contributions to the wide range of software distributed through that system in 
reliance on consistent application of that system; it is up to the author/donor to  
decide if he or she is willing to distribute software through any other system and a 
licensee cannot impose that choice. 

This section is intended to make thoroughly clear what is believed to be a consequence 
of the rest of this License. 

8. If the distribution and/or use of the Program is restricted in certain countries 
either by patents or by copyrighted interfaces, the original copyright holder who 
places the Program under this License may add an explicit geographical distribution 
limitation excluding those countries, so that distribution is permitted only in or 
among countries not thus excluded. In such case, this License incorporates the 
limitation as if written in the body of this License.  

9. The Free Software Foundation may publish revised and/or new versions of the General 
Public License from time to time. Such new versions will be similar in spirit to the 
present version, but may differ in detail to address new problems or concerns. 

Each version is given a distinguishing version number. If the Program specifies a 
version number of this License which applies to it and "any later version", you have 
the option of following the terms and conditions either of that version or of any 
later version published by the Free Software Foundation. If the Program does not 
specify a version number of this License, you may choose any version ever published by 
the Free Software Foundation. 

10. If you wish to incorporate parts of the Program into other free programs whose 
distribution conditions are different, write to the author to ask for permission. For 
software which is copyrighted by the Free Software Foundation, write to the Free 
Software Foundation; we sometimes make exceptions for this. Our decision will be 
guided by the two goals of preserving the free status of all derivatives of our free 
software and of promoting the sharing and reuse of software generally. 

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
CORRECTION. 

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.