/****************************************************
 * Houses everything to do with the flash-card player
 ****************************************************/

var Player = new function() {
	var category = null;
	
	this.startPlayer = function(c, uid) {
		category = c;
		layoutPlayer();

		var playerRequest = Utils.AJAX.createRequest();
		var url = Utils.AJAX.makeRequestURL('playerservlet', 
								'initialize', 'true', 
								'category', category, 
								'uid', uid, 
								'filter', false);
		playerRequest.open('GET', url, false);
		playerRequest.send(null);
		postEvent("FLASHCARDS_PLAY_CATEGORY", category);
		displayPlayerCard(playerRequest);
	}
	
	this.getCategory = function() {
		return category;
	}
	
	this.toggleCover = function(area) {
		if (area.className == "covered") {
			area.className = "uncovered";
		}
		else {
			area.className = "covered";
		}
		
		updateTextArea(area);
	}

	this.currentCard = function() {
		operation('current');
	}
	
	this.nextCard = function() {
		operation('next');
		coverCard();
	}
	
	this.prevCard = function() {
		operation('prev');
		coverCard();
	}
	
	this.firstCard = function() {
		operation('first');
		coverCard();
	}
	
	this.lastCard = function() {
		operation('last');
		coverCard();
	}
	
	this.markRight = function() {
		operation('right');
	}
	
	this.markWrong = function() {
		operation('wrong');
	}
	
	this.shuffle = function() {
		operation('shuffle');
		coverCard();
	}


	/*******************/
	/* private helpers */
	/*******************/
	
	function coverCard() {
		setCardCover(true);
	}
	
	function uncoverCard() {
		setCardCover(false);
	}

	function useFilter() {
		var filterE = document.getElementById('filter');
		return filterE.checked;
	}
		
	function layoutPlayer() {
		View.player.display();
	
		var englishE = document.getElementById('englishPlayingCard');
		englishE.coveredValue = "Click to show English";
		var pinyinE = document.getElementById('pinyinPlayingCard');
		pinyinE.coveredValue = "Click to show Pinyin";
		var chineseE = document.getElementById('chinesePlayingCard');
		chineseE.coveredValue = "Click to show Chinese";
	
		coverCard();
	}
	
	function setCardCover(cover) {
		var className = (cover) ? "covered" : uncovered;
		
		var englishE = document.getElementById('englishPlayingCard');
		englishE.className = className;
		updateTextArea(englishE);
	
		var pinyinE = document.getElementById('pinyinPlayingCard');
		pinyinE.className = className;
		updateTextArea(pinyinE);
	
		var chineseE = document.getElementById('chinesePlayingCard');
		chineseE.className = className;
		updateTextArea(chineseE);
	}
	
	function setBlankCard() {
		var chineseE = document.getElementById('chinesePlayingCard');
		var pinyinE = document.getElementById('pinyinPlayingCard');
		var englishE = document.getElementById('englishPlayingCard');
	
		var progressE = document.getElementById('progress');
		Utils.DOM.clearChildren(progressE);
		var markE = document.getElementById('mark');
		Utils.DOM.clearChildren(markE);
		var randomImageE = document.getElementById('randomImage');
		Utils.DOM.clearChildren(randomImageE);
		
		chineseE.uncoveredValue = "Start of deck.";
		englishE.uncoveredValue = "Start of deck.";
		pinyinE.uncoveredValue = "Start of deck.";
			
		coverCard();
	}
	
	function setCurrentCard(cardN) {
		var chineseE = document.getElementById('chinesePlayingCard');
		var pinyinE = document.getElementById('pinyinPlayingCard');
		var englishE = document.getElementById('englishPlayingCard');
	
		var chineseN = cardN.getElementsByTagName('chinese')[0];
		var pinyinN = cardN.getElementsByTagName('pinyin')[0];
		var englishN = cardN.getElementsByTagName('english')[0];
	
		if (chineseN.childNodes[0]) {
			chineseE.uncoveredValue = chineseN.childNodes[0].data;
		}
		
		if (pinyinN.childNodes[0]) {
			pinyinE.uncoveredValue = pinyinN.childNodes[0].data;
		}
	
		if (englishN.childNodes[0]) {
			englishE.uncoveredValue = englishN.childNodes[0].data;
		}
		
		setCardMark(cardN);
		
		var imageNs = cardN.getElementsByTagName('image');
		setRandomImage(imageNs);
	}
	
	function setRandomImage(imageNs) {
		var randomImageE = document.getElementById('randomImage');
		Utils.DOM.clearChildren(randomImageE);
			
		if (imageNs.length > 0) {
			var index=Math.floor(Math.random()*imageNs.length)
			var imageN = imageNs[index];
			
			var image = new Image;
			image.src = imageN.getAttribute('src');
			image.width = imageN.getAttribute('width');
			image.height = imageN.getAttribute('height');
			image.imageNode = imageN;
	
			randomImageE.appendChild(image);
		}	
	}
	
	function setCardMark(cardN) {
		var markE = document.getElementById('mark');
		Utils.DOM.clearChildren(markE);
		
		var guessed = cardN.getAttribute('guessed');
		
		if (guessed == 'true') {
			var correct = cardN.getAttribute('correct');
			var icon = document.createElement('img');
			
			if (correct == 'true') {
				icon.src = "images/right.png";
			}
			else {
				icon.src = "images/wrong.png";
			}
			
			markE.appendChild(icon);
		}		
	}
	
	function updateCard() {
		var englishE = document.getElementById('englishPlayingCard');
		var pinyinE = document.getElementById('pinyinPlayingCard');
		var chineseE = document.getElementById('chinesePlayingCard');
		updateTextArea(englishE);
		updateTextArea(pinyinE);
		updateTextArea(chineseE);
	}
	
	function updateTextArea(textarea) {
		if (textarea.className == "uncovered") {
			textarea.value = textarea.uncoveredValue;
		}
		else {
			textarea.value = textarea.coveredValue;
		}
	}
	
	function updateInfo(deckInfo) {
		var correctE = document.getElementById('correct');
		var incorrectE = document.getElementById('incorrect');
		var unguessedE = document.getElementById('unguessed');
		
		Utils.DOM.clearChildren(correctE);
		Utils.DOM.clearChildren(incorrectE);
		Utils.DOM.clearChildren(unguessedE);
	
		var right = deckInfo.getAttribute('right');
		var text1 = document.createTextNode(right);
		correctE.appendChild(text1);
	
		var wrong = deckInfo.getAttribute('wrong');
		var text2 = document.createTextNode(wrong);
		incorrectE.appendChild(text2);
	
		var unguessed = deckInfo.getAttribute('unguessed');
		var text3 = document.createTextNode(unguessed);
		unguessedE.appendChild(text3);
		
		updateProgress(deckInfo);
	}
	
	function updateProgress(deckInfo) {
		var index = deckInfo.getAttribute('index');
		var total = deckInfo.getAttribute('total');
	
		if (useFilter()) {
			index = deckInfo.getAttribute('filterIndex');
			total = deckInfo.getAttribute('filterTotal');
		}
		
		var text = document.createTextNode("" + index + "/" + total);
	
		var progressE = document.getElementById('progress');
		Utils.DOM.clearChildren(progressE);
		progressE.appendChild(text);
	}

	function operation(op) {
		var filter = useFilter();
		var playerRequest = Utils.AJAX.createRequest();
		var url = Utils.AJAX.makeRequestURL('playerservlet', 'operation', op, 'filter', filter);
		playerRequest.open('GET', url, false);
		playerRequest.send(null);
		displayPlayerCard(playerRequest);
		postEvent('FLASHCARD_OPERATION', op);
	}
	
	function displayPlayerCard(playerRequest) {
		if (playerRequest.readyState == 4) {
			if (playerRequest.status == 200) {
				var xmldoc = playerRequest.responseXML;
				
				var card = xmldoc.getElementsByTagName('card')[0];			
				var deckInfo = xmldoc.getElementsByTagName('deck')[0];
				
				if (card) {
					setCurrentCard(card);
					updateCard();
					updateInfo(deckInfo);
				}
				else {
					setBlankCard();		
				}
			}
		}
	}
}