leftBtnPressed = 1;
columnSizingEdge = 5;

function clearColumnSizingState(){
	curGridName = "";
	curSizing = false;
	curSzLn = null;
	curX = 0;
	curRszHdr = null;
	curColInd = -1;
	curDragAct = 0;	
}

function clearResizingCursor(){
	curRszCrsrHdr = null;
	curRszCrsr = "";
}

function clearDragState(){
	curGridName = "";
	curDragEl = null;
	curColInd = -1;
	curDragAct = 0;
	curX = 0;
	curY = 0;		
	curTargetHdr = null;
	curArrUp = null;
	curArrDown = null; 
	curArrUpX = -1;
	curArrUpY = -1;
	curArrDownX = -1;
	curArrDownY = -1;
}

function clearHotTrackState(){
	hotTrackElement = null;
	hotTrackSavedBackColor = "";
	hotTrackSavedBorderColor = "";
	hotTrackHeader = null;
}

function initializeEnableFlags(){
	curEnblHdrClick = false;
	curEnblHdrDrag = false;
	curEnblGroup = false;
	curEnblClmnMove = false;
	curEnblClmnSize = false;
	curShowArr = false;
}

function replaceDblColon(_str){
	var _indexOf = _str.indexOf("::");
	if(_indexOf == -1){
		return _str;
	}
	else{
		var _str1 = _str.substr(0, _indexOf + 1);		
		var _str2 = _str.substr(_indexOf + 2, _str.length);
		return _str1 + replaceDblColon(_str2);
	}
}

function fillKeyState(gridName){
	document.all(gridName + "ShiftPressed").value = event.shiftKey;
	document.all(gridName + "CtrlPressed").value = event.ctrlKey;
}

function checkElementOverflow(curEl, overflow){
	return curEl.style.overflow == overflow || curEl.style.overflowX == overflow || curEl.style.overflowY == overflow || curEl.currentStyle.overflow == overflow || curEl.currentStyle.overflowX == overflow || curEl.currentStyle.overflowY == overflow;	
}

function isScrollableElement(curEl){
	return checkElementOverflow(curEl, "scroll") || checkElementOverflow(curEl, "auto");
}

function isStaticElement(curEl){
	return !(curEl.currentStyle.position == "absolute" || curEl.currentStyle.position == "relative" || isScrollableElement(curEl));
}

function absoluteX(curEl, gridName, correctPos, correctionNeeded){
    var posX = 0;
    if(curEl != null){
		if(curEl.offsetParent != null){		
			var nestedCorrectPos = correctionNeeded && (correctPos || curEl.id == gridName + "Table");
			posX = absoluteX(curEl.offsetParent, gridName, nestedCorrectPos, correctionNeeded);
			if(curEl.clientWidth != 0 && (!correctPos || isStaticElement(curEl))) 
				posX += curEl.offsetLeft + (curEl.tagName.toLowerCase() != "table" ? curEl.clientLeft : 0);
			if(!correctPos && isScrollableElement(curEl))
				posX -= curEl.scrollLeft;
		}
		else{
			posX = curEl.offsetLeft;
		}
	}
    return posX;
}

function absoluteY(curEl, gridName, correctPos){
    var posY = 0;
    if(curEl.offsetParent != null){
		var nestedCorrectPos = correctPos || curEl.id == gridName + "Table";
		posY = absoluteY(curEl.offsetParent, gridName, nestedCorrectPos);
        if(curEl.clientHeight != 0 && (!correctPos || isStaticElement(curEl))) 
            posY += curEl.offsetTop + (curEl.tagName.toLowerCase() != "table" ? curEl.clientTop : 0);
        if(!correctPos && isScrollableElement(curEl))
			posY -= curEl.scrollTop;
    }
    else{
        posY = curEl.offsetTop;
    }
    return posY;
}

function showDragHeader(header, drgHdr, isGrouped, gridName, borderCollapse){
	drgHdr.style.visibility = "visible";					
	drgHdr.style.posLeft = absoluteX(header, gridName, false, true);
	drgHdr.style.posTop = absoluteY(header, gridName, false);			
	var align = header.align;
	if(align == "")
		align = header.parentElement.align;
	drgHdr.align = align;					
	var savedBorderColor = drgHdr.children[0].style.borderColor;
	drgHdr.innerHTML = header.innerHTML;					
	drgHdr.children[0].style.borderColor = savedBorderColor;
	drgHdr.style.posWidth = header.offsetWidth - (isGrouped ? 0 : (borderCollapse ? 1 : 2)); 
	drgHdr.style.posHeight = header.offsetHeight - (isGrouped ? 0 : (borderCollapse ? 1 : 2));
}

function startDragHeader(gridName, header, hdrInd, isGrouped, borderCollapse){
	try{
		while(header != null && (header.tagName != "TD" || header.id == "")){
			header = header.parentElement;
		}		
		if(header != null){
			var drgHdr = document.all(gridName + "~DH~" + hdrInd);						
			CheckPageSizeEdit(gridName);									
			endHotTrack();
			showDragHeader(header, drgHdr, isGrouped, gridName, borderCollapse);	
			curGridName = gridName;
			curColInd = hdrInd;
			curX = (event.clientX + document.body.scrollLeft);
			curY = (event.clientY + document.body.scrollTop);		
			curDragEl = drgHdr;
			curDragAct = (isGrouped) ? 10001 : 10000;				
			curArrUp = document.all(gridName + "arrowup");		
			curArrDown = document.all(gridName + "arrowdown"); 			
		}		
	}
	catch(e){
	}
}

function startColumnSizing(gridName, gridObj, header){
	curSzLn = document.all(gridName + "sizerline");		
	if(curSzLn != null){
		endHotTrack();
		curGridName = gridName;		
		curDragAct = 10000;		
		curX = (event.clientX + document.body.scrollLeft) - absoluteX(curSzLn.offsetParent, gridName, false, true) - 2;
		curSzLn.style.cursor = "e-resize";
		curSzLn.style.visibility = "visible";		
		curSzLn.style.posLeft = curX;
		curSzLn.style.posTop = absoluteY(header, gridName, false);
		curSzLn.style.posWidth = 1; 
		var scroller = document.all(gridName + "scroller");
		if(scroller != null)
			curSzLn.style.posHeight = scroller.offsetHeight; 
		else
			curSzLn.style.posHeight = gridObj.GetRowsHeight(header.parentElement.parentElement); 
	}
}

function endColumnSizing(){
	curSzLn.style.cursor = "default";
	curSzLn.style.visibility = "hidden";
	clearColumnSizingState();
}

function endColumnDragging(){
	curDragEl.style.visibility = "hidden";
	clearDragState();
}

function endHotTrackHdr(){	
	if(hotTrackElement != null){
		hotTrackElement.children[0].style.borderColor = hotTrackSavedBorderColor;
		hotTrackElement.style.visibility = "hidden";
		hotTrackElement.style.posLeft = 0;
		hotTrackElement.style.posTop = 0;			
		clearHotTrackState();		
	}
}

function startHotTrackHdr(header, element, borderColor){	
	if(hotTrackElement != null && hotTrackElement != element)
		endHotTrack();
	if(hotTrackElement == null){		
		hotTrackElement = element;
		hotTrackSavedBorderColor = hotTrackElement.children[0].style.borderColor;
		hotTrackElement.children[0].style.borderColor = borderColor;
		hotTrackHeader = header;
	}
}

function OnTMMove(){
	checkHotTrackHdrCoords();
	if(curSzLn != null){
		if((event.button & leftBtnPressed) != 0){
			newX = (event.clientX + document.body.scrollLeft) - absoluteX(curSzLn.offsetParent, curGridName, false, true) - 2;
			if(newX < curRszHdr.x + curRszHdr.minWidth)
				newX = curRszHdr.x + curRszHdr.minWidth;
			distanceX = (newX - curX);
			if(distanceX != 0){				
				curX = newX;
				curSzLn.style.posLeft += distanceX;
				curDragAct = 4;
			}
		}
		else{
			endColumnSizing();
		}
	}
}

function OnTMUp(){
	if(curSzLn != null){	
		if(curDragAct == 4)
			__doPostBack(replaceDblColon(curGridName), "RESIZECOLUMN:CH:" + curRszHdr.columnIndex + ":" + (curX - curRszHdr.x - curRszHdr.width));
		endColumnSizing();
	}
}

function OnHMMove(){		
	OnHMMoveHT(false, false, "", "");
}

function showResizingCursor(hdr){
	if(curRszCrsrHdr == null || curRszCrsrHdr != hdr){
		if(curRszCrsrHdr != null)
			hideResizingCursor();
		curRszCrsrHdr = hdr;
		curRszCrsr = hdr.style.cursor;
		hdr.style.cursor = "e-resize";
	}
}

function hideResizingCursor(){
	if(curRszCrsrHdr != null)
		curRszCrsrHdr.style.cursor = curRszCrsr;
	clearResizingCursor();
}

function OnHMMoveHT(hotTrack, flatStyle, color1, color2){		
	if(curSzLn == null && curDragEl == null){
		var header;
		if(hotTrackHeader != null){
			header = hotTrackHeader;
		}
		else{
			header = event.srcElement;
			while(header != null && (header.tagName != "TD" || header.id == "" || header.id.indexOf("~CH~") == -1 && header.id.indexOf("~GH~") == -1 && header.id.indexOf("~DH~") == -1)){
				header = header.parentElement;
			}
		}		
		if(header != null){
			var _indexOf = header.id.indexOf("~");
			if(_indexOf != -1){
				var gridName = header.id.substr(0, _indexOf);		
				var gridObj = __WebGridCollection.Get(gridName);
				if(gridObj != null){
					var hdrInd = header.id.substr(_indexOf + ("~CH~").length, header.id.length);
					var isGrouped = header.id.indexOf("~GH~") != -1;
					if(hotTrack && hotTrackHeader != header){
						if(flatStyle){						
							var drgHdr = document.all(gridName + "~DH~" + hdrInd)							
							if(drgHdr != null){
								showDragHeader(header, drgHdr, isGrouped, gridName, gridObj.borderCollapse);
								startHotTrackHdr(header, drgHdr, color2);
							}
						}
						else{
							startHotTrackBtn(header.children[0], false, color1, color2)
						}				
					}				
					if(!isGrouped){
						var clientX = event.clientX + document.body.scrollLeft;
						curRszHdr = gridObj.GetResizingHeaderInfo(header, hdrInd, clientX);
						if(curRszHdr != null){
							showResizingCursor(event.srcElement);
							curSizing = true;
						}
						else{
							hideResizingCursor();
							curSizing = false;
						}
					}
				}
			}			
		}
	}
}

function OnGBCl(){	
	var header = event.srcElement;
	while(header != null && (header.tagName != "TD" || header.id == "")){
		header = header.parentElement;
	}	
	if(header != null){
		var _indexOf = header.id.indexOf("~");
		if(_indexOf != -1){
			var gridName = header.id.substr(0, _indexOf);		
			var hdrInd = header.id.substr(_indexOf + ("~GB~").length, header.id.length);
			var gridObj = __WebGridCollection.Get(gridName);
			if(gridObj != null){				
				var column = gridObj.GetColumnByIndex(hdrInd);
				if(column != null && column.enableGrouping){
					if(header.id.indexOf("~GB~") != -1)
						__doPostBack(replaceDblColon(gridName), "GROUP:GB:" + hdrInd + ":-1");
					else
						__doPostBack(replaceDblColon(gridName), "UNGROUP:GB:" + hdrInd + ":-1");
				}
			}
		}
	}
}

function OnHMDown(){			
	var header;
	if(hotTrackHeader != null){
		header = hotTrackHeader;
	}
	else{
		header = event.srcElement;
		while(header != null && (header.tagName != "TD" || header.id == "")){
			header = header.parentElement;
		}
	}
	if(header != null && (header.id.indexOf("~CH~") != -1 || header.id.indexOf("~GH~") != -1)){
		var _indexOf = header.id.indexOf("~");
		if(_indexOf != -1){
			var gridName = header.id.substr(0, _indexOf);		
			var hdrInd = header.id.substr(_indexOf + ("~CH~").length, header.id.length);
			var gridObj = __WebGridCollection.Get(gridName);
			if(gridObj != null){
				if(curSizing){
					startColumnSizing(gridName, gridObj, header, hdrInd);
				}
				else{	
					initializeEnableFlags();										
					var column = gridObj.GetColumnByIndex(hdrInd);
					if(column != null){
						curEnblHdrClick = column.enableHeaderClick;
						curEnblHdrDrag = column.enableHeaderDragging;
						curEnblGroup = column.enableGrouping;
						curEnblClmnMove = column.enableColumnMoving;							
						curEnblClmnSize = column.enableColumnSizing;
					}						
					curShowArr = gridObj.showArrowsOnDragging;
					if(curEnblHdrClick || curEnblHdrDrag){
						var isGrouped = header.id.indexOf("~GH~") != -1;						
						startDragHeader(gridName, header, hdrInd, isGrouped, gridObj.borderCollapse);
						event.srcElement.onmouseup = OnDHMUp;
						event.cancelBubble = true;	
					}
				}	
			}		
		}
	}
}

function updateArrowsPos(arrowImgWidth){
	if(curTargetHdr != null){
        curArrUpX = curTargetHdr.x - arrowImgWidth / 2;        
        curArrUpY = curTargetHdr.y + curTargetHdr.height;
        curArrDownX = curTargetHdr.x - arrowImgWidth / 2;
        curArrDownY = curTargetHdr.y - arrowImgWidth;
	}
}

function showArrows(){
    curArrUp.style.posLeft = curArrUpX;    
    curArrUp.style.posTop = curArrUpY;
    curArrDown.style.posLeft = curArrDownX;
    curArrDown.style.posTop = curArrDownY;

    curArrUp.style.visibility = "visible";
    curArrDown.style.visibility = "visible";
}

function hideArrows(){
	if(curArrUp != null)
		curArrUp.style.visibility = "hidden";
	if(curArrDown)
		curArrDown.style.visibility = "hidden";
}

function OnDHMMove(){
	OnHMMoveHT(false, false, "", "");
}

function OnDHMDown(){	
	if(!(event.srcElement.id.indexOf("~GB~") >= 0 || event.srcElement.id.indexOf("~UB~") >= 0 || event.srcElement.parentElement != null && (event.srcElement.parentElement.id.indexOf("~GB~") >= 0 || event.srcElement.parentElement.id.indexOf("~UB~") >= 0)))
		OnHMDown();
}

function OnDHMUp(){	
	try	{
		if(event.srcElement.id.indexOf("~GB~") >= 0 || event.srcElement.id.indexOf("~UB~") >= 0 || event.srcElement.parentElement != null && (event.srcElement.parentElement.id.indexOf("~GB~") >= 0 || event.srcElement.parentElement.id.indexOf("~UB~") >= 0)){
			OnGBCl();
		}
		else{			
			var header = curDragEl;		
			if(header != null){
				var gridObj = __WebGridCollection.Get(curGridName);		
				if(curDragAct == 2 || curDragAct == 3){			
					if(curShowArr)
						hideArrows();		
					if(curTargetHdr != null){	
						if(curTargetHdr.inGroupingPanel){
							if(curEnblGroup && curTargetHdr.columnIndex != curColInd)
								__doPostBack(replaceDblColon(curGridName), "GROUP:CH:" + curColInd + ":" + curTargetHdr.targetIndex);
						}
						else{
							if(curDragAct == 3){
								if(curEnblGroup)
									__doPostBack(replaceDblColon(curGridName), "UNGROUP:CH:" + curColInd + ":" + curTargetHdr.targetIndex);
							}
							else{
								if(curEnblClmnMove && curTargetHdr.columnIndex != curColInd)
									__doPostBack(replaceDblColon(curGridName), "MOVECOLUMN:CH:" + curColInd + ":" + curTargetHdr.targetIndex);
							}
						}			
					}
				}
				else{
					if(curEnblHdrClick){
						fillKeyState(curGridName);						
						__doPostBack(replaceDblColon(curGridName), "SORT:CH:" + curColInd + ":0");
					}
				}		
				endColumnDragging();
			}
		}
	}
	catch(e){
	}	
}

function checkHotTrackHdrCoords(){
	if(hotTrackHeader != null){
		var headerX = absoluteX(hotTrackHeader);
		var headerY = absoluteY(hotTrackHeader);
		var mouseX = event.clientX + document.body.scrollLeft;
		var mouseY = event.clientY + document.body.scrollTop;
		if(mouseX < headerX || mouseX > headerX + hotTrackHeader.offsetWidth || mouseY < headerY || mouseY > headerY + hotTrackHeader.offsetHeight)
			endHotTrack();
	}
}

function OnDHMOut(){	
	if(curDragEl != null){
		if(!curEnblHdrDrag){
			curDragEl.style.visibility = "hidden";
			clearDragState();
		}
	}
	else{
		checkHotTrackHdrCoords();
	}
}

function OnMMove(gridName){			
	if(curDragEl != null && curEnblHdrDrag){
		var header = curDragEl;				
		newX = (event.clientX + document.body.scrollLeft);
		newY = (event.clientY + document.body.scrollTop);
		distanceX = newX - curX;
		distanceY = newY - curY;
		var threshold = (curDragAct == 2 || curDragAct == 3 ? 0 : 4)
		
		if(Math.abs(distanceX) > threshold || Math.abs(distanceY) > threshold){
			if(curDragAct == 10000)
				curDragAct = 2;
			if(curDragAct == 10001)
				curDragAct = 3;
			
			curX = newX;
			curY = newY;

			header.style.pixelLeft += distanceX;
			header.style.pixelTop += distanceY;    

			var gridObj = __WebGridCollection.Get(curGridName);
			curTargetHdr = null;
			if(gridObj != null && curDragAct == 2 && curEnblClmnMove || curDragAct == 3 && curEnblGroup)
				curTargetHdr = gridObj.GetTargetHeaderInfo(header.offsetLeft + header.offsetWidth / 2, header.offsetTop + header.offsetHeight / 2, curColInd);
			if(curTargetHdr == null && curEnblGroup && gridObj != null)
				curTargetHdr = gridObj.GetTargetGroupedHeaderInfo(header.offsetLeft + header.offsetWidth / 2, header.offsetTop + header.offsetHeight / 2, curColInd);
			if(curShowArr){				
				updateArrowsPos(gridObj.arrowImgWidth);				
				if(curTargetHdr == null)
					hideArrows();
				else
					showArrows();				
			}		
		}
		return false;
	}
	else{
		if(savedDocumentMouseMove != null)
			return savedDocumentMouseMove();
	}
	return true;
}

function OnEBCl(){		
	event.cancelBubble = true;	
	var button = event.srcElement;
	while(button != null && (button.tagName != "TD" || button.id == "")){
		button = button.parentElement;
	}
	if(button != null){
		var _indexOf = button.id.indexOf("~");
		if(_indexOf != -1){
			var gridName = button.id.substr(0, _indexOf);		
			var gridObj = __WebGridCollection.Get(gridName);
			if(gridObj != null && gridObj.rowsExpanded != null && gridObj.controlMode == "Browse")
				gridObj.ProcessExpBtn(button);	
			else
				__doPostBack(replaceDblColon(gridName), "EXPAND:EB:" + button.id + ":0");
		}
	}
}

function OnRBNoneCl(){
	event.cancelBubble = true;	
}

function rbGetButton(){
	var button = event.srcElement;
	while(button != null && (button.tagName != "TD" || button.id == "")){
		button = button.parentElement;
	}
	return button;
}

function rbGetGridName(button){
	var _indexOf = button.id.indexOf("~");
	if(_indexOf != -1)
		return button.id.substr(0, _indexOf);			
	return "";
}

function OnRBInsCl(){
	event.cancelBubble = true;	
	var button = rbGetButton();
	if(button != null){
		var gridName = rbGetGridName(button);			
		var gridObj = __WebGridCollection.Get(gridName);
		if(gridObj != null && !gridObj.readOnly && gridObj.allowInsert)
			__doPostBack(replaceDblColon(gridName), "INSERT:RB:" + button.id + ":0");
	}
}

function OnRBAppCl(){
	event.cancelBubble = true;	
	var button = rbGetButton();
	if(button != null){
		var gridName = rbGetGridName(button);			
		var gridObj = __WebGridCollection.Get(gridName);
		if(gridObj != null && !gridObj.readOnly && gridObj.allowInsert)
			__doPostBack(replaceDblColon(gridName), "APPEND:RB:-1:0");
	}
}

function OnRBEditCl(){
	event.cancelBubble = true;	
	var button = rbGetButton();
	if(button != null){
		var gridName = rbGetGridName(button);
		var gridObj = __WebGridCollection.Get(gridName);
		if(gridObj != null && !gridObj.readOnly && gridObj.allowEdit)
			__doPostBack(replaceDblColon(gridName), "STARTEDIT:RB:" + button.id + ":0");
	}
}

function OnRBCancelCl(){
	event.cancelBubble = true;	
	var button = rbGetButton();
	if(button != null){
		var gridName = rbGetGridName(button);			
		__doPostBack(replaceDblColon(gridName), "CANCELEDIT:RB:0:0");
	}
}

function DoDeleteRow(gridName, rowId, buttonId){
	CheckPageSizeEdit(gridName);		
	var gridObj = __WebGridCollection.Get(gridName);
	if(gridObj != null && gridObj.allowDelete){		
		if(!gridObj.confirmDelete || confirm(gridObj.confirmDeleteMessage))
			__doPostBack(replaceDblColon(gridName), "DELETE:" + (rowId != "-1" ? "RB" : "BB") + ":" + rowId + ":" + buttonId);
	}
}

function OnRBDelCl(){	
	event.cancelBubble = true;	
	var button = rbGetButton();
	if(button != null){
		var gridName = rbGetGridName(button);
		DoDeleteRow(gridName, button.id, "0");
	}
}

function OnRBOkCl(){
	event.cancelBubble = true;	
	var button = rbGetButton();
	if(button != null){
		var gridName = rbGetGridName(button);	
		__doPostBack(replaceDblColon(gridName), "POSTEDIT:RB:0:0");
	}
}

function GetGridNameFromFullID(fullID)
{
	var _indexOf = fullID.indexOf("~");
	if(_indexOf != -1)
		return fullID.substr(0, _indexOf);			
	return "";
}

function GetRowIDFromFullID(fullID)
{
	var _indexOf = fullID.indexOf("TR~");
	if(_indexOf <0 ) return "";
	_indexOf = fullID.indexOf("~",_indexOf+3);
	if(_indexOf <0 ) return "";
	return fullID.substr(_indexOf+1);
}

function GetSelectedRowFullID(aEvent)
{	
	var fullID = null;
	var td;
	td = aEvent.srcElement;
		if(td.tagName!="TD")
		td=td.parentElement;
	var tr;
	tr = td.parentElement;
	var _indexOf = tr.id.indexOf("~preview");	
	var previewClicked = false; 
	if(_indexOf != -1)
	{
		tr = document.all(tr.id.substr(0, _indexOf));		
		previewClicked = true;
	}
	_indexOf = tr.id.indexOf("~");	
	if(_indexOf != -1)
	{
		return tr.id;
	}
	return null;
}	

function GetGridObjectFromFullID(aFullID)
{
	var gridObj  = null;
	var _indexOf = aFullID.indexOf("~");	
	if(_indexOf != -1)
	{
		var gridName = aFullID.substr(0, _indexOf);		
		CheckPageSizeEdit(gridName);
		gridObj = __WebGridCollection.Get(gridName);
	}
			
	return gridObj;
	
}

function GetGridObjectFromName(aGridName)
{
	var gridObj  = null;
	CheckPageSizeEdit(aGridName);
	gridObj = __WebGridCollection.Get(aGridName);	
	return gridObj;
	
}


function OnMouseDownHandler(aElementType, aEvent)
{	
	var FullRowID = null;
	
	if (aEvent.button==1)
	{
		return;
		if (aEvent.x<16)
		{
			return;
		}
		
		FullRowID = OnTRCl();		
		ClickType = "Left";
	}
	
	if (aEvent.button==2)
	{
		ClickType = "Right";
		
		if (aElementType=='Row')
		{
			FullRowID = GetSelectedRowFullID(aEvent);
			if (FullRowID!=null)
			{
				var gridObj = GetGridObjectFromFullID(FullRowID);
				if (gridObj!=null)
				{
					if (!(gridObj.multiSelection==true && gridObj.GetSelectedCount()>1))
					{
						FullRowID = OnTRCl();							
					}
					
				}
			}
		}
		
	}
	
	if (FullRowID!=null)
	{			
		lGridName  = GetGridNameFromFullID(FullRowID);
		lElementID = GetRowIDFromFullID(FullRowID);
		
		OnMouseDownClientHandler(lGridName, aElementType, lElementID, aEvent);
	}

}


function OnSelectRow(tr)
{		
	var row_pseudo_id = GetRowID(tr);		
	var real_id_index = row_pseudo_id.indexOf("~");
	var row_id = null;
	if (real_id_index>0) row_id = row_pseudo_id.substring(real_id_index+1);
	
	// Must be implemented on the client page that contains the Grid Control
	OnSelectRowClientHandler(row_id);
}


function OnRBMoveToCl(){		
	event.cancelBubble = true;	
	var button = rbGetButton();

	if(button != null){
		var gridName = rbGetGridName(button);
		CheckPageSizeEdit(gridName);
		var gridObj = __WebGridCollection.Get(gridName);
		var rowId = button.id.substr(button.id.indexOf("~") + ("~LI~").length, button.id.length);			
		var tr = document.all(gridName + "~TR~" + rowId);						
		if(tr == null)				
			tr = document.all(gridName + "~GTR~" + rowId);				
		if(tr != null && !(document.all(gridName + "State").value == "Edit" && document.all(gridName + "FocusedRow").value == tr.id))
		{
			if(gridObj != null && !gridObj.postBackOnFocusedChanged && document.all(gridName + "State").value != "Edit")
			{
				gridObj.MoveTo(tr, true, !event.ctrlKey && !event.shiftKey, event.shiftKey);				
			}
			else
			{
				fillKeyState(gridName);
				__doPostBack(replaceDblColon(gridName), "MOVETO:RB:" + tr.id + ":0");
			}
		}
		OnSelectRow(tr);		
	}
}

function GetRowID(tr){
	var isGroupRow = tr.id.indexOf("~GTR~") != -1;
	var rowId = ((isGroupRow) ? tr.id.substr(tr.id.indexOf("~") + ("~GTR~").length, tr.id.length) : tr.id.substr(tr.id.indexOf("~") + ("~TR~").length, tr.id.length));
	return rowId;
}

function OnTRCl(){
	var td;
	td = event.srcElement;
	if(td.tagName!="TD")
		td=td.parentElement;
	var tr;
	tr = td.parentElement;	
	var _indexOf = tr.id.indexOf("~preview");	
	var previewClicked = false; 
	if(_indexOf != -1){
		tr = document.all(tr.id.substr(0, _indexOf));		
		previewClicked = true;
	}
	_indexOf = tr.id.indexOf("~");	
	if(_indexOf != -1){
		var gridName = tr.id.substr(0, _indexOf);		
		CheckPageSizeEdit(gridName);
		var gridObj = __WebGridCollection.Get(gridName);		
		if(gridObj != null){
			try{				
				if(!(document.all(gridName + "State").value == "Edit" && document.all(gridName + "FocusedRow").value == tr.id)){
					if(document.all(gridName + "State").value == "Edit"){
						__doPostBack(replaceDblColon(gridName), "MOVETO:RR:" + tr.id + ":0");
						return;
					}					
					var isGroupRow = tr.id.indexOf("~GTR~") != -1;		
					if(document.all(gridName + "FocusedRow").value != tr.id || gridObj.multiSelection && (event.ctrlKey || gridObj.GetSelectedCount() != 1)){
						if(!gridObj.postBackOnFocusedChanged){
							gridObj.MoveTo(tr, true, !event.ctrlKey && !event.shiftKey, event.shiftKey);
						}
						else{
							fillKeyState(gridName);
							__doPostBack(replaceDblColon(gridName), "MOVETO:RR:" + tr.id + ":0");						
						}
					}	
					else{		
						if(document.all(gridName + "FocusedRow").value == tr.id && (!gridObj.multiSelection || !event.ctrlKey) && !previewClicked){
							if(isGroupRow && gridObj.rowsExpanded != null)
								gridObj.ProcessExpTR(tr);	
							else if(gridObj.postBackOnRowDblClick){
								if(isGroupRow){
									__doPostBack(replaceDblColon(gridName), "EXPAND:RR:" + tr.id + ":0");
								}
								else{
									if(!gridObj.readOnly && gridObj.allowEdit)
										__doPostBack(replaceDblColon(gridName), "STARTEDIT:RR:" + tr.id + ":" + td.id);
								}
							}
						}
					}
					
					gridObj.ActiveRowID = GetRowIDFromFullID(tr.id);
				}
			}
			catch(e){
			}	
		}
	}
	return tr.id;
}

function MoveBy(gridName, direction, buttonId){
	CheckPageSizeEdit(gridName);
	var gridObj = __WebGridCollection.Get(gridName);
	if(gridObj != null && document.all(gridName + "State").value != "Edit" && !gridObj.postBackOnFocusedChanged){
		try{
			var newtrId = gridObj.MoveBy(direction, event.ctrlKey, event.shiftKey);
			if(newtrId != "")
				return;
		}
		catch(e){
		}
	}
	fillKeyState(gridName);
	__doPostBack(replaceDblColon(gridName), ((direction) ? "NEXT" : "PREV") + ":BB:0:" + buttonId);
}

function OnBBFirstCl(gridName, buttonId){
	fillKeyState(gridName);
	__doPostBack(replaceDblColon(gridName), "FIRST:BB:0:" + buttonId);
}

function OnBBPrevPageCl(gridName, buttonId){
	fillKeyState(gridName);
	__doPostBack(replaceDblColon(gridName), "PREVPAGE:BB:0:" + buttonId);
}

function OnBBPrevCl(gridName, buttonId){
	MoveBy(gridName, false, buttonId);	
}

function OnBBNextCl(gridName, buttonId){
	MoveBy(gridName, true, buttonId);	
}

function OnBBNextPageCl(gridName, buttonId){	
	fillKeyState(gridName);
	__doPostBack(replaceDblColon(gridName), "NEXTPAGE:BB:0:" + buttonId);
}

function OnBBLastCl(gridName, buttonId){
	fillKeyState(gridName);
	__doPostBack(replaceDblColon(gridName), "LAST:BB:0:" + buttonId);
}

function CancelPageSize(gridName){
	try	{		
		var gridObj = __WebGridCollection.Get(gridName);
		if(gridObj != null){
			gridObj.CancelPageSize();		
		}
		document.all(gridName + "State").value = "";
	}
	catch(e){
	}	
}

function ApplyPageSize(gridName, buttonId){
	var reg = /^[0-9]+$/;
	if(!reg.test(document.all(gridName + "PageSizeEdit" + buttonId).value))
		alert("The size of page must be an integer number");
	else
		__doPostBack(replaceDblColon(gridName), "CHANGEPAGESIZE:BB:" + document.all(gridName + "PageSizeEdit" + buttonId).value + ":" + buttonId);
}

function CheckPageSizeEdit(gridName){
	if(document.all(gridName + "State").value == "ChangingPageSize")
		CancelPageSize(gridName);
}

function OnBBChPSCl(gridName, buttonId){
	try	{	
		var gridObj = __WebGridCollection.Get(gridName);
		if(gridObj != null){			
			if(document.all(gridName + "State").value == "ChangingPageSize" && gridObj.pageSizeButtonId == buttonId){
				ApplyPageSize(gridName, buttonId);
			}
			else{			
				CheckPageSizeEdit(gridName);			
				gridObj.EditPageSize(event.srcElement, buttonId);
				document.all(gridName + "State").value = "ChangingPageSize";
			}
		}
	}
	catch(e){
	}
}

function OnEChPgSzKPrs(gridName, buttonId){
	if(event.keyCode == 27)
		CancelPageSize(gridName);
	if(event.keyCode == 13){
		ApplyPageSize(gridName, buttonId);	
		return false;
	}
	return true;
}

function OnBBInsCl(gridName, buttonId){		
	var gridObj = __WebGridCollection.Get(gridName);
	if(gridObj != null && !gridObj.readOnly && gridObj.allowInsert)
		__doPostBack(replaceDblColon(gridName), "INSERT:BB:-1:" + buttonId);
}

function OnBBAppCl(gridName, buttonId){		
	var gridObj = __WebGridCollection.Get(gridName);
	if(gridObj != null && !gridObj.readOnly && gridObj.allowInsert)
		__doPostBack(replaceDblColon(gridName), "APPEND:BB:-1:" + buttonId);
}

function OnBBEditCl(gridName, buttonId){		
	var gridObj = __WebGridCollection.Get(gridName);		
	if(gridObj != null && !gridObj.readOnly && gridObj.allowEdit)
		__doPostBack(replaceDblColon(gridName), "STARTEDIT:BB:-1:" + buttonId);
}

function OnBBDelCl(gridName, buttonId){
	DoDeleteRow(gridName, "-1", buttonId);	
}

function OnBBRefreshCl(gridName, buttonId){
	__doPostBack(replaceDblColon(gridName), "REFRESH:BB:0:" + buttonId);
}

function OnBBOkCl(gridName, buttonId){
	__doPostBack(replaceDblColon(gridName), "POSTEDIT:BB:0:" + buttonId);
}

function OnBBCancelCl(gridName, buttonId){
	__doPostBack(replaceDblColon(gridName), "CANCELEDIT:BB:0:" + buttonId);
}

function OnEGoToPgKPrs(gridName, buttonId){
	if(event.keyCode == 13){
		OnBBGoToPageCl(gridName, buttonId);
		return false;
	}
	return true;
}

function OnBBGoToPageCl(gridName, buttonId){	
	__doPostBack(replaceDblColon(gridName), "GOTOPAGE:BB:" + document.all(gridName + "GoToPageEdit" + buttonId).value + ":" + buttonId);
}

function OnBBGoToPageIndCl(gridName, pageIndex, buttonId){	
	__doPostBack(replaceDblColon(gridName), "GOTOPAGE:PI:" + pageIndex + ":" + buttonId);
}

function OnBBSelPgCh(select, gridName, buttonId){
	__doPostBack(replaceDblColon(gridName), "GOTOPAGE:BB:" + select.value + ":" + buttonId);
}

function OnBBSrchCl(gridName, buttonId){
	var edit = document.all(gridName + "SearchEdit" + buttonId)
	if(edit != null){
		if(edit.value != "")
			__doPostBack(replaceDblColon(gridName), "SEARCH:BB:" + document.all(gridName + "SearchSelect" + buttonId).value + ":" + edit.value);
		else
			edit.focus();
	}	
}

function OnBBCustom(gridName, buttonId){	
	__doPostBack(replaceDblColon(gridName), "CUSTOM:BB:0:" + buttonId);
}

function OnESrchKPrs(gridName, buttonId){
	if(event.keyCode == 13){
		__doPostBack(replaceDblColon(gridName), "SEARCH:BB:" + document.all(gridName + "SearchSelect" + buttonId).value + ":" + document.all(gridName + "SearchEdit" + buttonId).value);
		return false;
	}
	return true;
}

function OnSBCl(gridName, columnIndex){
	var edit = document.all(gridName + "SearchEdit" + columnIndex);
	if(edit != null){
		if(edit.value != "")
			__doPostBack(replaceDblColon(gridName), "SEARCH:SB:" + columnIndex + ":" + edit.value);
		else
			edit.focus();
	}
}

function OnSBEKPrs(gridName, columnIndex){
	if(event.keyCode == 13){
		__doPostBack(replaceDblColon(gridName), "SEARCH:SB:" + columnIndex + ":" + document.all(gridName + "SearchEdit" + columnIndex).value);
		return false;
	}
	return true;
}

function OnScroll(gridName){	
	var scrollLeftInput = document.all(gridName + "ScrollLeft");
	if(scrollLeftInput != null)
		scrollLeftInput.value = document.all(gridName + "scroller").scrollLeft;
	var scrollTopInput = document.all(gridName + "ScrollTop");
	if(scrollTopInput != null)
		scrollTopInput.value = document.all(gridName + "scroller").scrollTop;
}

function endHotTrackBtn(){
	if(hotTrackElement != null){
		hotTrackElement.style.backgroundColor = hotTrackSavedBackColor;
		hotTrackElement.style.borderColor = hotTrackSavedBorderColor;
		clearHotTrackState();		
	}
}

function endHotTrack(){
	if(hotTrackHeader != null)
		endHotTrackHdr();
	else
		endHotTrackBtn();
}

function startHotTrackBtn(element, flatStyle, color1, color2){	
	if(hotTrackElement != null && hotTrackElement != element)
		endHotTrack();
	if(hotTrackElement == null){
		hotTrackElement = element;
		hotTrackSavedBackColor = hotTrackElement.style.backgroundColor;
		hotTrackSavedBorderColor = hotTrackElement.style.borderColor;
		if(flatStyle){			
			hotTrackElement.style.backgroundColor = color1;
			hotTrackElement.style.borderColor = color2;
		}
		else{		
			hotTrackElement.style.borderLeftColor = color1;
			hotTrackElement.style.borderTopColor = color1;
			hotTrackElement.style.borderRightColor = color2;
			hotTrackElement.style.borderBottomColor = color2;
		}
	}
}


function OnBMMove(flatStyle, color1, color2){
	var button = event.srcElement;
	while(button != null && button.tagName != "TD"){
		button = button.parentElement;
	}
	startHotTrackBtn(button, flatStyle, color1, color2);
}

function OnBMOut(){
	endHotTrack();
}

var savedDocumentMouseMoveAssigned;
if(!savedDocumentMouseMoveAssigned){
	savedDocumentMouseMoveAssigned = true;
	savedDocumentMouseMove = document.onmousemove;
	document.onmousemove = OnMMove;
}
else{
	if(__WebGridCollection != null)
		__WebGridCollection.Clear();
}
clearDragState();
clearResizingCursor();
clearColumnSizingState();
clearHotTrackState();
