function moreToggle(ellipsisSpan, moreSpan, toggle, hideSpan, toggleShowMode, moreHideShowMode) {
	var ellipsis = document.getElementById(ellipsisSpan);
	var more = document.getElementById(moreSpan);
	if(more == null) { return; }
	var content = document.getElementById(toggle);
	if(content == null) { return; }
	var hide = document.getElementById(hideSpan);
	if(hide == null) { return; }
	
	if(more.style.display != "none") {
		if(ellipsis != null) {
			ellipsis.style.display = "none";
		}
		more.style.display = "none";
		content.style.display = toggleShowMode;
		hide.style.display = moreHideShowMode;
	} else {
		if(ellipsis != null) {
			ellipsis.style.display = "inline";
		}
		more.style.display = moreHideShowMode;
		content.style.display = "none";
		hide.style.display = "none";
	}
}

var youtubeData = new Object();
var youtubeVideosAdded = 0;

var flickrData = new Object();

function flickrJsonCall(callback, method, args) {
	var url = "http://api.flickr.com/services/rest/?format=json&jsoncallback=" + callback + "&method=" + method + "&api_key=" + flickrKey;
	for(var i in args) {
		url += "&" + i + "=" + args[i];
	}
	var script = document.createElement("script");
	script.setAttribute("type", "text/javascript");
	script.setAttribute("src", url);
	var headID = document.getElementsByTagName("head")[0];         
    headID.appendChild(script);
}

function youtubeJsonVideoSearch(query) {
	var url = "http://gdata.youtube.com/feeds/api/videos?alt=json-in-script&callback=youtubeScriptLoaded&orderby=updated&vq=" + query;

	var script = document.createElement("script");
	script.setAttribute("type", "text/javascript");
	script.setAttribute("src", url);
	var headID = document.getElementsByTagName("head")[0];         
	headID.appendChild(script);
}

function flickrGetNSIDFromPhoto(id) {
	for(var nsid in flickrData) {
		if(flickrData[nsid]["photos"] != undefined) {
			for(var photoId in flickrData[nsid]["photos"]) {
				if(photoId == id) {
					return nsid;
				}
			}
		}
	}
	return null;
}

function flickr_0_getUserNSID(rsp, username) {
	if(rsp == null) {
		var args = new Object();
		args["username"] = username;	
		flickrJsonCall("flickr_0_getUserNSID", "flickr.people.findByUsername", args);
		return 0;
	}
	
	if(rsp.stat != "ok") {
		return -1;
	}
	
	var nsid = rsp["user"]["nsid"];
	if(flickrData[nsid] == undefined) {
		flickrData[nsid] = new Object();
	}
	flickrData[nsid]["user"] = rsp.user;
	
	return flickr_1_getUserTags(null, nsid);
}

function flickr_1_getUserTags(rsp, nsid) {
	if(rsp == null) {
		var args = new Object();
		args["user_id"] = nsid;	
		flickrJsonCall("flickr_1_getUserTags", "flickr.tags.getListUser", args);
		return 0;
	}
	
	if(rsp.stat != "ok") {
		return -1;
	}
	
	var nsid = rsp["who"]["id"];
	
	if(flickrData[nsid]["tags"] == undefined) {
		flickrData[nsid]["tags"] = new Array();
	}
	
	// TODO: expand this using an array of regexes, and then use the Regex.test() method instead of String.search()
	
	for(var i in rsp["who"]["tags"]["tag"]) {
		var tag = rsp["who"]["tags"]["tag"][i]["_content"];
		if(tag.search(/tkd/i) != -1 || tag.search(/tae(.?)kwon(.?)do/i) != -1) {
			flickrData[nsid]["tags"].push(tag);
		}
	}
	
	return flickr_2_getPhotosByTag(null, nsid);
}

function flickr_2_getPhotosByTag(rsp, nsid) {
	if(rsp == null) {
		var args = new Object();
		args["user_id"] = nsid;
		args["tags"] = flickrData[nsid]["tags"].slice(0, flickr_CONSTANT_MAXTAGS).join(",");
		args["per_page"] = flickrDisplayPics;
		args["extras"] = "date_taken";
		flickrJsonCall("flickr_2_getPhotosByTag", "flickr.photos.search", args);
		return 0;
	}
	
	if(rsp.stat != "ok") {
		return -1;
	}
	
	if(rsp["photos"]["total"] == "0") {
		return -1;
	}
	
	var nsid = rsp["photos"]["photo"][0]["owner"];
	
	if(flickrData[nsid]["photos"] == undefined) {
		flickrData[nsid]["photos"] = new Object();
	}
	for(var i in rsp["photos"]["photo"]) {
		var id = rsp["photos"]["photo"][i]["id"];
		var title = rsp["photos"]["photo"][i]["title"];
		var datetaken = rsp["photos"]["photo"][i]["datetaken"]
		flickrData[nsid]["photos"][id] = new Object();
		flickrData[nsid]["photos"][id]["title"] = title;
		flickrData[nsid]["photos"][id]["datetaken"] = datetaken;
		
		flickr_3_getPhoto(null, id);
	}
	
	return 0;
}

function flickr_3_getPhoto(rsp, id) {
	if(rsp == null) {
		var args = new Object();
		args["photo_id"] = id;
		flickrJsonCall("flickr_3_getPhoto", "flickr.photos.getSizes", args);
		return 0;
	}
	
	if(rsp.stat != "ok") {
		return -1;
	}
	
	var idArr = rsp["sizes"]["size"][0]["url"].match(/\/(\d+)\//); // /id=(\d+)&/i
	
	var id = idArr[1];
	var nsid = flickrGetNSIDFromPhoto(id);
	
	for(var i in rsp["sizes"]["size"]) {
		var source = null;
		var url = null;
		var size = null;
		
		if(rsp["sizes"]["size"][i]["label"] == "Thumbnail") {
			source = rsp["sizes"]["size"][i]["source"];
			flickrData[nsid]["photos"][id]["source"] = source;
		}
		
		if(rsp["sizes"]["size"][i]["label"] == "Large") {
			url = rsp["sizes"]["size"][i]["url"];
			flickrData[nsid]["photos"][id]["url"] = url;
			size = "Large";
		}
		if(rsp["sizes"]["size"][i]["label"] == "Medium" && url == null) {
			url = rsp["sizes"]["size"][i]["url"];
			flickrData[nsid]["photos"][id]["url"] = url;
			size = "Medium";
		}
		
	}
	
	var flickrAccountName = flickrData[nsid]["user"]["username"]["_content"];
	var imgCount = flickrUsers[flickrAccountName]["count"];
	var tbody = flickrUsers[flickrAccountName]["tbody"];
	
	if(imgCount % flickrPerRow == 0) {
		var newtr = document.createElement("tr");
		tbody.appendChild(newtr);
	}
	
	flickrUsers[flickrAccountName]["count"]++;
	
	var tr = tbody.lastChild;
	
	var td = document.createElement("td");
	td.className = "flickrTd";
	td.style.width = parseInt(100 / flickrPerRow) + "%"
	
	var a = document.createElement("a");
	a.setAttribute("href", flickrData[nsid]["photos"][id]["url"]);
	a.setAttribute("target", "_new");
	var img = document.createElement("img");
	img.setAttribute("src", flickrData[nsid]["photos"][id]["source"]);
	a.appendChild(img);	
	td.appendChild(a);
	td.appendChild(document.createElement("br"));
	var span = document.createElement("span");
	span.className = "flickrTitle";
	span.innerHTML = flickrData[nsid]["photos"][id]["title"] + " (" + flickrData[nsid]["photos"][id]["datetaken"].split(" ")[0] + ")";
	td.appendChild(span);
	td.appendChild(document.createElement("br"));
	
	tr.appendChild(td);

	// Hide the Loading Span if we're done loading images
	if(flickrUsers[flickrAccountName]["count"] == flickrDisplayPics) {
		flickrUsers[flickrAccountName]["loadingDiv"].style.display = "none";
	}
	
	return 0;
}

function flickrRun() {
	var flickrDiv = document.getElementById("flickrImages");
	
	for(var i in flickrUsers) {
		flickr_0_getUserNSID(null, i);
		
		var userDiv = document.createElement("div");
		flickrDiv.appendChild(userDiv);
		flickrUsers[i]["div"] = userDiv;
		var div = document.createElement("div");
		flickrUsers[i]["loadingDiv"] = div;
		div.innerHTML = "loading...";
		div.style.cssFloat = "right";
		div.style.styleFloat = "right";
		userDiv.appendChild(div);
		var div2 = document.createElement("div");
		div2.className = "subsection";
		div2.innerHTML = "Recent TKD Photos from <a href='" + flickrUsers[i]["url"] + "' target='_new'>" + flickrUsers[i]["name"] + "'s Flickr Photostream</a>";
		userDiv.appendChild(div2);
		var table = document.createElement("table");
		table.className = "flickrTable";
		var tbody = document.createElement("tbody");
		table.appendChild(tbody);
		userDiv.appendChild(table);
		flickrUsers[i]["tbody"] = tbody;
		flickrUsers[i]["count"] = 0;
	}
}

function youtubeSwitchPlayer(url) {
	var container = document.getElementById("videoContainer");
	
	if(youtubeURL == url && container.hasChildNodes()) { return; }

	var v = youtubeData[url];
	
	youtubeTitle = v["title"];
	youtubeURL = url;
	
	while(container.hasChildNodes()) {
		container.removeChild(container.firstChild);
	}
	
	var titleSpan = document.getElementById("videoTitle");
	titleSpan.innerHTML = youtubeTitle;
	
	var div = document.createElement("div");
	div.id = youtubeURL;
	container.appendChild(div);
	
	var so = new SWFObject(youtubeURL, youtubeTitle, youtubeWidth, youtubeHeight, "8", "#FFFFFF");
	so.write(youtubeURL);
}

function youtubeAddVideo(url) {
	var container = document.getElementById("videosList");
	if(youtubeVideosAdded >= youtubeVideosToShow) {
		container = document.getElementById("videosListMore");
		
		// turn on the "see all" span
		document.getElementById("videosListMoreClick").style.display = "block";
	}
	var v = youtubeData[url];
	
	var div = document.createElement("div");
	div.className = "videoListing";
	
	var thumbDiv = document.createElement("div");
	thumbDiv.className = "videoListingThumb";
	var img = document.createElement("img");
	img.setAttribute("src", v["thumb"]);
	thumbDiv.appendChild(img);
	div.appendChild(thumbDiv);
	
	var titleSpan = document.createElement("span");
	titleSpan.innerHTML = v["title"];
	titleSpan.className = "videoListingTitle";
	titleSpan.onclick = function () {youtubeSwitchPlayer(url)};
	div.appendChild(titleSpan);
	div.appendChild(document.createElement("br"));
	
	var descriptionSpan = document.createElement("span");
	descriptionSpan.innerHTML = v["desc"];
	descriptionSpan.className = "videoListingDescription";
	div.appendChild(descriptionSpan);
	
	container.appendChild(div);
	
	var clearDiv = document.createElement("div");
	clearDiv.style.clear = "both";
	container.appendChild(clearDiv);
	
	youtubeVideosAdded += 1;
}

function youtubeRun() {
	youtubeData[youtubeURL] = new Object();
	youtubeData[youtubeURL]["title"] = youtubeTitle;
	youtubeData[youtubeURL]["desc"] = youtubeDesc;
	youtubeData[youtubeURL]["thumb"] = youtubeThumb;
	
	youtubeSwitchPlayer(youtubeURL);
	youtubeAddVideo(youtubeURL);
	
	youtubeJsonVideoSearch("%22NU%20Taekwondo%22");
}

function youtubeScriptLoaded(rsp) {
	for(var i in rsp["feed"]["entry"]) {
		var obj = rsp["feed"]["entry"][i];
		
		var title = obj["title"]["$t"];

		if(title.indexOf("NU Taekwondo") == -1) {
			continue;
		}

		var desc = obj["content"]["$t"];
		
		var url = null;
		for(var j in obj["media$group"]["media$content"]) {
			var obj2 = obj["media$group"]["media$content"][j];
			if(obj2["type"] == youtubeType) {
				url = obj2["url"];
				break;
			}
		}
		
		var thumbUrl = obj["media$group"]["media$thumbnail"][0]["url"];
		
		if(youtubeData[url] == undefined) {
			youtubeData[url] = new Object();
			youtubeData[url]["title"] = title;
			youtubeData[url]["desc"] = desc;
			youtubeData[url]["thumb"] = thumbUrl;
			
			youtubeAddVideo(url);
		}
	}
	
	document.getElementById("videosLoading").style.display = "none";
}
