////////////////////////////////////////////////////////////////////////////////////////////////////
// hours.js: Display library open hours
// used by:
// http://lib.colostate.edu/ - library home page 
// http://lib.colostate.edu/about/hours/ including related pages for intersessions, breaks and exams
// http://lib.colostate.edu/about/news/bigscreen/ - large digital sign monitor near library entrance
// http://lib.colostate.edu/users/ - information for you (5 pages) 
//
// Greg Vogl
// Colorado State University Libraries
// Created: 2007-01-12 Last updated: 2009-11-20
////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////
// these hours need to be manually updated every semester - see below for editable part of this file
////////////////////////////////////////////////////////////////////////////////////////////////////

// get library hours for a date and return as opens-closes string
function getLibHours(today) {
	var year = today.getFullYear();
	var month = addZero(today.getMonth() + 1);
	var day = addZero(today.getDate());
	var weekday = today.getDay();
	var opens = 0;
	var closes = 24;

///////////////////////////////////////////////////////////////////////////////////////////
	// The following hours need to be updated every semester!
    // for days, 0=Sunday 1=Monday 2=Tuesday 3=Wednesday 4=Thursday 5=Friday 6=Saturday
	// for opening, midnight=0 6:30am=6.5 7am=7 noon=12 1pm=13
	// for closing, midnight=24 1am=25 2am=26 5pm=17 6pm=18 10pm=22

    // do not edit this file above this line

	// Holidays (library closed all day)
	if ((month==1 && (day==1 || day==18)) || //new year, MLK
	    (month==5 && (day==25)) || // Memorial day
	    (month==7 && (day==3 || day==4)) || // Independence day
	    (month==9 && (day==7)) || // Labor day
	    (month==11 && (day==26 || day==27)) || // Thanksgiving
		(month==12 && (day==23 || day==24 || day==25)) || // Christmas
		1==0) {
		closes = 0;
	}
	
	// Summer intersession hours: M-R 7am-6pm, F 7am-5pm, S-S 1-5pm
	else if (month==8 && day>=8 && day <=23)
	switch (weekday) {
		case 5: opens = 7; closes = 17; break;
		case 0: case 6: opens = 13; closes = 17; break;
		default: opens = 7; closes = 18; break;
	}
	
	// Non-summer intersession hours (winter, spring and fall breaks): M-F 7am-6pm, S-S 1-5pm
	else if ((month==12 && day>=19) || (month==1 && day<=17) 
		|| (month==3 && day>=12 && day <=20) 
		|| (month==11 && day>=20 && day <=28))
	switch (weekday) {
		case 0: case 6: opens = 13; closes = 17; break;
		default: opens = 7; closes = 18; break;
	}
	
	// Spring and Fall final exam hours 
	// pre-exam M-R 7am-2am, F 7am-1am, Sat 9am-1am, Sun 10am-2am
	else if (month==11 && day==29) { opens = 12; closes = 26; }
	else if ((month==4 && day>=27) || (month==5 && day<=10) || (month==11 && day==30) || (month==12 && day<=13))
	switch (weekday) {
		case 5: opens = 7; closes = 25; break;
		case 6: opens = 9; closes = 25; break;
		case 0: opens = 10; closes = 26; break;
		default: opens = 7; closes = 26; break;
	}
	// exam M-R 6:30am-2am, F 6:30am-6pm, Sat and Sun 1pm-5pm
	else if ((month==5 && day>=11 && day<=14) || (month==12 && day>=14 && day<=17)) 
		{ opens = 6.5; closes = 26; } 
	else if ((month==5 && day==15) || (month==12 && day==18)) 
		{ opens = 6.5; closes = 18; }
	else if ((month==5 && day>=15 && day<=16) || (month==12 && day>=19 && day<=20)) 
		{ opens = 13; closes = 17; }
	
	// Summer hours (May 18-Aug 7): M-R 7am-10pm, F 7am-5pm, Sat 9am-5pm, Sun 2pm-10pm
	else if ((month==5 && day>=17) || month==6 || month==7 || (month==8 && day<=6))
	switch (weekday) {
		case 5: opens = 7; closes = 17; break;
		case 6: opens = 9; closes = 17; break;
		case 0: opens = 14; closes = 22; break;
		default: opens = 7; closes = 22; break;
	}

	// Normal hours: M-R 7am-midnight, F 7am-10pm, Sat 9am-10pm, Sun noon-midnight
	else switch (weekday) {
		case 5: opens = 7; closes = 22; break;
		case 6: opens = 9; closes = 22; break;
		case 0: opens = 12; break;
		default: opens = 7; break;
	}
	
	// do not edit this file below this line
///////////////////////////////////////////////////////////////////////////////////////////
	return opens + '-' + closes;
}

// add a zero in front of numbers less than 10
function addZero(i) { if (i < 10) i = "0" + i; return i; } 

// display time in format hh:mmam (0=12am, 12=12pm, 24=12am, 25=1am)
function displayTime(hour) { 
	var ampm = hour<12 || hour >= 24 ? "am" : "pm";
	var h = Math.floor((hour+11)%12+1); 
	var m = Math.floor(60*(hour - Math.floor(hour))); 
	m = m == 0 ? "" : ":" + addZero(m);
	return h + m + ampm;
}

function hoursMinutes(today) {
	var hours = today.getHours();
	var minutes = today.getMinutes();
	var hm = hours + minutes/60;	
	return hm;
}

function currentTime() {
	var today = new Date();
	var year = today.getFullYear();
	var month = addZero(today.getMonth() + 1);
	var day = addZero(today.getDate());
	var weekday = today.getDay();
	var weekdays = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
	var hours = today.getHours();
	var minutes = today.getMinutes();
	var seconds = today.getSeconds();

	return displayTime(hours + minutes/60) + " " + weekdays[weekday] + " " + month + "/" + day + "/" + year;
}

// return open hours for a date
function libHours(openscloses) {
	oc = openscloses.split('-');
	opens = parseFloat(oc[0]);
	closes = parseFloat(oc[1]);
	var openToday = opens != closes;
	var libHours = "closed";
	if (openToday) {
		libHours = displayTime(opens) + "-" + displayTime(closes);
	}
	return libHours;
}

function libOpen(hm, openscloses) {
	oc = openscloses.split('-');
	opens = parseFloat(oc[0]);
	closes = parseFloat(oc[1]);
	var libOpenNow = "closed";
	var openToday = opens != closes;
	if (openToday) {
		var openNow = (hm >= opens && hm < closes);
		libOpenNow = openNow ? "open" : "closed";
	}	
	return libOpenNow;
}

function startTime()
{
	// get days and times
	var yesterday = new Date();
	var today     = new Date();
	var tomorrow  = new Date();
	 tomorrow.setDate( tomorrow.getDate()+1);
	yesterday.setDate(yesterday.getDate()-1);
	var hm = hoursMinutes(today);
	
	// get opening hours in opens-closes format
	var yesterdayHours = getLibHours(yesterday);
	var todayHours     = getLibHours(today);
	var tomorrowHours  = getLibHours(tomorrow);
	
	// check whether the library is open or closed
	// if before 6am, add 24 and check yesterday's hours
	if (hm < 6) hm += 24;
	var libOpenNow = libOpen(hm, hm > 24 ? yesterdayHours : todayHours);

	// display current time
	document.getElementById('currtime').innerHTML = currentTime();

	// display whether the library is open or closed
	document.getElementById('libOpenNow').innerHTML = libOpenNow;

	// display open hours
	document.getElementById('libHoursToday').innerHTML = libHours(todayHours);
	document.getElementById('libHoursTomorrow').innerHTML = libHours(tomorrowHours);

	// check again every 30 seconds
	var t = setTimeout('startTime()',30000);
}
