var C1G_MAXLEVEL = 10;

function c1g_getNodeLevel(row)
{
	var id = row.id;
	var len = id.length;
	
	var idx = id.lastIndexOf("_");
	if (idx >= 0 && (idx + 2 < len) && id.substr(idx+1,2)=="GH")
	{
		idx = id.lastIndexOf("-");
		var val = id.substr(idx+1, len);
		val = parseInt(val);
		return isNaN(val) ? -1 : val;
	}
	
	return -1;
}


function c1g_checkNodes(node, len, level, vis)
{
	if (level > C1G_MAXLEVEL) return;

	for (var i = 0; i < len; i++)
	{
		var child = node.childNodes[i];
		if (child.nodeType == 1 && child.tagName == "SELECT")
		{
			if (vis == "none")
			{
				if (child.style.display == "")
				{
					child._c1g = 1;
					child.style.display = vis;
				}
			}
			else
				if (child._c1g)
					child.style.display = vis;
		}

		var cLen = child.childNodes.length;
		if (cLen)
			c1g_checkNodes(child, cLen, level + 1, vis);
	}
}

function c1g_getImgElement(row)
{
	var imgs = row.getElementsByTagName("IMG");
	return (imgs && imgs.length > 0) ? imgs[0] : null;
}

function c1g_toggleRowVisisbility(row, vis)
{
	if (row)
	{
		row.style.display = vis;

		if (isIE)
		{
			var len = row.cells.length;		
			for (var i = 0; i < len; i++)
				c1g_checkNodes(row.cells[i], row.cells[i].childNodes.length, 0, vis);
		}
	}
}

function c1g_getImages(img)
{
	var t = img.onclick.toString();
	
	if (t.indexOf("c1g_showHide(") != -1)
	{
		t = t.split(",");
		while (t[1].charAt(0) == " ") t[1] = t[1].substr(1, t[1].length - 1); 
		while (t[2].charAt(0) == " ") t[2] = t[2].substr(1, t[2].length - 1);
		return new Array(t[1].substr(1,t[1].length-2),t[2].substr(1,t[2].length-2));
	}
	else
	{
		t = t.split(",");
		t = t[2].split("|");
		return new Array(t[2].substr(0,t[2].length),t[3].substr(0,t[3].length));
	}
}

function c1g_showHide(e, imgCollapsed, imgExpanded, groupby)
{
	if (!e) e = window.event;

	var src = (e.srcElement) ? e.srcElement : e.currentTarget;
	var evtsrc = src;

	src = c1g_upToTag(src, "TR");
	if (!src) return;

	// get the node level
	var level = c1g_getNodeLevel(src);
	if (level < 0)
		 return;
	
	// loop through all rows below this one until the next node
	table = c1g_upToTag(src.parentNode, "TABLE");
	if (!table) return;

	var clientRowID = c1g_getattr(src, "id");	
	var gridid = c1g_getGridID(evtsrc);
	var rows = table.rows;
	var display = "";
	var lastlvl = true;
	var hdr = false;
	var len = rows.length;
	for (var row = src.rowIndex + 1; row < len; row++)
	{
		// stop at the next node higher than or equal to the source
		var rlevel = c1g_getNodeLevel(rows[row]);
		
		if (rlevel > -1 && rlevel <= level) break;
		if (rows[row].style["pager"] || rows[row].parentNode.tagName == "TFOOT") break;
		
		// handle detail rows

		if ((groupby && (level < rlevel || rlevel < 0)) || (!groupby && rlevel < 0))
		{
			// hiding or showing?
			if (display.length == 0)
				display = (rows[row].style.display == "none")? "": "none";
	
			// flip visibility
			if (groupby)
			{
				// if we're expanding only expand the next level up
				if( display == "" )
				{
					// group row
					if (rlevel == level + 1 || !hdr || e.shiftKey)
					{
						hdr = (rlevel == level + 1);
						lastlvl = false;
						var img = c1g_getImgElement(rows[row]);
						if (rlevel > -1 && img && img.src)
						{
							var imgs = c1g_getImages(img);
							img.src = e.shiftKey ? imgs[1] : imgs[0];
						}	
					
						if (rlevel >= 0 && e.shiftKey)
						{
							var id = c1g_getattr(rows[row],"id");
							c1g_updateGroupedField(gridid, rlevel+"~"+id);
						}
							
						c1g_toggleRowVisisbility(rows[row], display);
					}

					// datarow
					if (lastlvl && rlevel < 0 && !hdr)
						c1g_toggleRowVisisbility(rows[row], display);
				}
				else
				{
					if (level < rlevel)
					{
						var collapsed = true;
						if (row + 1 < len)
						{
							var t = c1g_getNodeLevel(rows[row+1]);
							
							if (rows[row+1].style.display == "")
								collapsed = false;
							
							if ((t >=0 && t <= rlevel) || (rows[row+1].parentNode.tagName=="TFOOT"))
								collapsed = true;
						}
						
						if (!collapsed)
						{
							var id = c1g_getattr(rows[row],"id");
							c1g_updateGroupedField(gridid, rlevel+"~"+id);
						}
						
						var img = c1g_getImgElement(rows[row]);
						if (img && img.src)
						{
							var imgs = c1g_getImages(img); 
							img.src = imgs[1];
						}
							
						c1g_toggleRowVisisbility(rows[row], display);
					}
					
					if (rlevel < 0)
						c1g_toggleRowVisisbility(rows[row], display);
				}
			}
			else
				if (rlevel < 0)
					c1g_toggleRowVisisbility(rows[row], display);
		}
	}

	// flip image
	src = evtsrc;
	if (src.tagName == "IMG")
		src.src = (display == "none")? imgCollapsed: imgExpanded;

	c1g_refreshGrid(gridid);
	c1g_updateGroupedField(gridid, level+"~"+clientRowID);
}


function c1g_updateGroupedField(gridid, value)
{
	var p = c1g_Props[gridid];
	var tmp = c1g_updateField(p.IDGroupedRows, value);
	
	if (typeof(c1cb__resetHiddenField) != "undefined")
		c1cb__resetHiddenField(p.IDGroupedRows, tmp);
}

function c1g_updateField(id, value)
{
	var f = c1g_getByName(id);
	if (f)
	{
		if (f.value.indexOf(value) != -1)
			f.value = f.value.replace(value+":", "");
		else
			f.value += value + ":";
		
		return f.value;
	}
	
	return null;
}