1342 lines
38 KiB
JavaScript
1342 lines
38 KiB
JavaScript
|
|
var spinner = '<div class=spinner><img border=0 src=/img/loading.gif>' +
|
|
'Loading... Please wait...</div>';
|
|
|
|
var did=0;
|
|
var saveTO={};
|
|
|
|
|
|
function saveCurState() {
|
|
// Save current state to session storage
|
|
clearTimeout(saveTO);
|
|
sessionStorage.fvConfig = JSON.stringify(fvConfig);
|
|
sessionStorage.flLoaded = JSON.stringify(flLoaded);
|
|
sessionStorage.flData = JSON.stringify(flData);
|
|
$.jgrid.saveState("dirlist", {storageType: "sessionStorage"});
|
|
$.jgrid.saveState("filelist",{storageType: "sessionStorage"});
|
|
//$.jgrid.saveState("dirlist" );
|
|
//$.jgrid.saveState("filelist");
|
|
|
|
console.log("saveCurState: saved current state");
|
|
//saveTO=setTimeout(saveCurState,fvConfig.saveInt);
|
|
};
|
|
|
|
function loadCurState() {
|
|
// Restore current state from session storage
|
|
fvConfig = JSON.parse(sessionStorage.fvConfig);
|
|
flLoaded = JSON.parse(sessionStorage.flLoaded);
|
|
flData = JSON.parse(sessionStorage.flData);
|
|
$.jgrid.loadState("dirlist", null, {storageType: "sessionStorage"});
|
|
$.jgrid.loadState("filelist", null, {storageType: "sessionStorage"});
|
|
//$.jgrid.loadState("dirlist" );
|
|
//$.jgrid.loadState("filelist");
|
|
|
|
console.log("loadCurState: reloaded saved state");
|
|
};
|
|
|
|
function loadServerState() {
|
|
// Reload grids from server
|
|
flLoaded={};
|
|
flLoadTime={};
|
|
flData=[];
|
|
$("#dirlist").jqGrid('clearGridData')
|
|
.jqGrid('setGridParam',{url: "genJSON.jim", datatype: "json", treedatatype: "json"})
|
|
.trigger('reloadGrid', [{ page: 1}]);
|
|
sessionStorage.dlLoadTime = new Date();
|
|
|
|
console.log("loadServerState: loading server state");
|
|
};
|
|
|
|
function saveExpSel() {
|
|
// Save expanded, Selected state of current directory tree
|
|
var sel = {};
|
|
fvConfig.sel = {};
|
|
fvConfig.exp = {};
|
|
fvConfig.excl = {};
|
|
var nodes = $('#dirlist').jqGrid('getRootNodes');
|
|
|
|
for (var i=0; i<nodes.length; i++)
|
|
{
|
|
var node=nodes[i];
|
|
var id=node.id;
|
|
|
|
// special directories starting with _ [
|
|
var special = false;
|
|
var d = node.title.trim();
|
|
if (d[0]== "_"
|
|
|| d[0] == "[" ) {special=true;}
|
|
|
|
if (node.sel!= 'Yes')
|
|
{
|
|
if (!special && sel[node.parent]==true)
|
|
{
|
|
fvConfig.excl[id] = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sel[id] = true;
|
|
if (special || sel[node.parent]!=true)
|
|
{
|
|
fvConfig.sel[id] = true;
|
|
}
|
|
}
|
|
|
|
if (!node.isLeaf)
|
|
{
|
|
if (node.expanded)
|
|
{
|
|
fvConfig.exp[id] = true;
|
|
}
|
|
if ($('#dirlist').jqGrid('isNodeLoaded',node))
|
|
{
|
|
nodes= nodes.concat($('#dirlist').jqGrid('getNodeChildren',node));
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function adjExpSel() {
|
|
// Apply Saved expanded, Selected state of current directory tree
|
|
var sel = {};
|
|
var dirlist =[];
|
|
var reload = false;
|
|
var nodes = $('#dirlist').jqGrid('getRootNodes');
|
|
if (fvConfig.curdirsel!=null)
|
|
{
|
|
$('#dirlist').jqGrid('setSelection',fvConfig.curdirsel,false);
|
|
}
|
|
|
|
for (var i=0; i<nodes.length; i++)
|
|
{
|
|
var node=nodes[i];
|
|
var id=node.id;
|
|
|
|
// special directories starting with _ [
|
|
var special = false;
|
|
var d = node.title.trim();
|
|
if (d[0]== "_"
|
|
|| d[0] == "[" ) {special=true;}
|
|
|
|
// Expand/contract nodes as needed
|
|
if (!node.isLeaf)
|
|
{
|
|
if (fvConfig.exp[id])
|
|
{
|
|
if (!node.expanded)
|
|
{
|
|
// Should be expanded
|
|
$('#dirlist').jqGrid('expandNode',node);
|
|
if ($('#dirlist').jqGrid('isVisibleNode',node))
|
|
{
|
|
$('#dirlist').jqGrid('expandRow',node);
|
|
}
|
|
console.log('Expanded '+id);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (node.expanded)
|
|
{
|
|
// Should not be expanded
|
|
$('#dirlist').jqGrid('collapseRow',node);
|
|
$('#dirlist').jqGrid('collapseNode',node);
|
|
console.log('Collapsed '+id);
|
|
}
|
|
}
|
|
if ($('#dirlist').jqGrid('isNodeLoaded',node))
|
|
{
|
|
nodes= nodes.concat($('#dirlist').jqGrid('getNodeChildren',node));
|
|
}
|
|
}
|
|
|
|
// Select/deselect directories
|
|
if (fvConfig.sel[id] ||
|
|
(!special && sel[node.parent] && !fvConfig.excl[id]))
|
|
{
|
|
// Selected
|
|
$("#dirlist").jqGrid('setCell',id,"sel","Yes");
|
|
sel[id]=true;
|
|
}
|
|
else
|
|
{
|
|
// Not selected
|
|
$("#dirlist").jqGrid('setCell',id,"sel","No");
|
|
}
|
|
|
|
// Show Selected directories
|
|
if (sel[id] ||
|
|
(id== fvConfig.curdirsel))
|
|
{
|
|
if (flLoaded[id])
|
|
{ // Row already loaded
|
|
showDir(id);
|
|
reload = true;
|
|
}
|
|
else
|
|
{ // Not yet loaded
|
|
dirlist.push(node.dir);
|
|
flLoaded[id] = true;
|
|
flLoadTime[id] = new Date();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (flLoaded[id])
|
|
{ // loaded
|
|
hideDir(id);
|
|
reload = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (dirlist.length>0 )
|
|
{
|
|
requestDir(dirlist);
|
|
}
|
|
else if (reload)
|
|
{
|
|
reloadTable();
|
|
}
|
|
|
|
}
|
|
|
|
function cmpColModel(grid,origCM) {
|
|
// compare grid colModels to find differences in column
|
|
// size, position, visibilty, ( sort order, filters }
|
|
var curCM = $(grid).jqGrid('getGridParam','colModel');
|
|
var difCM = {};
|
|
for (var i=0; i<origCM.length; i++)
|
|
{
|
|
var oCol = origCM[i];
|
|
var name = oCol.name;
|
|
var dCol = {};
|
|
var chg = false;
|
|
for (var j=0; j<curCM.length; j++)
|
|
{
|
|
if (name == curCM[j].name)
|
|
{
|
|
var cCol = curCM[j];
|
|
if (i != j)
|
|
{
|
|
dCol.pos =j;
|
|
chg=true;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (oCol.width != cCol.width)
|
|
{
|
|
dCol.width = cCol.width;
|
|
chg=true;
|
|
}
|
|
if (oCol.hidden != cCol.hidden)
|
|
{
|
|
dCol.hidden = cCol.hidden;
|
|
chg=true;
|
|
}
|
|
if (chg)
|
|
{
|
|
difCM[name] =dCol;
|
|
}
|
|
}
|
|
return difCM;
|
|
};
|
|
|
|
function adjColModel(grid,origCM,difCM) {
|
|
// apply colModel changes from saved config to current grid
|
|
// size, position, visibilty, ( sort order, filters }
|
|
var curCM = $(grid).jqGrid('getGridParam','colModel');
|
|
var remap = [];
|
|
for (var i=0; i<curCM.length; i++)
|
|
{
|
|
var cCol = curCM[i];
|
|
var name = cCol.name;
|
|
var oCol = cCol;
|
|
remap[i]=i;
|
|
|
|
// Restore column to default
|
|
for (var j=0; j<origCM.length; j++)
|
|
{
|
|
if (name == origCM[j].name)
|
|
{
|
|
var oCol = origCM[j];
|
|
remap[i]=j;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (oCol.width != cCol.width)
|
|
{
|
|
$(grid).jqGrid('resizeColumn',name,oCol.width);
|
|
}
|
|
if (oCol.hidden != cCol.hidden)
|
|
{
|
|
if (oCol.hidden)
|
|
{
|
|
$(grid).jqGrid('hideCol',name);
|
|
}
|
|
else
|
|
{
|
|
$(grid).jqGrid('showCol',name);
|
|
}
|
|
}
|
|
|
|
if (difCM.hasOwnProperty(name))
|
|
{
|
|
// Apply changes to default
|
|
var dCol = difCM[name];
|
|
if ('pos' in dCol)
|
|
{
|
|
remap[i]=dCol.pos;
|
|
}
|
|
if ('width' in dCol)
|
|
{
|
|
$(grid).jqGrid('resizeColumn',name,dCol.width);
|
|
}
|
|
if ('hidden' in dCol)
|
|
{
|
|
if (dCol.hidden)
|
|
{
|
|
$(grid).jqGrid('hideCol',name);
|
|
}
|
|
else
|
|
{ $(grid).jqGrid('showCol',name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$(grid).jqGrid('remapColumns',remap,true);
|
|
};
|
|
|
|
function setTableWidth() {
|
|
if (fvConfig.dircolwidth)
|
|
{
|
|
$("#dirlist").jqGrid('setGridWidth',fvConfig.dircolwidth);
|
|
}
|
|
else
|
|
{
|
|
$("#dirlist").jqGrid('resetGridWidth');
|
|
}
|
|
|
|
if (fvConfig.dircolhidden)
|
|
{
|
|
$("#dirhead").hide('slow');
|
|
$("#dircell").hide('slow');
|
|
$("#show").show();
|
|
$("#flhead").height($("#show").outerHeight());
|
|
if (fvConfig.tablewidth)
|
|
{
|
|
$("#filelist").jqGrid('setGridWidth',fvConfig.tablewidth);
|
|
}
|
|
else
|
|
{
|
|
$("#filelist").jqGrid('resetGridWidth');
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$("#dirhead").show('slow');
|
|
$("#dircell").show('slow');
|
|
$("#show").hide();
|
|
if (fvConfig.tablewidth)
|
|
{
|
|
$("#filelist").jqGrid('setGridWidth',fvConfig.tablewidth
|
|
-$("#dircell").outerWidth());
|
|
}
|
|
else
|
|
{
|
|
$("#filelist").jqGrid('resetGridWidth');
|
|
}
|
|
}
|
|
};
|
|
|
|
function setTableHeight() {
|
|
if (fvConfig.tabledepth)
|
|
{
|
|
var dirHeadSz = $("#dircell thead").outerHeight(true);
|
|
var flHeadSz = $("#flcell thead").outerHeight(true);
|
|
$("#dirlist").jqGrid('setGridHeight',fvConfig.tabledepth-dirHeadSz);
|
|
$("#filelist").jqGrid('setGridHeight',fvConfig.tabledepth-flHeadSz);
|
|
}
|
|
else
|
|
{
|
|
$("#dirlist").jqGrid('setGridHeight','auto');
|
|
$("#filelist").jqGrid('setGridHeight','auto');
|
|
}
|
|
};
|
|
|
|
function resizeFl(xchange) {
|
|
// Set FileList table width to take rest of table width after DirList
|
|
fvConfig.dircolwidth = $("#dirlist").jqGrid('getGridParam','width')-xchange;
|
|
if (fvConfig.tablewidth)
|
|
{
|
|
fvConfig.flcolwidth = $("#filelist").jqGrid('getGridParam','width')+xchange;
|
|
}
|
|
setTableWidth();
|
|
};
|
|
|
|
function applyConfig() {
|
|
// Apply saved configuration
|
|
|
|
// Dir tree
|
|
adjColModel('#dirlist', dirColModel, fvConfig.dirColChg);
|
|
adjExpSel();
|
|
// File list
|
|
adjColModel('#filelist', flColModel, fvConfig.flColChg);
|
|
// Table sizes
|
|
setTableWidth();
|
|
setTableHeight();
|
|
|
|
// display config name
|
|
statusMsg("Applied configuration- " + fvConfig.name);
|
|
|
|
};
|
|
|
|
function statusMsg(msg) {
|
|
$("#topmsg").show().html(msg).delay(5000).hide('slow');
|
|
}
|
|
|
|
function updateConfigList(data, status) {
|
|
// Message for update status
|
|
var output = data.split("<br>");
|
|
statusMsg(output[0]);
|
|
// Update configuration selection lists
|
|
$('#configllist').html(output[1]);
|
|
$('#configslist').html(output[1]);
|
|
console.log(output[0]);
|
|
};
|
|
|
|
function showDir(rowid) {
|
|
// Show already loaded directory in filelist table
|
|
console.log("showDir Row " + rowid);
|
|
var dir = $("#dirlist").jqGrid('getCell',rowid,"dir")
|
|
for (var i=0; i < flData.length; i++)
|
|
{
|
|
if (flData[i].dir == dir)
|
|
{
|
|
flData[i].showrow =true;
|
|
// setCell only works on visible rows!
|
|
}
|
|
}
|
|
};
|
|
|
|
function hideDir(rowid) {
|
|
// Hide already displayed directory in filelist table
|
|
console.log("hideDir Row " + rowid);
|
|
var dir = $("#dirlist").jqGrid('getCell',rowid,"dir")
|
|
for (var i=0; i < flData.length; i++)
|
|
{
|
|
if (flData[i].dir == dir)
|
|
{
|
|
flData[i].showrow =false;
|
|
id = flData[i].id;
|
|
$("#filelist").jqGrid('setCell',id,"showrow","false");
|
|
$("#filelist").jqGrid('setCell',id,"sel","false");
|
|
//$("#"+flData[i].id).hide();
|
|
}
|
|
}
|
|
};
|
|
|
|
function removeDir(dir) {
|
|
// Remove entries for directory from filelist table
|
|
var first = -1;
|
|
var ct = 0;
|
|
// find first entry
|
|
for (var i=0; i < flData.length; i++)
|
|
{
|
|
if (flData[i].dir == dir)
|
|
{
|
|
first = i;
|
|
ct=1;
|
|
break;
|
|
}
|
|
}
|
|
if (first >-1)
|
|
{
|
|
// count the additional entries
|
|
for (var i=first+1; i < flData.length; i++)
|
|
{
|
|
if (flData[i].dir != dir)
|
|
{
|
|
break;
|
|
}
|
|
ct++;
|
|
}
|
|
flData.splice(first,ct);
|
|
}
|
|
console.log("removeDir " + dir + " entries removed: " + ct);
|
|
};
|
|
|
|
function reloadDir(dir) {
|
|
var rowid= getRowId(dir);
|
|
flLoaded[rowid]=true;
|
|
flLoadTime[rowid]=new Date();
|
|
removeDir(dir);
|
|
requestDir(dir);
|
|
};
|
|
|
|
|
|
function dirSelected(rowid) {
|
|
|
|
if (fvConfig.curdirsel != null)
|
|
{
|
|
var record = $("#dirlist").jqGrid('getLocalRow',fvConfig.curdirsel);
|
|
if (record.sel!="Yes")
|
|
{
|
|
hideDir(fvConfig.curdirsel);
|
|
}
|
|
fvConfig.curdirsel = null;
|
|
}
|
|
|
|
// Show current directory and all sub directories
|
|
var record = $("#dirlist").jqGrid('getLocalRow',rowid);
|
|
var showlist = [record];
|
|
var dirlist = [];
|
|
var reload=false;
|
|
|
|
for (var rid=0;rid<showlist.length;rid++)
|
|
{
|
|
rowid=showlist[rid]._id_
|
|
$("#dirlist").jqGrid('setCell',rowid,"sel","Yes");
|
|
fvConfig.sel[rowid]=true;
|
|
|
|
if (flLoaded[rowid])
|
|
{ // Row already loaded
|
|
showDir(rowid);
|
|
reload=true;
|
|
}
|
|
else
|
|
{ // Not yet loaded
|
|
dirlist.push(showlist[rid].dir);
|
|
flLoaded[rowid] = true;
|
|
flLoadTime[rowid] = new Date();
|
|
}
|
|
|
|
if (showlist[rid].isLeaf == false
|
|
&& showlist[rid].expanded == true )
|
|
{
|
|
// get the children
|
|
var kids = $("#dirlist").jqGrid('getNodeChildren',showlist[rid]);
|
|
for (i=0;i<kids.length;i++)
|
|
{
|
|
// ignore special directories starting with _ [
|
|
var d = kids[i].title.trim();
|
|
if (d[0] != "_"
|
|
&& d[0] != "[" )
|
|
{
|
|
id=kids[i]._id_;
|
|
if (kids[i].sel != "Yes")
|
|
{
|
|
//console.log("kid "+id);
|
|
showlist.push(kids[i]); // add to list to be shown
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (dirlist.length>0 )
|
|
{
|
|
requestDir(dirlist);
|
|
}
|
|
else if (reload)
|
|
{
|
|
reloadTable();
|
|
}
|
|
|
|
};
|
|
|
|
function dirDeSelected(rowid) {
|
|
// Hide current directory and all sub directories
|
|
var record = $("#dirlist").jqGrid('getLocalRow',rowid);
|
|
var showlist = [record];
|
|
for (rid=0;rid<showlist.length;rid++)
|
|
{
|
|
rowid=showlist[rid]._id_
|
|
$("#dirlist").jqGrid('setCell',rowid,"sel","No");
|
|
fvConfig.sel[rowid]=false;
|
|
hideDir(rowid);
|
|
|
|
if (showlist[rid].isLeaf == false)
|
|
{
|
|
// get the children
|
|
var kids = $("#dirlist").jqGrid('getNodeChildren',showlist[rid]);
|
|
for (i=0;i<kids.length;i++)
|
|
{
|
|
id=kids[i]._id_;
|
|
if (kids[i].sel == "Yes")
|
|
{
|
|
//console.log("kid "+id);
|
|
showlist.push(kids[i]); // add to list to be hidden
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
reloadTable();
|
|
};
|
|
|
|
function triggerToolbar() {
|
|
console.log("triggerToolbar");
|
|
$("#filelist")[0].triggerToolbar();
|
|
};
|
|
|
|
|
|
|
|
function reloadTable() {
|
|
var start = new Date();
|
|
$('#flspin').show();
|
|
$("#filelist").jqGrid('clearGridData')
|
|
.jqGrid('setGridParam', { data: flData })
|
|
.trigger('reloadGrid', [{ page: 1}]);
|
|
$("#filelist")[0].triggerToolbar();
|
|
$('#flspin').hide();
|
|
var end = new Date();
|
|
var elapse = end-start;
|
|
console.log("reloadTable, Time " + elapse/1000);
|
|
|
|
};
|
|
|
|
function requestDir(dirlist) {
|
|
// Issue Ajax request to return directory contents for filelist table
|
|
console.log("requestDir " + dirlist);
|
|
$('#flspin').show();
|
|
var start = new Date();
|
|
$.getJSON("genJSON.jim?mode=filelist&dir="+dirlist,
|
|
function(data, status) {
|
|
// Call back function - load table
|
|
flData = flData.concat(data.rows);
|
|
reloadTable();
|
|
|
|
var end = new Date();
|
|
var elapse = end-start;
|
|
console.log("Loaded status= " + status + ", Time " + elapse/1000);
|
|
});
|
|
};
|
|
|
|
function getRowId(path) {
|
|
// Change all special chars to - to create id value
|
|
var id= "";
|
|
var chars="[";
|
|
chars=chars+"\\x01-\\x2f";
|
|
chars=chars+"\\x3a-\\x40";
|
|
chars=chars+"\\x5b-\\x5e";
|
|
chars=chars+"\\x7b-\\x7f";
|
|
chars=chars+"]";
|
|
re = new RegExp(chars,"g");
|
|
id = path.replace(re,"-");
|
|
return id;
|
|
}
|
|
|
|
function viewRow(grid,rowid) {
|
|
$(grid).jqGrid('viewGridRow',rowid,{modal:true,top:1,left:1});
|
|
};
|
|
|
|
function reloadNode(rowid) {
|
|
var record = $("#dirlist").jqGrid('getLocalRow',rowid);
|
|
record.isLeaf=false;
|
|
$("#dirlist").jqGrid('expandNode', record);
|
|
$("#dirlist").jqGrid('reloadNode', record);
|
|
};
|
|
|
|
function selAll(event) {
|
|
// Table header checbbox clicked
|
|
console.log("Checkbox " + $(event.target).is(":checked"));
|
|
event.stopPropagation();
|
|
if($(event.target).is(":checked"))
|
|
{
|
|
console.log("checkbox selected");
|
|
//$('#chkbox').val("Yes").prop('checked', true); // select all
|
|
$('input.fs').prop('checked', true).trigger('change');
|
|
}
|
|
else
|
|
{
|
|
console.log("checkbox deselected");
|
|
//$('#chkbox').prop('checked', false); // deselect all
|
|
$('input.fs').prop('checked', false).trigger('change');
|
|
|
|
}
|
|
inputChanged();
|
|
|
|
};
|
|
|
|
function fmtCheckbox(cellvalue, options, rowObject) {
|
|
// Format checkbox column as expected by browse
|
|
|
|
var file = encodeURI(rowObject.dir + "/" + rowObject.fname);
|
|
var fmtStr=
|
|
'<input type="checkbox" class="fs fs'+rowObject.ftype+'">'+
|
|
'<a class="bf" display=none file="'+file+'" href=#></a>'
|
|
;
|
|
return fmtStr;
|
|
|
|
};
|
|
|
|
function fmtHTML(cellvalue, options, rowObject)
|
|
{
|
|
//console.log("fmtHTML " + cellvalue);
|
|
return cellvalue;
|
|
}
|
|
|
|
function fmtIcon(cellvalue, options, rowObject)
|
|
{
|
|
//console.log("fmtIcon " + cellvalue);
|
|
if (cellvalue == 1)
|
|
{
|
|
var label = options.colModel.formatoptions.label
|
|
return options.colModel.formatoptions.img;
|
|
}
|
|
else {
|
|
var name= options.colModel.name;
|
|
rowObject[name] = 0;
|
|
return " ";
|
|
}
|
|
}
|
|
|
|
function fmtfname(cellvalue, options, rowObject)
|
|
{
|
|
// Format fname with hover display of title, synopsis & guidance
|
|
// Generate attributes expected by Browse context menu
|
|
|
|
//var title = rowObject.title+"\n"+rowObject.synopsis;
|
|
//if (rowObject.guidance != "")
|
|
//{
|
|
// title += "\nGUIDANCE: " + rowObject.guidance;
|
|
//}
|
|
var title = "<b>"+rowObject.title+"</b><br>"+rowObject.synopsis;
|
|
if (rowObject.guidance != "")
|
|
{
|
|
title += "</br><b>Guidance: </b>" ;
|
|
if (rowObject.GGuidance == 1)
|
|
{
|
|
title += icons.Gguidance +" ";
|
|
}
|
|
if (rowObject.Guidance == 1)
|
|
{
|
|
title += icons.guidance +" ";
|
|
}
|
|
title += rowObject.guidance;
|
|
}
|
|
title = encodeURI(title);
|
|
|
|
//console.log("fmtfname " + cellvalue);
|
|
var file = rowObject.dir + "/" + cellvalue;
|
|
var fmtStr= "<a class=bf title=\"" +title+
|
|
"\" file=\""+file+"\" type="+rowObject.ftype+
|
|
' onclick="viewFile(\''+rowObject.id+'\')" '+
|
|
//" href=#" +
|
|
" >" +
|
|
cellvalue +
|
|
"</a>";
|
|
return fmtStr;
|
|
}
|
|
|
|
function fmtChannel(cellvalue, options, rowObject)
|
|
{
|
|
// Add Channel icon to channel name
|
|
var name = cellvalue;
|
|
var icon = '<img class="fvIcon" src="/img/channels/out/'+name+'.png"> ' ;
|
|
var fmtStr= icon + name;
|
|
return fmtStr;
|
|
}
|
|
|
|
function fmtThumbnail(cellvalue, options, rowObject)
|
|
{
|
|
// Return thumbnail image if it exists
|
|
var file = rowObject.dir + "/" + rowObject.fname;
|
|
if (rowObject.thmok)
|
|
{
|
|
var img = '<img class="bmp va" src="/browse/bmp.jim?file='+file+'"> ' ;
|
|
return img;
|
|
}
|
|
return " ";
|
|
}
|
|
|
|
function fmtGuidance(cellvalue, options, rowObject)
|
|
{
|
|
// Format Guidance text with guidance flag icon
|
|
var fmtStr='<span class="guidetext" title="'+ encodeURI(cellvalue)+'" >';
|
|
if (rowObject.GGuidance == 1)
|
|
{
|
|
fmtStr += icons.Gguidance +" ";
|
|
}
|
|
if (rowObject.Guidance == 1)
|
|
{
|
|
fmtStr += icons.guidance +" ";
|
|
}
|
|
|
|
fmtStr += cellvalue + '</span>';
|
|
return fmtStr;
|
|
}
|
|
|
|
function fmtOpt(cellvalue, options, rowObject)
|
|
{
|
|
// Format File list Opt+ button
|
|
// Generate attributes expected by Browse context menu
|
|
var attr, col, value;
|
|
did = did+1;
|
|
var attrlist = 'did="did'+did+'" ';
|
|
for (attr in optmenuattr) {
|
|
col = optmenuattr[attr];
|
|
value = rowObject[col];
|
|
if (!value)
|
|
{
|
|
value=0;
|
|
}
|
|
attrlist += attr +'="'+value+'" ';
|
|
}
|
|
|
|
|
|
$('#'+rowObject.id).addClass('bf');
|
|
//console.log("fmtOpt " + cellvalue);
|
|
//var file = encodeURIComponent(rowObject.dir + "/" + rowObject.fname);
|
|
var file = rowObject.dir + "/" + rowObject.fname;
|
|
var fmtStr=
|
|
'<div class="bf" id="did'+did+'">' +
|
|
'<a class="bf" display=none file="'+file+'" href=#></a>' +
|
|
'<a href=#>' +
|
|
'<img class="'+cellvalue+' va" border=0 width=45 '+
|
|
attrlist +
|
|
' src="/images/181_1_00_Help5_OPT_Plus.png">'+
|
|
'</a>'+
|
|
'<div class="results blood" style="margin: 0 0 0 5em"></div>' +
|
|
'</div>'
|
|
;
|
|
return fmtStr;
|
|
}
|
|
|
|
function fmtDOpt(cellvalue, options, rowObject)
|
|
{
|
|
// Format Directory Opt+ button
|
|
// Generate attributes expected by Browse context menu
|
|
|
|
var attr, col, value;
|
|
var attrlist = "";
|
|
for (attr in dirmenuattr) {
|
|
col = dirmenuattr[attr];
|
|
value = rowObject[col];
|
|
if (!value)
|
|
{
|
|
value=0;
|
|
}
|
|
attrlist += attr +'="'+value+'" ';
|
|
}
|
|
|
|
//console.log("fmtOpt " + cellvalue);
|
|
//var file = encodeURIComponent(rowObject.dir);
|
|
var file = rowObject.dir;
|
|
var fmtStr=
|
|
'<a class="dbf" display=none file="'+file+'" href=#></a>' +
|
|
'<span class="iconset"></span>' +
|
|
'<a href=#>' +
|
|
'<img class="'+cellvalue+' va" border=0 width=45 '+
|
|
attrlist +
|
|
' src="/images/181_1_00_Help5_OPT_Plus.png">'+
|
|
'</a>'+
|
|
'<div class="results blood" style="margin: 0 0 0 5em"></div>'
|
|
;
|
|
return fmtStr;
|
|
}
|
|
|
|
// Initialize tables when document ready
|
|
$(function() {
|
|
|
|
//==================================================================
|
|
// Resize of main tables
|
|
//==================================================================
|
|
// resize table width (file list width)
|
|
$( "#fvtable" ).resizable({
|
|
handles: "e",
|
|
helper: "ui-resizable-helper",
|
|
stop: function( event, ui ) {
|
|
console.log("fvtable x= "+ ui.size.width +" y="+ ui.size.height);
|
|
var xchange = ui.originalSize.width - ui.size.width;
|
|
if (xchange !=0)
|
|
{
|
|
fvConfig.tablewidth = ui.size.width;
|
|
fvConfig.flcolwidth = $("#filelist").jqGrid('getGridParam','width') -xchange;
|
|
setTableWidth();
|
|
}
|
|
|
|
}
|
|
} );
|
|
|
|
// resize table height
|
|
$( "#dirrow" ).resizable({
|
|
handles: "s",
|
|
helper: "ui-resizable-helper",
|
|
stop: function( event, ui ) {
|
|
console.log("dirrow x= "+ ui.size.width +" y="+ ui.size.height);
|
|
|
|
if (ui.originalSize.height != ui.size.height)
|
|
{
|
|
fvConfig.tabledepth = ui.size.height;
|
|
setTableWidth();
|
|
setTableHeight();
|
|
}
|
|
}
|
|
} );
|
|
|
|
// resize directory column width
|
|
$( "#dirhead" ).resizable({
|
|
handles: "e",
|
|
minWidth: 0,
|
|
helper: "ui-resizable-helper",
|
|
stop: function( event, ui ) {
|
|
console.log("dircell x= "+ ui.size.width +" y="+ ui.size.height);
|
|
var xchange = ui.originalSize.width - ui.size.width;
|
|
if (xchange !=0)
|
|
{
|
|
resizeFl(xchange);
|
|
}
|
|
|
|
}
|
|
} );
|
|
|
|
//==================================================================
|
|
// Top Buttons
|
|
//==================================================================
|
|
$('#reload').button().enable()
|
|
.click(function() {
|
|
loadServerState();
|
|
});
|
|
|
|
$('#load').button().enable()
|
|
.click(function() {
|
|
|
|
$('#configload').dialog({
|
|
autoOpen: true,
|
|
height: 'auto', width: 'auto',
|
|
modal: true,
|
|
buttons: {
|
|
"Load": function() {
|
|
var setname = $('#configllist').val();
|
|
$(this).dialog('close');
|
|
var start = new Date();
|
|
// Issue Ajax request to return specified configuration set
|
|
console.log("load config: " + setname);
|
|
$('#topspin').show();
|
|
$.getJSON("loadConfig.jim",
|
|
{name: setname},
|
|
function(data, status) {
|
|
// Call back function - load table
|
|
if ('errmsg' in data)
|
|
{
|
|
console.error("Load error= " + data.errmsg);
|
|
statusMsg("Load error= " + data.errmsg);
|
|
} else
|
|
{
|
|
//Object.assign(fvConfig,data);
|
|
$.extend(fvConfig,data);
|
|
fvConfig.name = setname;
|
|
applyConfig();
|
|
saveCurState();
|
|
|
|
var end = new Date();
|
|
var elapse = end-start;
|
|
console.log("Loaded configuration= " + setname + ", Time " + elapse/1000);
|
|
}
|
|
$('#topspin').hide();
|
|
});
|
|
},
|
|
"Delete": function() {
|
|
var setname = $('#configllist').val();
|
|
$(this).dialog('close');
|
|
$.post('deleteConfig.jim',
|
|
{name: setname},
|
|
updateConfigList
|
|
);
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog('close');
|
|
}
|
|
},
|
|
});
|
|
});
|
|
|
|
$('#save').button().enable()
|
|
.click(function() {
|
|
$('#configsave').dialog({
|
|
autoOpen: true,
|
|
height: 'auto', width: 'auto',
|
|
modal: true,
|
|
buttons: {
|
|
"Save": function() {
|
|
var setname = $('#configname').val();
|
|
$(this).dialog('close');
|
|
fvConfig.name = setname;
|
|
fvConfig.dirColChg = cmpColModel('#dirlist', dirColModel);
|
|
fvConfig.flColChg = cmpColModel('#filelist', flColModel);
|
|
saveExpSel();
|
|
$.post('saveConfig.jim',
|
|
{name: setname,
|
|
fvconfig: JSON.stringify(fvConfig)
|
|
},
|
|
updateConfigList
|
|
);
|
|
saveCurState();
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog('close');
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
$('#dircolumn').button().enable()
|
|
.click(function() {
|
|
$("#dirlist").jqGrid('columnChooser', {
|
|
caption: "Select Directory tree columns",
|
|
done : function (perm) {
|
|
if (perm) {
|
|
// "OK" button are clicked
|
|
this.jqGrid("remapColumns", perm, true);
|
|
// the grid width is probably changed co we can get new width
|
|
// and adjust the width of other elements on the page
|
|
setTableWidth();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
$('#flcolumn').button().enable()
|
|
.click(function() {
|
|
$("#filelist").jqGrid('columnChooser', {
|
|
caption: "Select file list columns",
|
|
done : function (perm) {
|
|
if (perm) {
|
|
// "OK" button are clicked
|
|
this.jqGrid("remapColumns", perm, true);
|
|
// the grid width is probably changed co we can get new width
|
|
// and adjust the width of other elements on the page
|
|
setTableWidth();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
$('#hide').button().enable()
|
|
.click(function() {
|
|
fvConfig.dircolhidden = true;
|
|
setTableWidth();
|
|
});
|
|
$('#show').hide();
|
|
$('#show').button().enable()
|
|
.click(function() {
|
|
fvConfig.dircolhidden = false;
|
|
setTableWidth();
|
|
});
|
|
|
|
|
|
$('#topspin').hide();
|
|
$('#dirspin').hide();
|
|
$('#flspin').hide();
|
|
|
|
//==================================================================
|
|
// Directory tree table
|
|
//==================================================================
|
|
$("#dirlist").jqGrid({
|
|
url: "genJSON.jim",
|
|
datatype: "local",
|
|
//datatype: "json",
|
|
mtype: "POST",
|
|
colModel: dirColModel,
|
|
//colMenu: true,
|
|
loadonce: false, // needed for incremental load
|
|
sortname: "title",
|
|
viewrecords: true,
|
|
gridview: true,
|
|
autoencode: true,
|
|
//altRows: true,
|
|
//altClass: 'odd',
|
|
sortable: true,
|
|
shrinkToFit: false,
|
|
treeGrid: true,
|
|
treeGridModel: 'adjacency',
|
|
ExpandColumn: 'title',
|
|
|
|
onSelectRow: function(rowid, status, e){
|
|
console.log("Row " + rowid + " selected")
|
|
//if (rowid == fvConfig.curdirsel != null) return;
|
|
if (fvConfig.curdirsel != null)
|
|
{
|
|
var record = $("#dirlist").jqGrid('getLocalRow',fvConfig.curdirsel);
|
|
if (record.sel!="Yes")
|
|
{
|
|
hideDir(fvConfig.curdirsel);
|
|
}
|
|
}
|
|
fvConfig.curdirsel = rowid;
|
|
|
|
if (flLoaded[rowid])
|
|
{
|
|
showDir(rowid);
|
|
reloadTable();
|
|
}
|
|
else
|
|
{
|
|
var record = $("#dirlist").jqGrid('getLocalRow',rowid);
|
|
flLoaded[rowid] = true;
|
|
flLoadTime[rowid] = new Date();
|
|
requestDir(record.dir);
|
|
}
|
|
},
|
|
|
|
beforeSelectRow : function( rowid, event) {
|
|
if($(event.target).is(":checkbox"))
|
|
{
|
|
if($(event.target).is(":checked"))
|
|
{
|
|
console.log("Row " + rowid + " checkbox selected");
|
|
dirSelected(rowid);
|
|
reloadTable();
|
|
}
|
|
else
|
|
{
|
|
console.log("Row " + rowid + " checkbox deselected");
|
|
dirDeSelected(rowid);
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
|
|
serializeGridData: function(postData) {
|
|
console.log("serializeGridData");
|
|
//for (i in postData)
|
|
//{
|
|
// console.log(i +": "+postData[i]);
|
|
//}
|
|
//console.log(postData.nodeid);
|
|
$('#dirspin').show();
|
|
dirstart = new Date();
|
|
if ("nodeid" in postData)
|
|
{
|
|
postData.dir = $("#dirlist").jqGrid('getCell',postData.nodeid,"dir")
|
|
postData.mode = "children";
|
|
}
|
|
if (!("mode" in postData))
|
|
{
|
|
postData.mode = "parent";
|
|
postData.dir = $('#dir').text();
|
|
}
|
|
return postData;
|
|
},
|
|
|
|
gridComplete: function() {
|
|
var end = new Date();
|
|
var elapse = end-dirstart;
|
|
$('#dirspin').hide();
|
|
setTimeout(adjExpSel,500);
|
|
dirListReady();
|
|
$('#dirlist tr:nth-child(even)').addClass('even').removeClass('odd');
|
|
$('#dirlist tr:nth-child(odd)').addClass('odd').removeClass('even');
|
|
console.log("gridComplete dirTree, Time " + elapse/1000);
|
|
},
|
|
|
|
|
|
resizeStop: function(newwidth,index) {
|
|
setTableWidth();
|
|
},
|
|
|
|
beforeExpandTreeGridNode: function( id, record ){
|
|
console.log('beforeExpandTreeGridNode '+id);
|
|
fvConfig.exp[id]=true;
|
|
},
|
|
|
|
beforeCollapseTreeGridNode: function( id, record ){
|
|
console.log('beforeCollapseTreeGridNode '+id);
|
|
delete fvConfig.exp[id];
|
|
},
|
|
|
|
height: "100%"
|
|
}),
|
|
|
|
$("#dirlist").jqGrid('filterToolbar',{searchOperators: true,
|
|
//$("#dirlist").jqGrid('filterToolbar',{searchOperators: false,
|
|
|
|
beforeSearch:function() {
|
|
this.p.treedatatype = 'local';
|
|
this.p.loadonce = true;
|
|
},
|
|
|
|
afterSearch:function() {
|
|
this.p.loadonce = false;
|
|
this.p.treedatatype = 'json';
|
|
|
|
// Hide the filelist table
|
|
for (var i=0; i < flData.length; i++)
|
|
{
|
|
flData[i].showrow =false;
|
|
id = flData[i].id;
|
|
$("#filelist").jqGrid('setCell',id,"showrow","false");
|
|
$("#filelist").jqGrid('setCell',id,"sel","false");
|
|
}
|
|
reloadTable();
|
|
},
|
|
|
|
});
|
|
|
|
//==================================================================
|
|
// File list table
|
|
//==================================================================
|
|
$("#filelist").jqGrid({
|
|
//url: "genJSON.jim",
|
|
datatype: "local",
|
|
data: flData,
|
|
mtype: "POST",
|
|
colModel: flColModel,
|
|
//colMenu: true,
|
|
//loadonce: true,
|
|
//multiselect: true,
|
|
// multiboxonly: false,
|
|
// multikey: "ctrlKey",
|
|
sortname: "fname",
|
|
viewrecords: true,
|
|
gridview: true,
|
|
autoencode: true,
|
|
//altRows: true,
|
|
//altClass: 'odd',
|
|
sortable: true,
|
|
rowNum: 100000,
|
|
shrinkToFit: false,
|
|
|
|
beforeSelectRow : function( rowid, event) {
|
|
if($(event.target).is(":checkbox"))
|
|
{
|
|
if($(event.target).is(":checked"))
|
|
{
|
|
console.log("Row " + rowid + " checkbox selected")
|
|
}
|
|
else
|
|
{
|
|
console.log("Row " + rowid + " checkbox deselected");
|
|
$('#chkbox').prop('checked', false); // deselect all
|
|
}
|
|
inputChanged();
|
|
return false;
|
|
}
|
|
return false;
|
|
},
|
|
|
|
|
|
onSelectRow: function(rowid, status, e){
|
|
console.log("Row " + rowid + " selected, status " + status )
|
|
},
|
|
|
|
gridComplete: function() {
|
|
console.log("gridComplete filelist");
|
|
fileListReady();
|
|
$('#filelist tr:nth-child(even)').addClass('even');
|
|
$('#filelist tr:nth-child(odd)').addClass('odd');
|
|
//triggerToolbar();
|
|
$('#chkbox').prop('checked', false); // deselect all
|
|
inputChanged();
|
|
|
|
},
|
|
|
|
resizeStop: function(newwidth,index) {
|
|
setTableWidth();
|
|
},
|
|
|
|
// onCellSelect: function(rowid,iCol,cellcontent,e){
|
|
// console.log("Cell "+ iCol + " Row " + rowid + " selected, content " + cellcontent)
|
|
// },
|
|
|
|
//width: 700,
|
|
height: "100%"
|
|
})
|
|
,$("#filelist").jqGrid('filterToolbar',{searchOperators: true}) ;
|
|
//,$("#filelist").jqGrid('filterToolbar',{searchOperators: false}) ;
|
|
|
|
// Extend jqGrid with resetGridWidth function
|
|
// Set grid width to total width of visible columns
|
|
$.jgrid.extend({resetGridWidth: function() {
|
|
var gid = this.selector;
|
|
var colmod=$(this).jqGrid('getGridParam','colModel');
|
|
var w=0
|
|
for (i=0;i<colmod.length;i++) {
|
|
name=colmod[i].name;
|
|
if (!colmod[i].hidden) {
|
|
// console.log("resetGridWidth " + name);
|
|
w += $(gid+"_"+name).outerWidth();
|
|
}
|
|
}
|
|
if (fvConfig.tabledepth)
|
|
{
|
|
w+= getScrollBarWidth()+5;
|
|
}
|
|
$(this).jqGrid('setGridWidth',w);
|
|
// console.log("resetGridWidth " +w);
|
|
return w;
|
|
|
|
}});
|
|
|
|
sessionStorage.removeItem("dlLoadTime"); // disable loading for now
|
|
//console.log(sessionStorage.fvConfig);
|
|
var now = new Date();
|
|
var dlLoadTime = Date.parse(sessionStorage.dlLoadTime);
|
|
if (sessionStorage.dlLoadTime != undefined
|
|
&& (now.getTime() - dlLoadTime < fvConfig.reloadInt*60*1000)
|
|
)
|
|
{
|
|
loadCurState();
|
|
}
|
|
else
|
|
{
|
|
applyConfig();
|
|
loadServerState();
|
|
}
|
|
|
|
saveTO=setTimeout(saveCurState,fvConfig.saveInt);
|
|
|
|
|
|
// Allow jquery tooltip to format HTLML in title attribute
|
|
$( document ).tooltip(
|
|
{
|
|
content: function () {
|
|
var title = this.getAttribute("title");
|
|
if (title == " ")
|
|
{
|
|
return;
|
|
//title = null;
|
|
}
|
|
else
|
|
{
|
|
return decodeURI(title);
|
|
}
|
|
return title;
|
|
}
|
|
});
|
|
});
|
|
|
|
function getScrollBarWidth () {
|
|
// http://stackoverflow.com/questions/8079187/how-to-calculate-the-width-of-the-scroll-bar
|
|
// http://www.alexandre-gomes.com/?p=115
|
|
var inner = document.createElement('p');
|
|
inner.style.width = "100%";
|
|
inner.style.height = "200px";
|
|
|
|
var outer = document.createElement('div');
|
|
outer.style.position = "absolute";
|
|
outer.style.top = "0px";
|
|
outer.style.left = "0px";
|
|
outer.style.visibility = "hidden";
|
|
outer.style.width = "200px";
|
|
outer.style.height = "150px";
|
|
outer.style.overflow = "hidden";
|
|
outer.appendChild (inner);
|
|
|
|
document.body.appendChild (outer);
|
|
var w1 = inner.offsetWidth;
|
|
outer.style.overflow = 'scroll';
|
|
var w2 = inner.offsetWidth;
|
|
if (w1 == w2) w2 = outer.clientWidth;
|
|
|
|
document.body.removeChild (outer);
|
|
|
|
return (w1 - w2);
|
|
};
|
|
|