// calendar.js
// Author: Jeff Q. Nguyen 
// Copyright 2004
    
	var monthNames = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
	// var dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

/********************************************************************************************
 FUNCTION DEFINITIONS FOR PRIMARY AND SECONDARY LEVEL OBJECTS FOR EACH EVENT OBJECT ELEMENT
*********************************************************************************************/

	function Event(headline, venue, date, prices, optLink, optPhoto, descript) {
	         this.headline = headline;
		 this.venue = venue;
		 this.date = date;
		 this.prices = prices;
		 this.optLink = optLink;
		 this.optPhoto = optPhoto;
		 this.descript = descript;
	}
	
	function EventDate(year, month, day, dayOfWeek, time) {
	     this.year = year;
		 this.month = month;
		 this.day = day;
		 this.dayOfWeek = dayOfWeek;
		 this.time = time;
	}
	
	function Prices(price1, price2, price3, advTicket) {
	     this.general = price1;
		 this.student = price2;
		 this.senior  = price3;
		 this.advTicket = advTicket;
	}
	
	function OptLink(text, href) {
	     this.text = text;
		 this.href = href;
	}

/********************************************************************************************
 FUNCTION DEFINITIONS FOR GET FORMATTED STRINGS: PRICE, DATE, LINK, IMAGE
*********************************************************************************************/


	function getPriceString(priceArray) {
	         var priceString = "";
	         if ((priceArray.general == 0) && (priceArray.student == 0) && (priceArray.senior == 0)) {
			     priceString = "<span style='color: #900;'>" + "free admission" + "</span>";
			 } else {
				if (priceArray.general != 0) { priceString += "<span style='color: #360;'>" + "general $" + priceArray.general + "</span> | "; }
				if (priceArray.student != 0) { priceString += "<span style='color: #066;'>" + "student $" + priceArray.student + "</span> | "; }
				if (priceArray.senior != 0) { priceString += "<span style='color: 663;'>" + "senior $" + priceArray.senior + "</span> | "; }
			 }
			 return (priceString);
	}
	
	function getDateString(dateObject) {
	         var dateString = monthNames[dateObject.month] + " " + dateObject.day + ", " + dateObject.year;
	         return (dateString);
	}
	
	function getLinkString(linkObject) {
	         var linkString = "";
			 if ((linkObject.text != "") && (linkObject.href != ""))  {
			    linkString = "<a href='" + linkObject.href + "' " + "title='" + linkObject.text + "'>" + linkObject.text + "</a>";
			 } else { linkString = "&nbsp;"; } 
			 return (linkString);
	}

    // creates a target name that links between the preview descript and the calendar.
    function getLinkFragment(calendar, i) {
		     var frag = calendar[i].date.dayOfWeek.substring(0, 3) + 
			            calendar[i].date.month + "." + 
						calendar[i].date.day + "." + calendar[i].date.year;
			 return (frag);
	}
	
	function createLinkFragment(calendar, m,d) {
		     var frag = calendar[m][d].date.dayOfWeek.substring(0, 3) + 
			            calendar[m][d].date.month + "." + 
						calendar[m][d].date.day + "." + calendar[m][d].date.year;
			 return (frag);
	}
	
	
	function createLinkFrag(calendar, n) {
		     var frag = calendar[n].date.dayOfWeek.substring(0, 3) + 
			            calendar[n].date.month + "." + 
						calendar[n].date.day + "." + calendar[n].date.year;
			 return (frag);
	}

	function getImageString(image) {
		     var imageString = "";
			 if (image != "") {
				 imageString = "<img alt='" + image + "' " + "src='" + "../images/calendar/calPhotos/" + image + "' " + "width='75' height='75' align='right' style='margin-left: 10px;'" + " />";
			 } else { imageString = "&nbsp;"; }
			 return (imageString);
	}
	
	// *********************************************************************
	
  function getNumMonths(dbCal) {
	   var prevMonth = 0;
	   var numMonths = 0;
			 
	   for (i = 0; i < dbCal.length; i++) {
	        var currMonth = dbCal[i].date.month;
			if (currMonth != prevMonth) { numMonths++; }
			prevMonth = currMonth;
	   }
	   return (numMonths);
  }
  
  function getNumYears(dbCal) {
       var prevYear = 0;
	   var numYears = 0;
	   
	   for (i = 0; i < dbCal.length; i++) {
	        var currYear = dbCal[i].date.year;
			if (currYear != prevYear) { numYears++; }
			prevYear = currYear;
	   }
	   return (numYears);
  }
  
  // RETURNS THE ARRAY INDEX OF THE SOONEST EVENT
  function getSoonestEvent(events) {
	       //get today's date
		   var now = new Date();
               // alert(now);
	       var today = new EventDate(now.getFullYear(), (now.getMonth() + 1), now.getDate());		

	  
	       for (var i = 0; i < events.length; i++) {

                      // if      (YEARS MATCH)  && (MONTHS MATCH) && (DATE HAS NOT PASSED)
                      // else if (YEARS MATCH)  && (MONTHS CONSEC)
                      // else if (YEARS CONSEC)
                      // else    (EMERGENCY MEASURE: DISPLAY ENTIRE CALENDAR W/O REGARD TO TODAY' DATE)
	        	 
                      if ((today.year == events[i].date.year) && (today.month == events[i].date.month) && (today.day <= events[i].date.day)) {
                         var soonest = i; break;
                      }
                      
                      if ((today.year == events[i].date.year) && (today.month < events[i].date.month)) {
                         var soonest = i; break;
                      }

                      if (today.year < events[i].date.year) {
                         var soonest = i; break;
                      }
	       }  

		   return (soonest);
  }



/********************************************************************************************
 FUNCTION DEFINITIONS FOR GET FORMATTED STRINGS: PRICE, DATE, LINK, IMAGE
*********************************************************************************************/
  
  
  function createCal(events) {

		   var soonest = getSoonestEvent(events);
		   var now = new Date();
		   var lastMonth = 0;
		   var html = "";

           html += '<table cellpadding="0" cellspacing="0" id="calendar">';

		   for (var j = soonest; j < events.length; j++) {
		        var todaysMonth = events[j].date.month;

		   if ((todaysMonth != lastMonth)) {
               html += '<tr><td colspan="2" class="spacer">&nbsp;</td></tr>'; 
		       html += '<tr><th colspan="2">' + monthNames[todaysMonth].toUpperCase() + '</th></tr>';
			   lastMonth = todaysMonth;
		   }
			   
		   html += '<tr>';
		   /* LEFT ROW */
		   
		   html += '<td width="111" height="95" style="padding-right: 5px; background-position: -6px 15px; background-repeat: no-repeat; background-image: url(../images/calendar/calNumbers/' + events[j].date.day + '.gif)">';
              html += '<p class="dateRow">' + '<a name="' + createLinkFrag(events, j) + '">' + '</a> ' + events[j].date.dayOfWeek + '</p>';
	          html += '<p class="time">' + events[j].date.time + '<br />&nbsp;</p>';
	          html += '<p class="venue">' + events[j].venue + '</p>';  
		   html += '</td>';	   
		   
		   /* RIGHT ROW */
		   html += '<td>';
			   
			   html += '<p class="dateRow" style="text-align: right;">' + getDateString(events[j].date) + '</p>';
	           html += '<p class="headline">'; 
			   if (events[j].prices.advTicket) { 
			     html += '<img src="../images/calendar/ticket.gif" align="left" width="35" height="54"> '; 
			   }	
			   
			   html += events[j].headline + '</p>';
			   html += '<p class="descript">';
			   
			   if (events[j].optPhoto != "") { html += getImageString(events[j].optPhoto); }
			  
			   html += events[j].descript;
			   
			   if (getLinkString(events[j].optLink) != "&nbsp;") { 
			       html += " | ";
				   html += getLinkString(events[j].optLink);
				   html += '</p>';
			   }
			   html += '<p class="price">' + getPriceString(events[j].prices) + '</p>';
		   html += '</td></tr>';
		   }
		   html += '</table>';
		   
		   document.write(html);
  }
  
  /* PROBLEMS WITH THE FUNCTION: COMPLICATED CSS POSITIONING DOES NOT IMPLEMENT WELL IN INTERNET EXPLORER 
     HENCE, RESORT TO THE ALTERNATIVE PARADIGM ABOVE: LAYOUT WITH CSS.*/
  function createCalendarYear(events) {
		
		   for (var m = 0; m < events.length; m++) {
			   
			   document.write('<table id="calendar" border="0" cellpadding="0">');
			   document.write('<tr><td class="monthRow"><div class="monthTop">' + 
			                   monthNames[events[m][0].date.month].toUpperCase() + '</div></td></tr>');
		   
		       for (var d = 0; d < events[m].length; d++) { 
		   //--	   
		            var html = "";
						
						if (d != events[m].length - 1) {
						    html += '<tr><td class="eventBox" style="clear: right; background-position: left 15px; background-repeat: no-repeat; background-image: url(../images/calendar/calNumbers/' + events[m][d].date.day + '.gif)">';
						} else {
						    html += '<tr><td class="eventBox" style="border-bottom: none; clear: right; background-position: left 15px; background-repeat: no-repeat; background-image: url(../images/calendar/calNumbers/' + events[m][d].date.day + '.gif)">';
						}
					  
				        //-- FORMAT DATEROW
				        html += '<div class="dateRow">' + '<a name="' + createLinkFragment(events, m, d) + '">' + '</a>';
	                    html +=   '<div style="float: left;">' + events[m][d].date.dayOfWeek + '</div>';
	                    
						html +=   '<div style="float: right;">' + getDateString(events[m][d].date) + '</div>';
	                    html += '</div>';
				//--  FORMAT LEFT COLUMN
				        html += '<div class="leftCol">';
		                html +=   '<div style="width: 100%; border: none;">';
		                html +=     '<p class="event">' + events[m][d].date.time + '</p>';
			            html +=     '<p class="descript"><i>' + events[m][d].venue + '</i></p>';
		                html +=   '</div>';
		                html += '</div>';
			    //-- FORMAT RIGHT COLUMN
				        html += '<div class="rightCol">';
		                html +=   '<div style="float: left; width: 100%;">';   
 		                html +=     '<p class="event">' + events[m][d].headline + '</p>';
		                html +=     '<p class="descript">';
			          
					  if (events[m][d].optPhoto != "") {
					    html += getImageString(events[m][d].optPhoto);
					  }
			            html += events[m][d].descript;
						html +=     '</p>';
		                html +=   '</div>';

				        html +=   '<div class="footer">'; // getLinkString(events[m][d].optLink)
			            html +=     '<div style="float: left; margin: 10px 0; width: 150px;">' + getLinkString(events[m][d].optLink) + '</div>';
			            html +=     '<div style="float: right; margin: 10px 0;">' + getPriceString(events[m][d].prices) + '</div>';
		                html +=   '</div>';
				        html += '</div>';
				//--
				        html += '</td></tr>';
						document.writeln(html);
		   //--
		       }
			   
			   // document.write('<tr><td class="monthRow" style="padding-bottom: 50px"><div class="monthBottom">' + 
			   //                '&nbsp;' + '</div></td></tr>');
			   
			   document.write('</table>'); 
		   }  //closes the outerforloop
		   
    } // closes the function
	
	function showUpcoming(calDB) {
						  
		     var maximum = 0;
			 var soonest = getSoonestEvent(calDB);

			 // DISPLAY THE PREVIEW FOR THE NEXT FIVE EVENTS
			 while ((soonest < calDB.length) && (maximum < 5)) {
			           document.write('<div class="dateline">' + calDB[soonest].date.dayOfWeek.substring(0, 3) + ", " + calDB[soonest].date.month + "/" + calDB[soonest].date.day + " @ " + calDB[soonest].date.time + '</div>');
			           document.write('<div class="headline">' + '<a href="../Events/calendar.html#' + getLinkFragment(calDB, soonest) + '" title="' + calDB[soonest].descript + '">' + calDB[soonest].headline + '</a>' + '</div>');
			           document.write('<p class="venue"><i>' + calDB[soonest].venue + '</i><p>');
					   soonest++;
					   maximum++;
	         }
	}
	
	
	