var grids = [], gridHeadState, gridCursor = "", mouseEvent = false;
var gridCtxBtn, gridPopupObj, gridScrollX = [], gridScrollY = [];
var gridRangeOpt = [], gridRange1 = [], gridRange2 = [], gridTimer = [];
function gridDomObj(prefix, idArray, level){
	if(level === 2){
		return getObj(prefix + "_" + idArray[1] + "_" + idArray[2]);
	} else {
		return getObj(prefix + "_" + idArray[1]);
	}
}
function gridObj(gid){
	return grids[gid];
}
function gridLoad(url, gid, parms_nm, parms_val){
	var grid = {}, args, i, val;
	grid.url = url;
	grid.parms = [];
	args = 'i_xml=<grid><settings gid="'+ gid + '" action="0" /><header /></grid>';
	var nameArr = parms_nm.split("|");
	var valArr = parms_val.split("|");

	for (i = 0; i < nameArr.length; i++){
		if(nameArr[i] !== ""){
			val = "";
			if(valArr[i]){
				val = valArr[i].replace("CS\/CS", "|");
			}

			grid.parms[nameArr[i]] = val;
			args += "&" + nameArr[i] + "=" + val;
		}
	}

	gridScrollX[gid] = 0;
	gridScrollY[gid] = 0;
	//window.open(grid.url + "?" + args);
	grid.status = 0;
	grids[gid] = grid;
	ajaxReqPost(grid.url, args, gridLoadCB, grid);
}
function gridSetParmVal(gid, name, value){
	var grid = gridObj(gid);
	grid.parms[name] = value;
}
function gridUpdate(gid, arg){
	gridButtonProc(gid, 1, 1);
}
function gridRefresh(gid) {
    var i;
	var param_name, value;
	
    // Loop through and set any grid parameters
	for (i = 1; i < arguments.length; i+=2) {
	    // Make sure we have a pair of arguments
	    if (i > (arguments.length - 2)) break;
	    param_name = arguments[i];
		value = arguments[i + 1];
		if (param_name != "") gridSetParmVal(gid, param_name, value);
    }
    gridUpdate(gid, "refresh");
}
function gridPagingCheck(gid, action, scroll){
	var grid = gridObj(gid);
	var results = isNaN(grid.results)?0:grid.results;	
	
	switch (action){
		case 1:
			if(grid.rowidx == 1){ 
				if(grid.pagingalert == "T"){ alert("Already on first page of results"); }
				return;
			}
		break;
		case 2:
			if(grid.rowidx == 1){ 
				if(grid.pagingalert == "T"){ alert("Already on first page of results"); }
				return;
			}
		break;
		case 3:
			if(grid.rowidx > ((results - grid.rpp) + 1)){ 
				if(grid.pagingalert == "T"){ alert("Already on last page of results"); }
				return;
			}
		break;
		case 4:
			if(grid.rowidx > ((results - grid.rpp) + 1)){ 
				if(grid.pagingalert == "T"){ alert("Already on last page of results"); }
				return;
			}
		break; 
	}
			
	gridButtonProc(gid, action, scroll);
}
function gridButtonProc(gid, action, scroll, event){
	var grid = gridObj(gid), obj;
	if(event){
		obj = event.target || event.srcElement;
		grid.settings.setAttribute("rpp", (obj.selectedIndex + 1) * grid.rppi);
	}
	grid.settings.setAttribute("action", action);

	switch(scroll){
		case 1:
			gridScrollY[gid] = 0;
			gridScrollX[gid] = 0;
		break;
		case 2:
			gridScrollX[gid] = grid.body.scrollLeft;
			gridScrollY[gid] = 0;
		break;
		case 3:
			gridScrollX[gid] = 0;
			gridScrollY[gid] = grid.body.scrollTop;
		break;
		case 4:
			gridScrollX[gid] = grid.body.scrollLeft;
			gridScrollY[gid] = grid.body.scrollTop;
		break;
	}

	gridActionLoad(grid);
}
function gridActionLoad(grid){
	var xml, i, div, args, xhtml, url, gid = grid.gid, parms = [], hidden = "", pos = findPos(grid.div);
	var action = grid.settings.getAttribute("action");
	xml = "<grid>" + xmlSerialize(grid.xml.getElementsByTagName("settings")[0]);
	xml += xmlSerialize(grid.xml.getElementsByTagName("header")[0]) + "</grid>";
	args = "i_xml=" + xml;

	if(gridTimer[grid.gid]){ clearTimeout(gridTimer[grid.gid]); }

	for (i in grid.parms){
		if(i !== "indexOf"){
			parms[i] = grid.parms[i];
			args += "&" + i + "=" + grid.parms[i];
			hidden += '<input type="hidden" name="' + i +'" value="' + grid.parms[i] + '">';
		}
	}

	url = grid.url;

	if(action == 9){
		ajaxReqPost(grid.url, args, gridLoadCBnull);
	} else if (action == 5 || action == 6){
		div = getObj("interVeil");
		xhtml = '<form name="gridForm" action="' + url +'" method="POST" target="_blank">';
		xhtml += '<textarea name="i_xml">'+ xml +'</textarea>';
		xhtml += hidden + "</form>";
		div.innerHTML += xhtml;
		document.gridForm.submit();
		div.innerHTML = "&nbsp;";
	} else {
		grid.div.style.opacity = ".6";
			
		delete grids[gid];
		grid = {};
		grid.url = url;
		grid.parms = parms;
		grid.status = 0;
		grids[gid] = grid;
	    ajaxReqPost(grid.url, args, gridLoadCB, grid);
 	}
}
function gridLoadCBnull(ajaxResp){
	return;
}
function gridLoadCB(ajaxResp, grid){
	grid.xml = ajaxResp[0];
	grid.status = 1;
	var xmlparms;
	try{
		grid.settings = grid.xml.getElementsByTagName("settings")[0];
		grid.header = grid.xml.getElementsByTagName("header")[0];
		grid.data = grid.xml.getElementsByTagName("data")[0];
		grid.gid = grid.settings.getAttribute("gid");
		gridSetVars(grid);
		grids[grid.gid] = grid;
		
		xmlparms = grid.xml.getElementsByTagName("parm");
		for (i = 0; i < xmlparms.length; i++){
			gridSetParmVal(grid.gid, xmlparms[i].getAttribute("name"), xmlparms[i].getAttribute("val"));
		}
		
		gridRender(grid.gid);
	}
	catch(e){
		//alert(ajaxResp[1]);
		alert(e.number +" "+ e.name +" "+ e.description);
	}
	finally{ return; }
}
function gridSetVars(grid){
	grid.width = parseInt(grid.settings.getAttribute("width"), 10);
	grid.height = parseInt(grid.settings.getAttribute("height"), 10);
	grid.sortcol = grid.settings.getAttribute("sortcol");
	grid.sortdir = grid.settings.getAttribute("sortdir");
	grid.showtoolbar = grid.settings.getAttribute("showtoolbar");
	grid.results = parseInt(grid.settings.getAttribute("results"), 10);
	grid.rowidx = parseInt(grid.settings.getAttribute("rowidx"), 10);
	grid.rpp = parseInt(grid.settings.getAttribute("rpp"), 10);
	grid.rppm = parseInt(grid.settings.getAttribute("rppm"), 10);
	grid.rppi = parseInt(grid.settings.getAttribute("rppi"), 10);
	grid.ar = parseInt(grid.settings.getAttribute("ar"), 10);
	grid.pc = grid.settings.getAttribute("pc");
	grid.nullmsg = grid.settings.getAttribute("nullmsg");
	grid.div = getObj("grid_" + grid.gid);
	grid.pagingalert = grid.settings.getAttribute("pagingalert");
}
function gridSyncScroll(gid){
	var grid = gridObj(gid);
	var lw1 = grid.body.offsetWidth;
	var lw2 = lw1 - grid.body.clientWidth;
	var lw3 = lw2 + lw1;
	grid.ghsp.style.width = lw3 + "px";
	grid.head.scrollLeft = grid.body.scrollLeft;

	gridScrollX[gid] = grid.body.scrollLeft;
	gridScrollY[gid] = grid.body.scrollTop;
}
function disableSelection(cursor){
	if (document.all){
		document.onselectstart = function () { return false; };
	} else {
		document.onmousedown = function () { return false; };
	}
}
function enableSelection(){
	if (document.all){
		document.onselectstart = "";
	} else {
		document.onmousedown = "";
	}
}
function gridHeadMouseOver(gid, event){
	if(mouseEvent){ return; }
	if(!event){ event = window.event;}
	var grid = gridObj(gid);
	var el = event.target || event.srcElement;

	if(el.tagName === "IMG"){
		grid.eventObj = getFirstParentOfType(el, "TD");
		grid.head.style.cursor = "default";
		return;
	}
	grid.eventObj = el.tagName !== "TD" ? getFirstParentOfType(el, "TD") : el;
	var evPos = event.offsetX||parseInt(event.layerX, 10);

	if(grid.eventObj.tagName === "TD"){
		if((grid.eventObj.offsetWidth - evPos) < 8){
		 	grid.head.style.cursor = "e-resize";
			gridHeadState = 2;
		} else if(evPos < 5 || isNaN(evPos)){
			grid.head.style.cursor = "e-resize";
			grid.eventObj = grid.eventObj.previousSibling;
			gridHeadState = 2;
		} else {
		 	grid.head.style.cursor = "default";
			gridHeadState = 1;
		}
	} else {
		grid.head.style.cursor = "default";
		gridHeadState = 1;
	}
}
function rightClick(event){
	var mouseButton;
	if (event.which){
		mouseButton = (event.which == 3);
	}else if (event.button){
		mouseButton = (event.button == 2);
	}
	return mouseButton;
}
function GridContextMouseOver(event, action){
	if(!event){ event = window.event;}
	var el = event.target || event.srcElement;
	if(el.id){ return; }
	if(gridCtxBtn){ gridCtxBtn.className = "gridCtxBtn0"; }
	if(action == 1){
		el.className = "gridCtxBtn1";
		gridCtxBtn = el;
	}
}
function gridPopClose(gid){
	if(gid){
		gridObj(gid).popup2.style.display = "none";
	}
	if(!gridPopupObj){return;}
	gridPopupObj.style.display = "none";
	gridPopupObj.innerHTML = "&nbsp;";
}
function gridMouseEvent(event){
	if(!event){ event = window.event;}
	var el = event.target || event.srcElement;

	while(el.id != "gridCtx1"&& el.tagName != "BODY"){
		el = el.parentNode;
	}

	if(el.tagName == "BODY"){
		gridPopClose();
		eventListenerStop("mousedown", gridMouseEvent, true);
		eventStopPropagation(event);
	}
}
function gridColHideShow(gid, id){
	gridPopClose();
	var grid = gridObj(gid);
	grid.header.getElementsByTagName("col")[id].setAttribute("show", grid.header.getElementsByTagName("col")[id].getAttribute("show") == "T" ? "F" : "T");
	grid.settings.setAttribute("action", 9);
	gridActionLoad(grid);
	gridRender(grid.gid);
}
function gridHeadMouseUp(gid, event){
	if(mouseEvent){ return; }
	if(!event){ event = window.event;}
	var el = event.target || event.srcElement;
	var grid = gridObj(gid), idArray = [], div, gridCtx, nodes, width, i;

	if(gridHeadState === 2){ return; }

	if(rightClick(event)){
		grid.popup1.innerHTML = "&nbsp;";
		grid.popup1.style.width = null;
		grid.popup1.style.display = "";
		//grid.popup1.style.top = event.clientY + "px";
		//grid.popup1.style.top = el.getBoundingClientRect().bottom + 2 + "px";
		grid.popup1.style.top = findPos(el)[1] + "px";
		grid.popup1.style.left = el.getBoundingClientRect().left +  15 + "px";
		//grid.popup1.style.left = event.clientX + "px";
		idArray = grid.eventObj.id.split("_");
		div = '<div id="gridCtx1" onmouseover="GridContextMouseOver(event, 1)" onmouseout="GridContextMouseOver(event, 0)" oncontextmenu="return false;">';
		div += '<div class="gridCtxBtn0" style="background-image:url('+ csimg +'gridCtxSortA.gif);" onclick="gridSort('+ grid.gid +','+ idArray[2] +',1);">Sort Ascending</div>';
		div += '<div class="gridCtxBtn0" style="background-image:url('+ csimg +'gridCtxSortD.gif);" onclick="gridSort('+ grid.gid +','+ idArray[2] +',2);">Sort Descending</div>';
		div += '<div id="gridCtx2"><div id="gridCtx3">&nbsp;</div></div>';
		if(grid.header.getElementsByTagName("col")[idArray[2]].getAttribute("lock") == "F"){
			div += '<div class="gridCtxBtn0" style="background-image:url('+ csimg +'delete.gif);" onclick="gridColHideShow('+ grid.gid +','+ idArray[2] +');">Remove This Column</div>';
		}
		div += '<div class="gridCtxBtn0" style="background-image:url('+ csimg +'columnChoose.gif);" onclick="gridColChoose('+ grid.gid +',event,1);">Column Chooser</div>';
		div += '</div>';
		grid.popup1.innerHTML = div;
		gridPopupObj = grid.popup1;

		gridCtx = getObj("gridCtx1");
		nodes = gridCtx.childNodes;
		width = gridCtx.offsetWidth;

		for (i = 0; i < nodes.length; i++){
			if(!nodes[i].id){ nodes[i].style.width = width + 5 + "px"; } else { nodes[i].style.width = width - 28 + "px"; }
		}
		eventListenerStart("mousedown", gridMouseEvent, true);
		gridCtx = null;
		return;
	}
}
function gridSort(gid, cid, dir){
	gridPopClose();
	var grid = gridObj(gid);
	if(grid.header.getElementsByTagName("col")[cid].getAttribute("sort") == "F"){ return; }
	var sortDir = "a";
	if(dir){
		sortDir = dir == 1 ? "a" : "d";
	} else {
		if(grid.settings.getAttribute("sortcol") == cid){
			sortDir = grid.settings.getAttribute("sortdir") == "a" ? "d" : "a";
		}
	}
	grid.settings.setAttribute("sortdir", sortDir);
	grid.settings.setAttribute("sortcol", cid);
	gridSetVars(grid);
	gridButtonProc(gid, "S", 2);
}
function gridHeadMouseDown(gid, event){
	if(!event){ event = window.event;}
	if(rightClick(event)){ return; }
	var grid = gridObj(gid);
	gridPopClose();

	switch (gridHeadState){
		case 1:
			gridColMouseDown(grid, event);
		break;
		case 2:
			gridColResize(grid, event);
		break;
	}
}
function gridColMouseDown(grid, event){
	if(!event){ event = window.event;}
	if(!grid.eventObj){return;}
	gridPopClose();
	mouseEvent = true;
	disableSelection();
	grid.eventObj.style.background  = "url("+ csimg +"grid-head-bk0.gif) repeat-x";
	if(gridTimer[grid.gid]){ clearTimeout(gridTimer[grid.gid]); }

	var startX = event.clientX;
	var startY = event.clientY;
	var idArray = grid.eventObj.id.split("_");
	var deltaX, deltaY, newColW, changed, popX, popY, nodes,targX = [], targY = [], moveTol;
	var pos = [], objArr = [], posArr = [], targetCol, idx = 0, div = "";

	function mouseMove(event){
		if(!event){ event = window.event;}
		var el = event.target || event.srcElement;
		deltaX = (event.clientX - startX);
		deltaY = (event.clientY - startY);

		if(!moveTol){
			if(Math.abs(deltaX) > 2 || Math.abs(deltaY) > 2){
				moveTol = true;
			} else {
				return;
			}
		}

		if(!changed){
			popX = event.clientX - parseInt(grid.eventObj.offsetWidth / 2, 10);
			popY = event.clientY - 22;
			grid.popup1.style.display = "";
			grid.popup1.style.top = popY + "px";
			grid.popup1.style.left = popX + "px";
			div = '<div style="width:'+ grid.eventObj.offsetWidth + 'px;';
			div += 'height:23px;line-height:23px;';
			div += 'background-color:black;color:white;z-index:3;';
			div += 'border-bottom:1px solid #9a6c30;border-right:1px solid #653900">';
			grid.popup1.innerHTML = div + grid.eventObj.innerHTML + '</div>';

			nodes = grid.headTbody.childNodes[0].childNodes;

			for (i = 0; i < nodes.length; i++){
				if(nodes[i].id){
					pos = findPos(nodes[i]);
					posArr[idx] = pos[0] + parseInt(nodes[i].offsetWidth / 2, 10);
					objArr[idx] = nodes[i];
					targX[idx] = pos[0] - 3;
					targY[idx] = pos[1] - 10;
					idx++;
				}
			}
		} else {
			grid.popup1.style.top = popY + deltaY + "px";
			grid.popup1.style.left = popX + deltaX + "px";
		}

		changed = true;

		for (i = 0; i < posArr.length; i++){
			if(event.clientX <= posArr[i]){
				targetCol = objArr[i];
				grid.colIndicator.style.top = targY[i] + "px";
				grid.colIndicator.style.left = targX[i] + "px";
				grid.colIndicator.style.display = "";
				i = posArr.length + 1;
			}
		}

		if(grid.eventObj == targetCol || grid.eventObj.nextSibling == targetCol){
			targetCol = "";
			grid.colIndicator.style.display = "none";
		}

		eventStopPropagation(event);
	}

	function mouseUp(event){
		if(!event){ event = window.event;}
		eventListenerStop("mousemove", mouseMove, true);
		eventListenerStop("mouseup", mouseUp, true);
		eventStopPropagation(event);

		grid.eventObj.style.background  = "";
		grid.colIndicator.style.display = "none";
		grid.popup1.style.display = "none";
		mouseEvent = false;
		enableSelection();

		if(!changed){
			gridSort(idArray[1], idArray[2]);
			return;
		} else {
			gridColOrder(grid, grid.eventObj, targetCol);
		}
	}

	eventListenerStart("mousemove", mouseMove, true);
	eventListenerStart("mouseup", mouseUp, true);
	eventStopPropagation(event);
	eventDefault(event);
}
function gridColOrder(grid, moveCol, targetCol){
	if(!targetCol){ gridSetTimer(grid); return; }

	var currSortArray = [];
	var newSortArray = [];
	idx = 0;
	var id1 = moveCol.id.split("_")[2];
	var id2 = targetCol.id.split("_")[2];

	var cols = grid.header.getElementsByTagName("col");

	for (i = 0; i < cols.length; i++){
		currSortArray[cols[i].getAttribute("order")] = cols[i].getAttribute("id");
	}

	for (i = 0; i < currSortArray.length; i++ ){
		if(id1 != currSortArray[i]){
			if(id2 == currSortArray[i]){
				newSortArray[idx] = id1;
				idx++;
			}
			newSortArray[idx] = currSortArray[i];
			idx++;
		}
	}

	for (i = 0; i < newSortArray.length; i++){
		cols[newSortArray[i]].setAttribute("order", i);
	}

	grid.settings.setAttribute("action", 9);
	gridActionLoad(grid);
	gridRender(grid.gid);
}
function gridColResize(grid, event){
	if(!event){ event = window.event;}
	if(!grid.eventObj){return;}
	mouseEvent = true;
	disableSelection();
	gridCursor = "e-resize";
	grid.div.style.cursor = gridCursor;
	if(gridTimer[grid.gid]){ clearTimeout(gridTimer[grid.gid]); }

	var startX = event.clientX;
	var colHTD = grid.eventObj;
	var idArray = colHTD.id.split("_");
	var colHTH = gridDomObj("ghth", idArray, 2);
	var colBTH = gridDomObj("gbth", idArray, 2);
	var colWidth = removeNonNum(colHTH.style.width);
	var htWidth = removeNonNum(grid.headTable.style.width);
	var btWidth = removeNonNum(grid.bodyTable.style.width);
	var deltaPX, newColW, changed;

	function mouseMove(event){
		if(!event){ event = window.event;}
		changed = true;
		eventStopPropagation(event);

		deltaPX = (event.clientX - startX);
		newColW = colWidth + deltaPX;

		if(newColW <= 10){newColW = 10;}

		colHTH.style.width = newColW + "px";
		colBTH.style.width = newColW + "px";

		grid.headTable.style.width = htWidth + (newColW - colWidth) + "px";
		grid.bodyTable.style.width = btWidth + (newColW - colWidth) + "px";
		gridSyncScroll(grid.gid);
	}

	function mouseUp(event){
		if(!event){ event = window.event;}
		eventListenerStop("mousemove", mouseMove, true);
		eventListenerStop("mouseup", mouseUp, true);
		eventStopPropagation(event);

		mouseEvent = false;
		enableSelection();
		gridCursor = "default";
		grid.div.style.cursor = gridCursor;

		if(!changed){ return; }
		grid.header.getElementsByTagName("col")[idArray[2]].setAttribute("width", newColW);
		grid.settings.setAttribute("action", 9);
		gridActionLoad(grid);
		gridRender(grid.gid);
	}

	eventListenerStart("mousemove", mouseMove, true);
	eventListenerStart("mouseup", mouseUp, true);
	eventStopPropagation(event);
	eventDefault(event);
}
function gridTBM(event, action){
	if(!event){ event = window.event;}
	var obj = event.target || event.srcElement;
	obj.className = "gridTB" + action;
}
function gridColChoose(gid, event, loc){
	if(!event){ event = window.event;}
	var grid = gridObj(gid), div, id, chk, dis, yOffset, top;
	var cols = grid.header.getElementsByTagName("col");

	gridPopClose(gid);

	switch (loc){
		case 1:
			yOffset = 75;
		break;
		case 2:
			yOffset = 370;
		break;
	}
	top = (event.clientY <= yOffset) ? 5 : event.clientY - yOffset;
	grid.popup2.style.top = top + "px";
	grid.popup2.style.left = (event.clientX - 50) + "px";
	if (grid.popup2.style.display !== ""){
		grid.popup2.style.display = "";
		div = '<div style="background-color:#575757;border:1px solid #cdcdcd;padding:5px;width:200px;">';
		div += '<div style="color:white;margin-bottom:5px;">Column Chooser</div>';
		div += '<div style="border:1px solid #b6b6b6;background-color:#f6f6f6;padding:2px;">';
		div += '<div style="height:275px;overflow:auto;">';
		for (i = 0; i < cols.length; i++){
			id = "cc_" + gid + "_" + i;
			chk = ' checked="checked"';
			dis = ' disabled="disabled"';
			if(cols[i].getAttribute("show") == "F"){ chk = ""; }
			if(cols[i].getAttribute("lock") == "F"){ dis = ""; }

			div += '<div><input type="checkbox"'+ chk + dis +' id="'+ id +'">';
			div += '<label for="'+ id +'">'+ cols[i].firstChild.nodeValue +'</label></div>';
		}

		div += '</div>';
		div += '<div style="margin-top:5px"><button onclick="gridColChooseProc('+ gid +','+ i +')">Apply</button>';
		div += '<button onclick="gridPopClose('+ gid +')">Cancel</button></div>';
		div += '</div>';
		grid.popup2.innerHTML = div;
	}
}
function gridColChooseProc(gid, cnt){
	var grid = gridObj(gid), obj;
	var cols = grid.header.getElementsByTagName("col");

	for (i = 0; i < cols.length; i++){
		obj = "cc_" + gid + "_" + i;
		cols[i].setAttribute("show", getObj(obj).checked ? "T" : "F");
	}

	gridPopClose(gid);
	grid.settings.setAttribute("action", 9);
	gridActionLoad(grid);
	gridRender(grid.gid);
}
function gridRange(gid, event, action){
	if(!event){ event = window.event;}
	var grid = gridObj(gid), div, id, chk, dis, yOffset;
	var name = "grngopt" + gid, label, label2, label3;
		if(action == 5){
		label = "CSV Export";
		label2 = "Export";
		label3 = "export";
	} else {
		label = "Print";
		label2 = "Print";
		label3 = "print";
	}
	
	if(isNaN(grid.results)){ alert("There are no results to " + label3 + "."); return;}
	
	var cols = grid.header.getElementsByTagName("col");
	
	grid.settings.setAttribute("action", action);

	gridPopClose(gid);
	grid.popup2.style.top = (event.clientY - 190) + "px";
	grid.popup2.style.left = (event.clientX - 50) + "px";
	if (grid.popup2.style.display !== ""){
		grid.popup2.style.display = "";
		div = '<div style="background-color:#575757;border:1px solid #cdcdcd;padding:5px;width:220px;">';
		div += '<div style="color:white;margin-bottom:5px;">'+ label +' Options</div>';
		div += '<div style="border:1px solid #b6b6b6;background-color:#f6f6f6;padding:2px;">';
		div += '<div><fieldset style="margin:5px;"><legend>'+ label2 +' Range</legend>';
		div += '<input type="radio" id="' + name +'_1" name="' + name +'" checked="checked" />';
		div += '<label for="' + name +'_1">All</label><br />';
		div += '<input type="radio" id="' + name +'_2" name="' + name +'" />';
		div += '<label for="' + name +'_2">Current Rows</label><br />';
		div += '<input type="radio" id="' + name +'_3" name="' + name +'" />';
		div += '<label for="' + name +'_3">Rows: </label>';
		div += '<input type="text" size="5" id="' + name +'_a" onclick="gridRangeSet('+ gid +');" /> - ';
		div += '<input type="text" size="5" id="' + name +'_b" onclick="gridRangeSet('+ gid +');" />';
		div += '</fieldset></div>';
		div += '<div style="margin-top:5px"><button onclick="gridRangeProc('+ gid +')">Apply</button>';
		div += '<button onclick="gridPopClose('+ gid +')">Cancel</button></div>';
		div += '</div>';
		grid.popup2.innerHTML = div;
	}
}
function gridRangeSet(gid){
	getObj("grngopt" + gid + "_3").checked = true;
}
function gridRangeProc(gid){
	var grid = gridObj(gid), obj;
	var name = "grngopt" + gid;
	var range1, range2;
	var currRowidx = grid.settings.getAttribute("rowidx");
	var currResults = grid.settings.getAttribute("results");

	if(getObj(name + "_1").checked){
		grid.settings.setAttribute("rowidx", 1);
		grid.settings.setAttribute("results", grid.results);
	} else if(getObj(name + "_2").checked){
		grid.settings.setAttribute("rowidx", grid.rowidx);
		grid.settings.setAttribute("results", grid.rowidx + grid.rpp - 1);
	} else if(getObj(name + "_3").checked){
		grid.settings.setAttribute("rangeopt", 3);

		range1 = removeNonNum(getObj(name + "_a").value);
		range2 = removeNonNum(getObj(name + "_b").value);

		if(isNaN(range1) || isNaN(range2) || range1 < 1 || range1 > range2 || range2 > grid.results){
			alert("Invalid row range!");
			return;
		}

		grid.settings.setAttribute("rowidx", range1);
		grid.settings.setAttribute("results", range2);
	}

	gridPopClose(gid);
	gridActionLoad(grid);
	grid.settings.setAttribute("rowidx", currRowidx);
	grid.settings.setAttribute("results", currResults);
}
function gridResize(gid, event){
	if(!event){ event = window.event;}
	var grid = gridObj(gid), deltaX, deltaY;
	var startX = event.clientX;
	var startY = event.clientY;
	var startW = grid.div.offsetWidth;
	var startH = grid.div.offsetHeight;
	var newW = startW;
	var newH = startH;
	var pos = findPos(grid.div);

	mouseEvent = true;
	disableSelection();
	if(gridTimer[grid.gid]){ clearTimeout(gridTimer[grid.gid]); }
	
	grid.div.style.opacity = ".6";
	grid.div.style.width = startW + "px";
	grid.div.style.height = startH + "px";
	grid.div.innerHTML = "&nbsp;";

	function mouseMove(event){
		if(!event){ event = window.event;}
		eventStopPropagation(event);
		deltaX = (event.clientX - startX);
		deltaY = (event.clientY - startY);

		if((startW + deltaX) > 525){
			grid.div.style.width = (startW + deltaX)+ "px";
			newW = deltaX;
		}

		if((startH + deltaY) > 150){
			grid.div.style.height = (startH + deltaY) + "px";
			newH = deltaY;
		}
	}

	function mouseUp(event){
		if(!event){ event = window.event;}
		eventListenerStop("mousemove", mouseMove, true);
		eventListenerStop("mouseup", mouseUp, true);
		eventStopPropagation(event);

		mouseEvent = false;
		enableSelection();
		grid.settings.setAttribute("height", (grid.height + newH));
		grid.settings.setAttribute("width", (grid.width + newW));
		gridSetVars(grid);
		grid.div.style.width = grid.width + "px";
		delete grid.head;
		grid.settings.setAttribute("action", 9);
		gridActionLoad(grid);
		gridRender(grid.gid);
	}

	eventListenerStart("mousemove", mouseMove, true);
	eventListenerStart("mouseup", mouseUp, true);
	eventStopPropagation(event);
	eventDefault(event);
}
function gridRender(gid){

	var grid = gridObj(gid);
	var ghth, ghtd, gbtd, suffix, imgChar, width=0, colSort=[], sortCol=[], colShow=[], colStyle=[];
	var headTH=[], headTD=[], bodyTH=[], bodyTD=[], cells, colCnt=0;
	var headSrc=[], bodySrc=[], footSrc=[], headDiv, bodyDiv, footDiv;
	var cols = grid.header.getElementsByTagName("col");
	var rows = grid.data.getElementsByTagName("row");


	grid.div.style.opacity = "1";

	for (i = 0; i < cols.length; i++){
		imgChar = grid.sortcol == i ? grid.sortdir.toUpperCase() : "N";
		suffix = gid + "_" + cols[i].getAttribute("id");
		ghth = '<th id="ghth_' + suffix + '" style="width:' + cols[i].getAttribute("width") + 'px;">&nbsp;</th>';
		ghtd = '<td id="ghtd_' + suffix + '"><div class="ghtxt">' + cols[i].firstChild.nodeValue;
		ghtd += '<img id="gsimg_' + suffix + '" src="'+ csimg +'sort' + imgChar + '.gif" class="grid-sort" /></div></td>';
		gbtd = '<th id="gbth_' + suffix + '" style="width:' + cols[i].getAttribute("width") + 'px;">&nbsp;</th>';
		sortCol[cols[i].getAttribute("order")] = i;
		colSort[i] = cols[i].getAttribute("order");
		headTH[colSort[i]] = ghth;
		headTD[colSort[i]] = ghtd;
		bodyTH[colSort[i]] = gbtd;
		colStyle[i] = cols[i].getAttribute("style");

		if(cols[i].getAttribute("show") == "T"){
			width += parseInt(cols[i].getAttribute("width"), 10);
			colShow[colSort[i]] = true;
			colCnt++;
		}
	}
	//Header
	headDiv = '<div id="gridHead_'+ grid.gid +'" class="grid-head" style="width:'+ grid.width +'px">';
	headSrc.push('<table id="gridHeadTable_' + gid + '" style="width:' + width + 'px;" ');
	headSrc.push('onmousemove="gridHeadMouseOver('+ grid.gid +', event);" ');
	headSrc.push('onmouseup="gridHeadMouseUp('+ grid.gid +', event);" ');
	headSrc.push('onmousedown="gridHeadMouseDown('+ grid.gid +', event);" ');
	headSrc.push('oncontextmenu="return false;">');
	headSrc.push('<thead><tr>');

	for (i = 0; i < headTH.length; i++){ if(colShow[i]){ headSrc.push(headTH[i]); }}

	headSrc.push('<th id="ghsp_' + gid + '">&nbsp;</th></tr></thead>');
	headSrc.push('<tbody id="gridHeadTbody_' + gid + '"><tr>');

	for (i = 0; i < headTD.length; i++){ if(colShow[i]){ headSrc.push(headTD[i]); }}

	headSrc.push('<td>&nbsp;</td></tr></tbody>');
	headSrc.push('</table>');

	//Body
	bodyDiv = '<div id="gridBody_'+ grid.gid +'" class="grid-body" onscroll="gridSyncScroll('+ grid.gid +');" style="width:'+ grid.width +'px;height:'+ grid.height +'px;">';
	bodySrc.push('<table id="gridBodyTable_'+ grid.gid +'" style="width:' + width + 'px;">');
	bodySrc.push('<thead><tr>');

	for (i = 0; i < bodyTH.length; i++){ if(colShow[i]){ bodySrc.push(bodyTH[i]); }}

	bodySrc.push('<th id="gbsp_' + gid + '">&nbsp;</th></tr></thead><tbody class="gbtb" id="gridBodyTbody_' + gid + '" onkeydown="gridMouseHighlight(event,' + gid + ');">');

	for (i = 0; i < rows.length; i++){
		cells = rows[i].getElementsByTagName("cell");

		if(rows[i].getAttribute("nosort")){
			for (y = 0; y < cells.length; y++){
				bodyTD[y] = gridCell(cells[y], rows[i], y, colCnt, grid, colStyle[y]);
			}
		} else {
			for (y = 0; y < cells.length; y++){
				bodyTD[colSort[y]] = gridCell(cells[y], rows[i], y, colCnt, grid, colStyle[y]);
			}
		}

		bodySrc.push('<tr onmousedown="gridRowHighlight(this,' + gid + ');">');
		for (y = 0; y < bodyTD.length; y++){ if(colShow[y]){ bodySrc.push(bodyTD[y]); }}
		bodySrc.push("<td>&nbsp;</td></tr>");
		bodyTD=[];
	}

	bodySrc.push('</tbody></table>');
	
	if(rows.length === 0){ bodySrc.push('<div style="padding:5px;">' + grid.nullmsg + '</div>'); }
	
	footDiv = '<div id="gridFoot_'+ gid +'" class="grid-foot">';
	footSrc.push(gridToolbar(grid));
	footSrc.push('<div id="gridPopup1_' + gid + '" class="gridPopup" style="display:none;z-index:2;">&nbsp;</div>');
	footSrc.push('<div id="gridPopup2_' + gid + '" class="gridPopup" style="display:none;z-index:1;">&nbsp;</div>');
	footSrc.push('<div id="gridColIndicator_' + gid + '" class="gridColIndicator" style="display:none;">&nbsp;</div>');

	var gridElem;

	if(grid.head){
		grid.head.innerHTML = headSrc.join("");
		grid.head.style.width = grid.width +"px";
		grid.body.innerHTML = bodySrc.join("");
		grid.body.style.width = grid.width +"px";
		grid.body.style.height = grid.height +"px";
		grid.foot.innerHTML = footSrc.join("");
	} else{
		grid.div.style.width = grid.width + "px";
		grid.div.style.height = "";
		grid.div.innerHTML = headDiv + headSrc.join("") + "</div>" + bodyDiv + bodySrc.join("") + "</div>" + footDiv + footSrc.join("") + "</div>";
	}
	
	grid.head = getObj("gridHead_" + gid);
	grid.headTable = getObj("gridHeadTable_" + gid);
	grid.headTbody = getObj("gridHeadTbody_" + gid);
	grid.ghsp = getObj("ghsp_" + gid);
	grid.body = getObj("gridBody_" + gid);
	grid.bodyTable = getObj("gridBodyTable_" + gid);
	grid.bodyTbody = getObj("gridBodyTbody_" + gid);
	grid.foot = getObj("gridFoot_" + gid);
	grid.gbsp = getObj("gbsp_" + gid);
	grid.popup1 = getObj("gridPopup1_" + gid);
	grid.popup2 = getObj("gridPopup2_" + gid);
	grid.colIndicator = getObj("gridColIndicator_" + gid);
	grid.sortCol = sortCol;
	grid.colSort = colSort;

	grid.body.scrollLeft = gridScrollX[gid];
	grid.body.scrollTop = gridScrollY[gid];
	gridSyncScroll(grid.gid);
	if(grid.currRow){
		gridRowHighlight(grid.currRow, gid);
	}
	gridSetTimer(grid);

	if(grid.pc !== ""){ eval(grid.pc); }
	grid.status = 2;
	return;
}
function gridSetTimer(grid){
	if(grid.ar !== 0){ gridTimer[grid.gid] = setTimeout("gridUpdate(" + grid.gid + ")",grid.ar * 1000); }
}
function gridToolbar(grid){
	if(grid.showtoolbar === "F"){ return ""; }

	var selOpt, val, cnt = grid.rppm / grid.rppi;
	var pagingInfo = "Rows Per Page:&nbsp;";
	pagingInfo += '<select onchange="gridButtonProc('+ grid.gid +',7,4,event)" style="padding:0px; margin-right:10px;vertical-align:middle;font-size:11px;">';
	for (i = 1; i <= cnt; i++){
		val = (grid.rppi * i);
		selOpt = "";
		if(val == grid.rpp){
			selOpt = ' selected="selected"';
		}
		pagingInfo += "<option" + selOpt + ">" + (grid.rppi * i) + "</option>";
	}
	pagingInfo += "</select>";
	if(!isNaN(grid.results)){
		pagingInfo += addCommas(grid.rowidx) + " - ";
		pagingInfo += (grid.rowidx + grid.rpp - 1) < grid.results ? addCommas(grid.rowidx + grid.rpp - 1) : addCommas(grid.results);
		pagingInfo += " of " + addCommas(grid.results);
	}

	var rpp = 'Rows Per Page:&nbsp;<select style="padding:0px;vertical-align:middle;font-size:11px;">';
	for (i = 1; i <= cnt; i++){
		rpp += "<option>" + (grid.rppi * i) + "</option>";
	}
	rpp += "</select>";

	var imgArr = ["grid_page_first","grid_page_prev","grid_page_next","grid_page_last","excel","print","columnChoose","grid_refresh","undo"];
	var sepArr = [0,0,0,1,0,1,0,0,1];
	var hintArr = ["First Page","Previous Page","Next Page","Last Page","CSV Export","Printer Friendly View","Column Chooser","Refresh Grid Data","Reset Grid Layout"];
	var actArr = [];
	actArr[0] = "gridPagingCheck("+ grid.gid +",1,2);";
	actArr[1] = "gridPagingCheck("+ grid.gid +",2,2);";
	actArr[2] = "gridPagingCheck("+ grid.gid +",3,2);";
	actArr[3] = "gridPagingCheck("+ grid.gid +",4,2);";
	actArr[4] = "gridRange("+ grid.gid +",event,5);";
	actArr[5] = "gridRange("+ grid.gid +",event,6);";
	actArr[6] = "gridColChoose("+ grid.gid +",event,2);";
	actArr[7] = "gridButtonProc("+ grid.gid +",1,1);";
	actArr[8] = "gridButtonProc("+ grid.gid +",8,1);";

	var xhtml = '<table style="width:100%"><tr>';

	for (i = 0; i < imgArr.length; i++){
		xhtml += '<td style="background-image:url('+ csimg +'' + imgArr[i] + '.gif)" class="gridTB0" onclick="'+ actArr[i] +'" onmouseover="gridTBM(event, 1)" onmouseout="gridTBM(event, 0)" title="'+ hintArr[i] +'">&nbsp;</td>';
		xhtml += '<td class="gridTBSep' + sepArr[i] + '">&nbsp;</td>';
	}

	xhtml += '<td>' + pagingInfo + '</td>';
	xhtml += '<td onmousedown="gridResize(' + grid.gid + ',event);" style="cursor:nw-resize;width:12px;background:url('+ csimg +'grid-resize.gif) no-repeat 100% 100%; ">&nbsp;</td>';
	xhtml += '</tr></table>';

	return xhtml;
}
function gridCell(cell, row, cellnum, colCnt, grid, colStyle){
	var style="", colspan="";
	var type = cell.getAttribute("type");
	var text = cell.firstChild.nodeValue;

	switch (type){
		case "1":
			text = text;
		break;
		case "2":
			text = '<a href="'+ cell.getAttribute("href") + '">' + text + '</a>';
		break;
	}

	if(cell.getAttribute("colspan")){
		colspan = cell.getAttribute("colspan") == "-1" ? (colCnt - cellnum - 1) : cell.getAttribute("colspan");
		colspan = ' colspan="' + colspan + '"';
	} else {
		style += grid.sortcol == cellnum ? 'background-color:#f2f8ff;' : "";
	}
	style += row.getAttribute("style") ? row.getAttribute("style") : "";
	style += cell.getAttribute("style") ? cell.getAttribute("style") : "";
	style += colStyle;
	style = style === "" ? "" : ' style="' + style + '"';
	return '<td' + colspan + style + '><div class="gbtxt">' + text + '</div></td>';
}
function gridMouseHighlight(event, gid){
	if(!event){ event = window.event;}
	var grid = gridObj(gid), obj;
	if(event.keyCode == 38 || event.keyCode == 40){
		if(!grid.currRow){
			obj = grid.bodyTbody.firstChild;
		} else if(event.keyCode == 38 &&  grid.currRow.previousSibling){
			obj =  grid.currRow.previousSibling;
		} else if(event.keyCode == 40 &&  grid.currRow.nextSibling){
			obj =  grid.currRow.nextSibling;
		} else {
			return;
		}
		gridRowHighlight(obj, gid);
	}
}
function gridRowHighlight(obj, gid){
	var grid = gridObj(gid);
	var nodes, rowColorArray=[], rowBorderArray1=[], rowBorderArray2=[];

	if(grid.currRow){
		if(grid.currRow.previousSibling){
			nodes = grid.currRow.previousSibling.childNodes;

			for (i = 0; i < nodes.length; i++){
				nodes[i].style.borderBottom = grid.rowBorderArray2[i] === "" ? "1px solid #E3EFFF" : grid.rowBorderArray2[i];
			}
		}
		nodes = grid.currRow.childNodes;

		for (i = 0; i < nodes.length; i++){
			nodes[i].style.backgroundColor = grid.rowColorArray[i];
			nodes[i].style.borderBottom = grid.rowBorderArray1[i] === "" ? "1px solid #E3EFFF" : grid.rowBorderArray1[i];
		}
	}

	if(obj.previousSibling){
		nodes = obj.previousSibling.childNodes;

		for (i = 0; i < nodes.length; i++){
			rowBorderArray2[i] = nodes[i].style.borderBottom;
			nodes[i].style.borderBottom = "1px dotted black";
		}
	}

	nodes = obj.childNodes;

	for (i = 0; i < nodes.length; i++){
		rowColorArray[i] = nodes[i].style.backgroundColor;
		rowBorderArray1[i] = nodes[i].style.borderBottom;
		nodes[i].style.backgroundColor = nodes[i].style.backgroundColor == "#f2f8ff" ? "#f2f8ff" : "#b5c4df";
		nodes[i].style.borderBottom = "1px dotted black";
	}

	grid.currRow = obj;
	grid.rowColorArray = rowColorArray;
	grid.rowBorderArray1 = rowBorderArray1;
	grid.rowBorderArray2 = rowBorderArray2;
}
