var DebugMode = "false"; // "false" = no logging, "true" = in-site logging, "alert" = browser-logging
window.onload = setup;
var sidebarReq;
var sidebarArray;
var sidebarSelected = "";
var searchReq;
var newsReq;
var weekCalendarReq;
var weekCalendarEvents;
var searchResults;
var searchStatus = "";
var loadingTimer;
var loadingRefCount = 0;
var windowBackgroundColor = "";

var blogEntryTitle;

var calendarYear = "";
var calendarMonth = "";
var calendarDay = "";

var currentCalendarYear = calendarYear;
var currentCalendarMonth = calendarMonth;
var calendarDirection = 1;

var calendarEventDays;

var weekCalendarStartDate; // Date for monday;

function setup() {
	// yell at IE
	var browserIsIE = navigator.userAgent.indexOf("MSIE") >= 0;
	var browserVer = parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+4, navigator.userAgent.indexOf("MSIE")+7));
	if (browserIsIE && browserVer <= 7) {
		document.body.innerHTML = "<div class='warningmessage'>Please consider using a more <u>modern</u> and <u>standards compliant</u> browser such as <a href='http://www.apple.com/safari/'>Safari 4</a> or <a href='http://www.firefox.com/'>Firefox 3</a> when browsing this site.</div>\n" + document.body.innerHTML;
	}
	
	var is_iphone = navigator.userAgent.toLowerCase().indexOf('iphone') >= 0;
	
	// correct sidebar and heights
	if (!is_iphone) {
		if (document.getElementById("sidebarContents")) {
			var contentsHeight = parseFloat(getStyle(document.getElementById("content"), "height"));
			var sidebarHeight = parseFloat(getStyle(document.getElementById("sidebarContents"), "height")) + parseFloat(getStyle(document.getElementById("sidebarContents"), "paddingBottom"));
			if (sidebarHeight > contentsHeight) {
				document.getElementById("content").style.height = sidebarHeight + "px";
			}
		} else {
			document.getElementById("main").style.paddingRight = "10px";
		}
	}
	
	// show search if supported
	if (document.getElementById("search") && document.getElementById("search").onsearch && !is_iphone) {
		document.getElementById("search").style.display = "block";
		document.getElementById("search").style.opacity = "1";
	}
	
	// preload images
	if (!document.getElementById("loader")) {
		var node = document.createElement("div");
		node.setAttribute("id", "loader");
		document.body.appendChild(node);
		var preloadImages = new Array();
		preloadImages.push("/images/logoOver.png");
		preloadImages.push("/images/contactOver.png");
		preloadImages.push("/images/aboutOver.png");
		preloadImages.push("/images/blogOver.png");
		preloadImages.push("/images/bread/leftCapSelected.png");
		preloadImages.push("/images/bread/rightCapSelected.png");
		preloadImages.push("/images/bread/selected.png");
		preloadImages.push("/images/bread/flatCapLeft.png");
		preloadImages.push("/images/bread/flatCapRight.png");
		preloadImages.push("/images/bread/background.png");
		preloadImages.push("/images/bread/leftCap.png");
		preloadImages.push("/images/bread/rightCap.png");
		preloadImages.push("/images/selectedSearch.png");
		preloadImages.push("/images/shadow.png");
		preloadImages.push("/images/calendar/previousPressed.png");
		preloadImages.push("/images/calendar/nextPressed.png");
		var i;
		var div;
		for (i = 0; i < preloadImages.length; i++) {
			div = document.createElement("div");
			div.style.backgroundImage = "url(" + preloadImages[i] + ")";
			node.appendChild(div);
		}
	}
	
	// generate most recent news blurb
	if (document.getElementById("newsBlurb")) {
		showLoading();
		newsReq = new XMLHttpRequest();
		newsReq.onreadystatechange = function() {
			if (newsReq.readyState == 4) {
				if (newsReq.status == 200) {
					var newsResults = eval("(" + newsReq.responseText + ")");
					if (newsResults == "ERROR") {
						document.getElementById("newsBlurb").innerHTML = '<span class="title">An Error Occured While Loading the News Blurb</span>';
					} else {
						if (is_iphone) {
							document.getElementById("newsBlurb").innerHTML = '<span class="title">News:</span>';
						} else {
							document.getElementById("newsBlurb").innerHTML = '<span class="title">Recent News Blurb:</span>';
						}
						var aNode = document.createElement("a");
						aNode.setAttribute("href", newsResults[0].url);
						aNode.appendChild(document.createTextNode(newsResults[0].title));
						document.getElementById("newsBlurb").appendChild(aNode);
					}
				} else {
					log("News Blurb Unavailable. Return Code: " + newsReq.status);
					document.getElementById("newsBlurb").innerHTML = '<span class="title">An Error Occured While Loading the News Blurb</span>';
				}
				newsReq = null;
				hideLoading();
			}
		};
		newsReq.open("GET", "/blog/blurb/", true);
		newsReq.send("");
	}
	
	// animate caution tape
	if (document.getElementsByClassName && document.getElementsByClassName("pageHeader construction").length != 0) {
		setInterval(animateCautionTape, 50);
	}
	
	// create calendar
	if (typeof(calendarYear) == "string" && typeof(calendarMonth) == "string") {
		showCurrentDate();
	} else if (typeof(calendarYear) == "string") {
		var year = (new Date()).getFullYear();
		showCalendarMonth(calendarMonth, year);
	} else if (typeof(calendarMonth) == "string") {
		var month = (new Date()).getMonth()+1;
		showCalendarMonth(month, calendarYear);
	} else {
		showCalendarMonth(calendarMonth, calendarYear);
	}
	
	// generate breadcrumb menu
	if (document.getElementById("breadcrumb").className == "autoGenerated") {
		var parts = location.pathname.split("/");
		var i;
		var partNames = new Array();
		partNames[0] = "home";
		var fileNames;
		var ulNode = document.createElement("ul");
		var liNode, node, textNode;
		var href = "";
		
		for (i = 0; i < parts.length; i++) {
			partNames[i] = parts[i];
			fileNames = partNames[i].split(".");
			if (fileNames.length != 0) {
				partNames[i] = fileNames[0];
			}
			
			if (i-2 >= 0 && partNames[i-2] == "blog") {
				if (!isNaN(partNames[i-1])) {
					if (partNames[i] == 1) {
						partNames[i] = "january";
					} else if (partNames[i] == 2) {
						partNames[i] = "february";
					} else if (partNames[i] == 3) {
						partNames[i] = "march";
					} else if (partNames[i] == 4) {
						partNames[i] = "april";
					} else if (partNames[i] == 5) {
						partNames[i] = "may";
					} else if (partNames[i] == 6) {
						partNames[i] = "june";
					} else if (partNames[i] == 7) {
						partNames[i] = "july";
					} else if (partNames[i] == 8) {
						partNames[i] = "august";
					} else if (partNames[i] == 9) {
						partNames[i] = "sebtember";
					} else if (partNames[i] == 10) {
						partNames[i] = "october";
					} else if (partNames[i] == 11) {
						partNames[i] = "november";
					} else if (partNames[i] == 12) {
						partNames[i] = "december";
					}
				}
			}
			
			if (i-4 >= 0 && partNames[i-4] == "blog" && blogEntryTitle) {
				partNames[i] = blogEntryTitle;
			}
			
			if (i == 0) partNames[i] = "home";
			if (partNames[i] == "code") partNames[i] = "code snippets";
			if (partNames[i] == "firstdraft") partNames[i] = "first draft";
			if (partNames[i] == "languagepod101") partNames[i] = "LanguagePod101";
			if (partNames[i] == "japanesepod101") partNames[i] = "JapanesePod101";
			if (partNames[i] == "errorPages") partNames[i] = "error pages";
			if (partNames[i] == "chrisherr") partNames[i] = "christopher herr";
			if (partNames[i] == "dimitribouniol") partNames[i] = "dimitri bouniol";
			if (partNames[i] == "dinanicholaou") partNames[i] = "dina nicholaou";
			if (partNames[i] == "artificialintelligence") partNames[i] = "artificial intelligence";
			if (partNames[i] == "japanesealphabets") partNames[i] = "japanese alphabets";
			if (partNames[i] == "screenshots") partNames[i] = "screen shots";
			if (partNames[i] == "myaccount") partNames[i] = "my account";
			if (partNames[i] == "bugreporter") partNames[i] = "bug reporter";
			if (partNames[i] == "bugs") partNames[i] = "bug reporter";
			if (partNames[i] == "releasenotes") partNames[i] = "release notes";
			if (partNames[i] == "userguide") partNames[i] = "user guide";
			if (partNames[i] == "roadmap") partNames[i] = "road map";
			if (partNames[i] == "js") partNames[i] = "JavaScript";
			if (partNames[i] == "css") partNames[i] = "cascading style sheets";
			if (partNames[i] == "howitworks") partNames[i] = "how it works";
			if (partNames[i] == "tok") partNames[i] = "theory of knowledge";
			if (partNames[i] == "downloadcount") partNames[i] = "download counter";
			if (partNames[i] == "admin") partNames[i] = "administration";
			if (partNames[i] == "elemints") partNames[i] = "EleMints";
			if (partNames[i] == "mildelemints") partNames[i] = "Mild EleMints";
			if (partNames[i] == "igave") partNames[i] = "iGave";
			if (partNames[i] == "cliche") partNames[i] = "Cliché Magazine";
			if (partNames[i] == "imgreen") partNames[i] = "imGREEN";
			if (partNames[i] == "smartfrench") partNames[i] = "SmartFrench";
			if (partNames[i] == "apptrends") partNames[i] = "AppTrends";
			if (partNames[i] == "number2pencil") partNames[i] = "#2 Pencil";
			if (partNames[i] == "workcalendar") partNames[i] = "work calendar";
			if (i == 1) href = "";
			href += "/" + parts[i];
			
			if (parts[i] != "" || i == 0) {
				liNode = document.createElement("li");
				node = document.createTextNode(" ");
				liNode.appendChild(node);
				node = document.createElement("a");
				if (i != parts.length-1 && i != 0) {
					node.setAttribute("href", href + "/");
				} else {
					node.setAttribute("href", href);
				}
				liNode.appendChild(node);
				ulNode.appendChild(liNode);
				
				liNode = node;
				node = document.createElement("div");
				if (i == 0) {
					node.className = "button root";
				} else if (i != parts.length-1 || parts[parts.length-1] == "") {
					node.className = "button folder";
				} else {
					node.className = "button file";
				}
				liNode.appendChild(node);
				
				liNode = node;
				node = document.createTextNode(" ");
				liNode.appendChild(node);
				node = document.createElement("div");
				node.className = "buttonBackLeft";
				liNode.appendChild(node);
				node = document.createTextNode(" ");
				liNode.appendChild(node);
				node = document.createElement("div");
				node.className = "buttonBackRight";
				liNode.appendChild(node);
				node = document.createTextNode(" ");
				liNode.appendChild(node);
				node = document.createElement("div");
				node.className = "buttonLabel";
				textNode = document.createTextNode(titleCaps(partNames[i]));
				node.appendChild(textNode);
				liNode.appendChild(node);
				node = document.createTextNode(" ");
				liNode.appendChild(node);
			}
		}
		
		document.getElementById("breadcrumb").appendChild(ulNode);
		document.getElementById("breadcrumb").className = "";
	}
	
	// generate sidebar
	if (document.getElementById("sidebarContents").className == "autoGenerated") {
		showLoading();
		sidebarReq = new XMLHttpRequest();
		sidebarReq.onreadystatechange = function() {
			if (sidebarReq.readyState == 4) {
				if (sidebarReq.status == 200) {
					sidebarArray = eval("(" + sidebarReq.responseText + ")");
					var i, j, k;
					var groupNode, textNode, listNode, subListNode, linkNode;
					for (i = 0; i < sidebarArray.length; i++) {
						sidebarGroup = document.createElement("div");
						sidebarGroup.setAttribute("class", "sidebarGroup");
						textNode = document.createTextNode(sidebarArray[i].name);
						sidebarGroup.appendChild(textNode);
						
						document.getElementById("sidebarContents").appendChild(sidebarGroup);
						
						sidebarGroup = document.createElement("ul");
						for (j = 0; j < sidebarArray[i].links.length; j++) {
							listNode = document.createElement("li");
							textNode = document.createTextNode(sidebarArray[i].links[j].name);
							if (sidebarArray[i].links[j].href) {
								linkNode = document.createElement("a");
								linkNode.setAttribute("href", sidebarArray[i].links[j].href);
								linkNode.appendChild(textNode);
								listNode.appendChild(linkNode);
								if (sidebarSelected == sidebarArray[i].links[j].name) {
									linkNode.setAttribute("class", "selected");
								}
							} else {
								listNode.appendChild(textNode);
							}
							
							sidebarGroup.appendChild(listNode);
							
							if (sidebarArray[i].links[j].links) {
								subListNode = document.createElement("ul");
								listNode.appendChild(subListNode);
								listNode = subListNode;
								for (k = 0; k < sidebarArray[i].links[j].links.length; k++) {
									subListNode = document.createElement("li");
									textNode = document.createTextNode(sidebarArray[i].links[j].links[k].name);
									if (sidebarArray[i].links[j].links[k].href) {
										linkNode = document.createElement("a");
										linkNode.setAttribute("href", sidebarArray[i].links[j].links[k].href);
										linkNode.appendChild(textNode);
										subListNode.appendChild(linkNode);
										if (sidebarSelected == sidebarArray[i].links[j].links[k].name) {
											linkNode.setAttribute("class", "selected");
										}
									} else {
										subListNode.appendChild(textNode);
									}
									
									listNode.appendChild(subListNode);
								}
							}
						}
						document.getElementById("sidebarContents").appendChild(sidebarGroup);
					}
					
					if (!is_iphone) {
						document.getElementById("sidebarContents").className = "";
						
						document.getElementById("content").style.height = "";
						contentsHeight = parseFloat(getStyle(document.getElementById("content"), "height"));
						sidebarHeight = parseFloat(getStyle(document.getElementById("sidebarContents"), "height")) + parseFloat(getStyle(document.getElementById("sidebarContents"), "paddingBottom"));
						if (sidebarHeight > contentsHeight) {
							document.getElementById("content").style.height = sidebarHeight + "px";
						}
					}
				} else {
					log("Sidebar Unavailable. Return Code: " + sidebarReq.status);
					document.getElementById("sidebarContents").className = "";
					if (document.getElementById("sidebarContents").innerHTML == "\n\t\t") {
						document.getElementById("main").removeChild(document.getElementById("sidebar"));
						document.getElementById("main").style.paddingRight = "10px";
						document.getElementById("content").style.height = "";
					}
				}
				sidebarReq = null;
				hideLoading();
			}
		};
		sidebarReq.open("GET", "/js/sidebar.json", true);
		sidebarReq.send("");
	}
	
	if (document.getElementById("weekCalendarContent")) {
		var weekCalendarContent = document.getElementById('weekCalendarContent');
		setTimeout("document.getElementById('weekCalendarContent').scrollTop = 282;", 10); // Scroll to top after small interval cause safari is stuborn
		
		weekCalendarStartDate = new Date();
		weekCalendarStartDate.setDate(weekCalendarStartDate.getDate()-weekCalendarStartDate.getDay()+1);
		
		showLoading();
		weekCalendarReq = new XMLHttpRequest();
		weekCalendarReq.onreadystatechange = function() {
			if (weekCalendarReq.readyState == 4) {
				if (weekCalendarReq.status == 200) {
					icalParser.parseIcal(weekCalendarReq.responseText);
					weekCalendarEvents = new Array();
					var i;
					for (i = 0; i < icalParser.ical.events.length; i++) {
						var event = new Object();
						
						event.title = "";
						
						var year, month, day, hour, min, sec;
						var dtstart, dtend, summary;
						
						dtstart = icalParser.ical.events[i].dtstart;
						dtend = icalParser.ical.events[i].dtend;
						summary = icalParser.ical.events[i].summary;
						
						year = dtstart.value.substring(0, 4);
						month = parseInt(dtstart.value.substring(4, 6))-1;
						day = dtstart.value.substring(6, 8);
						hour = dtstart.value.substring(9, 11);
						min = dtstart.value.substring(11, 13);
						sec = dtstart.value.substring(13, 15);
						
						event.start = new Date(year, month, day, hour, min, sec, 0);
						
						year = dtend.value.substring(0, 4);
						month = parseInt(dtend.value.substring(4, 6))-1;
						day = dtend.value.substring(6, 8);
						hour = dtend.value.substring(9, 11);
						min = dtend.value.substring(11, 13);
						sec = dtend.value.substring(13, 15);
						
						event.end = new Date(year, month, day, hour, min, sec, 0);
						
						event.title = summary.value;
						
						weekCalendarEvents[i] = event;
					}
					updateWeekCalendar();
				} else {
					log("Week Calendar. Return Code: " + weekCalendarReq.status);
					document.getElementById("weekCalendarMonthTitle").innerHTML = titleCaps('Could not load work calendar');
				}
				weekCalendarReq = null;
				hideLoading();
			}
		};
		weekCalendarReq.open("GET", "/client/workcalendar.ics.php", true);
		weekCalendarReq.send("");
	}
	
	// Make emoji appear
	convertEmoji(document.getElementById("content"));
}

function updateWeekCalendar()
{
	var startDate = new Date(weekCalendarStartDate.getTime());
	startDate.setHours(0,0,0,0);
	var endDate = new Date(weekCalendarStartDate.getTime());
	endDate.setHours(0,0,0,0);
	endDate.setDate(endDate.getDate()+5);
	document.getElementById("weekCalendarMonthTitle").innerHTML = monthFromDate(weekCalendarStartDate) + " " + weekCalendarStartDate.getDate() + " to " + monthFromDate(endDate) + " " + endDate.getDate() + " " + endDate.getFullYear();
	
	var mondayDivs = new Array();
	var tuesdayDivs = new Array();
	var wednesdayDivs = new Array();
	var thursdayDivs = new Array();
	var fridayDivs = new Array();
	var saturdayDivs = new Array();
	
	var i;
	for (i = 0; i < weekCalendarEvents.length; i++) {
		if (weekCalendarEvents[i].start >= startDate && weekCalendarEvents[i].start <= endDate) {
			var top = (weekCalendarEvents[i].start.getHours()-3)*40;
			var height = ((weekCalendarEvents[i].end-weekCalendarEvents[i].start)/1000/60/60)*40 + "px";
			
			var div = document.createElement("div");
			div.className = "weekCalendarEvent";
			div.style.top = (weekCalendarEvents[i].start.getHours()-3)*40 + "px";
			div.style.height = ((weekCalendarEvents[i].end-weekCalendarEvents[i].start)/1000/60/60)*40-1-8 + "px";
			
			div.appendChild(document.createTextNode(weekCalendarEvents[i].title));
			
			var dayOfWeek = weekCalendarEvents[i].start.getDay();
			console.log(dayOfWeek);
			if (dayOfWeek == 1) {
				mondayDivs[mondayDivs.length] = div;
			} else if (dayOfWeek == 2) {
				tuesdayDivs[tuesdayDivs.length] = div;
			} else if (dayOfWeek == 3) {
				wednesdayDivs[wednesdayDivs.length] = div;
			} else if (dayOfWeek == 4) {
				thursdayDivs[thursdayDivs.length] = div;
			} else if (dayOfWeek == 5) {
				fridayDivs[fridayDivs.length] = div;
			} else if (dayOfWeek == 6) {
				saturdayDivs[saturdayDivs.length] = div;
			}
		} else if (weekCalendarEvents[i].start < startDate && weekCalendarEvents[i].end >= startDate && weekCalendarEvents[i].end <= endDate) {
		
		}
	}
	
	document.getElementById("mondayColumn").innerHTML = "";
	document.getElementById("tuesdayColumn").innerHTML = "";
	document.getElementById("wednesdayColumn").innerHTML = "";
	document.getElementById("thursdayColumn").innerHTML = "";
	document.getElementById("fridayColumn").innerHTML = "";
	document.getElementById("saturdayColumn").innerHTML = "";
	
	for (i = 0; i < mondayDivs.length; i++) {
		document.getElementById("mondayColumn").appendChild(mondayDivs[i]);
	}
	for (i = 0; i < mondayDivs.length; i++) {
		document.getElementById("tuesdayColumn").appendChild(tuesdayDivs[i]);
	}
	for (i = 0; i < mondayDivs.length; i++) {
		document.getElementById("wednesdayColumn").appendChild(wednesdayDivs[i]);
	}
	for (i = 0; i < mondayDivs.length; i++) {
		document.getElementById("thursdayColumn").appendChild(thursdayDivs[i]);
	}
	for (i = 0; i < mondayDivs.length; i++) {
		document.getElementById("fridayColumn").appendChild(fridayDivs[i]);
	}
	for (i = 0; i < mondayDivs.length; i++) {
		document.getElementById("saturdayColumn").appendChild(saturdayDivs[i]);
	}
}

function showNextWeek()
{
	weekCalendarStartDate.setDate(weekCalendarStartDate.getDate()+7);
	updateWeekCalendar();
}

function showPreviousWeek()
{
	weekCalendarStartDate.setDate(weekCalendarStartDate.getDate()-7);
	updateWeekCalendar();
}

function monthFromDate(theDate)
{
	var month = theDate.getMonth();
	if (month == 0) return "Jan";
	if (month == 1) return "Feb";
	if (month == 2) return "Mar";
	if (month == 3) return "Apr";
	if (month == 4) return "May";
	if (month == 5) return "Jun";
	if (month == 6) return "Jul";
	if (month == 7) return "Aug";
	if (month == 8) return "Sep";
	if (month == 9) return "Oct";
	if (month == 10) return "Nov";
	if (month == 11) return "Dec";
}

function convertEmoji(node) {
	var blogContent = null;
	if (document.getElementById("entryField")) {
		blogContent = document.getElementById("entryField").value;
	}
	var nodeHTML = node.innerHTML;
	var oldString = "";
	while (oldString != nodeHTML) {
		oldString = nodeHTML;
		nodeHTML = nodeHTML.replace(":P", "<image src='/images/emoji/toung.png' class='emoji' />", "g");
		nodeHTML = nodeHTML.replace("&gt;:(", "<image src='/images/emoji/angry.png' class='emoji' />", "g");
		nodeHTML = nodeHTML.replace(" :(", " <image src='/images/emoji/disappointed.png' class='emoji' />", "g");
		nodeHTML = nodeHTML.replace(":)", "<image src='/images/emoji/happy.png' class='emoji' />", "g");
		nodeHTML = nodeHTML.replace(":D", "<image src='/images/emoji/happy2.png' class='emoji' />", "g");
		nodeHTML = nodeHTML.replace("XP", "<image src='/images/emoji/happy3.png' class='emoji' />", "g");
		nodeHTML = nodeHTML.replace(" :3", " <image src='/images/emoji/cat.png' class='emoji' />", "g");
	}
	node.innerHTML = nodeHTML;
	if (document.getElementById("entryField")) {
		document.getElementById("entryField").value = blogContent;
	}
}

function searchSite() {
	var searchField = document.getElementById("search");
	var searchValue = searchField.value;
	searchValue = searchValue.replace("-", " ");
	searchValue = searchValue.replace("/", " ");
	searchValue = searchValue.replace(",", " ");
	searchValue = searchValue.replace(".", " ");
	searchValue = searchValue.replace("!", " ");
	searchValue = searchValue.replace("?", " ");
	searchValue = searchValue.replace(":", " ");
	searchValue = searchValue.replace(";", " ");
	searchValue = searchValue.replace("(", " ");
	searchValue = searchValue.replace(")", " ");
	searchValue = searchValue.replace("+", " ");
	searchValue = searchValue.replace("=", " ");
	searchValue = searchValue.replace("[", " ");
	searchValue = searchValue.replace("]", " ");
	searchValue = searchValue.replace("{", " ");
	searchValue = searchValue.replace("}", " ");
	searchValue = searchValue.replace("@", " @ ");
	searchValue = searchValue.replace(" and ", " ");
	searchValue = searchValue.replace(" or ", " ");
	searchValue = searchValue.replace(" not ", " ");
	var searchWordsOld = searchValue.split(" ");
	var searchWords = new Array();
	
	var searchResultsBox, searchResultsContentBox;
	var node;
	
	var titleSearchResults = new Array();
	var descriptionSearchResults = new Array();
	var keywordSearchResults = new Array();
	
	// load index
	if (!searchResults && !searchReq) {
		showLoading();
		searchStatus = "Searching…";
		searchReq = new XMLHttpRequest();
		searchReq.onreadystatechange = function() {
			if (searchReq.readyState == 4) {
				if (searchReq.status == 200) {
					searchResults = eval("(" + searchReq.responseText + ")");
					searchStatus = "Search Results:";
					hideLoading();
					if (!searchResults) {
						searchStatus = "Error Parsing Search Index";
					}
					searchSite();
				} else {
					log("Search Results Unavailable. Return Code: " + searchReq.status);
					searchStatus = "Error Loading Search Index";
					hideLoading();
					searchSite();
				}
				searchReq = null;
			}
		};
		searchReq.open("GET", "/js/searchIndex.json", true);
		searchReq.send("");
	}
	
	var i, j, yn, titleSuccess, descSuccess, keySuccess;
	
	if (searchResults && searchValue != "" && searchWordsOld.length > 0) {
		for (i = 0; i < searchWordsOld.length; i++) {
			if (searchWordsOld[i] != "" && searchWordsOld[i].toLowerCase() != "and" && searchWordsOld[i].toLowerCase() != "or") { // exclude these strings
				yn = true;
				if (searchWords.length > 0) {
					for (j = 0; j < searchWords.length; j++) {
						if (searchWordsOld[i] == searchWords[j]) {
							yn = false;
						}
					}
				}
				if (yn) {
					searchWords.push(searchWordsOld[i]);
				}
			}
		}
		if (searchWords.length > 0) {
			for (i = 0; i < searchResults.length; i++) {
				titleSuccess = false;
				descSuccess = false;
				keySuccess = false;
				yn = true;
				for (j = 0; j < searchWords.length; j++) {
					if (searchResults[i].title.toLowerCase().indexOf(searchWords[j].toLowerCase()) >= 0) {
						titleSuccess = true;
					} else if (searchResults[i].desc.toLowerCase().indexOf(searchWords[j].toLowerCase()) >= 0) {
						descSuccess = true;
					} else if (searchResults[i].keywords.toLowerCase().indexOf(searchWords[j].toLowerCase()) >= 0) {
						keySuccess = true;
					} else {
						yn = false;
					}
				}
				if (titleSuccess && yn) {
					titleSearchResults.push(searchResults[i]);
				} else if (descSuccess && yn) {
					descriptionSearchResults.push(searchResults[i]);
				} else if (keySuccess && yn) {
					keywordSearchResults.push(searchResults[i]);
				}
			}
		}
	}
	
	if (searchValue == "") {
		if (searchReq) {
			searchReq.abort();
			searchReq = null;
		}
		hideLoading();
		searchResultsBox = document.getElementById("sidebarSearch");
		searchResultsBox.style.top = "-" + searchResultsBox.style.height;
	} else {
		if (document.getElementById("sidebarSearch")) {
			searchResultsBox = document.getElementById("sidebarSearch");
		} else {
			searchResultsBox = document.createElement("div");
			searchResultsBox.setAttribute("id", "sidebarSearch");
			document.getElementById("sidebar").appendChild(searchResultsBox);
			node = document.createElement("div");
			node.setAttribute("id", "sidebarSearchContent");
			searchResultsBox.appendChild(node);
			node = document.createElement("div");
			node.setAttribute("id", "sidebarSearchShadow");
			searchResultsBox.appendChild(node);
		}
		searchResultsBox.style.height = parseFloat(getStyle(document.getElementById("sidebar"), "height")) + 27 + "px";
		searchResultsBox.style.top = "0px";
		searchResultsContentBox = document.getElementById("sidebarSearchContent");
		searchResultsContentBox.innerHTML = "<div class=\"sidebarGroup\">" + searchStatus + "</div>";
		
		var aNode, divNode, imageNode, titleNode, descriptionNode, textNode;
		if (titleSearchResults.length > 0) {
			for (i = 0; i < titleSearchResults.length; i++) {
				aNode = document.createElement("a");
				aNode.setAttribute("href", titleSearchResults[i].href);
				searchResultsContentBox.appendChild(aNode);
				divNode = document.createElement("div");
				if (titleSearchResults[i].img) {
					divNode.className = "searchResult image";
					aNode.appendChild(divNode);
					imageNode = document.createElement("div");
					imageNode.className = "searchResultImage";
					imageNode.style.backgroundImage = 'url("' + titleSearchResults[i].img + '")';
					divNode.appendChild(imageNode);
				} else {
					divNode.className = "searchResult";
					aNode.appendChild(divNode);
				}	
				titleNode = document.createElement("div");
				titleNode.className = "searchResultTitle";
				titleNode.appendChild(document.createTextNode(titleSearchResults[i].title));
				divNode.appendChild(titleNode);
				descriptionNode = document.createElement("div");
				descriptionNode.className = "searchResultDesc";
				descriptionNode.appendChild(document.createTextNode(titleSearchResults[i].desc));
				divNode.appendChild(descriptionNode);
			}
		}
		
		if (descriptionSearchResults.length > 0) {
			for (i = 0; i < descriptionSearchResults.length; i++) {
				aNode = document.createElement("a");
				aNode.setAttribute("href", descriptionSearchResults[i].href);
				searchResultsContentBox.appendChild(aNode);
				divNode = document.createElement("div");
				if (descriptionSearchResults[i].img) {
					divNode.className = "searchResult image";
					aNode.appendChild(divNode);
					imageNode = document.createElement("div");
					imageNode.className = "searchResultImage";
					imageNode.style.backgroundImage = 'url("' + descriptionSearchResults[i].img + '")';
					divNode.appendChild(imageNode);
				} else {
					divNode.className = "searchResult";
					aNode.appendChild(divNode);
				}	
				titleNode = document.createElement("div");
				titleNode.className = "searchResultTitle";
				titleNode.appendChild(document.createTextNode(descriptionSearchResults[i].title));
				divNode.appendChild(titleNode);
				descriptionNode = document.createElement("div");
				descriptionNode.className = "searchResultDesc";
				descriptionNode.appendChild(document.createTextNode(descriptionSearchResults[i].desc));
				divNode.appendChild(descriptionNode);
			}
		}
		
		if (keywordSearchResults.length > 0) {
			for (i = 0; i < keywordSearchResults.length; i++) {
				aNode = document.createElement("a");
				aNode.setAttribute("href", keywordSearchResults[i].href);
				searchResultsContentBox.appendChild(aNode);
				divNode = document.createElement("div");
				if (keywordSearchResults[i].img) {
					divNode.className = "searchResult image";
					aNode.appendChild(divNode);
					imageNode = document.createElement("div");
					imageNode.className = "searchResultImage";
					imageNode.style.backgroundImage = 'url("' + keywordSearchResults[i].img + '")';
					divNode.appendChild(imageNode);
				} else {
					divNode.className = "searchResult";
					aNode.appendChild(divNode);
				}	
				titleNode = document.createElement("div");
				titleNode.className = "searchResultTitle";
				titleNode.appendChild(document.createTextNode(keywordSearchResults[i].title));
				divNode.appendChild(titleNode);
				descriptionNode = document.createElement("div");
				descriptionNode.className = "searchResultDesc";
				descriptionNode.appendChild(document.createTextNode(keywordSearchResults[i].desc));
				divNode.appendChild(descriptionNode);
			}
		}
	}
}

function showLoading() {
	var loadingView;
	loadingRefCount += 1;
	if (document.getElementById("loadingView")) {
		loadingView = document.getElementById("loadingView");
	} else {
		loadingView = document.createElement("div");
		loadingView.setAttribute("id", "loadingView");
		document.getElementById("header").appendChild(loadingView);
	}
	document.getElementById("loadingView").style.opacity = "1";
	clearInterval(loadingTimer);
	loadingTimer = setInterval("animateLoading();", 50);
}

function animateLoading() {
	var loadingView = document.getElementById("loadingView");
	var origin = parseFloat(getStyle(loadingView, "backgroundPositionY"));
	origin -= 17;
	if (origin <= -203) origin = 0;
	loadingView.style.backgroundPositionY = origin + "px";
}

function hideLoading() {
	loadingRefCount -= 1;
	if (loadingRefCount <= 0) {
		loadingRefCount = 0;
		document.getElementById("loadingView").style.opacity = "0";
		clearInterval(loadingTimer);
	}
}

function animateCautionTape() {
	var cautionTape = document.getElementsByClassName("pageHeader construction")[0];
	var origin = parseFloat(getStyle(cautionTape, "backgroundPositionX"));
	origin -= 1;
	if (origin <= -120) origin = 0;
	cautionTape.style.backgroundPositionX = origin + "px";
}

function showImage(width, height, url) {
	var node = document.createElement("img");
	node.src = url;
	windowBackgroundColor = "transparent";
	showMiniWindow(width, height, node);
	windowBackgroundColor = "";
	return false;
}

function showMiniWindow(width, height, content) {
	var node, page;
	content.setAttribute("class", "windowContent");
	
	if (document.getElementById("windowBack")) {
		node = document.getElementById("windowBack");
		page = document.getElementById("windowPage");
		page.innerHTML = "";
		page.appendChild(content);
		page.innerHTML += '<div class="closeBox"></div><div class="shadow"><div class="tl"></div><div class="t"></div><div class="tr"></div><div class="l"></div><div class="c"></div><div class="r"></div><div class="bl"></div><div class="b"></div><div class="br"></div></div>';
	} else {
		node = document.createElement("div");
		node.setAttribute("id", "windowBack");
		document.body.appendChild(node);
		node.onclick = hideMiniWindow;
		page = document.createElement("div");
		page.className = "page window";
		page.setAttribute("id", "windowPage");
		page.appendChild(content);
		node.appendChild(page);
		page.innerHTML += '<div class="closeBox"></div><div class="shadow"><div class="tl"></div><div class="t"></div><div class="tr"></div><div class="l"></div><div class="c"></div><div class="r"></div><div class="bl"></div><div class="b"></div><div class="br"></div></div>';
	}
	
	page.style.backgroundColor = windowBackgroundColor;
	
	node.style.display = "block";
	
	var newHeight, newWidth;
	if (height > parseFloat(getStyle(node, "height"))-40) {
		newHeight = parseFloat(getStyle(node, "height"))-40;
		newWidth = (newHeight*width)/height;
		
		height = newHeight;
		width = newWidth;
	}

	if (width > parseFloat(getStyle(node, "width"))-40) {
		newWidth = parseFloat(getStyle(node, "width"))-40;
		newHeight = (newWidth*height)/width;
		
		height = newHeight;
		width = newWidth;
	}
	
	page.style.top = (parseFloat(getStyle(node, "height")) - height)/2 + "px";
	page.style.width = width + "px";
	page.style.height = height + "px";
	
	node.style.opacity = 1;
}

function hideMiniWindow() {
	var node = document.getElementById("windowBack");
	var page = document.getElementById("windowPage");
	page.style.width = "109px";
	page.style.height = "109px";
	page.style.top = (parseFloat(getStyle(node, "height")) - 109)/2 + "px";
	node.style.opacity = 0;
	setTimeout("document.getElementById('windowBack').style.display = 'none';", 1000);
}

function showNextMonth() {
	var newMonth;
	if (currentCalendarMonth != "") {
		newMonth = currentCalendarMonth + 1;
	} else {
		var currentDate = new Date();
		newMonth = currentDate.getMonth() + 2;
	}
	
	var newYear;
	if (currentCalendarYear != "") {
		newYear = currentCalendarYear;
	} else {
		var currentDate = new Date();
		newYear = currentDate.getFullYear();
	}
	
	if (newMonth == 13) {
		newMonth = 1;
		newYear += 1;
	}
	
	if (newMonth == 0) {
		newMonth = 12;
		newYear -= 1;
	}
	
	showCalendarMonth(newMonth, newYear);
}

function showPreviousMonth() {
	var newMonth;
	if (currentCalendarMonth != "") {
		newMonth = currentCalendarMonth - 1;
	} else {
		var currentDate = new Date();
		newMonth = currentDate.getMonth();
	}

	var newYear;
	if (currentCalendarYear != "") {
		newYear = currentCalendarYear;
	} else {
		var currentDate = new Date();
		newYear = currentDate.getFullYear();
	}

	if (newMonth == 13) {
		newMonth = 1;
		newYear += 1;
	}

	if (newMonth == 0) {
		newMonth = 12;
		newYear -= 1;
	}
	
	calendarDirection = -1;
	showCalendarMonth(newMonth, newYear);
}

function showCurrentDate() {
	var date = new Date();
	showCalendarMonth(date.getMonth()+1, date.getFullYear());
}

function showCalendarMonth(month, year) {
	var toRight = false;
	if (calendarDirection < 0) {
		toRight = true;
		calendarDirection = 1;
	}
	
	if (document.getElementById("calendarboxA") && document.getElementById("calendarboxB")) return; // not done animating;
	
	currentCalendarYear = year;
	currentCalendarMonth = month;
	
	if (document.getElementById("calendar")) {
		var calendarBox = document.createElement("div");
		calendarBox.style.opacity = "0.0";
		if (toRight) {
			calendarBox.style.left = "-195px";
		} else {
			calendarBox.style.left = "195px";
		}
		calendarBox.className = "calendarbox";
		calendarBox.setAttribute("id", "calendarboxB");
		var monthNode = document.createElement("div");
		monthNode.className = "month";
		var aNode = document.createElement("a");
		aNode.setAttribute("href", "/blog/" + year + "/" + month + "/");
		aNode.appendChild(document.createTextNode(stringForMonthAndYear(month, year)));
		monthNode.appendChild(aNode);
		calendarBox.appendChild(monthNode);
		
		var dateOfFirstDay = new Date(year, month-1, 1);
		var dayOfWeek = dateOfFirstDay.getDay();
		
		if (dayOfWeek != 0) {
			var lastMonth = month-1;
			var lastYear = year;
			if (lastMonth == 0) {
				lastMonth = 12;
				lastYear -= 1;
			}
			var totalDays = getAmountOfDaysInMonth(lastMonth, lastYear);
			for (i = totalDays-(dayOfWeek-1); i <= totalDays; i++) {
				var dayNode = document.createElement("div");
				if (lastMonth == calendarMonth && lastYear == calendarYear && i == calendarDay) {
					dayNode.className = "day d" + (i-totalDays+dayOfWeek) + " selected";
				} else {
					dayNode.className = "day d" + (i-totalDays+dayOfWeek) + " old";
				}
				if (isEventForDay(i, lastMonth, lastYear)) {
					var dayANode = document.createElement("a");
					dayANode.setAttribute("href", "/blog/" + lastYear + "/" + lastMonth + "/" + i + "/");
					dayANode.appendChild(dayNode);
					calendarBox.appendChild(dayANode);
				} else {
					calendarBox.appendChild(dayNode);
				}
				dayNode.appendChild(document.createTextNode(i));
				var divNode = document.createElement("div");
				divNode.className = "dot";
				dayNode.appendChild(divNode);
			}
		}
		
		var totalDays = getAmountOfDaysInMonth(month, year);
		var lastDayCell;
		for (i = 1; i <= totalDays; i++) {
			var dayNode = document.createElement("div");
			if (month == calendarMonth && year == calendarYear && i == calendarDay) {
				dayNode.className = "day d" + (i+dayOfWeek) + " selected";
			} else {
				dayNode.className = "day d" + (i+dayOfWeek);
			}
			if (isEventForDay(i, month, year)) {
				var dayANode = document.createElement("a");
				dayANode.setAttribute("href", "/blog/" + year + "/" + month + "/" + i + "/");
				dayANode.appendChild(dayNode);
				calendarBox.appendChild(dayANode);
			} else {
				calendarBox.appendChild(dayNode);
			}
			dayNode.appendChild(document.createTextNode(i));
			var divNode = document.createElement("div");
			divNode.className = "dot";
			dayNode.appendChild(divNode);
			lastDayCell = (i+dayOfWeek);
		}
		
		var nextMonth = month+1;
		var nextYear = year;
		if (nextMonth == 13) {
			nextMonth = 1;
			nextYear += 1;
		}
		
		for (i = 1; i <= 42 - lastDayCell; i++) {
			var dayNode = document.createElement("div");
			if (nextMonth == calendarMonth && nextYear == calendarYear && i == calendarDay) {
				dayNode.className = "day d" + (i+lastDayCell) + " selected";
			} else {
				dayNode.className = "day d" + (i+lastDayCell) + " old";
			}
			if (isEventForDay(i, nextMonth, nextYear)) {
				var dayANode = document.createElement("a");
				dayANode.setAttribute("href", "/blog/" + nextYear + "/" + nextMonth + "/" + i + "/");
				dayANode.appendChild(dayNode);
				calendarBox.appendChild(dayANode);
			} else {
				calendarBox.appendChild(dayNode);
			}
			dayNode.appendChild(document.createTextNode(i));
			var divNode = document.createElement("div");
			divNode.className = "dot";
			dayNode.appendChild(divNode);
		}
		
		document.getElementById("calendar").appendChild(calendarBox);
		
		if (toRight) {
			setTimeout("document.getElementById('calendarboxB').style.left = '0px'; document.getElementById('calendarboxB').style.opacity = '1.0'; document.getElementById('calendarboxA').style.left = '195px'; document.getElementById('calendarboxA').style.opacity = '0.0';", 100);
		} else {
			setTimeout("document.getElementById('calendarboxB').style.left = '0px'; document.getElementById('calendarboxB').style.opacity = '1.0'; document.getElementById('calendarboxA').style.left = '-195px'; document.getElementById('calendarboxA').style.opacity = '0.0';", 100);
		}
		
		setTimeout("document.getElementById('calendar').removeChild(document.getElementById('calendarboxA')); document.getElementById('calendarboxB').setAttribute('id', 'calendarboxA');", 1100);
	}
}

function isEventForDay(day, month, year) {
	// if (day % month == 0) return true; // replace with checkup to database
	// return false;
	
	if (calendarEventDays && calendarEventDays[year] && calendarEventDays[year][month] && calendarEventDays[year][month][day] == true) {
		return true;
	} else if (calendarEventDays && calendarEventDays['every'] && calendarEventDays['every'][month] && calendarEventDays['every'][month][day] == true) {
		return true;
	}
	return false
}

function stringForMonthAndYear(month, year) {
	var monthString = "";
	if (month == 1) {
		monthString = "January";
	} else if (month == 2) {
		monthString = "February";
	} else if (month == 3) {
		monthString = "March";
	} else if (month == 4) {
		monthString = "April";
	} else if (month == 5) {
		monthString = "May";
	} else if (month == 6) {
		monthString = "June";
	} else if (month == 7) {
		monthString = "July";
	} else if (month == 8) {
		monthString = "August";
	} else if (month == 9) {
		monthString = "September";
	} else if (month == 10) {
		monthString = "October";
	} else if (month == 11) {
		monthString = "November";
	} else if (month == 12) {
		monthString = "December";
	}
	return monthString + " " + year;
}

function getAmountOfDaysInMonth(month, year) {
	if (month == 1) {
		return 31;
	} else if (month == 2) {
		if (year % 4 == 0) {
			return 29;
		} else {
			return 28;
		}
	} else if (month == 3) {
		return 31;
	} else if (month == 4) {
		return 30;
	} else if (month == 5) {
		return 31;
	} else if (month == 6) {
		return 30;
	} else if (month == 7) {
		return 31;
	} else if (month == 8) {
		return 31;
	} else if (month == 9) {
		return 30;
	} else if (month == 10) {
		return 31;
	} else if (month == 11) {
		return 30;
	} else if (month == 12) {
		return 31;
	}
}

function log(msg) {
	if (DebugMode == "true") {
		var node = document.getElementById("DebugBox");
		if (!node) {
			node = document.createElement("div");
			node.setAttribute("id", "DebugBox");
			node.style.fontFamily = "Monaco";
			node.style.fontSize = "11px";
			node.style.whiteSpace = "pre";
			node.style.marginTop = "20px";
			node.style.marginLeft = "auto";
			node.style.marginRight = "auto";
			node.style.padding = "8px";
			node.style.position = "relative";
			node.style.width = "50%";
			node.style.height = "100px";
			node.style.minWidth = "100px";
			node.style.minHeight = "27px";
			node.style.resize = "both";
			node.style.overflow = "auto";
			node.style.border = "1px solid rgb(40%, 40%, 40%)";
			node.style.border = "1px solid rgba(0, 0, 0, 0.6)";
			node.style.backgroundColor = "rgb(255, 255, 255)";
			node.style.backgroundColor = "rgba(255, 255, 255, 0.5)";
			node.style.webkitBoxShadow = "rgba(0, 0, 0, 0.5) 0px 3px 7px";
			document.body.appendChild(node);
		}
		
		node.innerHTML += "=> " + msg + "<br />";
		node.scrollTop = node.scrollHeight;
	} else if (DebugMode == "alert") {
		if (window.console) {
			window.console.log(msg);
		} else {
			alert(msg);
		}
	}
}

function generatePageName() {
	var title = document.getElementById("titleField").value;
	var pageNameNode = document.getElementById("pageNameField");
	var pageName = pageNameNode.value;
	if (pageName == "") {
		pageNameNode.isGenerated = true;
	}
	
	if (pageNameNode.isGenerated) {
		pageName = title.toLowerCase();
		pageName = pageName.replace(/\s+/g, " ");
		pageName = pageName.replace(/[^A-Za-z0-9 ]/g, "");
		pageName = pageName.replace(/\s/g, "-");
		pageNameNode.value = pageName;
	}
}

function checkTitle() {
	var title = document.getElementById("titleField").value;
	title = titleCaps(title);
	document.getElementById("titleField").value = title;
}

function testCommentForm(form) {
	var returnValue = true;
	if (form.authorField.value == "") {
		returnValue = false;
		document.getElementById("nameErrorField").innerHTML = "Please enter your name.";
	} else {	
		document.getElementById("nameErrorField").innerHTML = "";
	}
	var re = /^\w+([\.-]?\w*)*@\w+([\.-]?\w*)*(\.\w+)+$/;
	
	if (!re.test(form.emailField.value)) {
		returnValue = false;
		document.getElementById("emailErrorField").innerHTML = "Please enter a valid email address.";
	} else {	
		document.getElementById("emailErrorField").innerHTML = "";
	}
	return returnValue;
}

function cancelPageNameGeneration() {
	var pageNameNode = document.getElementById("pageNameField");
	pageNameNode.isGenerated = false;
}

// function goTo(link)
// {
// 	var page = document.getElementById("main");
// 	//page.style.width = "700px";
// 	var content = document.getElementById("content");
// 	content.innerHTML += "ajudfk kvf xdj,hv f m,nnsvz f,mjgc jhf nhsz ajudfk kvf xdj,hv f m,nnsvz f,mjgc jhf nhsz ajudfk kvf xdj,hv f m,nnsvz f,mjgc jhf nhsz ajudfk kvf xdj,hv f m,nnsvz f,mjgc jhf nhsz ajudfk kvf xdj,hv f m,nnsvz f,mjgc jhf nhsz ajudfk kvf xdj,hv f m,nnsvz f,mjgc jhf nhsz ajudfk kvf xdj,hv f m,nnsvz f,mjgc jhf nhsz ajudfk kvf xdj,hv f m,nnsvz f,mjgc jhf nhsz ajudfk kvf xdj,hv.";
// 	content.style.height = "auto";
// 	page.style.height = parseFloat(getStyle(content, "height")) + "px";
// 	content.style.height = "100%";
// 	return false;
// }

function getStyle(el, prop) {
	var returnValue = null;
	if (document.defaultView && document.defaultView.getComputedStyle && document.defaultView.getComputedStyle(el, null)) {
		returnValue = document.defaultView.getComputedStyle(el, null)[prop];
	} else if (el.currentStyle) {
		returnValue = el.currentStyle[prop];
	} else {
		returnValue = el.style[prop];
	}
	return returnValue;
}