Main Page   Class Hierarchy   File List  

cgiCalendar.cpp

00001 /*
00002   cgiCalendar.cpp
00003 
00004   Common Gateway Interface Class Implementations.
00005      Extended classes for cgi support
00006      -- generic calendar container
00007   copyright (c) 2002
00008 
00009   w3sys.com - Tunnel Hill, Ga.
00010 
00011   David McCombs davidmc@w3sys.com
00012 
00013   Nuclear Core Class Library
00014 
00015   freely re-usable, redistributable.
00016 
00017 */
00018 
00019 #include "cgiCalendar.h"
00020 #include "../openData/fmtTime.h"
00021 #include <cstdlib>
00022 #include <cstdio>
00023 
00024 /*
00025   A generic html calendar
00026 */
00027 
00028 
00029 cgiCalendar::cgiCalendar( aString & year, aString & month ): cgiCan( "table", " class='calendar'" ), headerPos(posTop)
00030 {
00031   char buffer[256];
00032   const char * DateFmt = "%Y-%m-%d";
00033   aString strDate;
00034   if(year.length()>0 && month.length()>0)
00035   {
00036     // construct the time from passed arguments
00037     memset( &m_tm, 0, sizeof(tm) );
00038     m_tm.tm_year = atol( year.str() ) - 1900;
00039     m_tm.tm_mon = atol( month.str() ) -1;
00040     m_tm.tm_mday = 1;
00041     fixTime(&m_tm);
00042   }
00043   else
00044   {
00045     // assume current time
00046     currentTime(&m_tm);
00047     m_tm.tm_mday = 1;
00048     fixTime(&m_tm);
00049   }
00050 }
00051 
00052 bool cgiCalendar::fill( dayItems & items, const char * url )
00053   {
00054     char buffer[256];
00055     bool ret = false;
00056     cgiCan & rCan = *this;
00057     header = "<tr class='month'><th colspan='7'>";
00058     if( url )
00059     {
00060       header += "<a href='";
00061       header += url;
00062       header += "?";
00063       tm prevTm = m_tm;
00064       prevTm.tm_mon -= 1;
00065       fixTime(&prevTm);
00066       fmtTime(buffer, sizeof(buffer), "month=%m&year=%Y", &prevTm );
00067       header += buffer;
00068       header += "'>&nbsp;&lt;&lt;&nbsp;</a>";
00069 
00070     }
00071 
00072     fmtTime(buffer, sizeof(buffer), "%B %Y", &m_tm );
00073     header += " &nbsp;&nbsp;&nbsp; ";
00074     header += buffer;
00075     header += " &nbsp;&nbsp;&nbsp; ";
00076     if( url )
00077     {
00078       header += "<a href='";
00079       header += url;
00080       header += "?";
00081       tm nextTm = m_tm;
00082       nextTm.tm_mon += 1;
00083       fixTime(&nextTm);
00084       fmtTime(buffer, sizeof(buffer), "month=%m&year=%Y", &nextTm );
00085       header += buffer;
00086       header += "'>&nbsp;&gt;&gt;&nbsp;</a></th></tr>";
00087     }
00088 
00089     if(  headerPos == posTop || headerPos == posBoth )
00090     {
00091       rCan << header << endl;
00092     }
00093     rCan << "<tr class='weekdays'><th class='weekday'>Sunday</th>";
00094     rCan << "<th class='weekday'>Monday</th><th class='weekday'>Tuesday</th>";
00095     rCan << "<th class='weekday'>Wednesday</th><th class='weekday'>";
00096     rCan << "Thursday</th><th class='weekday'>Friday</th><th class='weekday'>Saturday</th></tr>" << endl;
00097 
00098     ret = fillDays( items );
00099 
00100     if(  headerPos == posBottom || headerPos == posBoth )
00101     {
00102       rCan << header << endl;
00103     }
00104     return ret;
00105   }
00106 
00107 bool cgiCalendar::fillDays ( dayItems & items )
00108 {
00109   char classBuf[256];
00110   cgiCan & rCan = *this;
00111   bool bMoreWeeks = true;
00112   int iDay, iWeek=1, iMonth = m_tm.tm_mon;
00113   while( bMoreWeeks && m_tm.tm_mday <= 31)
00114   {
00115     if( iWeek%2==0 ) strcpy(classBuf,"even");
00116     else strcpy(classBuf,"odd");
00117     rCan << "<tr class='" << classBuf << "'>";
00118     for( iDay = 0; iDay < m_tm.tm_wday; iDay++ )
00119     {
00120       rCan << "<td class='empty'>&nbsp;</td>";
00121     }
00122     for( ; iDay<7 && bMoreWeeks; iDay++ )
00123     {
00124       rCan << "<td class='mday'><span class='day'>" <<  m_tm.tm_mday;
00125       rCan << "</span><br>&nbsp;";
00126       fillDay( items );
00127       rCan << "</td>";
00128       bMoreWeeks = dayAdd();
00129     }
00130     for( ; iDay<7; iDay++ )
00131     {
00132       rCan << "<td class='empty'>&nbsp;</td>";
00133     }
00134     rCan << "</tr>" << endl;
00135     iWeek ++;
00136   }
00137   return true;
00138 }
00139 bool cgiCalendar::fillDay ( dayItems & items )
00140 {
00141   cgiCan & rCan = *this;
00142   // find all day items matching th current day
00143   dayItems::iterator pos;
00144   for( pos = items.lower_bound(m_tm.tm_mday);
00145       pos != items.upper_bound(m_tm.tm_mday);
00146       ++pos )
00147   {
00148     rCan << pos->second << "<br>";
00149   }
00150   return true;
00151 }
00152 
00153 bool cgiCalendar::dayAdd( void )
00154 {
00155   bool bMoreWeeks = false;
00156   int iMonth = m_tm.tm_mon;
00157   m_tm.tm_mday+=1;
00158   long lRet = fixTime(&m_tm);
00159   if ( lRet != -1 )
00160   {
00161     bMoreWeeks = (iMonth == m_tm.tm_mon);
00162   }
00163   return bMoreWeeks;
00164 }
00165 
00166 string & cgiCalendar::strYear( void )
00167 {
00168   char buffer[256];
00169   fmtTime(buffer, sizeof(buffer), "%Y", &m_tm );
00170   m_formatted = buffer;
00171   return m_formatted;
00172 }
00173 
00174 string & cgiCalendar::strMonth( void )
00175 {
00176   char buffer[256];
00177   fmtTime(buffer, sizeof(buffer), "%m", &m_tm );
00178   m_formatted = buffer;
00179   return m_formatted;
00180 }
00181 
00182 int cgiCalendar::year ( void )
00183 {
00184   return 1900 + m_tm.tm_year;
00185 }
00186 
00187 int cgiCalendar::month( void )
00188 {
00189   return 1 + m_tm.tm_mon;
00190 }
00191 
00192 cgiCalendar::~cgiCalendar()
00193 {
00194   ;
00195 }
00196 

Generated on Tue Jan 20 09:03:27 2004 for OpenTools by doxygen1.2.18