369 lines
8.5 KiB
JavaScript
369 lines
8.5 KiB
JavaScript
// My HTTP Request
|
|
|
|
var outUrl = "index.cgi";
|
|
var NULL_CHAR = '^\5*';
|
|
|
|
// check response of HTTP request, only if ready
|
|
function checkResponse(r, on_timeout, no_spinner, freeze_msg) {
|
|
try {
|
|
if (r.readyState==4 && r.status==200) return true; else return false;
|
|
} catch(e) {
|
|
// $i("icon_loading").style.visibility = "hidden"; WAINING MESSAGE
|
|
msgprint("error:Request timed out, try again");
|
|
if(on_timeout)
|
|
on_timeout();
|
|
|
|
hide_loading();
|
|
|
|
if(freeze_msg)
|
|
unfreeze();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
var pending_req = 0;
|
|
|
|
// new XMLHttpRequest object
|
|
function newHttpReq() {
|
|
if (!isIE)
|
|
var r=new XMLHttpRequest();
|
|
else if (window.ActiveXObject)
|
|
var r=new ActiveXObject("Microsoft.XMLHTTP");
|
|
return r;
|
|
}
|
|
|
|
// call execute serverside request
|
|
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(); // Loaded
|
|
|
|
var rtxt = req.responseText;
|
|
|
|
try {
|
|
var r = JSON.parse(rtxt);
|
|
} catch(e) {
|
|
alert('Handler Exception:' + rtxt);
|
|
return;
|
|
}
|
|
// unfreeze
|
|
if(freeze_msg)unfreeze();
|
|
|
|
if(!validate_session(r,rtxt)) return;
|
|
if(r.exc) { errprint(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(); // Loading
|
|
if(freeze_msg)freeze(freeze_msg,1);
|
|
}
|
|
|
|
function validate_session(r,rt) {
|
|
// check for midway change in session
|
|
if(r.message=='Logged In') {
|
|
start_sid = get_cookie('sid');
|
|
return true;
|
|
}
|
|
if(start_sid && start_sid != get_cookie('sid') && user!='Guest') {
|
|
page_body.set_session_changed();
|
|
return;
|
|
}
|
|
|
|
// check for expired session
|
|
if(r.exc && r.session_status=='Session Expired') {
|
|
resume_session();
|
|
return;
|
|
}
|
|
|
|
// check for logged out sesion
|
|
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;
|
|
}
|
|
|
|
// For calling an object
|
|
function $c_obj(doclist, method, arg, call_back, no_spinner, freeze_msg) {
|
|
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);
|
|
}
|
|
|
|
// For call a page metho
|
|
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);
|
|
}
|
|
|
|
// For calling an for output as csv
|
|
function $c_obj_csv(doclist, method, arg) {
|
|
// single
|
|
|
|
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
|
|
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;
|
|
|
|
// Evaluate script
|
|
if (!w.execScript) {
|
|
if (/Gecko/.test(navigator.userAgent)) {
|
|
eval(co, w); // Firefox 3.0
|
|
} else {
|
|
eval.call(w, co);
|
|
}
|
|
} else {
|
|
w.execScript(co); // IE
|
|
}
|
|
}
|
|
|
|
|
|
// 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 = [];
|
|
|
|
for(key in dict){
|
|
varList[varList.length] = key + '=' + encodeURIComponent(dict[key]);
|
|
}
|
|
return varList.join('&');
|
|
}
|
|
|
|
// call a url as POST
|
|
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;
|
|
}
|
|
|
|
|
|
// 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);
|