//<script>
//////////////////
// Helper Stuff //
//////////////////
var doc;
var htmltext;
var objects = new Array();
function getProp(element, attr, response)
{
   var aDoc;
   if (!response)
   {
	   aDoc = doc;
   }
   else
   {
	   aDoc = response.doc;
   }
	
	var obj = objects[element];
	if (!obj)
	{		
		obj = aDoc.getElementsByTagName(element);
		objects[element] = obj;
	}
	if (!obj || !obj[0]) return;
	var value = obj[0].getAttribute(attr);
    if (value)
    {	   	   
	   var regexp = /\+/g;	   	  
	   value = value.replace(regexp, " ");
	   value = unescape(value);
    }
	else 
	{
		value="";
	}
    return value;   
}
function getString(element, response)
{
   var aDoc;
   if (!response)
   {
	   aDoc = doc;
   }
   else
   {
	   aDoc = response.doc;
   }
	obj = aDoc.getElementsByTagName(element);
	if (!obj) return;
	
	var value = obj[0].textContent;	
	if(typeof value === 'undefined')
		value = obj(0).text;
	
    var regexp = /\+/g;	   	  
	value = value.replace(regexp, " ");
	value = unescape(value);
	return value;
}
function getError(response)
{
   var aDoc;
   if (!response)
   {
	   aDoc = doc;
   }
   else
   {
	   aDoc = response.doc;
   }   
   if (aDoc)
   {
	   var errorEl = aDoc.getElementsByTagName("error")
	   if (errorEl && errorEl.length > 0)
	   {
		  var regexp = /\+/g;
		  var value = errorEl[0].textContent;
		  if(typeof value === 'undefined')
			value = errorEl(0).text;
		  var urlDecoded = unescape(value);
		  
		  return (urlDecoded.replace(regexp, " "));
	   }
   }
   return;   
}
function getXml(sUri, showError) 
{
   //alert(sUri);
   objects = new Array();
   var xmlHttp = XmlHttp.create();
   var async = false;
   xmlHttp.open("POST", sUri, async);
   xmlHttp.send(null);
   doc = xmlHttp.responseXML;
   htmltext = xmlHttp.responseText;
   var error = getError();
   if (error)
   {
   	   if (showError)
	   {	   	 
          alert(error);
	   }
	   return false;	
   }   
   return true;
}
function gtXmlResonse()
{
	this.doc = null;
	this.error = null;	
}
function getXmlTest(sUri, showError, callbackFunction) 
{
   //alert(sUri);
   objects = new Array();
   var xmlHttp = XmlHttp.create();
   var async = true;
   //xmlHttp.onreadystatechange = processReqChange;
   xmlHttp.onreadystatechange = function () {
	   if (xmlHttp.readyState == 4)
	   {
		    var response = new gtXmlResonse();
			response.doc = xmlHttp.responseXML;
	   		//processReqChange(xmlHttp);
			var error = getError(response);
			if (error)
			{
				response.error = error;
				if (showError)
				{
					alert(error);
				}
			}
			callbackFunction.call(this, response);			
	   }
   }
   xmlHttp.open("POST", sUri, async);
   xmlHttp.send(null);
}
function processReqChange(reqObj)
{
	alert(reqObj);
}
function updatePageObject(obj, pageObj)
{
	if (!pageObj || pageObj == '')
	{
		pageObj = obj;
	}
	var spans = document.getElementsByTagName('span');
	for (var i=0; i<spans.length; i++)
	{				
		if (spans[i].id.indexOf(pageObj) == 0)
		{			
			var attr = spans[i].id.substring(pageObj.length);						
			var value = getProp(obj, attr);
			if (!value)
			{
				value = "";
			}
			if (value != '')
			{				
				var caseAttr = spans[i].caseProp;				
				if (caseAttr && caseAttr.toUpperCase() == "UL")
				{
					value = upperCaseWords(value);
				}
				else if (caseAttr && caseAttr.toUpperCase() == "U")
				{
					value = value.toUpperCase();
				}
				else if (caseAttr && caseAttr.toUpperCase() == "L")
				{
					value = value.toLowerCase();
				}			
				
			}			
			spans[i].innerHTML = value;
		}
	}
	var inputs = document.getElementsByTagName('input');
	for (var i=0; i<inputs.length; i++)
	{		
		var type = inputs[i].type;
		var id = inputs[i].id;
		var name = inputs[i].name;
		var caseAttr = inputs[i].caseProp;					
		if (id.indexOf(pageObj) == 0)
		{			

			var attr = id.substring(pageObj.length);			
			var value = getProp(obj, attr);
			if (!value)

			{
				value = "";
			}
			if (value != '')
			{								
				if (caseAttr && caseAttr.toUpperCase() == "UL")
				{
					value = upperCaseWords(value);
				}
				else if (caseAttr && caseAttr.toUpperCase() == "U")
				{
					value = value.toUpperCase();
				}
				else if (caseAttr && caseAttr.toUpperCase() == "L")
				{
					value = value.toLowerCase();
				}			
				
			}			
			inputs[i].value = value;
		}
	}
}



function runUrl(sUri, showError) 
{
   objects = new Array();
   var xmlHttp = XmlHttp.create();
   var async = false;
   xmlHttp.open("POST", sUri, async);
   xmlHttp.send(null);
   var doc = xmlHttp.responseXML;
   //alert(doc.xml);
   var errorEl = doc.getElementsByTagName("error")
   if (errorEl && errorEl.length > 0)
   {
   	   if (showError)
	   {	   	 
	   	  var regexp = /\+/g;
		  var urlDecoded = unescape(errorEl(0).text);
		  
          alert (urlDecoded.replace(regexp, " "));
	   }
	   return "";	
   }   
   var outEl = doc.getElementsByTagName("output")
   for (var i = 0; i < outEl.length; i++)
   {
       return outEl(i).text; // responseXML : XmlDocument
   }
   return "";
}

function upperCaseWords(s)
{
	var previousWasSpace = true;
	if (!s || s.length == 0)
	{
		return "";
	}
	var ret = "";
	s = s.toLowerCase();
	for (var i=0; i<s.length; i++)
	{
		var c = s.charAt(i);
		var ci = s.charCodeAt(i);
		if (previousWasSpace)
		{
			ret = ret + c.toUpperCase();
		}
		else
		{
			ret = ret + c;
		}
		if(ci == 32 || ci == 45 || ci == 46 || ci == 47)
		{
			previousWasSpace = true;
		}
		else
		{
			previousWasSpace = false;
		}
	}
	return ret;
}

// used to find the Automation server name
function getDomDocumentPrefix() {
	if (getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".DomDocument");
			return getDomDocumentPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

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 {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

//////////////////////////
// Start the Real stuff //
//////////////////////////


// XmlHttp factory
function XmlHttp() {}

XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}
			
			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// fell through
	throw new Error("Your browser does not support XmlHttp objects");
};

// XmlDocument factory
function XmlDocument() {}

XmlDocument.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			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 (ex) {}
	throw new Error("Your browser does not support XmlDocument objects");
};

// Create the loadXML method and xml getter for Mozilla
if (window.DOMParser &&
	window.XMLSerializer &&
	window.Node && Node.prototype && Node.prototype.__defineGetter__) {

	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	//XMLDocument.prototype.loadXML = 
	Document.prototype.loadXML = function (s) {
		
		// parse the string to a new doc	
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
		
		// remove all initial children
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);
			
		// insert and import nodes
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};
	
	
	/*
	 * xml getter
	 *
	 * This serializes the DOM tree to an XML String
	 *
	 * Usage: var sXml = oNode.xml
	 *
	 */
	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	/*
	XMLDocument.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
	*/
	Document.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
}
