var oDataArray = new DataObjectsCollection();
var oData;

function DataObjectsCollection()
{
	var objXMLHttp = new ActiveXObject('Msxml2.XMLHTTP');
	this.length = 0;
	this.Add = _AddDataObject;
	this.DataObject = _GetDataObject;
	this.DeleteObject = _DeleteDataObject;
	function _AddDataObject(strKey, strBaseURL)
	{
		var nLen = this.length;
		this.length++;
		this[nLen] = new _ConstructDataObject(strKey, strBaseURL);
	}
	function _GetDataObject(strKey)
	{
		for (var nCount=0; nCount<this.length; nCount++)
		{
			if (this[nCount].Key == strKey)
			{
				return this[nCount];
			}
		}
	}

	function _DeleteDataObject(strKey)
	{
	var foundKey = false;
		for (var nCount=0; nCount<this.length; nCount++)
		{
			if (this[nCount].Key == strKey)
			{
				foundKey = true;
			}
			if (foundKey && (nCount < this.length - 1))
				this[nCount] = this[nCount+1]
		}
		this.length--;
	}

	function _ConstructDataObject(strKey, strBaseURL)
	{
		var objTransactionXMLDoc = new ActiveXObject('Msxml2.DOMDocument');
		var objBaseXMLDoc = new ActiveXObject('Msxml2.DOMDocument');

		var objDataNode;
		var objQueryDataNode;
		var objQueryDataNodeList;
		var objQueryNodeList;
		var objDisplayFormatNodeList;

		var objTempDocElement;
		var objTempNewElement;

		objTransactionXMLDoc.async = false;
		objTransactionXMLDoc.resolveExternals = false;

		objBaseXMLDoc.loadXML('<ROOT/>');
		objTempDocElement = objBaseXMLDoc.documentElement;
		objTempNewElement = objBaseXMLDoc.createElement('QUERYSECTION');
		objTempDocElement.appendChild(objTempNewElement);


		objTempDocElement = objBaseXMLDoc.documentElement;
		objTempNewElement = objBaseXMLDoc.createElement('DISPLAYFORMATSECTION');
		objTempDocElement.appendChild(objTempNewElement);

		objTempDocElement = objBaseXMLDoc.documentElement;
		objTempNewElement = objBaseXMLDoc.createElement('DATASECTION');
		objTempDocElement.appendChild(objTempNewElement);
		objTempDocElement = objBaseXMLDoc.documentElement;
		objTempNewElement = objBaseXMLDoc.createElement('QUERYDATASECTION');
		objTempDocElement.appendChild(objTempNewElement);

		this.length = 0;
		this.Key = strKey;
		this.BaseURL = strBaseURL;

		this.QueryParameters = new _QueryParameters();
		this.DisplayFormatParameters = new _DisplayFormatParameters();
		this.FetchData = _FetchData;
		this.RefreshData = _FetchData;
		this.QueryData = _QueryData;

		function _QueryParameters()
		{
			this.Add = _AddQueryParameter;
			this.Set = _SetQueryParameter;
			this.Peek = _PeekQueryParameters;
			this.Parameter = _QueryParamater;

			objQueryNodeList = objBaseXMLDoc.selectSingleNode('//QUERYSECTION');

			function _AddQueryParameter(strNewItem)
			{
				objTempDocElement = objQueryNodeList;
				objTempNewElement = objBaseXMLDoc.createElement(strNewItem);
				objTempDocElement.appendChild(objTempNewElement);
				objQueryNodeList = objBaseXMLDoc.selectSingleNode('//QUERYSECTION');
			}

			function _PeekQueryParameters()
			{
				return objQueryNodeList.xml.toString();
			}

			function _SetQueryParameter(strNodeName, strNodeValue)
			{
				var objQueryParamaterNode = objQueryNodeList.selectSingleNode(strNodeName);
				objQueryParamaterNode.text = strNodeValue;
				objQueryNodeList = objBaseXMLDoc.selectSingleNode('//QUERYSECTION');
			}

			function _QueryParamater(xArg)
			{
				var strNodeName;
				var objQueryParamaterNode = new _QueryParamaterNode(xArg);
				function _QueryParamaterNode(xArg)
				{
					if (isNaN(xArg))
					{
						strNodeName = xArg;
					}
					else
					{
						strNodeName = objQueryNodeList.childNodes[xArg].nodeName;
					}
					objQueryParamaterNode = objQueryNodeList.selectSingleNode(strNodeName);
					this.Name = objQueryParamaterNode.nodeName.toString();
					if (objQueryParamaterNode.hasChildNodes())
					{
						this.Name = objQueryParamaterNode.nodeName.toString();
						this.Value = objQueryParamaterNode.childNodes[0].nodeValue.toString();
					}
					else
					{
						this.Name = objQueryParamaterNode.nodeName.toString();
						this.Value = '';
					}
				}
				return objQueryParamaterNode;
			}
		}

		function _DisplayFormatParameters()
		{
			this.Add = _AddDisplayFormatParameter;
			this.Peek = _PeekDisplayFormatParameters;
			this.Parameter = _DisplayFormatParamater;
			this.ColCount = _DisplayFormatParametersColCount;

			objDisplayFormatNodeList = objBaseXMLDoc.selectSingleNode('//DISPLAYFORMATSECTION');


			function _DisplayFormatParametersColCount()
			{
				return objDisplayFormatNodeList.childNodes.length;
			}

			function _AddDisplayFormatParameter(strNewItem, strDisplayName, bDisplay, strFormat, nColWidthPercent, bSortable)
			{
				var objTempAttribute;
				objTempDocElement = objDisplayFormatNodeList;
				objTempNewElement = objBaseXMLDoc.createElement(strNewItem);
				objTempNewElement.text = strDisplayName;
				objTempNewElement.setAttribute('Display', bDisplay);
				objTempNewElement.setAttribute('Format', strFormat);
				objTempNewElement.setAttribute('ColWidthPercent', nColWidthPercent);
				objTempNewElement.setAttribute('Sortable', bSortable);

				objTempDocElement.appendChild(objTempNewElement);

				objDisplayFormatNodeList = objBaseXMLDoc.selectSingleNode('//DISPLAYFORMATSECTION');
			}

			function _PeekDisplayFormatParameters()
			{
				return objDisplayFormatNodeList.xml.toString();
			}

			function _DisplayFormatParamater(xArg)
			{
				var strNodeName;
				var strTempAttributeValue;
				var objDisplayFormatParamaterNode = new _DisplayFormatParamaterNode(xArg);
				function _DisplayFormatParamaterNode(xArg)
				{
					if (isNaN(xArg))
					{
						strNodeName = xArg;
					}
					else
					{
						strNodeName = objDisplayFormatNodeList.childNodes[xArg].nodeName;
					}

					objDisplayFormatParamaterNode = objDisplayFormatNodeList.selectSingleNode(strNodeName);
					this.Name = objDisplayFormatParamaterNode.nodeName.toString();
					strTempAttributeValue = objDisplayFormatParamaterNode.getAttribute('Display');
					this.Display = strTempAttributeValue;
					strTempAttributeValue = objDisplayFormatParamaterNode.getAttribute('Format');
					this.Format = strTempAttributeValue;
					strTempAttributeValue = objDisplayFormatParamaterNode.getAttribute('ColWidthPercent');
					this.ColWidthPercent = strTempAttributeValue;
					strTempAttributeValue = objDisplayFormatParamaterNode.getAttribute('Sortable');
					this.Sortable = strTempAttributeValue;
					if (objDisplayFormatParamaterNode.hasChildNodes())
					{
						this.Value = objDisplayFormatParamaterNode.childNodes[0].nodeValue.toString();
					}
					else
					{
						this.Value = '';
					}
				}
				return objDisplayFormatParamaterNode;
			}
		}

		function _FetchData(strTargetAction)
		{
			var bLoad = false;
			if (_FetchData.arguments.length)
			{
					this.URL = _GetURL(strTargetAction, this.BaseURL);
			}

			function _GetURL(strTargetAction, strASPURL)
			{
				var objQueryParamaterNode;
				var strReturnURL = '';
				strReturnURL += strASPURL
				strReturnURL += '?ACTION='
				strReturnURL += strTargetAction
				for (var nCount=0; nCount<objQueryNodeList.childNodes.length; nCount++)
				{
					objQueryParamaterNode = objQueryNodeList.childNodes[nCount]
					if (objQueryParamaterNode.childNodes.length)
					{
						if (objQueryParamaterNode.childNodes[0].nodeValue)
						{
							strReturnURL += '&'
							strReturnURL += objQueryParamaterNode.nodeName.toString();
							strReturnURL += '=';
							strReturnURL += objQueryParamaterNode.childNodes[0].nodeValue.toString();
						}
					}
				}
				return strReturnURL;
			}
			objXMLHttp.open('GET', this.URL, false);
			objXMLHttp.send(null);
//alert(objXMLHttp.responseText);
			var bLoad = objTransactionXMLDoc.load(objXMLHttp.responseXML);
			if (bLoad)
			{
				objTempNewElement = objTransactionXMLDoc.selectSingleNode('/DATASECTION');
			}
			else
			{
				objTempNewElement = objBaseXMLDoc.createElement('DATASECTION');
			}
			objTempDocElement = objBaseXMLDoc.documentElement;
			objTempDocElement.replaceChild(objTempNewElement, objTempDocElement.selectSingleNode('//DATASECTION'));
			objDataNode = objTempDocElement.selectSingleNode('//DATASECTION');
			objQueryDataNode = objTempDocElement.selectSingleNode('//QUERYDATASECTION');
			_QueryData();
			this.Data = new _DataSection();
			return bLoad;
		}

		function _QueryData(strArgument)
		{
			var objTempNode;
			nCurrentRow = 0;
			objQueryDataNode.selectNodes('ROW').removeAll();
			if (strArgument)
			{
				objQueryDataNodeList = objDataNode.selectNodes('ROW[' + strArgument + ']');
			}
			else
			{
				objQueryDataNodeList = objDataNode.selectNodes('ROW');
			}

			for (var nCount=0; nCount<objQueryDataNodeList.length; nCount++)
			{
				objTempNode = objQueryDataNodeList[nCount].cloneNode(true);
				objQueryDataNode.appendChild(objTempNode);
			}
		}

		function _DataSection()
		{
			var nCurrentRow = 0;
			var bBOF = true;
			var bEOF = true;
			this.PeekData = _PeekData;
			this.Peek = _PeekQueryData;
			this.PeekRow = _PeekQueryDataRow;
			this.RowCount = _RowCount;
			this.CurrentRow = _CurrentRow;
			this.SetCurrentRow = _SetCurrentRow;
			this.MoveFirst = _MoveFirst;
			this.MoveLast = _MoveLast;
			this.MoveNext = _MoveNext;
			this.MovePrevious = _MovePrevious;
			this.BOF = _BOF;
			this.EOF = _EOF;
			this.FieldCount = _FieldCount;
			this.Field = _Field;

			function _PeekData()
			{
				return objDataNode.xml.toString();
			}

			function _PeekQueryData()
			{
				return objQueryDataNode.xml;
			}

			function _PeekQueryDataRow()
			{
				return objQueryDataNodeList[nCurrentRow].xml.toString();
			}

			function _RowCount()
			{
				return objQueryDataNodeList.length;
			}

			function _CurrentRow()
			{
				return nCurrentRow;
			}
			function _SetCurrentRow(nRow)
			{
				nCurrentRow = nRow
				SetBOFEOF(1);
			}
			function _MoveFirst()
			{
				nCurrentRow=0;
				SetBOFEOF(0);
			}
			function _MoveLast()
			{
				if (nCurrentRow<(objQueryDataNodeList.length-1))
				{
					nCurrentRow=(objQueryDataNodeList.length-1);
				}
				else
				{
					SetBOFEOF(1);
				}
			}
			function _MoveNext()
			{
				if (nCurrentRow<(objQueryDataNodeList.length-1))
				{
					nCurrentRow++;
				}
				else
				{
					SetBOFEOF(2);
				}
			}
			function _MovePrevious()
			{
				if (nCurrentRow>0)
				{
					nCurrentRow--;
				}
				else
				{
					SetBOFEOF(-1);
				}
			}

			function SetBOFEOF(xPlusMinus)
			{
				bBOF = ((nCurrentRow+xPlusMinus)==0);
				bEOF = (((nCurrentRow+xPlusMinus)>(objQueryDataNodeList.length))||(objQueryDataNodeList.length==0));
			}
			function _BOF()
			{
				return bBOF
			}
			function _EOF()
			{
				return bEOF
			}

			function _Field(xArg)
			{
				var strNodeName;
				var objFieldNode = new _FieldNode(xArg);
				function _FieldNode(xArg)
				{
					if (isNaN(xArg))
					{
						strNodeName = xArg;
					}
					else
					{
						strNodeName = objQueryDataNodeList[nCurrentRow].childNodes[xArg].nodeName;
					}
					objFieldNode = objQueryDataNodeList[nCurrentRow].selectSingleNode(strNodeName);
					this.Name = objFieldNode.nodeName.toString();
					if (objFieldNode.childNodes.length)
						this.Value = objFieldNode.childNodes[0].nodeValue.toString();
					else
						this.Value = '';
				}
				return objFieldNode;
			}

			function _FieldCount()
			{
				return objQueryDataNodeList[nCurrentRow].childNodes.length;
			}
		}
	}
}