var Grammar = new function() {
	var grammarRequest;
	var headerRequest;
	var useGrammars = false;
	
	this.setUseGrammars = function() {
		useGrammars = true;
	}
	
	this.getUseGrammars = function() {
		return useGrammars;
	}
	
	this.startGrammarHeaderTool = function(headerName) {
		if (this.getUseGrammars()) {
			var header = getGrammarHeader(headerName); 
			View.setDisplay('GameGrammarEditor', true);
			
			if (!header) {
				header = "Enter JSGF header here!";
			}
			
			var textarea = document.getElementById('grammarHeaderEditorArea');
			textarea.value = header;
			textarea.headerName = headerName;
		}
	}
	
	this.closeHeaderEditor = function() {
			View.setDisplay('GameGrammarEditor', false);
	}
	
	this.startGrammarTool = function() {
		this.loadCategoryGrammar();
		showCategoryGrammarTool();
	}
	
	this.loadCategoryGrammar = function() {
		if (this.getUseGrammars()) {
			var editorCategoryE = document.getElementById("editorcategory");
			Utils.DOM.clearChildren(editorCategoryE);
			
			var category = CurrentCard.getCategory();
			
			if (category) {
				var label = document.createTextNode(category);
				editorCategoryE.appendChild(label);
				var grammar = getCategoryGrammar(category);
			
				if (!grammar) {
					grammar = "Enter JSGF rules here!";
				}
			
				var textarea = document.getElementById('categoryGrammarArea');
				textarea.value = grammar;
			}
		}
	}

	this.markGrammarEditted = function() {
		var saveButton = document.getElementById('grammarSaveButton');
		saveButton.value = "*Save Grammar*";
		return true;
	}
	
	this.markHeaderEditted = function() {
		var saveButton = document.getElementById('headerSaveButton');
		saveButton.value = "*Save Header*";
		return true;
	}

	this.saveCategoryGrammar = function() {
		var message = getGrammarXML();
		grammarRequest = Utils.AJAX.createRequest();
		var category = CurrentCard.getCategory();
		postEvent("EDIT_CATEGORY_SAVE_GRAMMAR", category);
		var url = Utils.AJAX.makeRequestURL('cardservlet', 'category', category, 'categorygrammar', true, 'uid', User.getCurrentUser());
		grammarRequest.open('POST', url, true);
		grammarRequest.onreadystatechange = grammarSaved;
		grammarRequest.send(message);
	}
	
	this.saveGrammarHeader = function() {
		var message = getHeaderXML();
		var headerName = getHeaderName();
		
		if (headerName) {
			headerRequest = Utils.AJAX.createRequest();
			var url = Utils.AJAX.makeRequestURL('cardservlet', 'header', headerName);
			headerRequest.open('POST', url, true);
			headerRequest.onreadystatechange = headerSaved;
			headerRequest.send(message);
		}
		else {
			alert("Header name not defined.");
		}
	}

	/* private helpers */
	function getHeaderName() {
		var textarea = document.getElementById('grammarHeaderEditorArea');
		return textarea.headerName;
	}
	
	function unmarkGrammarEditted() {
		var saveButton = document.getElementById('grammarSaveButton');
		saveButton.value = "Save Grammar";
	}
	
	function unmarkHeaderEditted() {
		var saveButton = document.getElementById('headerSaveButton');
		saveButton.value = "Save Header";
	}
	
	function getGrammarXML() {
		var categoryAreaE = document.getElementById('categoryGrammarArea');
		var xmlDoc = Utils.XML.newDocument();
		var grammarE = xmlDoc.createElement('grammar');
		var dataE = xmlDoc.createCDATASection(categoryAreaE.value);
		grammarE.appendChild(dataE);
		xmlDoc.appendChild(grammarE);
		
		return xmlDoc;
	}
		
	function getHeaderXML() {
		var headerAreaE = document.getElementById('grammarHeaderEditorArea');
		var xmlDoc = Utils.XML.newDocument();
		var headerE = xmlDoc.createElement('header');
		var dataE = xmlDoc.createCDATASection(headerAreaE.value);
		headerE.appendChild(dataE);
		xmlDoc.appendChild(headerE);
		
		return xmlDoc;
	}
	
	function clearGrammarEditor() {
		var editorCategoryE = document.getElementById("editorcategory");
		Utils.DOM.clearChildren(editorCategoryE);	
		var editorE = document.getElementById("editorarea");
		Utils.DOM.clearChildren(editorE);
		var editorButtonsE = document.getElementById("editorbuttons");
		Utils.DOM.clearChildren(editorButtonsE);
	}

	function showCategoryGrammarTool() {
		closeTools();
		View.setDisplay('categoryGrammarTool', true);
	}
	
	function getGrammarHeader(headerName) {
		return "header test";
	}
	
	function getCategoryGrammar(category) {
		var request = Utils.AJAX.createRequest();
		var url = Utils.AJAX.makeRequestURL('cardservlet', 'category', category, 'categorygrammar', true, 'uid', User.getCurrentUser());
		request.open('GET', url, false);
		request.send(null);
		
		var grammar = "<rule> = example rule;";
		
		if (request.readyState == 4) {
			if (request.status == 200) {
				var xmldoc = request.responseXML;
				var result = xmldoc.getElementsByTagName('grammar')[0];
				
				if (result) {
					grammar = result.childNodes[0].data;
				}
			}
		}
		
		return grammar;
	}
	
	function getGrammarHeader(headerName) {
		var request = Utils.AJAX.createRequest();
		var url = Utils.AJAX.makeRequestURL('cardservlet', 'header', headerName);
		request.open('GET', url, false);
		request.send(null);
		
		var grammar = null;
		
		if (request.readyState == 4) {
			if (request.status == 200) {
				var xmldoc = request.responseXML;
				var result = xmldoc.getElementsByTagName('header')[0];
				
				if (result) {
					grammar = result.childNodes[0].data;
				}
			}
		}
		
		return grammar;
	}
	
	function grammarSaved() {
		if (grammarRequest.readyState == 4) {
			if (grammarRequest.status == 200) {
				unmarkGrammarEditted();
			}
		}
	}	
	
	function headerSaved() {
		if (headerRequest.readyState == 4) {
			if (headerRequest.status == 200) {
				unmarkHeaderEditted();
			}
		}
	}
}