Welcome, Guest. Please login or register.
Did you miss your activation email?


Login with username, password and session length

Search

 
Advanced search

8001 Posts in 1848 Topics- by 2099 Members - Latest Member: roi
Calendar Script CommunityEverything ElseGeneral Use (Moderators: scott, DanO, Marty)Sudden CGI error after 2 years of working
Pages: [1]   Go Down
Print
Author Topic: Sudden CGI error after 2 years of working  (Read 200 times)
0 Members and 1 Guest are viewing this topic.
mjanes
New Member
*

Karma: 0
Offline Offline

Posts: 0


WWW
« on: November 11, 2004, 09:06:00 AM »

I don't know Perl so I need help with this error message please.  No changes were made to the script that I'm aware of.  This has been working for 2 years then all of a sudden...Thanks for your help in advance.  Here is the error:

The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:


String found where operator expected at E:\intercefcu\cgi-bin\calendar.pl line 227, near "if (($ENV{'HTTP_COOKIE'} =~ /CGISessionID/) | | ($in{'command'} eq ""
 (Might be a runaway multi-line "" string starting on line 223)
   (Missing semicolon on previous line?)
syntax error at E:\intercefcu\cgi-bin\calendar.pl line 227, near "if (($ENV{'HTTP_COOKIE'} =~ /CGISessionID/) | | ($in{'command'} eq ""
Execution of E:\intercefcu\cgi-bin\calendar.pl aborted due to compilation errors.

Here is the code:***********************************

#!/usr/bin/perl
#
# CalendarScript
# Version: 3.0
#
# Copyright 2001 Scott
# http://www.CalendarScript.com/
#

BEGIN {
   # CHANGE THE FOLLOWING LINE IF NECESSARY
   #$BASE_DIR = "/...change.to.full.file.path.of.dir.../calendarscript/";
   
   if ($BASE_DIR ne "") { $BASE_DIR =~ s|([^/])$|$1/|; }
   else {
      my ($path) =  $ENV{'PATH_TRANSLATED'} | | $ENV{'SCRIPT_FILENAME'};
      unless ($path) {
         print "Content-type:text/html\n\n<B>ERROR:</B><BR>Your server does not provide the PATH_TRANSLATED or SCRIPT_FILENAME environment variables.<br><br>Please see the installation documentation for how to set the \$BASE_DIR variable manually.";
         exit(0);
         }
      $path =~ s|[^/\\]*$| |;
      $path =~ s|([^/])$|$1/|;
      $BASE_DIR = $path . "calendarscript/";
      }
   unshift(@INC,$BASE_DIR."lib");
   require "asp.inc";
   require "DBFile.pm";
   require "DBFileUtil.inc";
   require "TimeLocal.inc";
   require "Date.inc";
   require "Config.pm";
   require "Event.inc";
   require "HTML.pm";
   require "CGISession.inc";
   require "User.pm";
   require "SimpleDateFormat.pm";
   }
   
sub ERROR {
   my($msg,$severity) = @_;
   &addUserMessage($msg);
   &showScreen();
   }
sub FATALERROR {
   my ($msg) = @_;
   &addErrorMessage($msg);
   if ($in{template} eq "error.html") { print "FATAL ERROR: COULD NOT LOAD error.html"; exit(0); }
   $in{template} = "error.html";
   &showScreen();
   }
   
# Load the required template and execute it
# -----------------------------------------
sub showScreen {
   $template_dir = $BASE_DIR . "templates/calendars/" . $Config->get("template_dir") . "/";
   $template_file = $template_dir . $in{'template'};
   $template = &ASPLoadTemplate($template_file);
   &ASPEval($template,$template_dir);
   &ASPError($tmp_parsed_template) if $@;
   exit(0);
   }
sub showSameScreen() {
   $in{'template'} = $in{'fromTemplate'} | | "error.html";
   &showScreen();
   }

# Handle error messages
# ---------------------
sub addUserMessage {
   my($msg) = shift;
   if ($msg ne "") {
      $Template::userMessage .= $msg . "<BR>";
      }
   }
sub addErrorMessage {
   my($msg) = shift;
   if ($msg ne "") {
      $Template::errorMessage .= $msg . "<BR>";
      }
   }

# Get message text to support language translation
# ------------------------------------------------
sub getMessage() {
   my ($name,$p1,$p2,$p3,$p4) = @_;
   # Only read in the file if there is a message to be retrieved
   unless ($MESSAGES) {
      $msgfile = $BASE_DIR . "templates/admin/$admin_template_dir/messages.txt";
      open(MESSAGES,$msgfile) | | &FATALERROR("Error opening messages file [$msgfile]: $!");
      while(<MESSAGES> ) {
         next if /^#/;
         next unless /\S/;
         chomp;
         my($name,$value) = split(/=/,$_,2);
         $MESSAGES->{$name} = $value;
         }
      close(MESSAGES);
      }
   my ($message) = $MESSAGES->{$name};
   if ($message eq "") { return "MESSAGE TEXT MISSING FOR: $name"; }
   if ($p1) { $message =~ s/\%s/$p1/; }
   if ($p2) { $message =~ s/\%s/$p2/; }
   if ($p3) { $message =~ s/\%s/$p3/; }
   if ($p4) { $message =~ s/\%s/$p4/; }
   return $message;
   }

sub LZ { my($x)=shift;if(length($x)==1){return "0$x";}return $x; }

sub URLEncode {
   my($url)=@_;
   my(@characters)=split(/(\%[0-9a-fA-F]{2})/,$url);
   foreach(@characters) {
      if ( /\%[0-9a-fA-F]{2}/ ) {
         unless ( /(20|7f|[0189a-fA-F][0-9a-fA-F])/i | | /2[2356fF]|3[a-fA-F]|40/i ) {
            s/\%([2-7][0-9a-fA-F])/sprintf "%c",hex($1)/e;
            }
         }
      else {
         s/([\000-\040\177-\377\074\076\042])/sprintf "%%%02x",unpack("C",$1)/egx;
         }
      }
   return join("",@characters);
   }

# Get input Data
# --------------
sub getInput {
   my ($in,@in,$key,$val);
   my (@keys,%formvars);
   if ($ENV{'DOCUMENT_URI'}) {
      open(SSI,$BASE_DIR."ssi.txt");
      while(<SSI> ) {
         chomp;
         ($key,$val) = ( /^\s*([^=]+)\s*=\s*"?(.*?)"?$/o );
         $key =~ s|\s*$| |;
         $val =~ s|\s*$| |;
         next unless ($key);
         $in{$key} = $val;
         }
      close(SSI);
      $no_session = 1;
      }
   elsif ($ENV{'REQUEST_METHOD'}) {
      if ($ENV{'REQUEST_METHOD'} eq "GET") { $in = $ENV{'QUERY_STRING'}; }
      elsif ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); }
      @in = split(/&/,$in);
      # First get all the raw form vars
      foreach $i (0 .. $#in) {
         $in[$i] =~ s/\+/ /g;    ($key, $val) = split(/=/,$in[$i],2);
         $key =~ s/%(..)/pack("c",hex($1))/ge;
         $val =~ s/%(..)/pack("c",hex($1))/ge;
         # Keep a record of their order, because later values take precendent
         push(@keys,$key);
         $formvars{$key} = $val;
         }
      # Process the special QUERY_STRING field, if it exists
      # These values come first and then might be over-written
      if ($formvars{'QUERY_STRING'}) {
         @in = split(/&/,$formvars{'QUERY_STRING'});
         foreach $i (0 .. $#in) {
            $in[$i] =~ s/\+/ /g;    ($key, $val) = split(/=/,$in[$i],2);
            if ($val ne "") {
               $in{$key} = $val;
               if ($in{'datestring'} && (($key eq 'year') | | ($key eq 'month') | | ($key eq 'date'))) {
                  delete $in{'datestring'};
                  }
               if ($key eq "datestring") {
                  delete $in{'year'};
                  delete $in{'month'};
                  delete $in{'date'};
                  }
               }
            }
         delete $formvars{'QUERY_STRING'};
         }
      # Process all the new field values, over-writing the old ones
      foreach $key (@keys) {
         next if ($key eq "QUERY_STRING");
         $in{$key} = $formvars{$key};
         if ($in{'datestring'} && (($key eq 'year') | | ($key eq 'month') | | ($key eq 'date'))) {
            delete $in{'datestring'};
            }
         if ($key eq "datestring") {
            delete $in{'year'};
            delete $in{'month'};
            delete $in{'date'};
            }
         }
      # Form the query string from form input
      foreach $key (keys %in) {
         if (($key eq "command") | | ($key eq "username") | | ($key eq "password") | | ($key =~/^FIELD_/)) {
            delete $formvars{$key};
            next;
            }
         if ($QUERY_STRING ne "") { $QUERY_STRING .= "&"; }
         $QUERY_STRING .= &URLEncode($key) . "=" . &URLEncode($in{$key});
         }
      $FORM_QUERY = join('&', map {"$_=$formvars{$_}"} keys %formvars);
      }
   elsif ($#ARGV >= 0) {
      while ($in = shift(@ARGV)) {
         ($key,$val) = split(/=/,$in);
         $in{$key} = $val;
         }
      $no_session = 1;
      $no_header=1;
      }
   }

#################################
# Here is all the dirty work... #
#################################
$|=1;

# Read the main admin config file
$admin_config = $BASE_DIR . "config.txt";
$AdminConfig = new Config($admin_config);
$Template::AdminConfig = $AdminConfig;
$admin_template_dir = $AdminConfig->get("admin_template_dir") | | "English";

# Get input
&getInput();  

# Start output
# ------------
if (($ENV{'HTTP_COOKIE'} =~ /CGISessionID/) | | ($in{'command'} eq "login")) {
   $Session = new CGISession($BASE_DIR . "session/");
   unless ($no_session) {
      my ($id) = ($ENV{'HTTP_COOKIE'} =~ /CGISessionID\s*=\s*([^;]*)/);
      $Session->getSession($id);
      if (($Session->isValid()) && ($in{'command'} ne "logout")) {
         print "Set-cookie: CGISessionID=",$Session->getValue("_id"),";path=/\n";
         }
      else { print "Set-cookie: CGISessionID=;path=/;expires=Thu, 01-Jan-1970 00:00:00 GMT\n"; }
      }
   # Make session available in template files
   $Template::Session = $Session;
   }
unless ($no_header) {
   print "Content-type: text/html\n\n";
   }

$in{'calendar'} | |= "default";
$in{'calendar'} =~ s|[^\w\d\._]| |g;
$calendar = $in{'calendar'};
$in{'template'} | |= "default.html";
$in{'template'} =~ s|[^\w\d\._]| |g;

$db_dir          = $BASE_DIR . "calendars/" . $in{'calendar'} . "/";
$config_file     = $db_dir . "config.txt";
$schedule_db     = $db_dir . "schedule";
$events_db       = $db_dir . "events";
$calendars_db    = $BASE_DIR . "calendars";
$users_db        = $BASE_DIR . "users";
$permissions_db  = $BASE_DIR . "permissions";

# Read the config file for the calendar
$Config = new Config($config_file);
$Template::Config = $Config;

# The CGI URL for call-back
$Template::CGI_URL = $AdminConfig->get("calendar_url") | | $ENV{'SCRIPT_NAME'} | | $ENV{'REQUEST_URI'};
$Template::CGI_URL_QUERYSTRING = $Template::CGI_URL . "?".$QUERY_STRING;
if ($QUERY_STRING ne "") { $Template::CGI_URL_QUERYSTRING .= "&"; }
$Template::QUERY_STRING = $QUERY_STRING;
$Template::CGI_HIDDEN_FIELDS .= "<INPUT TYPE=\"hidden\" NAME=\"QUERY_STRING\" VALUE=\"$FORM_QUERY\">";
$Template::ADMIN_CGI_URL = $AdminConfig->get("calendar_admin_url");

# Attempt to Login?
# -----------------
if ($in{'command'} eq "login") {
   $User = new User($in{username}, $users_db, $permissions_db);
   my ($result) = $User->login($in{password});
   if ($result == 1) {
      # User logged in
      $Session->{'username'} = $User->{'username'};
      $Session->{'name'} = $User->{'name'};
      $Session->{'calendar'} = $calendar;
      &addUserMessage(($User->{'name'} | | $User->{'username'}) . $User::MSG_LOGGED_IN_SUCCESSFULLY);
      }
   elsif ($result == 2) {
      undef $Session;
      &addUserMessage(e"tMessage("CALENDAR_PASSWORD_MUST_BE_CHANGED"));
      &showSameScreen();
      }
   else {
      &addUserMessage($User->getErrorMessage());
      &showSameScreen();
      }
   }

# Handle Logout
# -------------
if ($in{'command'} eq "logout") {
   $Session->ExpireNow();
   $Session->cleanupExpiredSessions();
   undef $Session;
   undef $Template::Session;
   undef $User;
   }   

# Create a global "User" object if it doesn't already exist
# ---------------------------------------------------------
unless ($User) {
   if ($Session && ($Session->{'username'} ne "")) {
      $User = new User($Session->{'username'}, $users_db, $permissions_db);
      $User->{'logged_in'} = 1;
      $Session->{'calendar'} = $calendar;
      }
   else {
      $User = new User('anonymous', $users_db, $permissions_db);
      $User->{'logged_in'} = 0;
      }
   }
$Template::User = $User;

# Require Login?
# --------------
if ($Config->get("require_login")) {
   if ($Session->{'username'}) {
      unless ($User->hasPermission($calendar,"VIEW")) {
         $Template::userMessage = e"tMessage("CALENDAR_NO_VIEW_PERMISSION");
         &FATALERROR("");
         }
      }
   else {
      $in{'template'} = "login.html";
      &showScreen();
      }
   }

# Create the event and schedule database objects
$DBEvents = new DBFile($events_db);
$DBSchedule = new DBFile($schedule_db);

# Handle any commands here
# ------------------------

# SEARCH
# ------
if ($in{'command'} eq "search") {
   my ($properties,$name,$field);
   foreach $name (keys %in) {
      $field = $name;
      if (($in{$name} ne "") && ($field =~ s/^FIELD_//)) {
         $properties->{$field} = $in{$name};
         }
      }
   if (scalar keys %$properties <= 0) {
      &addUserMessage("Search query must not be blank!");
      }
   else {
      $start = Time::Local::timegm(0,0,0,$in{start_date},$in{start_month}-1,$in{start_year});
      $end   = Time::Local::timegm(0,0,0,$in{end_date},$in{end_month}-1,$in{end_year});
      $Template::SEARCH_RESULTS = &Event::search($DBEvents, $DBSchedule, "", $properties, $start, $end);
      }
   }

$localtime_offset = 3600*$Config->get("time_zone_offset");
($now_ss,$now_mi,$now_hh,$now_dd,$now_mm,$now_yy,$now_wd,$now_yd,$now_dst) = localtime(time+$localtime_offset);
$now_mm++;
$now_yy += 1900;

# Get the displayed dates, etc
$year = substr($in{'datestring'},0,4) | | $in{'year'} | | substr($in{'selected_datestring'},0,4) | | $now_yy;
$month = substr($in{'datestring'},4,2) | | $in{'month'} | | substr($in{'selected_datestring'},4,2) | | $now_mm;
$date = substr($in{'datestring'},6,2) | | $in{'date'} | | substr($in{'selected_datestring'},6,2) | | $now_dd;

# Get selected date
$selected_datestring = $in{'selected_datestring'} | | $year.&LZ($now_mm).&LZ($now_dd);

# Date-related fields and HTML elements
$Template::YEAR_SELECT = "<SELECT NAME=\"year\">" . &HTML::yearOptions($year) ."</SELECT>";
$Template::MONTH_SELECT = "<SELECT NAME=\"month\">" . &HTML::monthNameOptions($month) . "</SELECT>";
$Template::MONTH_ABBREVIATION_SELECT = "<SELECT NAME=\"month\">" . &HTML::monthAbbreviationOptions($month) . "</SELECT>";
$Template: AY_NAMES = $Config->get("day_names");
$Template: AY_ABBREVIATIONS = $Config->get("day_abbreviations");
$Template::MONTH_NAMES = $Config->get("month_names");
$Template::MONTH_ABBREVIATIONS = $Config->get("month_abbreviations");
for ($i=0; $i<7; $i++) { ${"Template: AY_NAME_".$i} = $Template: AY_NAMES->[$i]; }
for ($i=0; $i<12; $i++) { ${"Template::MONTH_NAME_".$i} = $Template::MONTH_NAMES->[$i]; }
for ($i=0; $i<7; $i++) { ${"Template: AY_ABBREVIATION_".$i} = $Template: AY_ABBREVIATIONS->[$i]; }
for ($i=0; $i<12; $i++) { ${"Template::MONTH_ABBREVIATION_".$i} = $Template::MONTH_ABBREVIATIONS->[$i]; }
$Template::MONTH_NAME = $Template::MONTH_NAMES->[$month-1];
$Template::YEAR = $year;
$Template::MONTH = $month;
$Template: ATE = $date;
$Template: ATESTRING = $year . &LZ($month) . &LZ($date);
$Template::NEXT_YEAR = $year+1;
$Template::LAST_YEAR = $year-1;
($Template::NEXT_MONTH_YEAR,$Template::NEXT_MONTH) = &Date::getNextMonthYear($year,$month);
$Template::NEXT_MONTH_NAME = $Template::MONTH_NAMES->[$Template::NEXT_MONTH-1];
($Template::LAST_MONTH_YEAR,$Template::LAST_MONTH) = &Date::getLastMonthYear($year,$month);
$Template::LAST_MONTH_NAME = $Template::MONTH_NAMES->[$Template::LAST_MONTH-1];
($Template::LAST_WEEK_YEAR,$Template::LAST_WEEK_MONTH,$Template::LAST_WEEK_DATE) = &Date::getLastWeek($year,$month,$date);
($Template::NEXT_WEEK_YEAR,$Template::NEXT_WEEK_MONTH,$Template::NEXT_WEEK_DATE) = &Date::getNextWeek($year,$month,$date);
($Template::NEXT_DAY_YEAR,$Template::NEXT_DAY_MONTH,$Template::NEXT_DAY_DATE) = &Date::getTomorrow($year,$month,$date);
$Template::NEXT_DAY_DATESTRING = $Template::NEXT_DAY_YEAR . &LZ($Template::NEXT_DAY_MONTH) . &LZ($Template::NEXT_DAY_DATE);
($Template::PREVIOUS_DAY_YEAR,$Template::PREVIOUS_DAY_MONTH,$Template::PREVIOUS_DAY_DATE) = &Date::getYesterday($year,$month,$date);
$Template::PREVIOUS_DAY_DATESTRING = $Template::PREVIOUS_DAY_YEAR . &LZ($Template::PREVIOUS_DAY_MONTH) . &LZ($Template::PREVIOUS_DAY_DATE);
($Template::TODAY_YEAR,$Template::TODAY_MONTH,$Template::TODAY_DATE) = ($now_yy,$now_mm,$now_dd);
$Template::TODAY_DATESTRING = $Template::TODAY_YEAR . &LZ($Template::TODAY_MONTH) . &LZ($Template::TODAY_DATE);

# Other
$Template::CALENDAR = $calendar;

# Call-back method to get events
*Template::getEvents = \e"tEvents;
*Template::getEvent = \e"tEvent;

# Form input
%Template::in = %in;

# Looping and conditional special tags
&ASPCustomTag('\s*FOREACH\s*GRID\s*ROW\s*','foreach $ROW (0 .. $Grid->{rowcount}-1) {');
&ASPCustomTag('\s*FOREACH\s*GRID\s*COLUMN\s*','foreach $COL (0 .. $Grid->{colcount}-1) { $DAY = $Grid->{grid}->[$ROW]->[$COL]; my ($EVENTS) = $Grid->{grid}->[$ROW]->[$COL]->{events};');
&ASPCustomTag('\s*FOREACH\s*DAY\s*OF\s*WEEK\s*','foreach $COL (0 .. $Grid->{colcount}-1) { $DAY = $Grid->{grid}->

  • ->[$COL]; my ($EVENTS) = $Grid->{grid}->
  • ->[$COL]->{events};');
    &ASPCustomTag('\s*FOREACH\s*HOUR\s*OF\s*DAY\s*','foreach $HOUR ( 99, $Config->{days_hours_display_start} .. $Config->{days_hours_display_end} ) { my ($EVENTS) = $DAY->{hours}->[$HOUR]->{events};');
    &ASPCustomTag('\s*FOREACH\s*EVENTLIST','foreach $datestring (sort keys %$EventList) { $DAY = $EventList->{$datestring}; my ($EVENTS) = $DAY->{events};');
    &ASPCustomTag('\s*FOREACH\s*EVENT\s*','foreach $EVENT (@$EVENTS) { ');
    &ASPCustomTag('\s*FOREACH\s*SEARCH\s*RESULT\s*','foreach $i (0 .. $#$SEARCH_RESULTS) { $EVENT = $SEARCH_RESULTS->[$i]; ');
    &ASPCustomTag('\s*IF\s*SEARCH\s*RESULT\s*','if ($in{command} eq "search") {');
    &ASPCustomTag('\s*IF\s*SEARCH\s*RESULTS\s*EXIST\s*','if ($#$SEARCH_RESULTS < 0) {');
    &ASPCustomTag('\s*IF\s*EVENTS\s*EXIST\s*','if ($#{$EVENTS} >= 0) {');
    &ASPCustomTag('\s*IF\s*NEXT\s*OCCURRENCE\s*EXISTS\s*','if ($EVENT->{schedule}->{nextoccurrence}) {');
    &ASPCustomTag('\s*IF\s*NO\s*EVENTS\s*EXIST\s*','if (!($#{$EVENTS} >= 0)) {');
    &ASPCustomTag('\s*IF\s*DISPLAY\s*','if ($DAY->{\'display\'}) {');
    &ASPCustomTag('\s*IF\s*SELECTED\s*','if ($DAY->{\'selected\'}) {');
    &ASPCustomTag('\s*IF\s*USER\s*LOGGED\s*IN\s*','if ($User->{username} ne "anonymous") {');
    &ASPCustomTag('\s*/FOREACH\s*','}');
    &ASPCustomTag('\s*ELSE\s*','}else{');
    &ASPCustomTag('\s*/IF\s*','}');

    # Other special tags
    &ASPCustomTag('=\s*EVENT\s*FIELD\s*\((\w+)\)\s*','= $EVENT->{details}->{$1} ');
    &ASPCustomTag('=\s*SCHEDULE\s*FIELD\s*\((\w+)\)\s*','= $EVENT->{schedule}->{$1} ');
    &ASPCustomTag('\s*LAST\s*YEAR\s*LINK\s*','= $CGI_URL_QUERYSTRING."year=".$LAST_YEAR');
    &ASPCustomTag('\s*NEXT\s*YEAR\s*LINK\s*','= $CGI_URL_QUERYSTRING."year=".$NEXT_YEAR');
    &ASPCustomTag('\s*LAST\s*MONTH\s*LINK\s*','= $CGI_URL_QUERYSTRING."year=".$LAST_MONTH_YEAR."&month=".$LAST_MONTH');
    &ASPCustomTag('\s*NEXT\s*MONTH\s*LINK\s*','= $CGI_URL_QUERYSTRING."year=".$NEXT_MONTH_YEAR."&month=".$NEXT_MONTH');
    &ASPCustomTag('\s*LAST\s*WEEK\s*LINK\s*','= $CGI_URL_QUERYSTRING."year=".$LAST_WEEK_YEAR."&month=".$LAST_WEEK_MONTH."&date=".$LAST_WEEK_DATE');
    &ASPCustomTag('\s*NEXT\s*WEEK\s*LINK\s*','= $CGI_URL_QUERYSTRING."year=".$NEXT_WEEK_YEAR."&month=".$NEXT_WEEK_MONTH."&date=".$NEXT_WEEK_DATE');

    &ASPCustomTag('\s*PREVIOUS\s*DAY\s*LINK\s*','= $CGI_URL_QUERYSTRING."datestring=".$PREVIOUS_DAY_DATESTRING."&selected_datestring=".$PREVIOUS_DAY_DATESTRING');
    &ASPCustomTag('\s*NEXT\s*DAY\s*LINK\s*','= $CGI_URL_QUERYSTRING."datestring=".$NEXT_DAY_DATESTRING."&selected_datestring=".$NEXT_DAY_DATESTRING');


    # Load the required template and execute it
    # -----------------------------------------
    &showScreen();

    END {   
       if (defined $main::Session) {
          $main::Session->saveSession();
          }
       }


    ##################################################
    # Subroutine called by Template to get an event
    ##################################################
    sub getEvent {
       my ($id) = @_;
       my ($db) = new DBFile($events_db);
       my ($event) = $db->getRecord( {'id'=>$id } );
       if ($event == 0) { return {}; }
       # Add the auto-links if necessary
       if ($Config->get("auto_link")) {
          foreach $key (keys %$event) {
             $event->{$key} = &HTML::autoLink($event->{$key},$Config->get("auto_link_target"));
             }
          }
       return $event;
       }

    ##################################################
    # Subroutine called by Template to populate events
    ##################################################
    sub getEvents {
       my ($properties) = @_;
       my ($event_ids,$events,$event_details,$s);
       my ($month,$year,$date,$datestring,$start,$end);
       
       $month = &LZ($properties->{'month'}) | | &LZ($Template::MONTH);
       $year = $properties->{'year'} | | ($Template::YEAR);
       $date = &LZ($properties->{'date'}) | | &LZ($Template: ATE);

       if ($properties->{'range'} eq "month") {
          $datestring = $year . $month . "01";
          $properties->{'startdate'} = $datestring;
          }
       #elsif (($properties->{'range'} eq "week") | | ($properties->{'range'} eq "twoweek")) {
       else {
          $datestring = $year . $month . $date;
          $properties->{'startdate'} | |= $datestring;
          }

       ($start,$end) = &Date::getTimeSpan( $properties );   
       $Template::RANGE_START = &SimpleDateFormat::formatDate($start,$Config->get("date_format"));
       ($Template::RANGE_START_DATE,$Template::RANGE_START_MONTH,$Template::RANGE_START_YEAR) = (gmtime($start))[3,4,5];
       $Template::RANGE_START_MONTH++;
       $Template::RANGE_START_YEAR+=1900;
       $Template::RANGE_END = &SimpleDateFormat::formatDate($end,$Config->get("date_format"));
       ($Template::RANGE_END_DATE,$Template::RANGE_END_MONTH,$Template::RANGE_END_YEAR) = (gmtime($end))[3,4,5];
       $Template::RANGE_END_MONTH++;
       $Template::RANGE_END_YEAR+=1900;
       
       $schedule = &Event::getEventsInRange($DBSchedule,$start,$end);
       foreach $s (@$schedule) {
          $event_ids->{$s->{'event_id'}}=1;
          }
       $event_details = &Event::getEventDetails($DBEvents,$event_ids);

       foreach $s (@$schedule) {
          # Skip the event unless it's approved
          next unless ($event_details->{$s->{'event_id'}}->{'approved'});
          # Skip if it's private
          next if ($event_details->{$s->{'event_id'}}->{'private'});
       
          push(@$events, { 'schedule'=>$s, 'details'=>$event_details->{$s->{'event_id'}} } );
          }
       
       # Put the raw events into the template
       # ------------------------------------
       $Template::EVENTS = $events;
       
       my ($Grid);
       my ($start_ss,$start_mi,$start_hh,$start_dd,$start_mm,$start_yy,$start_wd,$start_yd,$start_dst) = gmtime($start);
       $week_start_day = $Config->get("week_start_day");
       if ($start_wd >= $week_start_day) {
          $offset_days = $start_wd - $week_start_day;
          }
       elsif ($start_wd < $week_start_day) {
          $offset_days = 7-$week_start_day+$start_wd;
          }
       $i = $start;
       my $x = 0;
       my $y = 0;
       # Place pre-empty grid cells if more than one row
       if ((($end - $start)/86400) > 7) {
          foreach (0 .. ($offset_days-1)) {
             $Grid->{'grid'}->[$y]->[$x]->{'display'} = 0;
             $x++;
             }
          }
       while ($i < $end) {
          my ($ss,$mi,$hh,$dd,$mm,$yy,$wd,$yd,$dst) = gmtime($i);
          my ($datestring) = (1900+$yy) . &LZ($mm+1) . &LZ($dd);
          $gridMappings->{$datestring} = [$y,$x];
          $Grid->{'grid'}->[$y]->[$x]->{'dd'} = $dd;
          $Grid->{'grid'}->[$y]->[$x]->{'mm'} = $mm+1;
          $Grid->{'grid'}->[$y]->[$x]->{'yyyy'} = 1900+$yy;
          $Grid->{'grid'}->[$y]->[$x]->{'wd'} = $wd;
          $Grid->{'grid'}->[$y]->[$x]->{'yd'} = $yd;
          $Grid->{'daynames'}->[$x] = $Template: AY_NAMES->[$wd];
          $Grid->{'grid'}->[$y]->[$x]->{'dayname'} = $Template: AY_NAMES->[$wd];
          $Grid->{'grid'}->[$y]->[$x]->{'dayabbreviation'} = $Template: AY_ABBREVIATIONS->[$wd];
          $Grid->{'grid'}->[$y]->[$x]->{'monthname'} = $Template::MONTH_NAMES->[$mm];
          $Grid->{'grid'}->[$y]->[$x]->{'monthabbreviation'} = $Template::MONTH_ABBREVIATIONS->[$mm];
          $Grid->{'grid'}->[$y]->[$x]->{'datestring'} = $datestring;
          $Grid->{'grid'}->[$y]->[$x]->{'display'} = 1;
          if ($datestring eq $selected_datestring) {
             $Grid->{'grid'}->[$y]->[$x]->{'selected'} = 1;
             }
          $x++;
          $Grid->{'rowcount'} = $y+1;
          if ($x > $Grid->{'colcount'}) { $Grid->{'colcount'} = $x; }
          if ($x > 6) { $x=0; $y++; }
          $i+=86400;
          }
       # Place post-empty grid cells if more than one row
       if ((($end - $start)/86400) > 7) {
          while($wd < 6) {
             $Grid->{'grid'}->[$y]->[$x]->{'display'} = 0;
             $x++;
             $wd++;
             }
          }
       $Template::Grid = $Grid;
       $Template::GRID_ROW_COUNT = $Grid->{'rowcount'};
       $Template::GRID_COLUMN_COUNT = $Grid->{'colcount'};

       # Map events on to Grid and dates/hours/etc
       # -----------------------------------------
       foreach $event (sort {$a->{'schedule'}->{'start'} <=> $b->{'schedule'}->{'start'} } @$events) {
          # Time of event
          if ($event->{'schedule'}->{'start_time'} == $event->{'schedule'}->{'end_time'}) {
             $event->{'schedule'}->{'end_time'} = "";
             }
          if ($event->{'schedule'}->{'all_day'}) {
             $event->{'schedule'}->{'start_time'} = "";
             $event->{'schedule'}->{'end_time'} = "";
             }
          else {
             $event->{'schedule'}->{'start_time'} = &Date::formatTime($event->{'schedule'}->{'start_time'}, $Config->get("time_format"));
             $event->{'schedule'}->{'end_time'} = &Date::formatTime($event->{'schedule'}->{'end_time'} , $Config->get("time_format"));
             }
          
          # Date, month, day name, month name, etc
          my ($event_start) = $event->{'schedule'}->{'start'};
          my ($event_end) = $event->{'schedule'}->{'end'};
          my ($continued) = 0;
          while ($event_start <= $event_end) {
             if (($event_start >= $start) && ($event_start <= $end)) {
                my ($ss,$mi,$hh,$dd,$mm,$yy,$wd,$yd,$dst) = gmtime($event_start);
                my ($datestring) = (1900+$yy) . &LZ($mm+1) . &LZ($dd);
                $event->{'schedule'}->{'datestring'} = $datestring;
                if ($event->{'schedule'}->{'all_day'}) {
                   $hh = 99;
                   }
                else {
                   $hh = &LZ($hh);
                   }
                push(@{$Grid->{'grid'}->[$gridMappings->{$datestring}->

  • ]->[$gridMappings->{$datestring}->[1]]->{'events'}} , $event);
                push(@{$Grid->{'grid'}->[$gridMappings->{$datestring}->
  • ]->[$gridMappings->{$datestring}->[1]]->{'hours'}->[$hh]->{'events'}} , $event);

                $continued=1;
                }
             $event_start = $event_start+86400;
             }
          }
       # Sort the events on each day into chronological order
       for ($y=0; $y<$Grid->{'rowcount'}; $y++) {
          for ($x=0; $x<$Grid->{'colcount'}; $x++) {
             if ($Grid->{'grid'}->[$y]->[$x]->{'display'}) {
                @{$Grid->{'grid'}->[$y]->[$x]->{'events'}} = sort { ($a->{'schedule'}->{'start'} <=> $b->{'schedule'}->{'start'}) | | ($a->{'details'}->{'id'} <=> $b->{'details'}->{'id'}) } @{$Grid->{'grid'}->[$y]->[$x]->{'events'}};
                $EventList->{$Grid->{'grid'}->[$y]->[$x]->{'datestring'}} = $Grid->{'grid'}->[$y]->[$x];
                }
             }
          }
       $Template::EventList = $EventList;
       
       if ($properties->{'range'} eq "day") {
          $Template: AY = $Grid->{'grid'}->

  • ->
  • ;
          $Template::EVENTS = $Grid->{'grid'}->
  • ->
  • ->{'events'};
          }
       }

Logged
Pages: [1]   Go Up
Print
Jump to: