//This object is from Dustin Diaz. http://www.dustindiaz.com/add-remove-elements-reprise/
var Dom = {
	get: function(el) {
		if (typeof el === 'string') {
			return document.getElementById(el);
		} else {
			return el;
		}
	},
	add: function(el, dest) {
		var el = this.get(el);
		var dest = this.get(dest);
		dest.appendChild(el);
	},
	remove: function(el) {
		var el = this.get(el);
		el.parentNode.removeChild(el);
	}
};

//This object is from Dustin Diaz. http://www.dustindiaz.com/add-remove-elements-reprise/
var Event = {
	add: function() {
		if (window.addEventListener) {
			return function(el, type, fn) {
				Dom.get(el).addEventListener(type, fn, false);
			};
		} else if (window.attachEvent) {
			return function(el, type, fn) {
				var f = function() {
					fn.call(Dom.get(el), window.event);
				};
				Dom.get(el).attachEvent('on' + type, f);
			};
		}
	}()
};

//This function from Snipplr. http://snipplr.com/view/1696/get-elements-by-class-name/
function getElementsByClassName(classname, node)  {
    if(!node) node = document.getElementsByTagName("body")[0];
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}

//This function from Quirksmode. http://www.quirksmode.org/js/findpos.html
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

//This function from Snipplr. http://snippets.dzone.com/posts/show/4132
function mysqlTimeStampToDate(timestamp) {
	//function parses mysql datetime string and returns javascript Date object
	//input has to be in this format: 2007-06-05 15:26:02
	var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
	var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
	return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
}

//This function from Kae Verens. http://verens.com/archives/2005/07/25/isset-for-javascript/
function isset(varname){
  return(typeof(window[varname])!='undefined');
}

function makeAgenda() {
	var data = agenda.events;
	var contentRoot = Dom.get("content");
	var loopStarted = 0;
	var curDay = 0;
	var days = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
	var months = new Array("January", "February", "March", "April", "May", "June", "July", "Auguest", "September", "October", "November", "December");
	
	for(var i in data) {
		var startDate = mysqlTimeStampToDate(data[i].startDate);
		var endDate = mysqlTimeStampToDate(data[i].endDate);
		loopDay = startDate.getDate();
		
		//if curDay does not equal loopDay, print day table header and make curDay = loopDay
		if (curDay != loopDay) {
			//if not first iteration, add table to page
			if (loopStarted != 0) Dom.add(agendaTable, contentRoot);
			else loopStarted = 1;
			
			var agendaTable = document.createElement('table');
			var tableBody = document.createElement('TBODY');
			
			agendaTable.setAttribute("cellpadding", "0");
			agendaTable.setAttribute("cellspacing", "1");
			
			var tableHeaderRow = document.createElement('tr');
			
			var tableHeader = document.createElement('th');
			tableHeader.colSpan = 2;
			
			var tableHeaderString = document.createTextNode(days[startDate.getDay()]+', '+months[startDate.getMonth()]+' '+loopDay);
			
			Dom.add(tableBody, agendaTable);
			Dom.add(tableHeaderRow, tableBody);
			Dom.add(tableHeader, tableHeaderRow);
			Dom.add(tableHeaderString, tableHeader);
			
			curDay = loopDay;
		}
		
		//create table row
		var tableRow = document.createElement('tr');
		
		//format date string
		var dateDisplay = document.createElement('td');
		dateDisplay.innerHTML = formatTimeString(data[i].startDate, data[i].endDate);
		
		var titleDisplay = document.createElement('td');
		
		//format pop-up content and titleLink
		switch (data[i].type) {
		case 'event':
			var titleLink = document.createTextNode(data[i].title);
			Dom.add(titleLink, titleDisplay);
			break;
		case 'description_event':
		case 'twotrack_event':
		case 'deeptrack_event':
			var agendaDescription = eval('format_'+data[i].type+'(data[i])');
			var titleLink = document.createElement('a')
			titleLink.innerHTML = data[i].title;
			titleLink.className = 'hasDescription';
			Dom.add(titleLink, titleDisplay);
			titleDisplay.innerHTML += agendaDescription;
			break;
		}
		
		
		//add all components to tableRow
		Dom.add(titleDisplay, tableRow);
		Dom.add(dateDisplay, tableRow);
		
		//add tableRow to agendaTable
		Dom.add(tableRow, tableBody);
	}
	Dom.add(agendaTable, contentRoot);
	addLinks();
}

function showTracks() {
	var data = agenda.events;
	var contentRoot = Dom.get("content");
	var consultantHeader = '<h3><a class="expandCollapse" href="javascript:toggleDivText(\'dynamicTextDiv2\'), toggleVisibility(\'consultantTrack\')"><span id="dynamicTextDiv2">[+]</span> Consultant Track</a></h3>';
	var developerHeader = '<h3><a class="expandCollapse" href="javascript:toggleDivText(\'dynamicTextDiv1\'), toggleVisibility(\'developerTrack\')"><span id="dynamicTextDiv1">[+]</span> Developer Track</a></h3>';
	var consultantData = "";
	var developerData = "";
	
	for(var i in data) {
		switch(data[i].type) {
		case 'twotrack_event':
		case 'deeptrack_event':
			var formattedDates = formatDateString(data[i].startDate, data[i].endDate);
			consultantData += formatTrackSession(data[i].consultant, formattedDates);
			developerData += formatTrackSession(data[i].developer, formattedDates);
			break;
		}
	}
	
	consultantDiv = document.createElement('div');
	consultantDiv.id = 'consultantTrack';
	consultantDiv.innerHTML = consultantData;
	developerDiv = document.createElement('div');
	developerDiv.id = 'developerTrack';
	developerDiv.innerHTML = developerData;
	
	contentRoot.innerHTML += consultantHeader;
	Dom.add(consultantDiv, contentRoot);
	contentRoot.innerHTML += developerHeader;
	Dom.add(developerDiv, contentRoot);
}

function format_description_event(event) {
	/*FINAL RETURNED HTML FORMAT STYLE
	<div class="agendaDescription">
		<h3>event.description.header</h3>
		<h4>Formatted Time</h4>
		<p>event.description.content</p>
	</div>
	*/
	var formattedDates = formatDateString(event.startDate, event.endDate);
	var output = '<div class="agendaDescription">';
	output += '<h3>'+event.description.header+'</h3>';
	output += '<h4>'+formattedDates+'</h4>';
	output += event.description.content;
	output += '</div>';
	
	return(output);
}

function format_twotrack_event(event) {
	/*FINAL RETURNED HTML FORMAT STYLE
	<div class="agendaDescription">
		<h3>event.title</h3>
		<h4>Formatted Time</h4>
		<div class="consultant track">
			<h4>event.consultant.header</h4>
			<p>event.consultant.content</p>
		</div>
		<div class="developer track">
			<h4>event.developer.header</h4>
			<p>event.developer.content</p>
		</div>
	</div>
	*/
	var formattedDates = formatDateString(event.startDate, event.endDate);
	var output = '<div class="agendaDescription">';
	output += '<h3>'+event.title+'</h3>';
	output += '<h4>'+formattedDates+'</h4>';
	output += '<div class="consultant track">';
	output += '<h4><span>Consultant</span>'+event.consultant.header+'</h4>';
	output += event.consultant.content;
	output += '</div>';
	output += '<div class="developer track">';
	output += '<h4><span>Developer</span>'+event.developer.header+'</h4>';
	output += event.developer.content;
	output += '</div>';
	output += '</div>';
	
	return(output);
}

function format_deeptrack_event(event) {
	/*FINAL RETURNED HTML FORMAT STYLE
	<div class="agendaDescription">
		<h3>event.title</h3>
		<h4>Formatted Time</h4>
		<div class="consultant track">
			<h4>event.consultant[i].header</h4>
			<p>event.consultant[i].content</p>
		</div>
		...
		<div class="developer track">
			<h4>event.developer[i].header</h4>
			<p>event.developer[i].content</p>
		</div>
		...
	</div>
	*/
	var formattedDates = formatDateString(event.startDate, event.endDate);
	var output = '<div class="agendaDescription">';
	output += '<h3>'+event.title+'</h3>';
	output += '<h4>'+formattedDates+'</h4>';
	if(event.consultant.header) {
		output += '<div class="consultant track">';
		output += '<h4><span>Consultant</span>'+event.consultant.header+'</h4>';
		output += event.consultant.content;
		output += '</div>';
	}
	else {
		for(var i in event.consultant) {
			formattedTimes = formatTimeString(event.consultant[i].startDate, event.consultant[i].endDate);
			output += '<div class="consultant track">';
			output += '<h4><span>Consultant</span>'+ formattedTimes+' '+event.consultant[i].header+'</h4>';
			output += event.consultant[i].content;
			output += '</div>';
		}
	}
	if(event.developer.header) {
		output += '<div class="developer track">';
		output += '<h4><span>Developer</span>'+event.developer.header+'</h4>';
		output += event.developer.content;
		output += '</div>';
	}
	else {
		for(var i in event.developer) {
			formattedTimes = formatTimeString(event.developer[i].startDate, event.developer[i].endDate);
			output += '<div class="developer track">';
			output += '<h4><span>Developer</span>'+formattedTimes+' '+event.developer[i].header+'</h4>';
			output += event.developer[i].content;
			output += '</div>';
		}
	}
	output += '</div>';
	
	return(output);
}

function formatTrackSession(data, formattedDates) {
	/*FINAL RETURNED HTML FORMAT STYLE
	<div class="entry">
		<h4>data.header</h3>
		<h4>formattedDates</h4>
		<p>data.content</p>
	</div>
	*/
	var output = "";
	if (data.header) {
		output += '<div class="entry">';
		output += '<h3>'+data.header+'</h3>';
		output += '<h4>'+formattedDates+'</h4>';
		output += data.content;
		output += '</div>';
	}
	else {
		for(var i in data) {
			formattedDates = formatDateString(data[i].startDate, data[i].endDate);
			output += '<div class="entry">';
			output += '<h3>'+data[i].header+'</h3>';
			output += '<h4>'+formattedDates+'</h4>';
			output += data[i].content;
			output += '</div>';
		}
	}
	
	return(output);
}

function formatDateString(date1, date2) {
	var days = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
	var months = new Array("January", "February", "March", "April", "May", "June", "July", "Auguest", "September", "October", "November", "December");
	var startDate = mysqlTimeStampToDate(date1);
	var endDate = mysqlTimeStampToDate(date2);

	//FORMAT TO BUILD: Monday, May 3; 8:30am - 9:30am
	var day = days[startDate.getDay()];
	var month = months[startDate.getMonth()];
	var date = startDate.getDate();
	var formattedTime = formatTimeString(date1, date2);
	
	return(day+", "+month+" "+date+"; "+formattedTime);
}

function formatTimeString(date1, date2) {
	var startDate = mysqlTimeStampToDate(date1);
	var endDate = mysqlTimeStampToDate(date2);

	//FORMAT TO BUILD: 8:30am - 9:30am
	var date = startDate.getDate();
	var startMin = (String(startDate.getMinutes()).length < 2) ? String("0"+startDate.getMinutes()) : startDate.getMinutes();
	if (startDate.getHours() >= 13) {
		var startHour = startDate.getHours()-12;
		var start12 = "pm";
	}
	else {
		var startHour = startDate.getHours();
		var start12 = (startDate.getHours() == 12) ? "pm" : "am";
	}
	var endMin = (String(endDate.getMinutes()).length < 2) ? String("0"+endDate.getMinutes()) : endDate.getMinutes();
	if (endDate.getHours() >= 13) {
		var endHour = endDate.getHours()-12;
		var end12 = "pm";
	}
	else {
		var endHour = endDate.getHours();
		var end12 = (endDate.getHours() == 12) ? "pm" : "am";
	}
	return(startHour+":"+startMin+start12+" - "+endHour+":"+endMin+end12);
}

function showDescription () {
	var position = findPos(this);
	for(var i=0; i<=this.parentNode.childNodes.length-1;i++) {
		if (this.parentNode.childNodes[i].tagName == "DIV") {
			var content = this.parentNode.childNodes[i].innerHTML;
		}
	}
	var body = document.getElementsByTagName("BODY")[0];
	var display = document.createElement("div");
	display.id = "agendaDescription";
	var displayContent = document.createElement("div");
	displayContent.innerHTML = content;
	displayContent.id = "agendaContent";
	displayContent.style.left = position[0]-(position[0]/8)+'px';
	displayContent.style.top = position[1]-(position[1]/8)+'px';
	var closeLink = document.createElement("a");
	closeLink.id = "closeLink";
	closeLink.innerHTML = "x";
	closeLink.title = "Close";
	
	Dom.add(display, body);
	Dom.add(displayContent, display);
	Dom.add(closeLink, displayContent);
	Event.add(closeLink, 'click', function () {
		var display = Dom.get("agendaDescription");
		Dom.remove(display);
	});
}

function addLinks() {
	var links = getElementsByClassName('hasDescription');
	for(var i=0;i<=links.length-1;i++) {
		Event.add(links[i],'click',showDescription);
	}
};