/**********
*
* begin xml/rpc functions
*
********** */
var tempHttpreq = getXmlObj() ;

/*
* cross broswer way of getting XML Object
* no params yet
* @returns XMLObject
*/
function getXmlObj() {
	if(window.ActiveXObject) {
		returnObj = new ActiveXObject("Microsoft.XMLDOM");
		returnObj.async = false;
	} else {
		returnObj = new XMLHttpRequest();
	} 
	return returnObj;
}			

function handleStateChange() {
	state = tempHttpreq.readyState;
	while(state < 4) {
		switch(state) {
			case 0 :
				currState = "Connection Uninitialized.";
				break;
			case 1 :
				currState = "Loading XML Data.";
				break;
			case 2 :
				currState = "XML Data Loaded.";
				break;
			case 3 :
				currState = "XML Data Interactive.";
				break;
			case 4 :
				currState = "Finished loading XML Data.";
				break;
			default :
				currState = "Unknown RPC state.";
				break;
		}
		document.getElementById("playList").innerHTML = "<br/><br/><div align=\"center\"><strong>" + currState + "</strong></div>";
	}
	//alert(currState);
	
	//document.getElementById("playList").flush();
}


/*
* cross browser remote data call
* @param targetUrl - where xml data is
* @returns response
*/			
function doRpcCall(targetUrl) {
	var tempXmlDoc =  getXmlObj() ;
	tempHttpreq = tempXmlDoc;
	//tempXmlDoc.onreadystatechange  = handleStateChange;
	if(window.ActiveXObject) {
		tempXmlDoc.load(targetUrl);
		return tempXmlDoc;
	} else {
		tempXmlDoc.open("GET", targetUrl, false);
		tempXmlDoc.send(null);
		return tempXmlDoc.responseXML;
	}
}

/*
* Merges xml from given url with xsl style sheet from another url
* @param xmlUrl - URL (php page) where XML is stored.
* @param styleUrl - URL where XSL style sheet is stored.
* @returns XMLObject
*/
var styleSheetCache = new Array();
function doXSLMerge(xmlUrl, styleUrl, targetElement) {
	targetElement = targetElement + 'ContentContainer';
	//loadMessageLayer.style.display = '';
	// load the xslt file
	if(styleSheetCache[styleUrl] == null) {
		xslRequest = doRpcCall(styleUrl);
		xslStylesheet = xslRequest;
		styleSheetCache[styleUrl] = xslStylesheet;
	} else {
		xslStylesheet = styleSheetCache[styleUrl];
	}
	//window.open(xmlUrl, 'testxml', 'width=600,height=420, resizable=1, scrollbars=1, location=1');
	// optional caching of xml data
	if(typeof(xmlUrl) == 'string') {
		xmlRequest = doRpcCall(xmlUrl);
		xmlData = xmlRequest;
	} else {
		xmlData = xmlUrl;
	}

	if(window.ActiveXObject) {

		// populate layer with merged data
		document.getElementById(targetElement).innerHTML =  xmlData.transformNode(xslStylesheet);			

	} else {
		
		// define XSL processor
		xsltProcessor = new XSLTProcessor();
		xsltProcessor.importStylesheet(xslStylesheet);
		xmlFragment = xsltProcessor.transformToFragment(xmlData, document);
		
		// send results to target layers
		document.getElementById(targetElement).innerHTML = "";
		document.getElementById(targetElement).appendChild(xmlFragment);					  

	}			

}

/*
* Merges xml from given url with xsl style sheet from another url
* @param xmlUrl - URL (php page) where XML is stored.
* @param styleUrl - URL where XSL style sheet is stored.
* @returns XMLObject
*/
var styleSheetCache = new Array();
function getXSLFromServer(xmlUrl, styleSheet, targetElement) {
	//loadMessageLayer.style.display = '';
	// load the xslt file
	//window.open(xmlUrl, 'testxml', 'width=600,height=420, resizable=1, scrollbars=1, location=1');
	// optional caching of xml data
	xmlUrl = xmlUrl + 'returnType=xslToHtml&styleSheet=listContacts';
	if(typeof(xmlUrl) == 'string') {
		xmlRequest = doRpcCall(xmlUrl);
		xmlData = xmlRequest;
	} else {
		xmlData = xmlUrl;
	}

	if(window.ActiveXObject) {

		// populate layer with merged data
		document.getElementById(targetElement).innerHTML =  xmlData.transformNode(xmlData);			

	} else {
		
		// define XSL processor
		xsltProcessor = new XSLTProcessor();
		xsltProcessor.importStylesheet(xslStylesheet);
		xmlFragment = xsltProcessor.transformToFragment(xmlData, document);
		
		// send results to target layers
		document.getElementById(targetElement).innerHTML = "";
		document.getElementById(targetElement).appendChild(xmlFragment);					  

	}			

}

/**********
*
* end xml/rpc functions
*
********** */

function createFrameName(targetLayer) {
	var newDate = new Date();
	frameName = targetLayer + "Frame";// + newDate.getUTCMonth().toString() + newDate.getUTCDay().toString() 
	//frameName = frameName + newDate.getUTCHours().toString() + newDate.getUTCMinutes().toString();
	//frameName = frameName + newDate.getUTCSeconds().toString() + newDate.getUTCMilliseconds().toString();
	return frameName;
}

/* ***************************
* function to create hidden iframe for remote processing
*****************************/
function callRpcIFrame(targetLayer, targetURL, frameName) {
	//window.open(targetURL, 'testwin', 'width=300,height=100');
	
	
	//if (!document.createElement) {return true};
	var IFrameDoc;
	IFrameObj = document.getElementById(frameName);
	
	
	if (!IFrameObj && document.createElement) {
		// create the IFrame and assign a reference to the
		// object to our global variable IFrameObj.
		// this will only happen the first time 
		// callToServer() is called
		try {
			var tempIFrame=document.createElement('iframe');
			tempIFrame.setAttribute('id',frameName);
			tempIFrame.setAttribute('name',frameName);
			tempIFrame.style.border='solid 1px black';
			tempIFrame.style.width='180px';
			tempIFrame.style.height='180px';
			tempIFrame.style.display='none';
			IFrameObj = document.body.appendChild(tempIFrame);
			
			if (document.frames) {
				// this is for IE5 Mac, because it will only
				// allow access to the document object
				// of the IFrame if we access it through
				// the document.frames array
				IFrameObj = document.frames[frameName];
			}
		} catch(exception) {
			// This is for IE5 PC, which does not allow dynamic creation
			// and manipulation of an iframe object. Instead, we'll fake
			// it up by creating our own objects.
			iframeHTML='\<iframe id="' + frameName + '" name="' + frameName + '" style="';
			iframeHTML+='border:0px;';
			iframeHTML+='width:0px;';
			iframeHTML+='height:0px;';
			iframeHTML+='"><\/iframe>';
			document.body.innerHTML+=iframeHTML;
			IFrameObj = new Object();
			IFrameObj.document = new Object();
			IFrameObj.document.location = new Object();
			IFrameObj.document.location.iframe = document.getElementById(frameName);
			IFrameObj.document.location.replace = function(location) { this.iframe.src = targetURL; }
		}
	}

	//if (navigator.userAgent.indexOf('Gecko') !=-1 && !IFrameObj.contentDocument) {
	// we have to give NS6 a fraction of a second
	// to recognize the new IFrame
	//setTimeout('callRpcIFrame()',10);
	//return false;
	//}
	
	if (IFrameObj.contentDocument) {
		// For NS6
		IFrameDoc = IFrameObj.contentDocument; 
	} else if (IFrameObj.contentWindow) {
		// For IE5.5 and IE6
		IFrameDoc = IFrameObj.contentWindow.document;
	} else if (IFrameObj.document) {
		// For IE5
		IFrameDoc = IFrameObj.document;
	} else {
		frameObj = document.getElementById(frameName);
		frameObj.location = targetURL;
		return true;
	}

	IFrameDoc.location.replace(targetURL);
	
	
	return true;
	
}

/*********************
* function to monitor a hidden proccesing
* frame and output the results to a div once
* the hidden frame finish loading.
************************/
var secondCount = 0;
var millisecondCount = 0;
var frameContent = "";
var pageDetectEndDelay = 0;
function monitorFrame(targetLayer,frameName) {
	
	if(secondCount >= 15) {
		//alert(frameName);
		millisecondCount = 0;
		secondCount = 0;
		document.getElementById(targetLayer).innerHTML = "<div class='loadingMessage'><h3>Error Loading Data. Request timed out</h3></div>";
		frameProcessing = false;
	} else {
		frameObj = document.getElementById(frameName)
		//document.getElementById("timerLayer").innerHTML = "Time: " + secondCount + ":0" + millisecondCount + "";
		millisecondCount++;
		if(millisecondCount == 10) {
			millisecondCount = 0;
			secondCount++;
		}
		
		if(isObject(frameObj)) {
			
			if (frameObj.contentDocument) {
				// For NS6
				IFrameDoc = frameObj.contentDocument; 
			} else if (frameObj.contentWindow) {
				// For IE5.5 and IE6
				IFrameDoc = frameObj.contentWindow.document;
			} else {
				// For IE5
				IFrameDoc = frameObj.document;
			} 
			
			if(IFrameDoc.body != null) {
				
				if(IFrameDoc.body.innerHTML != "") {
					currContent = IFrameDoc.body.innerHTML;
					
					if(currContent == frameContent) {
						if($pageDetectEndDelay >= 5) {
						
							document.getElementById(targetLayer).innerHTML = IFrameDoc.body.innerHTML;
							document.body.removeChild(frameObj);
							frameProcessing = false;
							millisecondCount = 0;
							secondCount = 0;
							frameContent = "";
						} else {
							$pageDetectEndDelay++;
							frameContent = currContent;
							setTimeout('monitorFrame("' + targetLayer + '", "' + frameName + '")',100);
						}
					} else {
						$pageDetectEndDelay = 0;
						frameContent = currContent;
						setTimeout('monitorFrame("' + targetLayer + '", "' + frameName + '")',100);
					}
				} else {	
					setTimeout('monitorFrame("' + targetLayer + '", "' + frameName + '")',100);
				}
			} else {
				setTimeout('monitorFrame("' + targetLayer + '", "' + frameName + '")',100);
			}
		} else {
			setTimeout('monitorFrame("' + targetLayer + '", "' + frameName + '")',100);
		}
	}
}


/**************
* function to do remote calls to a hidden ifranme and return 
* the results to a layer in the page.
* example call:
	newUrl = collectFormElements(formObj,"<?= SITE_WEB_ROOT ?>", 'contact');
	newUrl = newUrl + "&totalRows=" + formObj.totalRows.value;
	newUrl = newUrl + "&returnType=xslToHtml&styleSheet=listContacts";
	doIFrameRpcCall(newUrl, 'contactList');	
***************/
var finalTargetLayer = "";
function doIFrameRpcCall(targetUrl, targetLayer) {
	targetLayer = targetLayer + 'ContentContainer';
	//window.open(targetUrl,'test','width=400,height=100,locationbar=1');
	//doXSLMerge(newUrl, contactListStyle, 'contactList');
	//getXSLFromServer(newUrl, 'listContacts', 'contactList');
	frameName = createFrameName(targetLayer);
	
	if(targetLayer != null) {
		finalTargetLayer = targetLayer;
		targetUrl = targetUrl + '&frameName=' + frameName + '&targetLayer=' + targetLayer;
		
		if(callRpcIFrame(targetLayer,targetUrl,frameName)) {
			//alert(document.getElementById(frameName));
			if(document.getElementById(targetLayer)) {
				//document.getElementById(targetLayer).innerHTML = '<div class="loadingMessage"><h2>Loading Data...</h2></div>'; //<img src="images/nma-timer-anim.gif"  />
			}
			//monitorFrame(targetLayer,frameName);
		} else {
			alert("error creating proccessing frame");
		}
	} else {
		callRpcIFrame(null,targetUrl,frameName);	
	}
	//return false;
}


function recieveFrameResponse(responseData, frameName, targetLayer) {
	if(targetLayer != "") {
		if(document.getElementById(targetLayer)) {
			document.getElementById(targetLayer).innerHTML = "";
			document.getElementById(targetLayer).innerHTML = responseData;
			frameObj = document.getElementById(frameName)
			document.body.removeChild(frameObj);
		}
	} else {
		alert(responseData);
	}

}



/********************
* end iframe functions
*********************/