function fmgetgrid(id) { return window.fmGrids.Find(id); }
function fmRefreshGrid(id) {
	var grid= fmgetgrid(id); if (grid) grid.Refresh(true);
}
function fmFindFirstGridInstance() { 
	return fmgetgrid();
}

function fmHandleFind(gridID) {
var fmFindCriteria= $get(gridID + "_fmFindCriteria");
var fmFieldSelector= $get(gridID + "_fmFieldSelector");
if (fmFindCriteria.value == "") {
	fmFind("", gridID, "");
} else {
	var column= (fmFieldSelector != null) ? fmFieldSelector.value : "";
	fmFind("%" + fmFindCriteria.value, gridID, column);
}
}

function fmChangeView(o, gridID) {
var grid= fmgetgrid(gridID);
if (grid == null) return;
if (o) grid.ChangeView(o.options[o.selectedIndex].value);
fmFilterReset(grid.id);
}

function fmFilterReset(gridID) {
var fmFindCriteria= $get(gridID + "_fmFindCriteria");
if (fmFindCriteria != null) fmFindCriteria.value= "";

//var _JumpBar= $get(gridID + "_JumpBar");
//if (_JumpBar) _JumpBar.Reset();
}

function fmFind(keyword, gridID, column) {
var dg= fmgetgrid(gridID);
if (dg == null) { alert("Grid not found."); return; }
dg.SetParameter("filterValue", keyword);
dg.SetParameter("filterColumn", column);
dg.Select();
}

function fmOpenGridRecord(gridID, tableName, handler, id, ro, w, h, scroll, full) {
var qs= (id != '') ? ("id=" + id) : "";
var refreshCallback= function() { fmRefreshGrid(gridID); }
openRecordByHandler(tableName, handler, qs, w, h, full, refreshCallback, ro);
}

function fmDeny() { window.status= "Access denied."; }

function fmDeleteRecords(gridID) {
var grid= fmgetgrid(gridID);
if (grid == null) return;
if (!window.confirm(FM.Res.Grid__DeleteRecord)) return;
grid.ExecCommand("DELETE");
}

function fmQuickDesignView(gridID, mode) {
var grid= fmgetgrid(gridID);
if (grid == null) return;
var table= grid.tableName;
var view= grid.viewName;
var url= fmCommonPath + "../Explorer/ViewBuilder/Designer.aspx?t=" + table + "&v=" + view + "&gridID=" + gridID + ((mode != null) ? "&mode=" + mode : "");
openStdWin(url, "ViewBuilder", 850, 500);
}

function fmResetGrid(id) {
if (id != "" && id != null) fmgetgrid(id).Reset();
}

/* MENU HANDLERS */
///////////////////
function MenuItem(p1, p2, p3, p4, p5, p6, p7, p8) {
this.Command= p1;
this.Window= p2;
this.Attributes= p3;
this.Value= p4;
this.Width= p5;
this.Height= p6;
this.Scroll= p7;
this.Full= p8;
}

function fmMenuItem_Process(gridID, item) {
if (item == null) { alert("Menu item not defined"); return url; }
var url= "";
switch (item.Command)	{
	case "URL":
		url= item.Value;
		break;
	case "ASCX":
		url= fmDataViewerPath + "_ControlLoader.aspx?_src=" + item.Value;
		break;
	case "ASSIGN":
		url= fmDataViewerPath + "Form/Lookup/Old/LookupMulti.aspx";
		if (item.Attributes.indexOf("t=") == -1) item.Attributes+= ",t";
		item.Attributes+= ",externalFilter";
		item.Width= null;
		item.Height= null;
		break;
	case "SET":
		url= fmDataViewerPath + "Grid/Plugins/Set.aspx";
		if (item.Value == "BULKPROCESS") { fmgetgrid(gridID).BulkProcess(item.Attributes); return; }
		item.Attributes= "t,ids," + item.Attributes;
		item.Window= "INTERNAL";
		break;
	case "EDIT":
		item.ControlType= "FORM"; item.Window= "FRAMEWINDOW";
		item.Attributes= "t,id," + item.Attributes;
		break;
	case "CREATE":
		item.ControlType= "FORM"; item.Window= "FRAMEWINDOW";
		item.Attributes= "t," + item.Attributes;
		break;
	case "WORKFLOW":item.ControlType= "WORKFLOW"; item.Window= "FRAMEWINDOW";break;
	case "WORKFLOW2":item.ControlType= "WORKFLOW2"; item.Window= "FRAMEWINDOW";break;
	case "PROFILE":item.ControlType= "PROFILE"; item.Window= "FRAMEWINDOW";break;
	case "PRINT": fmgetgrid(gridID).Print(); return;
	case "EXPORT":fmgetgrid(gridID).Export(); return;
}
var grid= fmgetgrid(gridID);
if (grid == null) { alert("Grid control not found"); return; }
var q= fmMenuItem_BuildQuery(grid, item);
if (q == null) return;
if (item.Command == "JSCRIPT") {
	item.Query= q;
	var f= item.Value + "(item, grid)";
	try { window.eval(f); } catch (e) {alert(e.description);}
	return;
}
item.TableName= grid.tableName;
var res;
switch (item.Window) {
	case "FRAMEWINDOW": res= fmMenuItem_openFrameWindow(item, q, gridID); break;
	case "MODAL": res= openStdDlg(fmMenuItem_BuildUrl(url, q), "", item.Width, item.Height, item.Scroll); break;
	case "MODALCONTROL": alert('not supported'); break;
	case "INTERNAL": fmHandleInternal(fmMenuItem_BuildUrl(url, q), true); break;
	case "CURRENT": fmHandleInternal(fmMenuItem_BuildUrl(url, q), false); break;
	default: openStdWin(fmMenuItem_BuildUrl(url, q), item.Command + "_" + gridID, item.Width, item.Height, item.Scroll, item.Full); break;
}
if (res) window.fmRefreshGrid(gridID);
}

function fmMenuItem_openFrameWindow(item, qs, gridID) {
	var refreshCallback= function() { fmRefreshGrid(gridID); }
	var handler= item.ControlType + ":" + item.Value;
	openRecordByHandler(item.TableName, handler, qs, parseInt(item.Width), parseInt(item.Height), item.Full, refreshCallback);
}

function fmMenuItem_BuildQuery(grid, item) {
var q= "";
var mas= item.Attributes.split(",");

var p, key, val, qmas;
for (var i= 0; i < mas.length; i++) {
	p= mas[i]; if (p == "") continue;
	if (p.indexOf("=") > 0) {
		qmas= p.split("=");
		key= qmas[0]; val= qmas[1];
	} else {
		key= p; val= "[" + p + "]";
	}
	
	var p1= val.indexOf("[");
	var d1= val.indexOf("$");
	if (p1 == 0) val= fmGetGridVariable(val, grid); // [id]
	else if (p1 > 0) val= val.substring(0, p1) + fmGetGridVariable(val.substring(p1), grid); // _data=param1:[id]
	else if (d1 == 0) val= fmGetQueryString(val, grid); // $id
	else if (d1 > 0) val= val.substring(0, d1) + fmGetQueryString(val.substring(d1), grid); // _data=param1:$id
	if (val == null) return null;
	
	if (q != "") q+= "&";
	q+= (key + "=" + val);
}
return q;
}
function fmGetGridVariable(p, grid) {
switch (p) {
case "[id]":
	var id= grid.GetSelectedID();
	if (id == null) { alert("No one record selected."); return null; }
	return id;
case "[ids]" :
	var list= grid.GetSelectedIDArray();
	if (list.length == 0) { alert("No one record selected."); return null; }
	return list.toString();
case "[externalFilter]": 
	var f= grid.GetParameter("externalFilter"); if (!f) alert("External filter not defined.");
	return f;
case "[parent_id]": 
	var f= grid.GetParameter("parent_id"); if (!f) alert("parent_id not defined.");
	return f;
case "[t]": 
	return grid.tableName;
}
if (p.indexOf("/") > 0) return fmLookupQueryParam(p);
}

function fmGetQueryString(p, grid) {
p= p.substr(1);
var qs= (grid.InputParameters != "") ? grid.InputParameters : window.location.search.substring(1);
var i1= qs.indexOf(p + "=");
if (i1 >= 0) {
	i1= i1 + p.length + 1;
	var i2= qs.indexOf("&", i1);
	return (i2 != -1) ? qs.substr(i1, i2-i1) : qs.substr(i1);
}
return "";
}

function fmLookupQueryParam(p) {
var url= fmDataViewerPath + "Form/Lookup/LookupSingle.aspx";
if (p.indexOf("[tree:") != -1) {
	url= fmDataViewerPath + "Form/Lookup/LookupTree.aspx";
	p= p.substr(5);
}
var m= p.substr(1, p.length-2).split('/');
url+= "?t=" + m[0] + "&v=" + m[1];
var res= openStdDlg(url, null, 450, 500);
if (res != null) return res.items[0].value;
else return null;
}

function fmMenuItem_BuildUrl(url, query) {
if (typeof(WorkspaceRoot) != "undefined" && url.indexOf(WorkspaceRoot) != 0) url= WorkspaceRoot + url;
if (query != "") {
	if (url.indexOf("?") == -1) url+= "?"; else url+= "&";
	url+= query;
}
return url;
}

function fmHandle_JoinArray(list, mode) {
var s= "";
for (var i= 0; i < list.length; i++) {
	if (i > 0) s+= ",";
	if (mode == "Type") {
		if (list[i].Type == undefined || list[i].Type == "") return "";
		s+= list[i].Type;
	}	else {
		s+= list[i].ID;
	}
}
return s;
}
var fmPluginHandler;
function fmHandleInternal(url, run_in_frame) {
if (run_in_frame) {
	if (fmPluginHandler == null) {
		fmPluginHandler= document.createElement("IFRAME");
		fmPluginHandler.id= "fmPluginHandler";
		fmPluginHandler.style.display= "none";
		document.body.appendChild(fmPluginHandler);
	}
	fmPluginHandler.src= url;
} else {
	window.location.href= url;
}
}

Grid_OpenRecord= function(handler, element) {
	if (!handler) return;
	openRecordByHandler(handler.TableName, handler.Value, handler.Parameters, handler.Width, handler.Height, false, null, false);
}
gli_click= function(le, oid) {
	FM._ResourceLoader.getResourceLoaderService().Lookup_GetHandler(le, "view", "id=" + oid, Grid_OpenRecord, null, null);
}
