/************************************** Steve Doggett - Factories ********************
 * Created By:		Steve Doggett
 * Creation Date:	1st September 2006
 * Edited ----------------------------------------------------------------------------
 *		By:				On:
 * Description -----------------------------------------------------------------------
 *		This file contains a number of Javascript factory classes
 *
 **************************************************************************************/

/****
 * This function creates a browser specific xmlhttp object
 ****/
function XmlHttpFactory() {}

XmlHttpFactory.create = function () {
	try {
		if (window.ActiveXObject) {
		  var req = new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
			return req;
		}
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			// implement readyState property and onreadystatechange event on all browsers
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}
      
      // flag to indicate to manually apply "onreadystatechange" event when in sync mode
      req.verifySyncCall = true;
      
			req.trueOpen = req.open;
			req.open = function(method, url, async) {
			      req.async = async;
			      return req.trueOpen(method, url, async);
          };
			
			return req;
		}
	}
	catch (err) {}
    var txt="There was an error on this page.\n\n";
    txt+="Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    alert(txt);
};

/****
 * This function creates a browser specific xml document object
 ****/
function XmlDocumentFactory() {}

XmlDocumentFactory.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);
			
			// implement readyState property and onreadystatechange event on all browsers
			if (doc.readyState == null) 
      {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}
			
			return doc;
		}
		if (window.ActiveXObject)
			return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
	}
	catch (err) {}
    var txt="There was an error on this page.\n\n";
    txt+="Error description: " + err.description + "\n\n";
    txt+="Click OK to continue.\n\n";
    alert(txt);
};

// get Automation Server name 
/**
 * @private
 */ 
function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (err) {
      var txt="There was an error on this page.\n\n";
      txt+="Error description: " + err.description + "\n\n";
      txt+="Click OK to continue.\n\n";
      alert(txt);
		};
	}
}
