How to Create a Perpetual Calendar Using Active Server Pages (245566)



The information in this article applies to:

  • Microsoft Internet Information Services 5.0

This article was previously published under Q245566

SUMMARY

This article demonstrates how to create a Web page calendar that will not easily go out of date using Microsoft Active Server Pages (ASP).

MORE INFORMATION

Microsoft provides programming examples for illustration only, without warranty either expressed or implied. This includes, but is not limited to, the implied warranties of merchantability or fitness for a particular purpose. This article assumes that you are familiar with the programming language that is being demonstrated and with the tools that are used to create and to debug procedures. Microsoft support engineers can help explain the functionality of a particular procedure, but they will not modify these examples to provide added functionality or construct procedures to meet your specific requirements. Save the following code to your Web site as "Calendar.asp" in a folder that has at least "script" access defined. When the page is browsed, it will display a calendar with menu buttons that will allow a Web client to choose to display the next or previous month's calendar.
<% @Language="vbscript" %>
<%
  
  ' force declaration of all variables
  Option Explicit
  
  Dim intYear, intMonth, intDay
  Dim intNumberOfDays, strDaysInMonths
  Dim strDate, strMonthName
  Dim strStyle, strTitle
  Dim strMethod, strURL  
  Dim strFirstDay, strLastDay, strCurrentDay
  Dim dtmPrev, dtmNext
  Dim X,Y,Z
  
  ' find out the URL of the page and the HTTP method used
  strMethod = UCase(Request.ServerVariables("REQUEST_METHOD"))
  strURL = LCase(Request.ServerVariables("URL"))
  
  ' if it's a GET then it's a regular browser request
  If strMethod="GET" Then
  
    ' use today's date
    intDay   = CInt(Day(Date()))
    intMonth = CInt(Month(Date()))
    intYear  = CInt(Year(Date()))
    
    strFirstDay = CStr(intMonth) & "-1-" & CStr(intYear)
    strDate  = CStr(intMonth) & "-" & CStr(intDay) & "-" & CStr(intYear)
    
  ' if it's a POST then it's a specific request
  Else
    
    ' get the submitted date
    intDay   = CInt(Day(Date()))
    intMonth = CInt(Request.Form("txtMonth"))
    intYear  = CInt(Request.Form("txtYear"))
    
    strFirstDay = CStr(intMonth) & "-1-" & CStr(intYear)
    strDate     = strFirstDay
    
  End If
  
  ' is a date in a leap year?
  Function IsLeapYearDate(dtmTestDate)
    IsLeapYearDate = False
    If IsDate(dtmTestDate) Then
      Dim dtmTempDate
      dtmTempDate = "1/31/" & Year(dtmTestDate)
      dtmTempDate = DateAdd("m", 1, dtmTempDate)
      If Day(dtmTempDate) = 29 Then IsLeapYearDate = True
    End If
  End Function

  ' create string of days in months
  If IsLeapYearDate("1/1/" & intYear) Then      
    strDaysInMonths = "312931303130313130313031"
  Else
    strDaysInMonths = "312831303130313130313031"
  End If
  
  ' get some date stuff
  strMonthName    = CStr(MonthName(intMonth))
  intNumberOfDays = CInt(Mid(strDaysInMonths,((intMonth-1)*2)+1,2))
  strLastDay      = CStr(intMonth) & "-" & intNumberOfDays & "-" & CStr(intYear)
  
  ' build the page title
  strTitle = "Calendar for " & strMonthName & " " & intYear

  ' get the next and previous months for the menus
  dtmPrev = CDate(DateAdd("m", -1, strDate))
  dtmNext = CDate(DateAdd("m",  1, strDate))
  
%>
<html>
<head>
<title><%=strTitle%></title>
</head>

<body>

<h1 align="center"><%=strTitle%></h1>

<center>
  <table border="0" width="100%">
    <tr>
      <td align="left">
        <form action="<%=strURL%>" method="POST">
          <input type="hidden" name="txtMonth" value="<%=Month(dtmPrev)%>">
          <input type="hidden" name="txtYear" value="<%=Year(dtmPrev)%>">
          <input type="submit" style="width:150" value="View <%=MonthName(Month(dtmPrev))%>">
        </form>
      </td>
    <% If (intMonth <> Month(Date())) Or (intYear <> Year(Date())) Then %>
      <td align="center">
        <form action="<%=strURL%>" method="POST">
          <input type="hidden" name="txtMonth" value="<%=Month(Date())%>">
          <input type="hidden" name="txtYear" value="<%=Year(Date())%>">
          <input type="submit" style="width:150" value="View Current Month">
        </form>
      </td>
    <% End If %>
      <td align="right">
        <form action="<%=strURL%>" method="POST">
          <input type="hidden" name="txtMonth" value="<%=Month(dtmNext)%>">
          <input type="hidden" name="txtYear" value="<%=Year(dtmNext)%>">
          <input type="submit" style="width:150" value="View <%=MonthName(Month(dtmNext))%>">
        </form>
      </td>
    </tr>
  </table>
</center>

<hr>

<table border="1" cellpadding="2" cellspacing="2" width="100%">
<tr>
<%
  ' print the weekday names
  For X = 1 to 7
    Response.Write "<th width=""14%"">" & WeekdayName(X) & "</th>" & vbCrLf
  Next
%>
</tr>
<tr>
<%  
  ' print empty table cells for the beginning days not in the current month
  If (Weekday(strFirstDay)-1) Then  
    For X = 1 to (Weekday(strFirstDay)-1)
      Response.Write "<td>&#xa0;</td>" & vbCrLf
    Next
  End If

  ' loop through the days in the current month
  For X = 1 to intNumberOfDays

    ' get the day we're working on
    strCurrentDay = CStr(intMonth) & "-" & X & "-" & CStr(intYear)
    
    
    ' start the table cell for a day
    Response.Write "<td id=""" & X & """ align=""left"" valign=""top"">"
    Response.Write "<a name=""" & X & """>" & X & "</a><br>" & vbCrLf
    
    ' *** NOTE - The following case section can be optional when database functionality is added
    ' ***  e.g. if no database record exists for a given day, then use the case section
    
    Select Case Weekday(strCurrentDay)
      Case 2
        Response.Write "<u>9:00am</u><br><i>Monday's activities</i><br>" & vbCrLf
      Case 3
        Response.Write "<u>9:00am</u><br><i>Tuesday's activities</i><br>" & vbCrLf
      Case 4
        Response.Write "<u>9:00am</u><br><i>Wednesday's activities</i><br>" & vbCrLf
      Case 5
        Response.Write "<u>9:00am</u><br><i>Thursday's activities</i><br>" & vbCrLf
      Case 6
        Response.Write "<u>9:00am</u><br><i>Friday's activities</i><br>" & vbCrLf
      Case Else
        For Y = 1 To 2
          Response.Write "<br><br>" & vbCrLf
        Next
    End Select

    ' *** end of case section


    ' end the table cell for a day
    Response.Write "</td>" & vbCrLf

    ' if the current day is then end of a week then output the end of the table row
    If (Weekday(strCurrentDay) = 7) And (strCurrentDay <> strLastDay) Then
      Response.Write "</tr>" & vbCrLf & "<tr>" & vbCrLf
    End If

  Next

  ' print empty table cells for the ending days not in the current month
  If (7-Weekday(strLastDay)) Then  
    For X = 1 to (7-Weekday(strLastDay))
      Response.Write "<td>&#xa0;</td>" & vbCrLf
    Next
  End If
%>
</tr>
</table>

<hr>

</body>
</html>
				
Note that this ASP code could be modified to perform various functions, such as:
  • Display common daily events for a department
  • List the hours that a store is open
  • Integrate calendar events kept in a database
For more information on Microsoft scripting technologies, please see the Microsoft Developer Network (MSDN) Web site:

Modification Type:MajorLast Reviewed:6/23/2005
Keywords:kbCodeSnippet kbhowto kbScript KB245566