seitime-frappe/js/legacy/utils/handler.js
Rushabh Mehta f253fa8e0b version 2
2011-09-07 16:44:57 +05:30

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);