var alldays = "MTWHF"
//         M   T   W   Th  F
bsMTWThF = 1 + 2 + 4 + 8 + 16
bsTTh = 2 + 8
bsMWF = 1 + 4 + 16
bsMW = 1 + 4
bsT = 2
bsTh = 8

function getDayTimes(t, isActivity) {
	var DT = {}
	t = t.replace(/\s+/g," ").replace(/\:/g,"").replace(/^\s+/,"")
	if (t.indexOf("(") >= 0) {
		DT.title = t.substring(t.indexOf("("))
		t = t.substring(0, t.indexOf("("))
	}
	if (t == "")return {}
	t = t.replace(/\./g,"")
		.replace(/am/ig,"AM").replace(/pm/ig,"PM")
		.replace(/ AM/g,"AM").replace(/ PM/g,"PM")
		.replace(/\ \-/g,"-").replace(/\-\ /g,"-")
	DT.daycode = t
	var S=t.split(" ")
	if (S.length < 2)return {}
	var days = S[0].replace(/Th/,"H")
	var times = S[1] 
	if (days.indexOf("-") >= 0) {
		S = days.split("-")
		days = alldays.substring(alldays.indexOf(S[0]), alldays.indexOf(S[1]) + 1)
	}
	DT.bsDays = 0
	DT.days = ""
	for (i = 0, n = 1; i < 5; i++, n<<=1)
		if (days.indexOf(alldays.charAt(i))>=0) {
			DT.bsDays += n
			DT.days += alldays.charAt(i)
		}
	DT.isMWF = ((DT.bsDays & bsMWF) != 0)
	DT.isTTh = ((DT.bsDays & bsTTh) != 0)

	S = times.split("-")
	if (S.length < 2)return {}
	var isAM1 = (S[0].indexOf("AM")>=0)
	var isAM2 = (S[1].indexOf("AM")>=0)
	var isPM1 = (S[0].indexOf("PM")>=0)
	var isPM2 = (S[1].indexOf("PM")>=0)
	var time1 = parseInt(S[0].replace(/^0/,""))
	var time2 = parseInt(S[1].replace(/^0/,""))
	if (time1 < 100) time1 *= 100
	if (time2 < 100) time2 *= 100
	
	if (isAM1) {
		if (!isAM2 && !isPM2) isPM2 = true
	} else if (isPM1) {
		if (!isAM2 && !isPM2) isPM2 = true
	} else {
		if (isAM2) {
			//9-10 AM
			isAM1 = true
		} else if (isPM2) {
			// 11:45 - 1:45 PM
			// 11:45 - 12:45 PM (counts as 0:45 PM)
			// 3-5 PM
			isAM1 = (time1 >= time2%1200)
			isPM1 = !isAM1
		} else {
			if (time1 > time2%1200) {
				// 8-5
				isAM1 = true
				isPM2 = true
			} else if (time1 < 800) {
				// 7-9
				isPM1 = isPM2 = true
			} else {
				isAM1 = isAM2 = true
			}
		}
	}

	if (isPM1 && time1 < 1200) time1 += 1200
	if (isPM2 && time2 < 1200) time2 += 1200

	isAM1 = (time1 < 1200 && time2 >= 1200)
	isPM1 = false
	isAM2 = (time2 < 1200)
	isPM2 = (time2 >= 1200)

	DT.Times = [time1,time2]
	DT.daytimes = DT.days.replace(/H/,"Th") + " " + fixtimeof(time1) + (isPM1 ? " PM" : isAM2 ? " AM" : "") 
		+ "-" + fixtimeof(time2) + (isPM2 ? " PM": isAM2 ? " AM" : "")
	DT.daytimesExact = DT.days.replace(/H/,"Th") + " " + fixtimeof(time1) + (time1 < 1200 ? " AM" : " PM")  
		+ " - " + fixtimeof(time2) + (time2 < 1200 ? " AM" : " PM")
	if (time2 <= time1) {
		alert("invalid time: " + DT.daytimesExact)
		return {}
	}
	return DT
}

function isConflict(DT1, DT2) {
	var bsDays = (DT1.bsDays & DT2.bsDays);
	if (bsDays == 0) return false
	var iday = 1
	for (var i = 0; i < 5; i++, iday <<= 1) {
		//bsMTWThF = 1 + 2 + 4 + 8 + 16
		if ((bsDays && iday) != 0 && DT1.Times[0] < DT2.Times[1] && DT1.Times[1] > DT2.Times[0])
			return true
	}
	return false
}


function fixtimeof(t) {
	var hr = Math.floor(t / 100)
	if (hr > 12) hr -= 12
	var min = t % 100
	if (min < 10) min = "0" + min
	return hr + ":" + min
}

function mycolorof(bsDays,ismwf) {
	if (ismwf) {
		var mwf = (bsDays & bsMWF)
		if (mwf == bsMWF) return "red"
	} else {
		var tth = (bsDays & bsTTh)
		if (tth == bsTTh) return "blue"
		if (tth == bsT) return "cyan"
		return "violet"
	}
	return "purple"
}

function getBars(isMWF, DT, color, divisor) {
	if (!divisor)divisor = 4
	var time1 = DT.Times[0] - 600
	var time2 = DT.Times[1] - 600
	time1 = (Math.floor(time1 / 100) + (time1 % 100)/60)*100
	time2 = (Math.floor(time2 / 100) + (time2 % 100)/60)*100
	if (isMWF && !DT.isMWF || !isMWF && !DT.isTTh) time2 = time1
	var w1 = Math.floor(time1 / divisor)
	var w2 = Math.floor((time2 - time1) / divisor)
	var w3 = Math.floor((2200 - 600 - time2) / divisor)
	return "<td width='" + w1 + "'></td>"
		+(w2 == 0 ? "" : "<td title='"+DT.daytimes + "' style='background-color:" + color + "' width=" + w2 + "></td>")
//+"<td>" + w1 + " " + w2 + " " + w3 + " " +(time2-time1) + " " + time1 + " " + time2 + "</td>"
		+"<td width='" + w3 + "'></td>"
}



/*
[A]MWF 800-855
[B]MWF 905-1000
[C]T 0935-1100, Th 0930-1050
;
[AL]M 1150-0250PM
[BL]M 0300-0600PM
[CL]T 0800-1100
[DL]T 1145-0245PM
[EL]T 0300-0600PM
[FL]W 0200-0500PM
[GL]Th 0800-1100
[HL]Th 1250-0350PM

*/

function getDayTimeSetsWithLabels(data) {
	var DTsets = []
	var D = data.replace(/\,/,"[]").split(";")
	var slast = ""	
	for (var d = 0; d < D.length;d++) {
		DTsets[d] = DTs = []
		var S = D[d].split("[")
		for (var i = 1; i < S.length; i++) {
			var SS = S[i].split("]")
			var DT = DTs[i-1] = getDayTimes(SS[1])
			DT.name = SS[0]
			if (!DT.name)DT.name = slast+"_"
			slast = DT.name
		}
	}
	return DTsets
}

function getDayTimeSetFromColumns(ColData) {
	var DTs = []
	for (var i = 0; i < ColData.length; i++) {
		var DT = (ColData[i] ? getDayTimes(ColData[i]) : {})
		//alert(i + " >" + ColData[i] + "< " + DT.dayTimes + " " + ColData[i].split(" "))
		if (DT && DT.Times)DTs[DTs.length] = DT
	}
	return DTs
}

