/*
File:        liturgySheets.js
Date:        28 October 2008
Author:      Paul VanLeeuwen
Copyright:   2008 Saint Joseph Catholic Church
Description: Liturgy planning sheet support functions.
*/
/*
Updates:
10-28-08:	Initial release
08-03-09:   Update to use 3 request objects, set "requested" value to prevent multiple requeests
            for the same liturgy.
08-06-09:   Update to use event.target for Firefox, as well as event.srcElement
09-27-09:	Load XSL object in advance
03-15-10:   Display year on liturgy planning sheet.
*/

//AJAX objects
var xLitObject1 = false;
var xLitObject2 = false;
var xLitObject3 = false;
if (window.XMLHttpRequest) {
	xLitObject1 = new XMLHttpRequest();
	xLitObject2 = new XMLHttpRequest();
	xLitObject3 = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
	xLitObject1 = new ActiveXObject("Microsoft.XMLHTTP");
	xLitObject2 = new ActiveXObject("Microsoft.XMLHTTP");
	xLitObject3 = new ActiveXObject("Microsoft.XMLHTTP");
}
if (xLitObject1.overrideMimeType) {
	xLitObject1.overrideMimeType("text/xml");
	xLitObject2.overrideMimeType("text/xml");
	xLitObject3.overrideMimeType("text/xml");
}
var xLitArray = new Array (xLitObject1,xLitObject2,xLitObject3);
var xLitUseArray = new Array (false,false,false);

//XSL for XML transformation of liturgy
var xsl
if(window.ActiveXObject) {
	//IE
	xsl = new ActiveXObject("Microsoft.XMLDOM");
}
else if (document.implementation && document.implementation.createDocument) {
	//Firefox, etc.
	xsl=document.implementation.createDocument("","",null);
}
xsl.async = false;
//xsl.validateOnParse = false; //Added when entities needed in XSL definition
xsl.load("scripts/liturgyTransform.xml");

/*
Object: liturgyCache
Purpose: Maintains cache of retrieved liturgies.
*/
var liturgyCache = {
	cache: new Array(),
	xLitIndex: 0,
	//calendarGenerated: false,
	cacheLiturgies: function (liturgyArray) {	
		//Issue httpRequest to get liturgies in provided array
		var requestBody = "";
		var first = true;
		for (i=1;i<liturgyArray.length;i++) {
			var liturgy = liturgyArray[i].split('|');
			var cachedLiturgy = liturgyCache.cache[liturgy[4]+liturgy[5]];
			//alert(cachedLiturgy);
			if (cachedLiturgy == undefined) {
				if (!first) {
					requestBody += "&"
				} else {
					first = false;
				}
				requestBody += "litTable[]=" + encodeURIComponent(liturgy[4]);
				requestBody += "&litID[]=" + encodeURIComponent(liturgy[5]);
				liturgyCache.cache[liturgy[4]+liturgy[5]] = "Requested";
				//alert(liturgy[4]+liturgy[5] + ": " + liturgyCache.cache[liturgy[4]+liturgy[5]]);
			}
		}

		if (requestBody != "") {
			var xLitObject = xLitArray[liturgyCache.xLitIndex];
			xLitUseArray[liturgyCache.xLitIndex] = true;
			xLitObject.open("POST", "scripts/liturgyPlanningSheet.php", true);
			xLitObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xLitObject.onreadystatechange = liturgyCache.getData;
			xLitObject.send(requestBody);

			//alert (liturgyCache.xLitIndex + " - " + requestBody + " " + xLitUseArray);
			liturgyCache.xLitIndex = (liturgyCache.xLitIndex + 1) % xLitArray.length;
		}
	},
	//Retrieve month from the cache
	getCachedLiturgy: function (table, litID) {	
		//Retrieve requested liturgy planning sheet from cache
		//Returned value should be HTML		
		var cachedLiturgy = liturgyCache.cache[table+litID];
		if (cachedLiturgy != undefined) {
			return cachedLiturgy;
		} else {
			return "none";	
		}
	},
	//Receive liturgy info from the database
	getData: function () {
		//Receive data from database
		for (j=0;j<xLitArray.length;j++) {
			var xLitObject = xLitArray[j];			
			if (xLitUseArray[j] && xLitObject.readyState == 4 && xLitObject.status == 200) {
				var replyXML = xLitObject.responseXML;
				//alert(replyXML.xml);
				//alert(j + "- " + xLitObject.readyState);
				receiveLiturgies(replyXML);
				xLitObject.onreadystatechange = function() {}; 
				xLitUseArray[j] = false;
			} //End if successful status
		} //End for through lit objects
	} //End getData
}

/*
function: hideLiturgyPlanningSheet
input:    none
output:   none
process:  Hides the liturgy planning sheet, allowing calendar to be seen.
*/
function hideLiturgyPlanningSheet() {
	var planningSheet = document.getElementById("liturgyPlanningSheet");
	planningSheet.style.visibility = "hidden";
}

/*
function: showLiturgyPlanningSheet
input:    Liturgy table and id
output:   none
process:  Shows the liturgy planning sheet for the requested liturgy.
*/
function showLiturgyPlanningSheet(event) {
	var planBody = document.getElementById("liturgyPlanBody");
    var lit;
    if (event.target) lit = event.target;
    else if (event.srcElement) lit = event.srcElement;
    if (lit.nodeType == 3) //safari
    	lit = lit.parentNode;
	planBody.innerHTML = "<font size='5'><strong>" + lit.massType + "<br/>" + lit.description + "</strong><br/>" + months[generateCalendar.currentMonth] + " " + lit.date + ", " + generateCalendar.currentYear +" - " + lit.time + "<br/></font>";
	planBody.innerHTML += liturgyCache.getCachedLiturgy(lit.table,lit.litID);
	
	var planningSheet = document.getElementById("liturgyPlanningSheet");
	planningSheet.style.visibility = "visible";
}

/*
function: receiveLiturgies
input:    XML
output:   None
process:  Parse liturgies out of an xml, process each individually
*/
function receiveLiturgies(liturgiesXML) {
	var liturgies = liturgiesXML.getElementsByTagName('liturgy');
	for (i=0;i<liturgies.length;i++) {
		var litXML = liturgies[i];
		var keyAttr = litXML.attributes.getNamedItem('key');
		var key = keyAttr.nodeValue;
		//alert("key: " + key);
		liturgyCache.cache[key] = transformLitXML(litXML);
		//alert (key + ": Set");
	}
}

/*
function: transformLitXML
input:    XML
output:   HTML version of liturgy
process:  Uses XSLT script for transformation.
*/
function transformLitXML(litXML) {
	var xml
	var transformed
	if(window.ActiveXObject) {
		//IE
		xml = new ActiveXObject("Microsoft.XMLDOM");
		xml.async = false;
		xml.loadXML(litXML.xml);
	}
	else if (document.implementation && document.implementation.createDocument) {
		//Firefox, etc.
		var oSerializer3 = new XMLSerializer();
		var litXMLstring = oSerializer3.serializeToString(litXML);
		
		var oParser = new DOMParser();
		xml = oParser.parseFromString(litXMLstring,"text/xml");
	}
	
	if(window.ActiveXObject) {		
		transformed = xml.transformNode(xsl);
	}
	else if (document.implementation && document.implementation.createDocument) {
		var xsltProcessor=new XSLTProcessor();
	    xsltProcessor.importStylesheet(xsl);
		var transformedDoc = xsltProcessor.transformToDocument(xml);
    	//transformed = xsltProcessor.transformToDocument(xml,document);
		var oSerializer = new XMLSerializer();
		transformed = oSerializer.serializeToString(transformedDoc);
	}
	//alert(transformed);
	return transformed
}
