Files
flowers/static/menu.js
T
2025-03-25 20:32:26 +00:00

385 lines
10 KiB
JavaScript
Executable File

/* COOKIES */
var editModus = '';
var Plugins = new Array();
var PageAge = -1;
var PageTimer;
var PlugDispState=[]; // state 1=visible, 0=hidden
var blockStyle = "block"
var alias = '/dashboard'
var Cookies = {
init: function () {
var allCookies = document.cookie.split('; ');
for (var i=0;i<allCookies.length;i++) {
var cookiePair = allCookies[i].split('=');
this[cookiePair[0]] = cookiePair[1];
}
},
create: function (name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
this[name] = value;
},
erase: function (name) {
this.create(name,'',-1);
this[name] = undefined;
}
};
Cookies.init();
function notXMLHttpRequest(x) {
//log('notXMLHttpRequest 1');
r = x
if (x instanceof XMLHttpRequest) {
r = evalJSONRequest(x);
}
return r;
}
function hide(element) {
getElement(element).style.display = 'None';
}
function unhide(element) {
getElement(element).style.display = blockStyle;
}
var Session = {
init: function(hostName) {
this.menuserver = hostName;
this.username = this.getUserId();
},
userid: function() {
return this.username+'@'+this.menuserver;
},
saveUserId: function(value) {
Cookies.create('userId', value, 300);
},
getUserId: function() {
return Cookies['userId'];
},
loadDispState: function() {
PlugDispState = [];
var states = Cookies['dispState'];
if (states) {
var slist = states.split('&');
for (i in slist) {
kv = slist[i].split(':');
PlugDispState[kv[0]]=kv[1];
}
}
},
saveDispState: function() {
var state = '';
for (k in PlugDispState) {
var v = PlugDispState[k];
state = state + k + ':' + v + '&';
}
Cookies.create('dispState', state, 300);
},
getDispState: function(plugin) {
return PlugDispState[plugin]+0;
},
setDispStateOff: function(plugin) {
PlugDispState[plugin]=0;
Session.saveDispState();
},
setDispStateOn: function(plugin) {
PlugDispState[plugin]=1;
Session.saveDispState();
}
}
var Ajax = {
ajaxFailed: function(err) {
// alert('Cannot fetch data from server, try again...');
Page.showServerError();
},
getConfig: function(userId, callback) {
// do a call to the server for the config for username@menuserver
//log('ajax: get menu as html');
var d = loadJSONDoc(alias+'/loadconfig?mode=html&userId=' + userId);
d.addCallbacks(callback, this.ajaxFailed);
},
getConfigAsText: function(userId, callback) {
// do a call to the server for the config for username@menuserver
var d = loadJSONDoc(alias+'/loadconfig?mode=text&userId=' + userId);
d.addCallbacks(callback, this.ajaxFailed);
},
saveMenuFromText: function(userId, menu, callback) {
var content = queryString({mode:'text',userId:userId, menu:menu})
var d = doXHR(alias+'/savemenu', {method:'POST', sendContent:content, headers:{"Content-Type":"application/x-www-form-urlencoded"}});
d.addCallbacks(callback, this.ajaxFailed);
},
savePlugsFromText: function(userId, plugs, callback) {
//log('Ajax.savePlugsFromText')
var content = queryString({mode:'text',userId:userId, plugs:plugs})
var d = doXHR(alias+'/saveplugs', {method:'POST', sendContent:content, headers:{"Content-Type":"application/x-www-form-urlencoded"}});
d.addCallbacks(callback, this.ajaxFailed);
},
loadPlugin: function(userId, pluginName, parameters, callbackFunction) {
// do a call to the server for the config for username@menuserver
//log('ajax: get pluginbody for ' + pluginName);
var d = loadJSONDoc(alias+'/loadPlugin?plugin='+pluginName+'&parameters='+urlEncode(parameters)+'&userId=' + Session.userid());
d.addCallbacks(callbackFunction, this.ajaxFailed);
//log(' cbtostr: '+callback.toString());
}
}
var Page = {
start: function(hostName) {
Session.init(hostName);
connect('username', 'onchange', this, 'userNameChanged');
//log('Page.start');
EditArea.init(this);
getElement('username').value = Session.username;
Session.loadDispState();
Ajax.getConfig(Session.userid(), this.redrawPage);
},
userNameChanged: function() {
Session.saveUserId(getElement('username').value); // stored in cookie
Ajax.getConfig(Session.userid(), Page.redrawPage);
},
redrawPage: function(transport) {
Page.redrawMenu(transport);
Page.redrawPlugs(transport);
},
redrawMenu: function(transport) {
Page.hideServerError();
//log('Page.redrawMenu ');
transport = notXMLHttpRequest(transport);
//getElement('menu3').innerHTML = transport.menu;
},
redrawPlugs: function(transport) {
Page.hideServerError();
transport = notXMLHttpRequest(transport);
log('Page.redrawPlugs'+transport.plugs);
Plugins = [];
var html = '';
var column = 1;
var plist = transport.plugs.split('\n');
var nr = 0;
for (i in plist) {
var plug = plist[i].replace(/^\s+|\s+$/g,"");
log('running along plist ' + plug);
if (plug.length<10) {
getElement('column'+column).innerHTML = html;
html = '';
column = column + 1;
} else {
if (plug[0]!='#') {
p = new Plugin(nr, plug);
Plugins[nr]=p;
html = html + '<div id="plugin'+nr+'" class="plugindiv"></div>';
nr += 1;
}
}
}
//log('Page - end of redraw');
// reset
Page.refreshPlugins();
},
refreshPlugins: function() {
//log('Page.refreshPlugins age='+PageAge);
PageAge += 1;
PageTimer = callLater(60, Page.refreshPlugins);
//log('triggered ....' + PageAge);
for (p in Plugins) {
Plugins[p].refresh(PageAge);
}
},
editMenu: function() {
EditArea.edit('m');
},
editMenuItem: function() {
EditArea.edit();
},
editPlugins: function() {
EditArea.edit('p');
},
showServerError: function() {
getElement('servererror').style.display = blockStyle;
},
hideServerError: function() {
getElement('servererror').style.display = 'None';
}
};
var EditArea = {
init: function(caller) {
this.page=caller
connect('savemenu', 'onclick', EditArea, 'save');
connect('saveexitmenu', 'onclick', EditArea, 'saveExit');
connect('closemenu', 'onclick', EditArea, 'hide');
},
edit: function(modus) {
editModus = modus
getElement('editarea').style.display = blockStyle;
if (editModus=='m') {
Ajax.getConfigAsText(Session.userid(), EditArea.redrawMenu);
}
if (editModus=='p') {
Ajax.getConfigAsText(Session.userid(), EditArea.redrawPlugs);
}
},
save: function() {
menu = getElement('menulines').value;
getElement('editarea').style.display = blockStyle;
if (editModus=='m') {
//log('Editarea.save: saving menu');
Ajax.saveMenuFromText(Session.userid(), getElement('menulines').value, Page.redrawMenu);
}
if (editModus=='p') {
//log('Editarea.save: saving plugins');
if (PageTimer) {
PageTimer.cancel;
}
PageAge=-1;
Ajax.savePlugsFromText(Session.userid(), getElement('menulines').value, Page.redrawPlugs);
}
},
saveExit: function() {
this.save();
this.hide();
},
hide: function() {
getElement('editarea').style.display = 'None';
},
redrawMenu: function(transport) {
Page.hideServerError();
//Page.redrawMenu(transport);
getElement('menulines').value = transport.menu;
},
redrawPlugs: function(transport) {
Page.hideServerError();
//Page.redrawPlugs(transport);
getElement('menulines').value = transport.plugs;
}
};
var EditPage = {
start: function(hostName) {
Session.init(hostName);
//log('start page');
EditArea.init(this);
Ajax.getConfig(Session.userid(), this.redrawPage);
},
redrawPage: function(transport) {
Page.hideServerError();
//log('ep: redraw page');
transport = notXMLHttpRequest(transport);
EditPage.redrawMenu(transport);
EditArea.edit();
},
redrawMenu: function(transport) {
Page.hideServerError();
//log('ep: redraw menu');
transport = notXMLHttpRequest(transport);
//log('redrawPage: ' + transport.menu);
//alert(transport);
getElement('menu3').innerHTML = transport.menu;
}
}
/********************* plugin object *********************/
function Plugin(nr, initstring) { // Define super class
// set divname, name, serverquery and timer
this.nr = nr;
this.divname = 'plugin' + nr;
// the initstrig should look like:
// <name>:<functionname>([<param1>[, param2 ..]]),<refreshrate in minutes>
var objRegExp = /^(\w+):.*$/;
this.title = initstring.replace(objRegExp, "$1");
objRegExp = /^\w*:(\w+)\(.*$/;
this.func = initstring.replace(objRegExp, "$1");
objRegExp = /^[^(]+\(([^)]*).*$/;
this.params = initstring.replace(objRegExp, "$1");
//log(this.params);
objRegExp = /.+\),(\d+)$/;
this.refreshrate = parseInt(initstring.replace(objRegExp, "$1"));
this.nextrefreshage = 0;
//log('created plugin '+this.title + ', '+this.func);
}
Plugin.prototype.refresh = function(age) { // Define Method
//log(' Refresh ' + this.divname );
if (age >= this.nextrefreshage) {
//log(' Refresh 2 ' + this.divname );
this.nextrefreshage += this.refreshrate;
Ajax.loadPlugin(Session.userid, this.func, this.params, bind(this.redraw, this))
}
}
Plugin.prototype.redraw = function(transport) { // Define Method
//log('redraw '+this.nr);
Page.hideServerError();
var body = '<div id="plugbody'+this.nr+'" class="plugbody">'+transport.plugin+'</div>';
var header = '<a class="plugheader" href="javascript:Plugins['+this.nr+'].toggle();"><img id="toggle'+this.nr+'" src=alias+"/static/icon_minus.gif"/></a>'
var html = '<table class="big"><tr><td class="plugtitle">'+this.title+'</td><td class="plugheader">'+header+'</td></tr><td class="plugbody" colspan="2">'+body+'</td></table>';
getElement(this.divname).innerHTML = html;
this.setDispState(Session.getDispState(this.title));
//log('REDRAW');
}
Plugin.prototype.toggle = function() { // Define Method
var button = getElement('toggle'+this.nr).src;
// could be a plus or a minus button
if (button.indexOf('minus')>=0) {
this.setDispState(0);
} else {
this.setDispState(1);
}
}
Plugin.prototype.setDispState = function(state) { // Define Method
var div = 'plugbody'+this.nr;
if (state == 0) {
hide(div);
getElement('toggle'+this.nr).src=alias+"/static/icon_plus.gif";
Session.setDispStateOff(this.title);
} else {
unhide(div);
getElement('toggle'+this.nr).src=alias+"/static/icon_minus.gif";
Session.setDispStateOn(this.title);
}
}