/******************************************************
 * All the functionality associated with the categories
 * section of the card creator site.
 *****************************************************/

var Categories = new function() {
	var categoriesRequest;
	
	this.newCategory = function() {
		var loadcat = document.getElementById('loadcategory');
		var category = loadcat.value;
		
		postEvent('CREATE_CATEGORY', category);
		
		if (category != '') {
			var xmldoc = Utils.XML.newDocument();
			var categoryNode = xmldoc.createElement("category");
			var node = xmldoc.createCDATASection(category);
			categoryNode.setAttribute("uid", User.getCurrentUser());
			categoryNode.setAttribute("fixed", "false");
			categoryNode.appendChild(node);
			placeCategory(categoryNode);
			loadcat.value = "";
			CurrentCard.setCategory(category);
			CurrentCard.showNewCardCover(true);
		}
		else {
			alert('Please type a category name in the text field above the button.');
		}
	}

	this.tryNewCategory = function(field, event) {
		var keycode;
		if (window.event) {
			keycode = window.event.keyCode;
		}
		else if (event) {
			keycode = event.which;
		}
		else {
			return true;
		}	
		
		if (keycode == 13) {
	   		this.newCategory();
	   	}
		else {
	   		return true;
		}
	}

	this.refresh = function() {
		CurrentCard.clearCard();
		categoriesRequest = Utils.AJAX.createRequest();
		var url = Utils.AJAX.makeRequestURL('cardservlet', 'categories', true, 'uid', User.getCurrentUser());
		categoriesRequest.open('GET', url, true);
		categoriesRequest.onreadystatechange = displayCategories;
		categoriesRequest.send(null);
	}
	
	/**
	 *  When the play button gets clicked for a category, we
	 *  change the image to denote that it has been selected.
	 *  this changes them all back.
	 */
	this.clearGameImages = function() {
		this.clearGameImagesOnSpan('categories');
		this.clearGameImagesOnSpan('fixedcategories');
	}
	
	this.clearGameImagesOnSpan = function(spanName) {
		var catE = document.getElementById(spanName);
		
		if (!catE) {
			return null;
		}
		
		for (var i = 0; i < catE.childNodes.length; i++) {
			var nodeE = catE.childNodes[i];
			if (nodeE.icon) {
				nodeE.icon.src = nodeE.playIconSrc;
			}
		}	
	}		

	/* private */
	
	function displayCategories() {
		if (categoriesRequest.readyState == 4) {
			if (categoriesRequest.status == 200) {
				var xmldoc = categoriesRequest.responseXML;
				var cats = document.getElementById('categories');
				Utils.DOM.clearChildren(cats);
				var results = xmldoc.getElementsByTagName('results')[0];
				var categoryNodes = results.getElementsByTagName('category');
	
				if (categoryNodes.length >= 1) {
					for (var i = 0; i < categoryNodes.length; i++) {
						placeCategory(categoryNodes[i]);
					}
					CurrentCard.setCategory(categoryNodes[0].childNodes[0].data);
					View.welcome.display();
				}
				else {
					CurrentCard.setCategory(null);
					View.welcome.display();
				}
			}
		}
	}

	function placeCategory(categoryNode) {
		var category = categoryNode.childNodes[0].data;
		var uid = categoryNode.getAttribute('uid');
		var fixed = categoryNode.getAttribute('fixed') == "true";
		
		var spanName = fixed ? "fixedcategories" : "categories";
		var span = document.getElementById(spanName);
		var playIconSrc = fixed ? "images/fixedplayicon.png" : 'images/playicon.png';
		
		if (!span) {
			// Might not have span for fixed categories.
			return;
		}
		
		var clickcode = "";
		clickcode += "Categories.clearGameImages();  User.setUser(" + uid + "); Games.showGames(true, '" + category + "'," + uid + ", " + !fixed + ");";
		clickcode += "this.icon.src = 'images/gameicon.png';";
		var playIcon = Utils.DOM.createOnClickImage(playIconSrc, clickcode);
		
		var link = Utils.DOM.createEmptyLink();
		link.className='category';
		link.icon = playIcon.icon;
		link.playIconSrc = playIconSrc;
		link.onclick = function () { 
			eval(clickcode);
		};
		var node = document.createTextNode(category);
		var br = document.createElement('br');
	
		link.appendChild(node);
	
		span.appendChild(playIcon);
		span.appendChild(link);
		span.appendChild(br);
	}

}