You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

369 rivejä
8.5 KiB

  1. // My HTTP Request
  2. var outUrl = "index.cgi";
  3. var NULL_CHAR = '^\5*';
  4. // check response of HTTP request, only if ready
  5. function checkResponse(r, on_timeout, no_spinner, freeze_msg) {
  6. try {
  7. if (r.readyState==4 && r.status==200) return true; else return false;
  8. } catch(e) {
  9. // $i("icon_loading").style.visibility = "hidden"; WAINING MESSAGE
  10. msgprint("error:Request timed out, try again");
  11. if(on_timeout)
  12. on_timeout();
  13. hide_loading();
  14. if(freeze_msg)
  15. unfreeze();
  16. return false;
  17. }
  18. }
  19. var pending_req = 0;
  20. // new XMLHttpRequest object
  21. function newHttpReq() {
  22. if (!isIE)
  23. var r=new XMLHttpRequest();
  24. else if (window.ActiveXObject)
  25. var r=new ActiveXObject("Microsoft.XMLHTTP");
  26. return r;
  27. }
  28. // call execute serverside request
  29. function $c(command, args, fn, on_timeout, no_spinner, freeze_msg) {
  30. var req=newHttpReq();
  31. ret_fn=function() {
  32. if (checkResponse(req, on_timeout, no_spinner, freeze_msg)) {
  33. if(!no_spinner)hide_loading(); // Loaded
  34. var rtxt = req.responseText;
  35. try {
  36. var r = eval("var a="+rtxt+";a");
  37. } catch(e) {
  38. alert('Handler Exception:' + rtxt);
  39. return;
  40. }
  41. // unfreeze
  42. if(freeze_msg)unfreeze();
  43. if(!validate_session(r,rtxt)) return;
  44. if(r.exc) { errprint(r.exc); };
  45. if(r.server_messages) { msgprint(r.server_messages);};
  46. if(r.docs) { LocalDB.sync(r.docs); }
  47. saveAllowed = true;
  48. if(fn)fn(r, rtxt);
  49. }
  50. }
  51. req.onreadystatechange=ret_fn;
  52. req.open("POST",outUrl,true);
  53. req.setRequestHeader("ENCTYPE", "multipart/form-data");
  54. req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  55. args['cmd']=command;
  56. req.send(makeArgString(args));
  57. if(!no_spinner)set_loading(); // Loading
  58. if(freeze_msg)freeze(freeze_msg,1);
  59. }
  60. function validate_session(r,rt) {
  61. // check for midway change in session
  62. if(r.message=='Logged In') {
  63. start_sid = get_cookie('sid');
  64. return true;
  65. }
  66. if(start_sid && start_sid != get_cookie('sid') && user!='Guest') {
  67. page_body.set_session_changed();
  68. return;
  69. }
  70. // check for expired session
  71. if(r.exc && r.session_status=='Session Expired') {
  72. resume_session();
  73. return;
  74. }
  75. // check for logged out sesion
  76. if(r.exc && r.session_status=='Logged Out') {
  77. msgprint('You have been logged out');
  78. setTimeout('redirect_to_login()', 3000);
  79. return;
  80. }
  81. if(r.exc && r.exc_type && r.exc_type=='PermissionError') {
  82. loadpage('_home');
  83. }
  84. return true;
  85. }
  86. // For calling an object
  87. function $c_obj(doclist, method, arg, call_back, no_spinner, freeze_msg) {
  88. var args = { 'method':method, 'arg': (typeof arg=='string' ? arg : JSON.stringify(arg)) }
  89. if(typeof doclist=='string') args.doctype = doclist;
  90. else args.docs = compress_doclist(doclist)
  91. // single
  92. $c('runserverobj',args, call_back, null, no_spinner, freeze_msg);
  93. }
  94. // For call a page metho
  95. function $c_page(module, page, method, arg, call_back, no_spinner, freeze_msg) {
  96. if(arg && !arg.substr) arg = JSON.stringify(arg);
  97. $c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg}, call_back, null, no_spinner, freeze_msg);
  98. }
  99. // For calling an for output as csv
  100. function $c_obj_csv(doclist, method, arg) {
  101. // single
  102. var args = {}
  103. args.cmd = 'runserverobj';
  104. args.as_csv = 1;
  105. args.method = method;
  106. args.arg = arg;
  107. if(doclist.substr)
  108. args.doctype = doclist;
  109. else
  110. args.docs = compress_doclist(doclist);
  111. // open
  112. open_url_post(outUrl, args);
  113. }
  114. // For loading a matplotlib Plot
  115. function $c_graph(img, control_dt, method, arg) {
  116. img.src = outUrl + '?' + makeArgString({cmd:'get_graph', dt:control_dt, method:method, arg:arg});
  117. }
  118. function my_eval(co) {
  119. var w = window;
  120. // Evaluate script
  121. if (!w.execScript) {
  122. if (/Gecko/.test(navigator.userAgent)) {
  123. eval(co, w); // Firefox 3.0
  124. } else {
  125. eval.call(w, co);
  126. }
  127. } else {
  128. w.execScript(co); // IE
  129. }
  130. }
  131. // For loading javascript file on demand using AJAX
  132. function $c_js(fn, callback) {
  133. var req=newHttpReq();
  134. ret_fn=function() {
  135. if (checkResponse(req, function() { }, 1, null)) {
  136. if(req.responseText.substr(0,9)=='Not Found') {
  137. alert(req.responseText);
  138. return;
  139. }
  140. hide_loading();
  141. my_eval(req.responseText);
  142. callback();
  143. }
  144. }
  145. req.onreadystatechange=ret_fn;
  146. req.open("POST",'cgi-bin/getjsfile.cgi',true);
  147. req.setRequestHeader("ENCTYPE", "multipart/form-data");
  148. req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  149. req.send(makeArgString({filename:fn}));
  150. set_loading();
  151. }
  152. var load_queue = {};
  153. var currently_loading = {};
  154. var widgets = {};
  155. var single_widgets = {};
  156. // load a widget on demand
  157. // --------------------------------------------------------------
  158. function new_widget(widget, callback, single_type) {
  159. var namespace = '';
  160. var widget_name = widget;
  161. if(widget.search(/\./) != -1) {
  162. namespace = widget.split('.')[0];
  163. widget_name = widget.split('.')[1];
  164. }
  165. var widget_loaded = function() {
  166. currently_loading[widget] = 0;
  167. for(var i in load_queue[widget]) {
  168. // callback
  169. load_queue[widget][i](create_widget());
  170. }
  171. // clear the queue
  172. load_queue[widget] = [];
  173. }
  174. var create_widget = function() {
  175. if(single_type && single_widgets[widget_name])
  176. return null;
  177. if(namespace)
  178. var w = new window[namespace][widget_name]();
  179. else
  180. var w = new window[widget_name]();
  181. // add to singles
  182. if(single_type)
  183. single_widgets[widget_name] = w;
  184. return w;
  185. }
  186. if(namespace ? window[namespace][widget_name] : window[widget_name]) {
  187. // loaded?
  188. callback(create_widget());
  189. } else {
  190. // loading in process
  191. if(!load_queue[widget]) load_queue[widget] = [];
  192. load_queue[widget].push(callback);
  193. // load only if not currently loading
  194. if(!currently_loading[widget]) {
  195. $c_js(widget_files[widget], widget_loaded);
  196. }
  197. // flag it as loading
  198. currently_loading[widget] = 1;
  199. }
  200. }
  201. function makeArgString(dict) {
  202. var varList = [];
  203. for(key in dict){
  204. varList[varList.length] = key + '=' + encodeURIComponent(dict[key]);
  205. }
  206. return varList.join('&');
  207. }
  208. // call a url as POST
  209. function open_url_post(URL, PARAMS, new_window) {
  210. var temp=document.createElement("form");
  211. temp.action=URL;
  212. temp.method="POST";
  213. temp.style.display="none";
  214. if(new_window){
  215. }
  216. for(var x in PARAMS) {
  217. var opt=document.createElement("textarea");
  218. opt.name=x;
  219. opt.value=PARAMS[x];
  220. temp.appendChild(opt);
  221. }
  222. document.body.appendChild(temp);
  223. temp.submit();
  224. return temp;
  225. }
  226. // Resume sessions
  227. var resume_dialog = null;
  228. function resume_session() {
  229. if(!resume_dialog) {
  230. var d = new Dialog(400,200,'Session Expired');
  231. d.make_body([
  232. ['Password','password','Re-enter your password to resume the session'], ['Button','Go']]);
  233. // check password
  234. d.widgets['Go'].onclick = function() {
  235. resume_dialog.widgets['Go'].set_working();
  236. var callback = function(r, rt) {
  237. resume_dialog.widgets['Go'].done_working();
  238. if(r.message == 'Logged In') {
  239. // okay
  240. resume_dialog.allow_close=1;
  241. resume_dialog.hide();
  242. setTimeout('resume_dialog.allow_close=0',100);
  243. } else {
  244. // wrong password
  245. msgprint('Wrong Password, try again');
  246. resume_dialog.wrong_count++;
  247. if(resume_dialog.wrong_count > 2) logout();
  248. }
  249. }
  250. $c('resume_session',{pwd:resume_dialog.widgets['password'].value},callback)
  251. }
  252. d.onhide = function() {
  253. if(!resume_dialog.allow_close) logout();
  254. }
  255. resume_dialog = d;
  256. }
  257. resume_dialog.wrong_count = 0;
  258. resume_dialog.show();
  259. }
  260. /**
  261. * require is used for on demand loading of JavaScript
  262. *
  263. * require r1 // 2008.02.05 // jQuery 1.2.2
  264. *
  265. * // basic usage (just like .accordion)
  266. * $.require("comp1.js");
  267. *
  268. * @param jsFiles string array or string holding the js file names to load
  269. * @param params object holding parameter like browserType, callback, cache
  270. * @return The jQuery object
  271. * @author Manish Shanker
  272. */
  273. (function($){
  274. $.require = function(jsFiles, params) {
  275. var params = params || {};
  276. var bType = params.browserType===false?false:true;
  277. if (!bType){
  278. return $;
  279. }
  280. var cBack = params.callBack || function(){};
  281. var eCache = params.cache===false?false:true;
  282. if (!$.require.loadedLib) $.require.loadedLib = {};
  283. if ( !$.scriptPath ) {
  284. var path = $('script').attr('src');
  285. $.scriptPath = path.replace(/\w+\.js$/, '');
  286. }
  287. if (typeof jsFiles === "string") {
  288. jsFiles = new Array(jsFiles);
  289. }
  290. for (var n=0; n< jsFiles.length; n++) {
  291. if (!$.require.loadedLib[jsFiles[n]]) {
  292. $.ajax({
  293. type: "GET",
  294. url: $.scriptPath + jsFiles[n],
  295. success: cBack,
  296. dataType: "script",
  297. cache: eCache,
  298. async: false
  299. });
  300. $.require.loadedLib[jsFiles[n]] = true;
  301. }
  302. }
  303. //console.dir($.require.loadedLib);
  304. return $;
  305. };
  306. })(jQuery);