// JavaScript for CYF programme retrieval from database using AJAX

var xmlHttpRequest;

// function to do HTTP request for specified month's programme information
function retrieveProgramme(url) { 
	retrieveInfo(url, "Programme");
}

// function to do HTTP request for specified year's monthly scriptures
function retrieveMScripture(url) { 
	retrieveInfo(url, "MScripture");
}

// function to do HTTP request for specified news page
function retrieveNews(url) { 
	retrieveInfo(url, "News");
}

// function to do HTTP request
function retrieveInfo(url, type) { 

	xmlHttpRequest = getXMLHttpRequest();
	
	if (xmlHttpRequest == null) {
		alert ("Browser does not support XML HTTP Request");
		return;
	} 
	
	if(type == "Programme"){
		xmlHttpRequest.onreadystatechange = doProgrammeUpdate;
	} else if(type == "MScripture"){
		xmlHttpRequest.onreadystatechange = doMScriptureUpdate;
	} else if(type == "News"){
		xmlHttpRequest.onreadystatechange = doNewsUpdate;
	}
	xmlHttpRequest.open("GET",url,true);
	xmlHttpRequest.send(null);
}

// callback function when HTTP Request completed
// update programme page DOM to reflect changes
function doProgrammeUpdate() { 
	try {
		if (xmlHttpRequest.readyState == 4){ 			
			if (xmlHttpRequest.status == 200) {
			
				var rotaTable = document.getElementById("rota_table");
				var rows = rotaTable.rows;
				var lastContentRowIndex = rows.length - 1;
				
				// delete the table's content of any particular month from HTML DOM
				for(var r = 2; r < lastContentRowIndex; r++){
					rotaTable.deleteRow(2);
				}

				// insert XML message's content into HTML DOM
				var message = xmlHttpRequest.responseXML.getElementsByTagName("message")[0];
				
				// each entry
				var entries = message.getElementsByTagName("entry");
				for(var e = 0; e < entries.length; e++){
					var newRow = rotaTable.insertRow(2+e);
					
					// each data item under an entry
					var tags = new Array("date","programme","speaker","chair",
										 "music","cooking","washingup","offering");
					for(var i = 0; i < tags.length; i++){
					
						var dataItem = entries[e].getElementsByTagName(tags[i])[0];

						// determine cell's width
						var width = 100;
						if(dataItem.tagName == "date") {
							width = 60;
						} else if(dataItem.tagName == "offering") {
							width = 70;
						}
						
						var newCell = newRow.insertCell(i);
						newCell.width = width;

						// extract XML Text node value and insert into a new HTML DOM Text node						
						var text = (dataItem.childNodes[0] == null)? "": dataItem.childNodes[0].nodeValue;
						var subtexts = text.split(",");
						
						var t;
						for(t = 0; t < subtexts.length - 1; t++){
							var newTextNode  = document.createTextNode(subtexts[t] + ",");							
							// append text node to the cell node
						    newCell.appendChild(newTextNode);
							
							// add a <br /> between subtexts
							newCell.appendChild(document.createElement("br"));
						}
						
						var newTextNode  = document.createTextNode(subtexts[t]);							
						// append text node to the cell node
					    newCell.appendChild(newTextNode);						
					   	
					}
					
				}
				
			} else {
				alert("Request error ocurred - unable to retrieve programme");
			}
		}
	}	catch( e ) {
			alert('Exception caught: ' + e.description);
		} 
}

// callback function when HTTP Request completed
// update monthly scripture page DOM to reflect changes
function doMScriptureUpdate() { 
	try {
		if (xmlHttpRequest.readyState == 4){
			if (xmlHttpRequest.status == 200) {
				
				var msTable = document.getElementById("mscripture_table");
				var rows = msTable.rows;
				var lastContentRowIndex = rows.length;
				
				// delete the table's content of any particular month from HTML DOM
				for(var r = 2; r < lastContentRowIndex; r++){
					msTable.deleteRow(2);
				}

				// insert XML message's content into HTML DOM
				var message = xmlHttpRequest.responseXML.getElementsByTagName("message")[0];
				
				// each entry
				var entries = message.getElementsByTagName("entry");
				for(var e = 0; e < entries.length; e++){
					var newRow = msTable.insertRow(msTable.rows.length);
					
					// each data item under an entry
					var tags = new Array("month","verses","chicontent");
					for(var i = 0; i < tags.length; i++){
					
						var dataItem = entries[e].getElementsByTagName(tags[i])[0];
						
						// determine cell's width
						var width = 500;
						if(dataItem.tagName == "month") {
							width = 80;
						} else if(dataItem.tagName == "verses") {
							width = 150;
						}
												
						var newCell = newRow.insertCell(i);
						newCell.width = width;

						// extract XML Text node value and insert into a new HTML DOM Text node						
						var text = (dataItem.childNodes[0] == null)? "": dataItem.childNodes[0].nodeValue;	
													
						if(dataItem.tagName == "chicontent") {
							// append text node to the span node and span node to the cell node
							var spanNode = document.createElement("span")
							spanNode.className = "chinese";
						    newCell.appendChild(spanNode);
							spanNode.appendChild(document.createTextNode(text));
							
							if(text != ""){
								// add 2 <br /> after chinese content if chinese content exists
								newCell.appendChild(document.createElement("br"));
								newCell.appendChild(document.createElement("br"));
							}
							
							// add english content after <br /> tags
							dataItem = entries[e].getElementsByTagName("engcontent")[0];
							// extract XML Text node value and insert into a new HTML DOM Text node						
							text = (dataItem.childNodes[0] == null)? "": dataItem.childNodes[0].nodeValue;
							
							// append text node to the span node and span node to the cell node
							spanNode = document.createElement("span")
							spanNode.className = "english";
						    newCell.appendChild(spanNode);
							spanNode.appendChild(document.createTextNode(text));
							
							if(text != ""){
								// add 2 <br /> after english content if english content exists
								newCell.appendChild(document.createElement("br"));
								newCell.appendChild(document.createElement("br"));
							}
							
						} else {
							// append text node to the span node and span node to the cell node
						    newCell.appendChild(document.createTextNode(text));
						}	
						
											
					}

					// determine whether a image file presents
					var dataItem = entries[e].getElementsByTagName("imgpath")[0];
					if(dataItem.childNodes[0] != null) {
						var newRow = msTable.insertRow(msTable.rows.length);
						var newCell = newRow.insertCell(0);
						newCell.width = 730;
						newCell.colSpan = 3;
						var imgNode = document.createElement("img");
						imgNode.src = "/m_scripture_data/" + dataItem.childNodes[0].nodeValue;
						newCell.appendChild(imgNode);
					}					
				}
				
			} else {
				alert("Request error ocurred - unable to retrieve monthly scripture");
			}
		}
	}	catch( e ) {
			alert('Exception caught: ' + e.description);
		} 
}

// callback function when HTTP Request completed
// update news page DOM to reflect changes
function doNewsUpdate() { 
	try {
		if (xmlHttpRequest.readyState == 4){ 			
			if (xmlHttpRequest.status == 200) {
			
				var newsTable = document.getElementById("news_table");
				var rows = newsTable.rows;
				var lastContentRowIndex = rows.length;
				
				// delete the table's content of any particular month from HTML DOM
				for(var r = 2; r < lastContentRowIndex; r++){
					newsTable.deleteRow(2);
				}

				// insert XML message's content into HTML DOM
				var message = xmlHttpRequest.responseXML.getElementsByTagName("message")[0];
				
				// each entry
				var entries = message.getElementsByTagName("entry");
				for(var e = 0; e < entries.length; e++){
					var newRow1 = newsTable.insertRow(2+e*3);
					var newRow2 = newsTable.insertRow(2+e*3+1);
					var newRow3 = newsTable.insertRow(2+e*3+2);
					
					// each data item under an entry
					var tags = new Array("timestamp", "title", "body");
					for(var i = 0; i < tags.length; i++){
					
						var dataItem = entries[e].getElementsByTagName(tags[i])[0];

						if(dataItem.tagName == "timestamp") {
							var newCell = newRow1.insertCell(0);
							newCell.width = 100;
							
							
						} else if(dataItem.tagName == "title") {
							var newCell = newRow1.insertCell(1);
							newCell.width = 630;
							
							
						} else if(dataItem.tagName == "body") {
							var newCellEmpty = newRow2.insertCell(0);
							newCellEmpty.width = 100;
							var newCell = newRow2.insertCell(1);
							newCell.width = 630;							
							
						}
						
						// extract XML Text node value and insert into a new HTML DOM Text node						
						var text = (dataItem.childNodes[0] == null)? "": dataItem.childNodes[0].nodeValue;
						
						// append text node to the cell node
					    newCell.appendChild(document.createTextNode(text));
		
						if(dataItem.tagName == "body"){
							// add 2 <br /> after news body content
							newCell.appendChild(document.createElement("br"));
							newCell.appendChild(document.createElement("br"));
						}					   	
					}
					
					var newCell = newRow3.insertCell(0);
					newCell.colSpan = 2;
					newCell.appendChild(document.createElement("hr"));
				}
				
			} else {
				alert("Request error ocurred - unable to retrieve news");
			}
		}
	}	catch( e ) {
			alert('Exception caught: ' + e.description);
		} 
}

// initialize and return the xmlHttpRequest object
function getXMLHttpRequest(){ 

	var _xmlHttpRequest = null;
	
	if (window.XMLHttpRequest){ // Mozilla, Safari, ...
		_xmlHttpRequest = new XMLHttpRequest();
	}
	else if (window.ActiveXObject){ // IE
		try {		// IE 6 or later (newest version of xmlHttpRequest object)
		   _xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {	// IE 5.5 or later
				_xmlHttpRequestt = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {} //do nothing
		}
	}
	return _xmlHttpRequest;
}