<!--
/*************************************************************************************
* CCXI JavaScript Library
*
* Copyright (C) 2004, by Higher Math (Cal Moffett) and Crile Carvey Consulting,
* All Rights Reserved.
*
* You may not alter the contents of this file in any way nor may you rename it.
* Use is granted only under license from Higher Math. Any other use constitutes
* software piracy and/or copyright infringement and is punishable by law.
* You may not post this file to any server without permisssion nor retransmit it in
* any way or form except under license.
*
* Any copy of this file missing this notice is considered proof of copyright violation.
*
* If you are interested in obtaining a license or in helping others to obtain a
* license--or making an evaluation of the product before obtaining a license--please
* visit our website at www.highermath.com/ccxi.htm.
*
* Product improvements, bug fixes, documentation and new samples are supplied free of
* charge to all paid license holders.
**************************************************************************************/


var ccxi_element;
var ccxi_filters = new Array();
var ccxi_sorts = new Array();	// separate sort for each container

function ccxiNewRow(strId)
{
	var objTable = ccxi_ns(strId);

	return objTable.insertRow(objTable.rows.length);
}

function ccxiNewCell(objRow)
{
	return objRow.insertCell(objRow.cells.length);
}

function ccxi_ns(strId)
{
	if (document.all)
	{
		return document.all(strId);
	}
	else if (document.getElementById)
	{
		return document.getElementById(strId);
	}
	else if (document.layers)
	{
		return document.layers(strId);	
	}
	
	return null;
}

function ccxi_fns(strFrameId, strId)
{
	if (document.frames)
	{
		return document.frames(strFrameId).document.all(strId);
	}
	else if (ccxi_ns(strFrameId) && ccxi_ns(strFrameId).contentDocument)
	{
		return ccxi_ns(strFrameId).contentDocument.getElementById(strId);
	}
	
	return null;
}

function ccxi_nsInnerText(objNode)
{
	var i;
	var strText = "";
	
	for (i = 0; i < objNode.childNodes.length; i++)
	{
		var objChild = objNode.childNodes[i];
		
		if (objChild.nodeType == 3)
		{
			strText += objChild.nodeValue;
		}
		else
		{
			strText += ccxi_nsInnerText(objChild);
		}
	}
	
	return strText;
}

function ccxiGetSortedElement(colDataRows, iSorts, iCurrent, iWhich, iFilter)
{
	if (ccxi_sorts[iSorts] == null)return;

	var aryCurrent = ccxi_sorts[iSorts][iCurrent][1];
	
	if (iFilter < 0)
	{
		return iWhich < aryCurrent.length ? colDataRows[aryCurrent[iWhich][1]] : null;
	}
	else
	{
		var i;
		var j = 0;
		
		for (i = 0; i < aryCurrent.length; i++)
		{
			if (ccxi_filters[iFilter][aryCurrent[i][1]])
			{
				if (j == iWhich)return colDataRows[aryCurrent[i][1]];
				
				j++;
			}
		}
	}
	
	return null;
}

function ccxiSortFunction(strFirst, strSecond)
{
	var strUpper1 = strFirst.toString().toUpperCase();
	var strUpper2 = strSecond.toString().toUpperCase();
	
	return strUpper1 < strUpper2 ? -1 : strUpper1 > strUpper2 ? 1 : 0;
}

function ccxiMoveItem(objXml, iFrom, iTo)
{
	if (objXml == null)return;
	if (iFrom == iTo)return;
	if (iFrom < 0)return;
	if (iTo < 0)return;	

	var iSorts = objXml.getAttribute("ccxi_sorts");
	
	if (iSorts == null)return;
	
	
	var iCurrent = objXml.getAttribute("ccxi_currentsort");

	if (iCurrent == null)return;
	
	if (iFrom < iTo)iTo--;
	
	
	var aryCurrent = ccxi_sorts[iSorts][iCurrent];
	var aryCurrent1 = aryCurrent[1];
	
	if (iFrom >= aryCurrent1.length)return;
	if (iTo >= aryCurrent1.length)return;
	
	
	var aryItem = aryCurrent1.splice(iFrom, 1);
	
	aryCurrent1.splice(iTo, 0, aryItem[0]);
	aryCurrent[2] = 0;			// unsorted
}

function ccxiItemCount(objXml, bUseFilter)
{
	if (objXml == null)return 0;
	

	if (bUseFilter)
	{
		var i;
		var iCount = 0;
		var iFilter = objXml.getAttribute("ccxi_filter");
		
		for (i = 0; i < ccxi_filters[iFilter].length; i++)
		{
			if (ccxi_filters[iFilter][i])iCount++;
		}

		return iCount;
	}
	else
	{
		var iSorts = objXml.getAttribute("ccxi_sorts");
		
		if (iSorts == null)return 0;
		
		
		var iCurrent = objXml.getAttribute("ccxi_currentsort");

		if (iCurrent == null)return 0;
		
		
		var aryCurrent = ccxi_sorts[iSorts][iCurrent][1];
		
		return aryCurrent.length;
	}
}

function ccxiFilterItem(objXml, strField, strTerm, bFilterIn)
{
	var iWhich = ccxiFindItemNode(objXml, strField, strTerm);

	if (iWhich < 0)return;


	var i;
	var iCount = objXml.getAttribute("ccxi_countf");
	var iFilter = objXml.getAttribute("ccxi_filter");
	var iPageLen = objXml.getAttribute("ccxi_pagelen");
	var bOldValue = ccxi_filters[iFilter][iWhich];
	
	ccxi_filters[iFilter][iWhich] = bFilterIn;
	/*
	for (i = 0; i < ccxi_filters[iFilter].length; i++)
	{
		if (ccxi_filters[iFilter][i])iCount++;
	}*/

	if (!bOldValue)bOldValue = false;
	
	if (bOldValue != bFilterIn)
	{
		if (bFilterIn)
		{
			iCount++;
		}
		else
		{
			iCount--;
		}
	}
	
	objXml.setAttribute("ccxi_lastpagef", Math.ceil(iCount/iPageLen));
	objXml.setAttribute("ccxi_countf", iCount);
}

function ccxiLocateItem(objXml, strField, strTerm, bUseFilter)
{
	var iItemNumber = ccxiFindItemNode(objXml, strField, strTerm);

	if (iItemNumber < 0)return -1;
	

	var iSorts = objXml.getAttribute("ccxi_sorts");
	
	if (iSorts == null)return -1;
	
	
	var iCurrent = objXml.getAttribute("ccxi_currentsort");

	if (iCurrent == null)return -1;
	
	
	var aryCurrent = ccxi_sorts[iSorts][iCurrent][1];
	var i;
	var j;
	var iFilter = (bUseFilter != null && bUseFilter ? objXml.getAttribute("ccxi_filter") : -1);
	var aryFilter = (iFilter >= 0 ? ccxi_filters[iFilter] : null);
	
	for (i = 0, j = 0; i < aryCurrent.length; i++)
	{
		var iItem = aryCurrent[i][1];
		
		if (iFilter >= 0)
		{
			if (aryFilter[iItem])
			{
				if (iItem == iItemNumber)return j;
				
				j++;
			}
		}
		else
		{
			if (iItem == iItemNumber)return i;
		}
	}
	
	return -1;
}

function ccxiSortElements(objXml, strField, bDescending, bUseFilter, bFillRows)
{
	if (objXml == null)return;
	
	var i;
	var j;
	var objData = ccxiMapDataId(objXml);
	var colElems = objData.getElementsByTagName("ccxi_datarow");
	
	if (colElems == null)return;
	
	
	var iSorts = objXml.getAttribute("ccxi_sorts");
	
	if (iSorts == null || !ccxi_sorts[iSorts])
	{
		var iFilter = ccxi_filters.length;
		var iPageLen = objXml.getAttribute("ccxi_pagelen");
		
		iSorts = ccxi_sorts.length;

		objXml.setAttribute("ccxi_sorts", iSorts);
		objXml.setAttribute("ccxi_filter", iFilter);
		
		ccxi_sorts[iSorts] = new Array();
		ccxi_sorts[iSorts][0] = new Array();
		ccxi_sorts[iSorts][0][0] = "";			// no name for unsorted sort
		ccxi_sorts[iSorts][0][1] = new Array();
		ccxi_sorts[iSorts][0][2] = 0;			// unsorted
		
		ccxi_filters[iFilter] = new Array(colElems.length);

		for (i = 0, j = 0; i < colElems.length; i++)
		{
			ccxi_filters[iFilter][i] = true;
		
			if (colElems[i].nodeType == 1)
			{
				ccxi_sorts[iSorts][0][1][j] = new Array();
				ccxi_sorts[iSorts][0][1][j][0] = "";	// no field to sort on
				ccxi_sorts[iSorts][0][1][j][1] = i;
				j++;
			}
		}
		
		objXml.setAttribute("ccxi_lastpage", Math.ceil(j/iPageLen));
		objXml.setAttribute("ccxi_lastpagef", Math.ceil(j/iPageLen));
		objXml.setAttribute("ccxi_countf", j);

		if (bFillRows == null || bFillRows)
		{
			objXml.setAttribute("ccxi_currentsort", 0);
			ccxiFillRows(objXml, 1, bUseFilter);
		}
		return 0;
	}
	else
	{
		for (i = 0; i < ccxi_sorts[iSorts].length; i++)
		{
			if (ccxi_sorts[iSorts][i][0] == strField)
			{
				if (i > 0)
				{
					if (bDescending == true)
					{
						if (ccxi_sorts[iSorts][i][2] == 1)
						{
							ccxi_sorts[iSorts][i][1].reverse();
							ccxi_sorts[iSorts][i][2] = -1;			// descending
						}
					}
					else if (bDescending == false)
					{
						if (ccxi_sorts[iSorts][i][2] == -1)
						{
							ccxi_sorts[iSorts][i][1].reverse();
							ccxi_sorts[iSorts][i][2] = 1;			// ascending
						}
					}
				}
				
				if (bFillRows == null || bFillRows)
				{
					objXml.setAttribute("ccxi_currentsort", i);
					ccxiFillRows(objXml, 1, bUseFilter);
				}
				return i;
			}
		}
		
		
		var iCurrent = i;
		
		ccxi_sorts[iSorts][iCurrent] = new Array();
		ccxi_sorts[iSorts][iCurrent][0] = strField;
		ccxi_sorts[iSorts][iCurrent][1] = new Array();
		ccxi_sorts[iSorts][iCurrent][2] = 0;			// not sorted
		
		for (i = 0, j = 0; i < colElems.length; i++)
		{
			if (colElems[i].nodeType == 1)
			{
				ccxi_sorts[iSorts][iCurrent][1][j] = new Array();
				ccxi_sorts[iSorts][iCurrent][1][j][0] = ccxiGetChildText(colElems[i], "ccxi_"+strField);;
				ccxi_sorts[iSorts][iCurrent][1][j][1] = i;
				j++;
			}
		}
		
		if (bDescending != null)
		{
			ccxi_sorts[iSorts][iCurrent][1].sort(ccxiSortFunction);
			ccxi_sorts[iSorts][iCurrent][2] = 1;			// ascending
		}
			
		if (bDescending == true)
		{
			ccxi_sorts[iSorts][iCurrent][1].reverse();
			ccxi_sorts[iSorts][iCurrent][2] = -1;			// descending
		}
		
		if (bFillRows == null || bFillRows)
		{
			objXml.setAttribute("ccxi_currentsort", iCurrent);
			ccxiFillRows(objXml, 1, bUseFilter);
		}
		return iCurrent;
	}
}

function ccxiGetNextElement(colElems, iCurrent)
{
	var i;
	
	for (i = iCurrent + 1; i < colElems.length; i++)
	{
		if (colElems[i].nodeType == 1)return i;
	}
	
	return -1;
}

function ccxiGetChildElement(objParent, strTag)
{
	if (objParent == null)return;
	if (strTag == null)return;
	if (strTag.length == 0)return;
	
	
	var colChildren = objParent.getElementsByTagName(strTag);
	var i;
	
	if (colChildren == null || colChildren.length == 0)return;
	
	for (i = 0; i < colChildren.length; i++)
	{
		if (colChildren[i].nodeType == 1)return colChildren[i];
	}
	
	return;
}

function ccxiGetChildContents(objParent, strTag)
{
	var objChild = ccxiGetChildElement(objParent, strTag);
	var strContents;
	
	if (objChild == null || objChild.childNodes.length == 0)return "";
	
	strContents = objChild.childNodes[0].nodeValue;
	strContents = strContents.replace(/^\s*/g, "");		// trim leading spaces
	strContents = strContents.replace(/\s*$/g, "");		// trim trailing spaces
	
	return strContents;
}

function ccxiGetChildText(objParent, strTag)
{
	var objChild = ccxiGetChildElement(objParent, strTag);
	
	if (objChild == null || objChild.childNodes.length == 0)return "";

	if (ccxi_element == null)
	{
		ccxi_element = document.createElement("div");
	}
	ccxi_element.innerHTML = objChild.childNodes[0].nodeValue;
	
	
	var strText = ccxi_nsInnerText(ccxi_element);
	
	strText = strText.replace(/^\s*/g, "");	// trim leading spaces
	strText = strText.replace(/\s*$/g, "");	// trim trailing spaces

//	return ccxi_nsInnerText(ccxi_element);
	return strText;
}

function ccxiBindXml(strFrameId, strXmlId, 
					strDataFrameId, strDataXmlId, 
					strContainerId, iPageLen)
{
	var objXml = ccxiMapId(strFrameId, strXmlId);
	var objContainer = ccxi_ns(strContainerId);
	
	if (objXml != null && objContainer != null)
	{
		objXml.setAttribute("ccxi_ContainerId", strContainerId);
		objXml.setAttribute("ccxi_DataFrameId", strDataFrameId);
		objXml.setAttribute("ccxi_DataId", strDataXmlId);
		objXml.setAttribute("ccxi_pagelen", iPageLen);
		ccxiSortElements(objXml, "", null);		// set up list of unsorted elements
	}
	return objXml;
}

function ccxiMapDataId(objXml)
{
	var strFrameId = objXml.getAttribute("ccxi_DataFrameId");
	var strXmlId = objXml.getAttribute("ccxi_DataId");
	
	return ccxiMapId(strFrameId, strXmlId);
}

function ccxiMapId(strFrameId, strXmlId)
{
	var objXml;
	
	if (strFrameId != null && strFrameId.length > 0)
	{
		objXml = ccxi_fns(strFrameId, strXmlId);
	}
	else
	{
		objXml = ccxi_ns(strXmlId);
	}

	return objXml;
}

function ccxiSetStyle(objTag, strStyle)
{
	if (strStyle == null || strStyle.length == 0)return;

	if (document.all)
	{
		objTag.style.cssText = strStyle;
	}
	else
	{
		objTag.setAttribute("style", strStyle);
	}
}

function ccxiSetAttributes(oTag, colTemplate, strAttrsLocId)
{
	var i;
	var colAttrs = colTemplate.getElementsByTagName(strAttrsLocId);
	var strStyle = "";
	
	for (i = 0; i < colAttrs.length; i++)
	{
		if (colAttrs[i].nodeType == 1)
		{
			var strAttr = colAttrs[i].getAttribute("attr");
			var strValue = colAttrs[i].getAttribute("value");
			
			if (strAttr != null && strValue != null
				&& strAttr.length > 0 && strValue.length > 0)
			{
				if (strAttr.toUpperCase() == "CLASS")
				{
					oTag.className = strValue;
				}
				else if (strAttr.toUpperCase() == "STYLE")
				{
					if (strStyle.length > 0)strStyle += ";";
					strStyle += strValue;
				}
				else if (strAttr.toUpperCase() == "ONCLICK")
				{
					oTag.onclick = strValue;
				}
				else
				{
					oTag.setAttribute(strAttr, strValue, 0);
				}
			}
		}
	}
	
	ccxiSetStyle(oTag, strStyle);
}

function ccxiCurrentPage(objXml)
{
	if (objXml == null)return -1;
	
	return parseInt(objXml.getAttribute("ccxi_curpage"));
}

function ccxiNextPage(objXml)
{
	if (objXml == null)return -1;
	
	return parseInt(objXml.getAttribute("ccxi_curpage")) + 1;
}

function ccxiPreviousPage(objXml)
{
	if (objXml == null)return -1;

	return parseInt(objXml.getAttribute("ccxi_curpage")) - 1;
}

function ccxiLastPage(objXml, bUseFilter)
{
	if (objXml == null)return -1;
	
	if (bUseFilter != null && bUseFilter)
	{
		return parseInt(objXml.getAttribute("ccxi_lastpagef"));
	}
	else
	{
		return parseInt(objXml.getAttribute("ccxi_lastpage"));
	}
}

function ccxiFillRows(objXml, iPage, bUseFilter)
{
	if (objXml == null)return;
	
	var i;
	var iFilter = (bUseFilter != null && bUseFilter ? objXml.getAttribute("ccxi_filter") : -1);
	var iFrom;
	var iTo;
	var iPageLen = objXml.getAttribute("ccxi_pagelen");
	var objData = ccxiMapDataId(objXml);
	
	if (iPageLen == null)return;
	if (iPage < 1)return;
	if (iPage > ccxiLastPage(objXml, bUseFilter))return;
	
	iPageLen = parseInt(iPageLen);
	iFrom = (iPage - 1) * iPageLen;
	iTo = iFrom + iPageLen - 1;
	
	objXml.setAttribute("ccxi_curpage", iPage);


	var strContainerId = objXml.getAttribute("ccxi_ContainerId");
	
	if (strContainerId == null)return;
	

	var objContainer = ccxi_ns(strContainerId);
	
	if (objContainer == null)return;
	
	
	if (objContainer.rows)
	{
		for (i = objContainer.rows.length - 1; i >= 0; i--)
		{
			objContainer.deleteRow(i);
		}
	}
	else
	{
		objContainer.innerHTML = "";
	}
		
	var colDataRows = objData.getElementsByTagName("ccxi_datarow");
	
	if (colDataRows == null)return;
	
	
	var colDataRowTemplates = objXml.getElementsByTagName("ccxi_datarowtemplate");
	
	if (colDataRowTemplates == null)return;
	
	
	//var colTemplateField = objXml.getElementsByTagName("ccxi_template");
	//var strTemplateField = "";

	var strTemplateField = ccxiGetTemplateField(objXml);
/*	
	if (colTemplateField != null)
	{
		var iTemplateField = ccxiGetNextElement(colTemplateField, -1);
		
		if (iTemplateField >= 0)
		{
			var objTemplateField = colTemplateField[iTemplateField];
			
			if (objTemplateField != null)
			{
				strTemplateField = objTemplateField.getAttribute("field");

				if (strTemplateField == null)strTemplateField = "";
			}
		}
	}
*/	
	
	var iSorts = objXml.getAttribute("ccxi_sorts");
	
	if (iSorts == null)return;
	
	
	var iCurrentSort = objXml.getAttribute("ccxi_currentsort");
	
	if (iCurrentSort == null)return;
	

	var iDataRow;
	var iCurrentDrt = -1;
	var strNonTableHtml = "";

	iDataRow = iFrom;
	if (iDataRow < 0)iDataRow = 0;
	
	for (; iDataRow <= iTo; iDataRow++)
	{
		var objDataRow = ccxiGetSortedElement(colDataRows, iSorts, iCurrentSort, iDataRow, iFilter);
		
		if (objDataRow == null)break;
		
		strNonTableHtml = ccxiFillSingleRow(objDataRow, strTemplateField, 
			colDataRowTemplates, strNonTableHtml, strContainerId);
/*
		if (strTemplateField.length > 0)
		{
			var strMatch = ccxiGetChildContents(objDataRow, "ccxi_"+strTemplateField);
			
			strMatch = strMatch.toUpperCase();
			iCurrentDrt = -1;
			
			for (j = ccxiGetNextElement(colDataRowTemplates, -1); j >= 0; 
					j = ccxiGetNextElement(colDataRowTemplates, j))
			{
				var strMatchId = colDataRowTemplates[j].getAttribute("id");
				
				if (strMatchId == null)continue;
				
				strMatchId = strMatchId.toUpperCase();

				if (strMatchId == strMatch)
				{
					iCurrentDrt = j;
					
					break;
				}
			}
			
			if (iCurrentDrt < 0)break;
		}
		else
		{
			iCurrentDrt = ccxiGetNextElement(colDataRowTemplates, iCurrentDrt);
			if (iCurrentDrt < 0)iCurrentDrt = ccxiGetNextElement(colDataRowTemplates, -1);
		}

	
		var objCurrentDrt = colDataRowTemplates[iCurrentDrt];
		var colTableRowTemplates = objCurrentDrt.getElementsByTagName("ccxi_tablerowtemplate");
		var colRowTemplates = objCurrentDrt.getElementsByTagName("ccxi_rowtemplate");

		for (j = ccxiGetNextElement(colRowTemplates, -1); j >= 0; j = ccxiGetNextElement(colRowTemplates, j))
		{
			var jj;
			var strTemplate = colRowTemplates[j].childNodes[0].nodeValue;
			var aryTemplate = strTemplate.split("%%");
			
			for (jj = 0; jj < aryTemplate.length; jj++)
			{
				if ((jj % 2) == 0)
				{
					strNonTableHtml += aryTemplate[jj];
				}
				else
				{
					strNonTableHtml += ccxiGetChildContents(objDataRow, "ccxi_"+aryTemplate[jj]);
				}
			}
		}
		
		for (j = ccxiGetNextElement(colTableRowTemplates, -1); j >= 0; j = ccxiGetNextElement(colTableRowTemplates, j))
		{
			var k;
			var oRow = ccxiNewRow(strContainerId);
			var colCellTemplates = colTableRowTemplates[j].getElementsByTagName("ccxi_celltemplate");
								
			ccxiSetAttributes(oRow, colTableRowTemplates[j], "ccxi_rowattr");

			for (k = ccxiGetNextElement(colCellTemplates, -1); k >= 0; k = ccxiGetNextElement(colCellTemplates, k))
			{
				var ii;
				var oCell = ccxiNewCell(oRow);
				var colCellData = colCellTemplates[k].getElementsByTagName("ccxi_celldata");

				ccxiSetAttributes(oCell, colCellTemplates[k], "ccxi_cellattr");

				for (ii = ccxiGetNextElement(colCellData, -1); ii >= 0; ii = ccxiGetNextElement(colCellData, ii))
				{
					var jj;
					var strCellData = colCellData[ii].childNodes[0].nodeValue;
					var aryCellData = strCellData.split("%%");
					var strHtml = "";
					
					for (jj = 0; jj < aryCellData.length; jj++)
					{
						if ((jj % 2) == 0)
						{
							strHtml += aryCellData[jj];
						}
						else
						{
							strHtml += ccxiGetChildContents(objDataRow, "ccxi_"+aryCellData[jj]);
						}
					}
					
					oCell.innerHTML = strHtml;
				}
			}
		}
*/
	}
	
	if (!objContainer.rows && strNonTableHtml.length > 0)
	{
		objContainer.innerHTML = strNonTableHtml;
	}
	objXml.setAttribute("ccxi_nextpage", iDataRow);
}


//cgm: new
function ccxiGetTemplateField(objXml)
{
	var colTemplateField = objXml.getElementsByTagName("ccxi_template");
	var strTemplateField = "";
	
	if (colTemplateField != null)
	{
		var iTemplateField = ccxiGetNextElement(colTemplateField, -1);
		
		if (iTemplateField >= 0)
		{
			var objTemplateField = colTemplateField[iTemplateField];
			
			if (objTemplateField != null)
			{
				strTemplateField = objTemplateField.getAttribute("field");

				if (strTemplateField == null)strTemplateField = "";
			}
		}
	}
	return strTemplateField;
}

//cgm: new
function ccxiAppendSingleRow(strContainerId, objXml, iDataRow, bUseFilter)
{
	if (objXml == null)return;
	

	var iFilter = (bUseFilter != null && bUseFilter ? objXml.getAttribute("ccxi_filter") : -1);
	var objData = ccxiMapDataId(objXml);
	var strTemplateField = ccxiGetTemplateField(objXml);

	var colDataRowTemplates = objXml.getElementsByTagName("ccxi_datarowtemplate");
	
	if (colDataRowTemplates == null)return;
	
	
	var colDataRows = objData.getElementsByTagName("ccxi_datarow");
	
	if (colDataRows == null)return;


	var iSorts = objXml.getAttribute("ccxi_sorts");
	
	if (iSorts == null)return;
	
	
	var iCurrentSort = objXml.getAttribute("ccxi_currentsort");
	
	if (iCurrentSort == null)return;
	

	var strNonTableHtml = "";
	var objDataRow = ccxiGetSortedElement(colDataRows, iSorts, iCurrentSort, iDataRow, iFilter);

	strNonTableHtml = ccxiFillSingleRow(objDataRow, strTemplateField, 
		colDataRowTemplates, "", strContainerId);

	if (strNonTableHtml.length > 0)
	{
		objContainer.innerHTML = strNonTableHtml;
	}
}


//cgm: new
function ccxiFillSingleRow(objDataRow, strTemplateField, colDataRowTemplates, 
			strNonTableHtml, strContainerId)
{
	var j;
	var iCurrentDrt = -1;
	
	if (objDataRow == null)return "";

	if (strTemplateField.length > 0)
	{
		var strMatch = ccxiGetChildContents(objDataRow, "ccxi_"+strTemplateField);
		
		strMatch = strMatch.toUpperCase();
		iCurrentDrt = -1;
		
		for (j = ccxiGetNextElement(colDataRowTemplates, -1); j >= 0; 
				j = ccxiGetNextElement(colDataRowTemplates, j))
		{
			var strMatchId = colDataRowTemplates[j].getAttribute("id");
			
			if (strMatchId == null)continue;
			
			strMatchId = strMatchId.toUpperCase();

			if (strMatchId == strMatch)
			{
				iCurrentDrt = j;
				
				break;
			}
		}
		
		if (iCurrentDrt < 0)return "";
	}
	else
	{
		iCurrentDrt = ccxiGetNextElement(colDataRowTemplates, iCurrentDrt);
		if (iCurrentDrt < 0)iCurrentDrt = ccxiGetNextElement(colDataRowTemplates, -1);
	}


	var objCurrentDrt = colDataRowTemplates[iCurrentDrt];
	var colTableRowTemplates = objCurrentDrt.getElementsByTagName("ccxi_tablerowtemplate");
	var colRowTemplates = objCurrentDrt.getElementsByTagName("ccxi_rowtemplate");

	for (j = ccxiGetNextElement(colRowTemplates, -1); j >= 0; j = ccxiGetNextElement(colRowTemplates, j))
	{
		var jj;
		var strTemplate = colRowTemplates[j].childNodes[0].nodeValue;
		var aryTemplate = strTemplate.split("%%");
		
		for (jj = 0; jj < aryTemplate.length; jj++)
		{
			if ((jj % 2) == 0)
			{
				strNonTableHtml += aryTemplate[jj];
			}
			else
			{
				strNonTableHtml += ccxiGetChildContents(objDataRow, "ccxi_"+aryTemplate[jj]);
			}
		}
	}
	
	for (j = ccxiGetNextElement(colTableRowTemplates, -1); j >= 0; j = ccxiGetNextElement(colTableRowTemplates, j))
	{
		var k;
		var oRow = ccxiNewRow(strContainerId);
		var colCellTemplates = colTableRowTemplates[j].getElementsByTagName("ccxi_celltemplate");
							
		ccxiSetAttributes(oRow, colTableRowTemplates[j], "ccxi_rowattr");

		for (k = ccxiGetNextElement(colCellTemplates, -1); k >= 0; k = ccxiGetNextElement(colCellTemplates, k))
		{
			var ii;
			var oCell = ccxiNewCell(oRow);
			var colCellData = colCellTemplates[k].getElementsByTagName("ccxi_celldata");

			ccxiSetAttributes(oCell, colCellTemplates[k], "ccxi_cellattr");

			for (ii = ccxiGetNextElement(colCellData, -1); ii >= 0; ii = ccxiGetNextElement(colCellData, ii))
			{
				var jj;
				var strCellData = colCellData[ii].childNodes[0].nodeValue;
				var aryCellData = strCellData.split("%%");
				var strHtml = "";
				
				for (jj = 0; jj < aryCellData.length; jj++)
				{
					if ((jj % 2) == 0)
					{
						strHtml += aryCellData[jj];
					}
					else
					{
						strHtml += ccxiGetChildContents(objDataRow, "ccxi_"+aryCellData[jj]);
					}
				}
				
				oCell.innerHTML = strHtml;
			}
		}
	}
	
	return strNonTableHtml;
}

function ccxiSearchTerm(strOp, hCriteria, strField, strTerm)
{
	if (hCriteria == null)
	{
		hCriteria = new Array();
	}
	
	var iAt = hCriteria.length;
	
	hCriteria[iAt] = new Array();
	hCriteria[iAt][0] = strOp;
	hCriteria[iAt][1] = strField;
	hCriteria[iAt][2] = strTerm;
	
	return hCriteria;
}

function ccxiOrTerm(hCriteria, strField, strTerm, bNot)
{
	return ccxiSearchTerm((bNot ? "ornot" : "or"), hCriteria, strField, strTerm);
}

function ccxiAndTerm(hCriteria, strField, strTerm, bNot)
{
	return ccxiSearchTerm((bNot ? "andnot" : "and"), hCriteria, strField, strTerm);
}

function ccxiSearchPhrase(strOp, hCriteria, hSubCriteria)
{
	if (hCriteria == null)
	{
		hCriteria = new Array();
	}
	
	var iAt = hCriteria.length;
	
	hCriteria[iAt] = new Array();
	hCriteria[iAt][0] = strOp;
	hCriteria[iAt] = hCriteria[iAt].concat(hSubCriteria);
	
	return hCriteria;
}

function ccxiOrPhrase(hCriteria, hSubCriteria, bNot)
{
	return ccxiSearchPhrase((bNot ? "ornot(" : "or("), hCriteria, hSubCriteria);
}

function ccxiAndPhrase(hCriteria, hSubCriteria, bNot)
{
	return ccxiSearchPhrase((bNot ? "andnot(" : "and("), hCriteria, hSubCriteria);
}

function ccxiSearch(objXml, hCriteria)
{
	if (objXml == null)return;
	
	var iSorts = objXml.getAttribute("ccxi_sorts");

	var aryItems = ccxi_sorts[iSorts][0][1];
	var aryExclude = new Array();
	var aryInclude = new Array();
	var i;
	var iFilter = objXml.getAttribute("ccxi_filter");
	var iPageLen = objXml.getAttribute("ccxi_pagelen");
	
	for (i = 0; i < aryItems.length; i++)
	{
		aryExclude[i] = aryItems[i][1];
	}
	
	for (i = 0; i < hCriteria.length; i++)
	{
		ccxiMatchNode(objXml, hCriteria[i], aryExclude, aryInclude);
	}
			
	for (i = 0; i < ccxi_filters[iFilter].length; i++)
	{
		ccxi_filters[iFilter][i] = false;
	}
	
	for (i = 0; i < aryInclude.length; i++)
	{
		ccxi_filters[iFilter][aryInclude[i]] = true;
	}
	
	objXml.setAttribute("ccxi_lastpagef", Math.ceil(aryInclude.length/iPageLen));
	objXml.setAttribute("ccxi_countf", aryInclude.length);
	
	ccxiFillRows(objXml, 1, true);
}

function ccxiSimpleSearch(objXml, strField, strTerm, bNot)
{
	var hCriteria = ccxiOrTerm(hCriteria, strField, strTerm, bNot);

	ccxiSearch(objXml, hCriteria);	
}

function ccxiMatchNode(objXml, aryCriteria, aryExclude, aryInclude)
{
	var aryFrom;
	var aryTo;
	var i;

	if (aryCriteria[0] == "or")
	{
		ccxiMatchCriterion(objXml, aryCriteria[1], aryCriteria[2], aryExclude, aryInclude, true);
	}
	else if (aryCriteria[0] == "ornot")
	{
		ccxiMatchCriterion(objXml, aryCriteria[1], aryCriteria[2], aryExclude, aryInclude,  false);
	}
	else if (aryCriteria[0] == "or(")
	{
		aryFrom = aryExclude.concat();
		aryTo = new Array();
		
		for (i = 1; i < aryCriteria.length; i++)
		{
			ccxiMatchNode(objXml, aryCriteria[i], aryFrom, aryTo);
		}
		
		if (aryTo.length > 0 )
		{
			for (i = 0; i < aryTo.length; i++)
			{
				aryInclude[aryInclude.length] = aryTo[i];
			}
		
			for (i = 0; i < aryTo.length; i++)
			{
				ccxiRemoveMatchItem(aryExclude, aryTo[i]);
			}
		}
	}
	else if (aryCriteria[0] == "ornot(")
	{
		aryFrom = aryExclude.concat();
		aryTo = new Array();
		
		for (i = 1; i < aryCriteria.length; i++)
		{
			ccxiMatchNode(objXml, aryCriteria[i], aryFrom, aryTo);
		}
			
		if (aryFrom.length > 0 )
		{
			for (i = 0; i < aryFrom.length; i++)
			{
				aryInclude[aryInclude.length] = aryFrom[i];
			}
		
			for (i = 0; i < aryFrom.length; i++)
			{
				ccxiRemoveMatchItem(aryExclude, aryFrom[i]);
			}
		}
	}
	else if (aryCriteria[0] == "and")
	{
		ccxiMatchCriterion(objXml, aryCriteria[1], aryCriteria[2], aryInclude, aryExclude,  false);
	}
	else if (aryCriteria[0] == "andnot")
	{
		ccxiMatchCriterion(objXml, aryCriteria[1], aryCriteria[2], aryInclude, aryExclude,  true);
	}
	else if (aryCriteria[0] == "and(")
	{
		aryFrom = aryInclude.concat();
		aryTo = new Array();
		
		for (i = 1; i < aryCriteria.length; i++)
		{
			ccxiMatchNode(objXml, aryCriteria[i], aryFrom, aryTo);
		}
			
		if (aryFrom.length > 0 )
		{
			for (i = 0; i < aryFrom.length; i++)
			{
				aryExclude[aryExclude.length] = aryFrom[i];
			}
		
			for (i = 0; i < aryFrom.length; i++)
			{
				ccxiRemoveMatchItem(aryInclude, aryFrom[i]);
			}
		}
	}
	else if (aryCriteria[0] == "andnot(")
	{
		aryFrom = aryInclude.concat();
		aryTo = new Array();
		
		for (i = 1; i < aryCriteria.length; i++)
		{
			ccxiMatchNode(objXml, aryCriteria[i], aryFrom, aryTo);
		}
			
		if (aryTo.length > 0 )
		{
			for (i = 0; i < aryTo.length; i++)
			{
				aryExclude[aryExclude.length] = aryTo[i];
			}
			
			for (i = 0; i < aryTo.length; i++)
			{
				ccxiRemoveMatchItem(aryInclude, aryTo[i]);
			}
		}
	}
}

function ccxiFindItemNode(objXml, strField, strTerm)
{
	if (objXml == null)return -1;

	var i;
	var iSorts = objXml.getAttribute("ccxi_sorts");
	var iCurrent = ccxiSortElements(objXml, strField, null, false, false);

	var aryCurrentBase = ccxi_sorts[iSorts][iCurrent];
	var aryCurrent = aryCurrentBase[1];
	var aryCurrent3 = aryCurrentBase[3];
	
	if (aryCurrent3 != null)
	{
		var iAt = aryCurrent3[parseInt(strTerm)];
		
		if (iAt != null)return iAt;
		
		return -1;
	}
	
	
	var strTermUpper = strTerm.toUpperCase();
	
	strTermUpper = strTermUpper.replace(/^\s*/g, "");	// trim leading spaces
	strTermUpper = strTermUpper.replace(/\s*$/g, "");	// trim trailing spaces
	
	for (i = 0; i < aryCurrent.length; i++)
	{
		var strText = aryCurrent[i][0].toUpperCase();
		
		if (strTermUpper == strText)
		{
			return aryCurrent[i][1];
		}
	}
	
	return -1;
}

function ccxiIndexBy(objXml, strField)
{
	if (objXml == null)return -1;

	var i;
	var iSorts = objXml.getAttribute("ccxi_sorts");
	var iCurrent = ccxiSortElements(objXml, strField, null, false, false);
	var aryCurrent = ccxi_sorts[iSorts][iCurrent];
	var aryCurrent1 = aryCurrent[1];

	aryCurrent[3] = new Array();


	var aryCurrent3 = aryCurrent[3];
	
	for (i = 0; i < aryCurrent1.length; i++)
	{
		aryCurrent3[parseInt(aryCurrent1[i][0])] = aryCurrent1[i][1];
	}
}

function ccxiGetItemData(objXml, iWhich, strField, bUseFilter)
{
	var iFilter = (bUseFilter != null && bUseFilter ? objXml.getAttribute("ccxi_filter") : -1);
	var iSorts = objXml.getAttribute("ccxi_sorts");
	var objData = ccxiMapDataId(objXml);
	var colDataRows = objData.getElementsByTagName("ccxi_datarow");
	
	if (colDataRows == null)return "";


	var iCurrentSort = objXml.getAttribute("ccxi_currentsort");
	
	if (iCurrentSort == null)return "";


	var objDataRow = ccxiGetSortedElement(colDataRows, iSorts, iCurrentSort, iWhich, iFilter);
		
	if (objDataRow == null)return "";
	
	
	var strItemData = ccxiGetChildContents(objDataRow, "ccxi_" + strField);

	//strItemData = strItemData.replace(/^\s*/g, "");	// trim leading spaces
	//strItemData = strItemData.replace(/\s*$/g, "");	// trim trailing spaces

	return strItemData;
}

function ccxiMatchCriterion(objXml, strField, strTerm, aryFrom, aryTo, bMatch)
{
	if (objXml == null)return;

	var i;
	var j;
	var iSorts = objXml.getAttribute("ccxi_sorts");
	var iCurrent = ccxiSortElements(objXml, strField, null, false, false);
	var regTerm = new RegExp(strTerm, "i");

	var aryCurrent = ccxi_sorts[iSorts][iCurrent][1];

	for (i = 0; i < aryCurrent.length; i++)
	{
		for (j = 0; j < aryFrom.length; j++)
		{
			if (aryCurrent[i][1] == aryFrom[j])
			{
				var strText = aryCurrent[i][0];
				var bFound = (strText.search(regTerm) >= 0);
				
				if (bMatch == bFound)
				{
					aryTo[aryTo.length] = aryFrom.splice(j, 1);
				}
				break;
			}
		}
	}
}

function ccxiRemoveMatchItem(aryItems, iItem)
{
	var i;
	
	for (i = 0; i < aryItems.length; i++)
	{
		if (aryItems[i] == iItem)
		{
			aryItems.splice(i, 1);
		
			break;
		}
	}
}

//-->
