00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "cgiCalendar.h"
00020 #include "../openData/fmtTime.h"
00021 #include <cstdlib>
00022 #include <cstdio>
00023
00024
00025
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
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
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 += "'> << </a>";
00069
00070 }
00071
00072 fmtTime(buffer, sizeof(buffer), "%B %Y", &m_tm );
00073 header += " ";
00074 header += buffer;
00075 header += " ";
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 += "'> >> </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'> </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> ";
00126 fillDay( items );
00127 rCan << "</td>";
00128 bMoreWeeks = dayAdd();
00129 }
00130 for( ; iDay<7; iDay++ )
00131 {
00132 rCan << "<td class='empty'> </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
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