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 #include "ocString.h"
00024 #include "ocTypes.h"
00025
00026
00027
00028
00029
00030 cgiCalendar::cgiCalendar( aString & year, aString & month, aString day )
00031 :cgiCan( "table", " class='calendar'" ),headerPos(posTop),isDayMode(false)
00032 ,dayTemplate("<div class='day'>$day</div>"),timeTemplate("<div class='time'>$time</div>"),iHourStart(6),iHourEnd(22)
00033 {
00034 char buffer[256];
00035 const char * DateFmt = "%Y-%m-%d";
00036 aString strDate;
00037 if(year.length()>0 && month.length()>0)
00038 {
00039
00040 memset( &m_tm, 0, sizeof(tm) );
00041 m_tm.tm_year = atol( year.str() ) - 1900;
00042 m_tm.tm_mon = atol( month.str() ) -1;
00043 m_tm.tm_mday = 1;
00044 if( day.length() )
00045 {
00046 m_tm.tm_mday = atol( day.c_str() );
00047 isDayMode = true;
00048 }
00049 fixTime(&m_tm);
00050 }
00051 else
00052 {
00053
00054 currentTime(&m_tm);
00055 m_tm.tm_mday = 1;
00056 fixTime(&m_tm);
00057 }
00058
00059 weekDayHeader = "<tr class='weekdays'><th class='weekday'>Sunday</th>"
00060 "<th class='weekday'>Monday</th><th class='weekday'>Tuesday</th>"
00061 "<th class='weekday'>Wednesday</th><th class='weekday'>"
00062 "Thursday</th><th class='weekday'>Friday</th><th class='weekday'>Saturday</th></tr>";
00063
00064 }
00065
00066 void cgiCalendar::WeekDayHeader( string newWeekDayHeader )
00067 {
00068 weekDayHeader = newWeekDayHeader;
00069 }
00070
00071 bool cgiCalendar::fill( timeItems & items, const char * url )
00072 { char buffer[512];
00073 bool bRet = false;
00074 cgiCan & rCan = *this;
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 header = "<tr class='month'><th colspan='2'>";
00086 if( url )
00087 {
00088 header += "<a href='";
00089 header += url;
00090 header += "?";
00091 tm prevTm = m_tm;
00092 fixTime(&prevTm);
00093 fmtTime(buffer, sizeof(buffer), "month=%m&year=%Y", &prevTm );
00094 header += buffer;
00095 header += "'> ";
00096 fmtTime(buffer, sizeof(buffer), "%A %B %d, %Y", &prevTm );;
00097 header += buffer;
00098 header += " </a>";
00099 }
00100 if( headerPos == posTop || headerPos == posBoth )
00101 {
00102 rCan << header << endl;
00103 }
00104
00105 bRet = fillHalfHours( items );
00106 if( headerPos == posBottom || headerPos == posBoth )
00107 {
00108 rCan << header << endl;
00109 }
00110 return bRet;
00111 }
00112 bool cgiCalendar::fillHalfHours ( timeItems & items )
00113 { bool bRet = false;
00114 char buffer[256];
00115 for( int iHour=iHourStart; iHour<=iHourEnd; iHour++)
00116 {
00117 snprintf(buffer, sizeof(buffer), "%.2d:00", iHour);
00118 string key = buffer;
00119 fillHalfHour( items, key );
00120 snprintf(buffer, sizeof(buffer), "%.2d:30", iHour);
00121 key = buffer;
00122 fillHalfHour( items, key );
00123 }
00124 return bRet;
00125 }
00126 bool cgiCalendar::fillHalfHour ( timeItems & items, string & key )
00127 { bool bRet = false;
00128 cgiCan & rCan = *this;
00129 string strClass;
00130 ocString test = key;
00131 if( test.regExMatch(":00") ) strClass = "even"; else strClass = "odd";
00132 rCan << "<tr class='" << strClass << "'>";
00133 time_date td;
00134 td.parse(key.c_str(),"%H:%M");
00135 ocString timeTemp = timeTemplate.c_str();
00136 rCan << "<tr class='" << strClass
00137 << "'><th class='" << strClass
00138 << "'>" << timeTemp.replaceAll("$time24",key.c_str())
00139 .replaceAll("$time",td.format( "%I:%M %p" ).c_str())
00140 << "<td class='" << strClass
00141 << "'>" << endl;
00142 timeItems::iterator pos;
00143 for( pos = items.lower_bound(key);
00144 pos != items.upper_bound(key);
00145 ++pos )
00146 {
00147 rCan << " " << pos->second << "<br>" << endl;
00148 }
00149 rCan << "</td></tr>" << endl;
00150 return bRet;
00151 }
00152 bool cgiCalendar::fill( dayItems & items, const char * url )
00153 {
00154 char buffer[256];
00155 bool ret = false;
00156 cgiCan & rCan = *this;
00157 header = "<tr class='month'><th colspan='7'>";
00158 if( url )
00159 {
00160 header += "<a href='";
00161 header += url;
00162 header += "?";
00163 tm prevTm = m_tm;
00164 prevTm.tm_mon -= 1;
00165 fixTime(&prevTm);
00166 fmtTime(buffer, sizeof(buffer), "month=%m&year=%Y", &prevTm );
00167 header += buffer;
00168 if( addedCriteria.length() )
00169 {
00170 header += "&" + addedCriteria;
00171 }
00172 header += "'> << </a>";
00173
00174 }
00175
00176 fmtTime(buffer, sizeof(buffer), "%B %Y", &m_tm );
00177 header += " ";
00178 header += buffer;
00179 header += " ";
00180 if( url )
00181 {
00182 header += "<a href='";
00183 header += url;
00184 header += "?";
00185 tm nextTm = m_tm;
00186 nextTm.tm_mon += 1;
00187 fixTime(&nextTm);
00188 fmtTime(buffer, sizeof(buffer), "month=%m&year=%Y", &nextTm );
00189 header += buffer;
00190 if( addedCriteria.length() )
00191 {
00192 header += "&" + addedCriteria;
00193 }
00194 header += "'> >> </a></th></tr>";
00195 }
00196
00197 if( headerPos == posTop || headerPos == posBoth )
00198 {
00199 rCan << header << endl;
00200 }
00201 rCan << weekDayHeader << endl;
00202
00203 ret = fillDays( items );
00204
00205 if( headerPos == posBottom || headerPos == posBoth )
00206 {
00207 rCan << header << endl;
00208 }
00209 return ret;
00210 }
00211
00212 bool cgiCalendar::fillDays ( dayItems & items )
00213 {
00214 char classBuf[256];
00215 cgiCan & rCan = *this;
00216 bool bMoreWeeks = true;
00217 int iDay, iWeek=1, iMonth = m_tm.tm_mon;
00218 while( bMoreWeeks && m_tm.tm_mday <= 31)
00219 {
00220 if( iWeek%2==0 ) strcpy(classBuf,"even");
00221 else strcpy(classBuf,"odd");
00222 rCan << "<tr class='" << classBuf << "'>";
00223 for( iDay = 0; iDay < m_tm.tm_wday; iDay++ )
00224 {
00225 rCan << "<td class='empty'> </td>";
00226 }
00227 for( ; iDay<7 && bMoreWeeks; iDay++ )
00228 {
00229 aString dayTemp = dayTemplate;
00230 ocString dayVal;
00231 dayVal.append(m_tm.tm_mday);
00232 dayTemp.replaceFoundWith("$day", dayVal.c_str());
00233 rCan << "<td class='mday'>" << dayTemp;
00234 fillDay( items );
00235 rCan << "</td>";
00236 bMoreWeeks = dayAdd();
00237 }
00238 for( ; iDay<7; iDay++ )
00239 {
00240 rCan << "<td class='empty'> </td>";
00241 }
00242 rCan << "</tr>" << endl;
00243 iWeek ++;
00244 }
00245 return true;
00246 }
00247 bool cgiCalendar::fillDay ( dayItems & items )
00248 {
00249 cgiCan & rCan = *this;
00250
00251 dayItems::iterator pos;
00252 for( pos = items.lower_bound(m_tm.tm_mday);
00253 pos != items.upper_bound(m_tm.tm_mday);
00254 ++pos )
00255 {
00256 rCan << pos->second << "<br>";
00257 }
00258 return true;
00259 }
00260
00261 bool cgiCalendar::dayAdd( void )
00262 {
00263 bool bMoreWeeks = false;
00264 int iMonth = m_tm.tm_mon;
00265 m_tm.tm_mday+=1;
00266 long lRet = fixTime(&m_tm);
00267 if ( lRet != -1 )
00268 {
00269 bMoreWeeks = (iMonth == m_tm.tm_mon);
00270 }
00271 return bMoreWeeks;
00272 }
00273
00274 string & cgiCalendar::strYear( void )
00275 {
00276 char buffer[256];
00277 fmtTime(buffer, sizeof(buffer), "%Y", &m_tm );
00278 m_formatted = buffer;
00279 return m_formatted;
00280 }
00281
00282 string & cgiCalendar::strMonth( void )
00283 {
00284 char buffer[256];
00285 fmtTime(buffer, sizeof(buffer), "%m", &m_tm );
00286 m_formatted = buffer;
00287 return m_formatted;
00288 }
00289
00290 int cgiCalendar::year ( void )
00291 {
00292 return 1900 + m_tm.tm_year;
00293 }
00294
00295 int cgiCalendar::month( void )
00296 {
00297 return 1 + m_tm.tm_mon;
00298 }
00299
00300 cgiCalendar::~cgiCalendar()
00301 {
00302 ;
00303 }
00304