diff --git a/css/legacy/default.css b/css/legacy/default.css index 3fa1a27e6f..34a5125977 100644 --- a/css/legacy/default.css +++ b/css/legacy/default.css @@ -441,10 +441,9 @@ div.time_field select{ .datainputcell { padding: 2px 0px; } -.field_description { +.field_description, .help { margin: 3px 0px 11px 0px; color: #888; - font-size: 12px; font-style: italic; } diff --git a/css/legacy/forms.css b/css/legacy/forms.css index b99410aee6..a073ffe598 100644 --- a/css/legacy/forms.css +++ b/css/legacy/forms.css @@ -142,10 +142,9 @@ div.time_field select{ .datainputcell { padding: 2px 0px; } -.field_description { +.field_description, .help { margin: 3px 0px 11px 0px; color: #888; - font-size: 12px; font-style: italic; } diff --git a/js/legacy/utils/datetime.js b/js/legacy/utils/datetime.js index 89f20d27ac..ecea72c147 100644 --- a/js/legacy/utils/datetime.js +++ b/js/legacy/utils/datetime.js @@ -220,47 +220,51 @@ wn.datetime.time_to_hhmm = function(hh,mm,am) { return hh + ':' + mm; } -// when +/* + * JavaScript Pretty Date + * Copyright (c) 2011 John Resig (ejohn.org) + * Licensed under the MIT and GPL licenses. + */ -wn.datetime.comment_when = function(dt, only_days) { - - if(only_days) { - var cdate = dateutil.str_to_obj(dt.split(' ')[0]); - var diff = (new Date() - cdate) / 1000; - - if(diff < 604800) { - var t = Math.floor(diff/86400); - if(t==0) return "Today"; - if(t==1) return "Yesterday"; - return t + " days ago" - } else { - return cdate.getDate() + " " + month_list[cdate.getMonth()] + " " + cdate.getFullYear(); - } - } else { - var cdate = dateutil.str_to_obj(dt); - var diff = (new Date() - cdate) / 1000; - - if(diff < 60) { - return "Few moments ago" - } else if(diff < 3600) { - var t = Math.floor(diff/60); - return t + " minute" + (t==1?"":"s") + " ago" - } else if(diff < 86400) { - var t = Math.floor(diff/3600); - return t + " hour" + (t==1?"":"s") + " ago" - } else if(diff < 604800) { - var t = Math.floor(diff/86400); - return t + " day" + (t==1?"":"s") + " ago" - } else { - return cdate.getDate() + " " + month_list[cdate.getMonth()] + " " + cdate.getFullYear(); - } - } +// Takes an ISO time and returns a string representing how +// long ago the date represents. +function prettyDate(time){ + if(!time) return '' + var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/, "")), + diff = (((new Date()).getTime() - date.getTime()) / 1000), + day_diff = Math.floor(diff / 86400); + + if ( isNaN(day_diff) || day_diff < 0 ) + return ''; + + return day_diff == 0 && ( + diff < 60 && "just now" || + diff < 120 && "1 minute ago" || + diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" || + diff < 7200 && "1 hour ago" || + diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") || + day_diff == 1 && "Yesterday" || + day_diff < 7 && day_diff + " days ago" || + day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" || + day_diff < 365 && Math.ceil( day_diff / 30) + " months ago" || + "more than " + Math.floor( day_diff / 365 ) + " year(s) ago"; } +// If jQuery is included in the page, adds a jQuery plugin to handle it as well +if ( typeof jQuery != "undefined" ) + jQuery.fn.prettyDate = function(){ + return this.each(function(){ + var date = prettyDate(this.title); + if ( date ) + jQuery(this).text( date ); + }); + }; + +var comment_when = prettyDate; + // globals (deprecate) var date = dateutil = wn.datetime; var get_today = wn.datetime.get_today -var comment_when = wn.datetime.comment_when; var time_to_ampm = wn.datetime.time_to_ampm; var time_to_hhmm = wn.datetime.time_to_hhmm; var only_date = wn.datetime.only_date; diff --git a/js/legacy/utils/handler.js b/js/legacy/utils/handler.js index 0fb94789b6..31217e738c 100644 --- a/js/legacy/utils/handler.js +++ b/js/legacy/utils/handler.js @@ -33,11 +33,13 @@ function newHttpReq() { } // call execute serverside request -function $c(command, args, fn, on_timeout, no_spinner, freeze_msg) { +function $c(command, args, fn, on_timeout, no_spinner, freeze_msg, btn) { var req=newHttpReq(); ret_fn=function() { if (checkResponse(req, on_timeout, no_spinner, freeze_msg)) { - if(!no_spinner)hide_loading(); // Loaded + if(btn)$(btn).done_working(); + if(!no_spinner) + hide_loading(); // Loaded var rtxt = req.responseText; @@ -61,6 +63,7 @@ function $c(command, args, fn, on_timeout, no_spinner, freeze_msg) { if(fn)fn(r, rtxt); } } + if(btn) $(btn).set_working(); req.onreadystatechange=ret_fn; req.open("POST",outUrl,true); req.setRequestHeader("ENCTYPE", "multipart/form-data"); @@ -103,22 +106,37 @@ function validate_session(r,rt) { } // For calling an object -function $c_obj(doclist, method, arg, call_back, no_spinner, freeze_msg) { +function $c_obj(doclist, method, arg, call_back, no_spinner, freeze_msg, btn) { var args = { 'method':method, 'arg': (typeof arg=='string' ? arg : JSON.stringify(arg)) } if(typeof doclist=='string') args.doctype = doclist; else args.docs = compress_doclist(doclist) // single - $c('runserverobj',args, call_back, null, no_spinner, freeze_msg); + $c('runserverobj',args, call_back, null, no_spinner, freeze_msg, btn); } // For call a page metho -function $c_page(module, page, method, arg, call_back, no_spinner, freeze_msg) { +function $c_page(module, page, method, arg, call_back, no_spinner, freeze_msg, btn) { if(arg && !arg.substr) arg = JSON.stringify(arg); - $c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg}, call_back, null, no_spinner, freeze_msg); + $c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg}, + call_back, null, no_spinner, freeze_msg, btn); } +// generic server call (call page, object) +wn.call = function(args) { + if(args.module && args.page) { + $c_page(args.module, args.page, args.method, args.args, args.callback, + args.no_spinner, false, args.btn); + } else if(args.docs) { + $c_obj(args.doc, args.method, args.args, args.callback, args.no_spinner, + false, args.btn); + } else { + $c(args.method, args.args, args.callback, args.no_spinner, false, args.btn); + } +} + + // For calling an for output as csv function $c_obj_csv(doclist, method, arg) { // single @@ -138,12 +156,6 @@ function $c_obj_csv(doclist, method, arg) { open_url_post(outUrl, args); } - -// For loading a matplotlib Plot -function $c_graph(img, control_dt, method, arg) { - img.src = outUrl + '?' + makeArgString({cmd:'get_graph', dt:control_dt, method:method, arg:arg}); -} - function my_eval(co) { var w = window; @@ -159,93 +171,6 @@ function my_eval(co) { } } - -// For loading javascript file on demand using AJAX -function $c_js(fn, callback) { - var req=newHttpReq(); - - ret_fn=function() { - if (checkResponse(req, function() { }, 1, null)) { - if(req.responseText.substr(0,9)=='Not Found') { - alert(req.responseText); - return; - } - hide_loading(); - my_eval(req.responseText); - callback(); - } - } - - req.onreadystatechange=ret_fn; - req.open("POST",'cgi-bin/getjsfile.cgi',true); - req.setRequestHeader("ENCTYPE", "multipart/form-data"); - req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); - req.send(makeArgString({filename:fn})); - set_loading(); -} - -var load_queue = {}; -var currently_loading = {}; -var widgets = {}; -var single_widgets = {}; - -// load a widget on demand -// -------------------------------------------------------------- -function new_widget(widget, callback, single_type) { - var namespace = ''; - var widget_name = widget; - - if(widget.search(/\./) != -1) { - namespace = widget.split('.')[0]; - widget_name = widget.split('.')[1]; - } - - var widget_loaded = function() { - currently_loading[widget] = 0; - for(var i in load_queue[widget]) { - // callback - load_queue[widget][i](create_widget()); - } - - // clear the queue - load_queue[widget] = []; - } - - var create_widget = function() { - if(single_type && single_widgets[widget_name]) - return null; - - if(namespace) - var w = new window[namespace][widget_name](); - else - var w = new window[widget_name](); - - // add to singles - if(single_type) - single_widgets[widget_name] = w; - - return w; - } - - if(namespace ? window[namespace][widget_name] : window[widget_name]) { - // loaded? - callback(create_widget()); - } else { - - // loading in process - if(!load_queue[widget]) load_queue[widget] = []; - load_queue[widget].push(callback); - - // load only if not currently loading - if(!currently_loading[widget]) { - $c_js(widget_files[widget], widget_loaded); - } - - // flag it as loading - currently_loading[widget] = 1; - } -} - function makeArgString(dict) { var varList = []; @@ -273,100 +198,4 @@ function open_url_post(URL, PARAMS, new_window) { document.body.appendChild(temp); temp.submit(); return temp; -} - - -// Resume sessions -var resume_dialog = null; - -function resume_session() { - if(!resume_dialog) { - var d = new Dialog(400,200,'Session Expired'); - d.make_body([ - ['Password','password','Re-enter your password to resume the session'], ['Button','Go']]); - - // check password - d.widgets['Go'].onclick = function() { - resume_dialog.widgets['Go'].set_working(); - var callback = function(r, rt) { - resume_dialog.widgets['Go'].done_working(); - if(r.message == 'Logged In') { - - // okay - resume_dialog.allow_close=1; - resume_dialog.hide(); - setTimeout('resume_dialog.allow_close=0',100); - } else { - - // wrong password - msgprint('Wrong Password, try again'); - resume_dialog.wrong_count++; - if(resume_dialog.wrong_count > 2) logout(); - } - } - $c('resume_session',{pwd:resume_dialog.widgets['password'].value},callback) - } - d.onhide = function() { - if(!resume_dialog.allow_close) logout(); - } - resume_dialog = d; - } - resume_dialog.wrong_count = 0; - resume_dialog.show(); -} - -/** -* require is used for on demand loading of JavaScript -* -* require r1 // 2008.02.05 // jQuery 1.2.2 -* -* // basic usage (just like .accordion) -* $.require("comp1.js"); -* - -* @param jsFiles string array or string holding the js file names to load -* @param params object holding parameter like browserType, callback, cache -* @return The jQuery object -* @author Manish Shanker -*/ - -(function($){ - $.require = function(jsFiles, params) { - - var params = params || {}; - var bType = params.browserType===false?false:true; - - if (!bType){ - return $; - } - - var cBack = params.callBack || function(){}; - var eCache = params.cache===false?false:true; - - if (!$.require.loadedLib) $.require.loadedLib = {}; - - if ( !$.scriptPath ) { - var path = $('script').attr('src'); - $.scriptPath = path.replace(/\w+\.js$/, ''); - } - if (typeof jsFiles === "string") { - jsFiles = new Array(jsFiles); - } - for (var n=0; n< jsFiles.length; n++) { - if (!$.require.loadedLib[jsFiles[n]]) { - $.ajax({ - type: "GET", - url: $.scriptPath + jsFiles[n], - success: cBack, - dataType: "script", - cache: eCache, - async: false - }); - $.require.loadedLib[jsFiles[n]] = true; - } - } - //console.dir($.require.loadedLib); - - return $; - }; -})(jQuery); +} \ No newline at end of file diff --git a/js/legacy/webpage/history.js b/js/legacy/webpage/history.js index f6514db5d7..fce818c74c 100644 --- a/js/legacy/webpage/history.js +++ b/js/legacy/webpage/history.js @@ -144,7 +144,7 @@ function historyChange(newLocation) { if(t[0]=='Form') { _history_current = newLocation; - if(docname.substr(0, 3)=='New') { + if(docname.substr(0, 3)=='New' && !(locals[t[1]] && locals[t[1]][docname])) { newdoc(t[1]); } else { loaddoc(t[1], docname); diff --git a/js/legacy/wnf.compressed.js b/js/legacy/wnf.compressed.js index 14b2310a7f..0a4a58f7aa 100644 --- a/js/legacy/wnf.compressed.js +++ b/js/legacy/wnf.compressed.js @@ -117,9 +117,13 @@ if(t.length!=2){show_alert('[set_time] Incorect time format');return;} if(cint(t[0])==0)var ret=['12',t[1],'AM'];else if(cint(t[0])<12)var ret=[cint(t[0])+'',t[1],'AM'];else if(cint(t[0])==12)var ret=['12',t[1],'PM'];else var ret=[(cint(t[0])-12)+'',t[1],'PM'];return ret;} wn.datetime.time_to_hhmm=function(hh,mm,am){if(am=='AM'&&hh=='12'){hh='00';}else if(am=='PM'&&hh!='12'){hh=cint(hh)+12;} return hh+':'+mm;} -wn.datetime.comment_when=function(dt,only_days){if(only_days){var cdate=dateutil.str_to_obj(dt.split(' ')[0]);var diff=(new Date()-cdate)/1000;if(diff<604800){var t=Math.floor(diff/86400);if(t==0)return"Today";if(t==1)return"Yesterday";return t+" days ago"}else{return cdate.getDate()+" "+month_list[cdate.getMonth()]+" "+cdate.getFullYear();}}else{var cdate=dateutil.str_to_obj(dt);var diff=(new Date()-cdate)/1000;if(diff<60){return"Few moments ago"}else if(diff<3600){var t=Math.floor(diff/60);return t+" minute"+(t==1?"":"s")+" ago"}else if(diff<86400){var t=Math.floor(diff/3600);return t+" hour"+(t==1?"":"s")+" ago"}else if(diff<604800){var t=Math.floor(diff/86400);return t+" day"+(t==1?"":"s")+" ago"}else{return cdate.getDate()+" "+month_list[cdate.getMonth()]+" "+cdate.getFullYear();}}} -var date=dateutil=wn.datetime;var get_today=wn.datetime.get_today -var comment_when=wn.datetime.comment_when;var time_to_ampm=wn.datetime.time_to_ampm;var time_to_hhmm=wn.datetime.time_to_hhmm;var only_date=wn.datetime.only_date; +function prettyDate(time){if(!time)return'' +var date=new Date((time||"").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/,"")),diff=(((new Date()).getTime()-date.getTime())/1000),day_diff=Math.floor(diff/86400);if(isNaN(day_diff)||day_diff<0) +return'';return day_diff==0&&(diff<60&&"just now"||diff<120&&"1 minute ago"||diff<3600&&Math.floor(diff/60)+" minutes ago"||diff<7200&&"1 hour ago"||diff<86400&&Math.floor(diff/3600)+" hours ago")||day_diff==1&&"Yesterday"||day_diff<7&&day_diff+" days ago"||day_diff<31&&Math.ceil(day_diff/7)+" weeks ago"||day_diff<365&&Math.ceil(day_diff/30)+" months ago"||"more than "+Math.floor(day_diff/365)+" year(s) ago";} +if(typeof jQuery!="undefined") +jQuery.fn.prettyDate=function(){return this.each(function(){var date=prettyDate(this.title);if(date) +jQuery(this).text(date);});};var comment_when=prettyDate;var date=dateutil=wn.datetime;var get_today=wn.datetime.get_today +var time_to_ampm=wn.datetime.time_to_ampm;var time_to_hhmm=wn.datetime.time_to_hhmm;var only_date=wn.datetime.only_date; /* * lib/js/legacy/utils/dom.js */ @@ -240,54 +244,32 @@ unfreeze();return false;}} var pending_req=0;function newHttpReq(){if(!isIE) var r=new XMLHttpRequest();else if(window.ActiveXObject) var r=new ActiveXObject("Microsoft.XMLHTTP");return r;} -function $c(command,args,fn,on_timeout,no_spinner,freeze_msg){var req=newHttpReq();ret_fn=function(){if(checkResponse(req,on_timeout,no_spinner,freeze_msg)){if(!no_spinner)hide_loading();var rtxt=req.responseText;try{var r=JSON.parse(rtxt);}catch(e){alert('Handler Exception:'+rtxt);return;} +function $c(command,args,fn,on_timeout,no_spinner,freeze_msg,btn){var req=newHttpReq();ret_fn=function(){if(checkResponse(req,on_timeout,no_spinner,freeze_msg)){if(btn)$(btn).done_working();if(!no_spinner) +hide_loading();var rtxt=req.responseText;try{var r=JSON.parse(rtxt);}catch(e){alert('Handler Exception:'+rtxt);return;} if(freeze_msg)unfreeze();if(!validate_session(r,rtxt))return;if(r.exc){errprint(r.exc);console.log(r.exc);};if(r.server_messages){msgprint(r.server_messages);};if(r.docs){LocalDB.sync(r.docs);} saveAllowed=true;if(fn)fn(r,rtxt);}} -req.onreadystatechange=ret_fn;req.open("POST",outUrl,true);req.setRequestHeader("ENCTYPE","multipart/form-data");req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");args['cmd']=command;req.send(makeArgString(args));if(!no_spinner)set_loading();if(freeze_msg)freeze(freeze_msg,1);} +if(btn)$(btn).set_working();req.onreadystatechange=ret_fn;req.open("POST",outUrl,true);req.setRequestHeader("ENCTYPE","multipart/form-data");req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");args['cmd']=command;req.send(makeArgString(args));if(!no_spinner)set_loading();if(freeze_msg)freeze(freeze_msg,1);} function validate_session(r,rt){if(r.message=='Logged In'){start_sid=get_cookie('sid');return true;} if(start_sid&&start_sid!=get_cookie('sid')&&user&&user!='Guest'){page_body.set_session_changed();return;} if(r.exc&&r.session_status=='Session Expired'){resume_session();return;} if(r.exc&&r.session_status=='Logged Out'){msgprint('You have been logged out');setTimeout('redirect_to_login()',3000);return;} if(r.exc&&r.exc_type&&r.exc_type=='PermissionError'){loadpage('_home');} return true;} -function $c_obj(doclist,method,arg,call_back,no_spinner,freeze_msg){var args={'method':method,'arg':(typeof arg=='string'?arg:JSON.stringify(arg))} +function $c_obj(doclist,method,arg,call_back,no_spinner,freeze_msg,btn){var args={'method':method,'arg':(typeof arg=='string'?arg:JSON.stringify(arg))} if(typeof doclist=='string')args.doctype=doclist;else args.docs=compress_doclist(doclist) -$c('runserverobj',args,call_back,null,no_spinner,freeze_msg);} -function $c_page(module,page,method,arg,call_back,no_spinner,freeze_msg){if(arg&&!arg.substr)arg=JSON.stringify(arg);$c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg},call_back,null,no_spinner,freeze_msg);} +$c('runserverobj',args,call_back,null,no_spinner,freeze_msg,btn);} +function $c_page(module,page,method,arg,call_back,no_spinner,freeze_msg,btn){if(arg&&!arg.substr)arg=JSON.stringify(arg);$c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg},call_back,null,no_spinner,freeze_msg,btn);} +wn.call=function(args){if(args.module&&args.page){$c_page(args.module,args.page,args.method,args.args,args.callback,args.no_spinner,false,args.btn);}else if(args.docs){$c_obj(args.doc,args.method,args.args,args.callback,args.no_spinner,false,args.btn);}else{$c(args.method,args.args,args.callback,args.no_spinner,false,args.btn);}} function $c_obj_csv(doclist,method,arg){var args={} args.cmd='runserverobj';args.as_csv=1;args.method=method;args.arg=arg;if(doclist.substr) args.doctype=doclist;else args.docs=compress_doclist(doclist);open_url_post(outUrl,args);} -function $c_graph(img,control_dt,method,arg){img.src=outUrl+'?'+makeArgString({cmd:'get_graph',dt:control_dt,method:method,arg:arg});} function my_eval(co){var w=window;if(!w.execScript){if(/Gecko/.test(navigator.userAgent)){eval(co,w);}else{eval.call(w,co);}}else{w.execScript(co);}} -function $c_js(fn,callback){var req=newHttpReq();ret_fn=function(){if(checkResponse(req,function(){},1,null)){if(req.responseText.substr(0,9)=='Not Found'){alert(req.responseText);return;} -hide_loading();my_eval(req.responseText);callback();}} -req.onreadystatechange=ret_fn;req.open("POST",'cgi-bin/getjsfile.cgi',true);req.setRequestHeader("ENCTYPE","multipart/form-data");req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");req.send(makeArgString({filename:fn}));set_loading();} -var load_queue={};var currently_loading={};var widgets={};var single_widgets={};function new_widget(widget,callback,single_type){var namespace='';var widget_name=widget;if(widget.search(/\./)!=-1){namespace=widget.split('.')[0];widget_name=widget.split('.')[1];} -var widget_loaded=function(){currently_loading[widget]=0;for(var i in load_queue[widget]){load_queue[widget][i](create_widget());} -load_queue[widget]=[];} -var create_widget=function(){if(single_type&&single_widgets[widget_name]) -return null;if(namespace) -var w=new window[namespace][widget_name]();else -var w=new window[widget_name]();if(single_type) -single_widgets[widget_name]=w;return w;} -if(namespace?window[namespace][widget_name]:window[widget_name]){callback(create_widget());}else{if(!load_queue[widget])load_queue[widget]=[];load_queue[widget].push(callback);if(!currently_loading[widget]){$c_js(widget_files[widget],widget_loaded);} -currently_loading[widget]=1;}} function makeArgString(dict){var varList=[];for(key in dict){varList[varList.length]=key+'='+encodeURIComponent(dict[key]);} return varList.join('&');} function open_url_post(URL,PARAMS,new_window){var temp=document.createElement("form");temp.action=URL;temp.method="POST";temp.style.display="none";if(new_window){temp.target='_blank';} for(var x in PARAMS){var opt=document.createElement("textarea");opt.name=x;opt.value=PARAMS[x];temp.appendChild(opt);} document.body.appendChild(temp);temp.submit();return temp;} -var resume_dialog=null;function resume_session(){if(!resume_dialog){var d=new Dialog(400,200,'Session Expired');d.make_body([['Password','password','Re-enter your password to resume the session'],['Button','Go']]);d.widgets['Go'].onclick=function(){resume_dialog.widgets['Go'].set_working();var callback=function(r,rt){resume_dialog.widgets['Go'].done_working();if(r.message=='Logged In'){resume_dialog.allow_close=1;resume_dialog.hide();setTimeout('resume_dialog.allow_close=0',100);}else{msgprint('Wrong Password, try again');resume_dialog.wrong_count++;if(resume_dialog.wrong_count>2)logout();}} -$c('resume_session',{pwd:resume_dialog.widgets['password'].value},callback)} -d.onhide=function(){if(!resume_dialog.allow_close)logout();} -resume_dialog=d;} -resume_dialog.wrong_count=0;resume_dialog.show();} -(function($){$.require=function(jsFiles,params){var params=params||{};var bType=params.browserType===false?false:true;if(!bType){return $;} -var cBack=params.callBack||function(){};var eCache=params.cache===false?false:true;if(!$.require.loadedLib)$.require.loadedLib={};if(!$.scriptPath){var path=$('script').attr('src');$.scriptPath=path.replace(/\w+\.js$/,'');} -if(typeof jsFiles==="string"){jsFiles=new Array(jsFiles);} -for(var n=0;n