megar 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +1 -0
  3. data/.rvmrc +1 -0
  4. data/.travis.yml +11 -0
  5. data/CHANGELOG +5 -0
  6. data/Gemfile +4 -0
  7. data/Guardfile +11 -0
  8. data/LICENSE +22 -0
  9. data/README.rdoc +218 -0
  10. data/Rakefile +33 -0
  11. data/bin/megar +16 -0
  12. data/lib/extensions/math.rb +13 -0
  13. data/lib/js_ref_impl/_README +9 -0
  14. data/lib/js_ref_impl/base64_1.js +83 -0
  15. data/lib/js_ref_impl/crypto_5.js +1795 -0
  16. data/lib/js_ref_impl/download_8.js +867 -0
  17. data/lib/js_ref_impl/hex_1.js +76 -0
  18. data/lib/js_ref_impl/index_9.js +666 -0
  19. data/lib/js_ref_impl/js.manifest +115 -0
  20. data/lib/js_ref_impl/rsa_1.js +456 -0
  21. data/lib/js_ref_impl/sjcl_1.js +1 -0
  22. data/lib/js_ref_impl/upload_10.js +691 -0
  23. data/lib/megar.rb +11 -0
  24. data/lib/megar/catalog.rb +5 -0
  25. data/lib/megar/catalog/catalog_item.rb +90 -0
  26. data/lib/megar/catalog/file.rb +14 -0
  27. data/lib/megar/catalog/files.rb +13 -0
  28. data/lib/megar/catalog/folder.rb +20 -0
  29. data/lib/megar/catalog/folders.rb +28 -0
  30. data/lib/megar/connection.rb +84 -0
  31. data/lib/megar/crypto.rb +399 -0
  32. data/lib/megar/exception.rb +55 -0
  33. data/lib/megar/session.rb +157 -0
  34. data/lib/megar/shell.rb +87 -0
  35. data/lib/megar/version.rb +3 -0
  36. data/megar.gemspec +30 -0
  37. data/spec/fixtures/crypto_expectations/sample_user.json +109 -0
  38. data/spec/spec_helper.rb +24 -0
  39. data/spec/support/crypto_expectations_helper.rb +44 -0
  40. data/spec/support/mocks_helper.rb +22 -0
  41. data/spec/unit/catalog/file_spec.rb +31 -0
  42. data/spec/unit/catalog/files_spec.rb +26 -0
  43. data/spec/unit/catalog/folder_spec.rb +28 -0
  44. data/spec/unit/catalog/folders_spec.rb +49 -0
  45. data/spec/unit/connection_spec.rb +50 -0
  46. data/spec/unit/crypto_spec.rb +476 -0
  47. data/spec/unit/exception_spec.rb +35 -0
  48. data/spec/unit/extensions/math_spec.rb +21 -0
  49. data/spec/unit/session_spec.rb +146 -0
  50. data/spec/unit/shell_spec.rb +18 -0
  51. metadata +238 -0
@@ -0,0 +1,76 @@
1
+
2
+ /*
3
+ * conversion functions:
4
+ * - num array to string
5
+ * - string to hex
6
+ */
7
+
8
+ function s2b(s)
9
+ {
10
+ var bn=1, r=[0], rn=0, sn=0, sb=256;
11
+ var bits=s.length*8;
12
+
13
+ for(var n=0; n<bits; n++)
14
+ {
15
+ if((sb<<=1) > 255)
16
+ {
17
+ sb=1; c=s.charCodeAt(sn++);
18
+ }
19
+ if(bn > bm)
20
+ {
21
+ bn=1;
22
+ r[++rn]=0;
23
+ }
24
+ if(c & sb) r[rn]|=bn;
25
+ bn<<=1;
26
+ }
27
+ return r;
28
+ }
29
+
30
+ function b2s(b)
31
+ {
32
+ var bn=1, bc=0, r=[0], rb=1, rn=0;
33
+ var bits=b.length*bs;
34
+ var n, rr='';
35
+
36
+ for(n=0; n<bits; n++)
37
+ {
38
+ if(b[bc] & bn) r[rn]|=rb;
39
+ if((rb<<=1) > 255)
40
+ {
41
+ rb=1; r[++rn]=0;
42
+ }
43
+ if((bn<<=1) > bm)
44
+ {
45
+ bn=1; bc++;
46
+ }
47
+ }
48
+
49
+ while(rn >= 0 && r[rn]==0) rn--;
50
+ for(n=0; n<=rn; n++) rr=String.fromCharCode(r[n])+rr;
51
+ return rr;
52
+ }
53
+
54
+ function s2hex(s)
55
+ {
56
+ var result = '';
57
+ for(var i=0; i<s.length; i++)
58
+ {
59
+ c = s.charCodeAt(i);
60
+ result += ((c<16) ? "0" : "") + c.toString(16);
61
+ }
62
+ return result;
63
+ }
64
+
65
+ function hex2s(hex)
66
+ {
67
+ var r='';
68
+ if(hex.indexOf("0x") == 0 || hex.indexOf("0X") == 0) hex = hex.substr(2);
69
+
70
+ if(hex.length%2) hex+='0';
71
+
72
+ for(var i = 0; i<hex.length; i += 2)
73
+ r += String.fromCharCode(parseInt(hex.slice(i, i+2), 16));
74
+ return r;
75
+ }
76
+
@@ -0,0 +1,666 @@
1
+ var fmdirid=false;
2
+ var u_type,cur_page,u_checked
3
+ var page = '';
4
+ var subpage = '';
5
+ var confirmcode = false;
6
+ var confirmok = false;
7
+ var signupcode = false;
8
+ var hash = window.location.hash;
9
+ var chrome_msg=false;
10
+ var init_anoupload=false;
11
+ var blogid =false;
12
+ var pwchangecode=false;
13
+ var resetpwcode=false;
14
+ var resetpwemail='';
15
+
16
+ if (window.location.hash) page = window.location.hash.replace('#','');
17
+
18
+
19
+
20
+ function hasFlash()
21
+ {
22
+ var f=swfobject.getFlashPlayerVersion();
23
+ if ((f.major >= 11) && (f.minor >= 5)) return true;
24
+ else if ((Ext.isLinux) && (f.major >= 11)) return true;
25
+ else return false;
26
+ }
27
+
28
+
29
+ function pagebrowse(p)
30
+ {
31
+ page = p;
32
+ init_page();
33
+ }
34
+
35
+ function logout()
36
+ {
37
+ u_logout();
38
+ document.location.href = '/';
39
+ }
40
+
41
+ function tmenu()
42
+ {
43
+ if (document.getElementById('top_pullmenu').style.display == '') document.getElementById('top_pullmenu').style.display='none';
44
+ else document.getElementById('top_pullmenu').style.display='';
45
+ }
46
+
47
+ function lmenu()
48
+ {
49
+ if (document.getElementById('language_menu').style.display == '') document.getElementById('language_menu').style.display='none';
50
+ else document.getElementById('language_menu').style.display='';
51
+ }
52
+
53
+
54
+ function hashchange()
55
+ {
56
+ var p = window.location.hash.replace('#','');
57
+ if (d) console.log(p);
58
+ pagebrowse(p);
59
+ }
60
+
61
+ function parsetopmenu()
62
+ {
63
+ var top = translate(pages['top']);
64
+ if (u_type) top = translate(pages['topl']);
65
+ return top;
66
+ }
67
+
68
+ function addmenuoptions()
69
+ {
70
+ if (document.getElementById('language_menu_options'))
71
+ {
72
+ var lc=0;
73
+ for (var lng in languages) if (languages[lng].length > 0) lc++;
74
+ var tl = lc;
75
+ lc = Math.ceil(lc/4);
76
+
77
+ var m = '<div class="nlanguage-txt-block">';
78
+ var i=1;
79
+ var x=1;
80
+ for (var lng in languages)
81
+ {
82
+ if (languages[lng].length > 0)
83
+ {
84
+ m += '<a href="javascript:setlang(\'' + lng + '\');" class="nlanguage-lnk"><span class="nlanguage-tooltip"> <span class="nlanguage-tooltip-bg"> <span class="nlanguage-tooltip-main"> ' + ln2[lng] + '</span></span></span>' + ln[lng] + '</a><div class="clear"></div>';
85
+
86
+ if ((lc*x == i) && (i !== tl))
87
+ {
88
+ m+='</div><div class="nlanguage-txt-block">';
89
+ x++;
90
+ }
91
+ i++;
92
+ }
93
+ }
94
+ m+='</div><div class="clear"></div>';
95
+ document.getElementById('language_menu_options').innerHTML = m;
96
+ document.getElementById('language_menu_selected').innerHTML = ln[lang].replace('Brasil','BR');
97
+ }
98
+ }
99
+
100
+
101
+ function setlang(lang)
102
+ {
103
+ if (downloading || ul_uploading)
104
+ {
105
+ alert(l[375]);
106
+ return false;
107
+ }
108
+ localStorage.lang = lang;
109
+ window.location.reload();
110
+ }
111
+
112
+ function parsepage(pagehtml)
113
+ {
114
+ pagehtml = translate(pagehtml);
115
+ pagehtml = pagehtml.replace(/{staticpath}/g,staticpath);
116
+
117
+ var top = parsetopmenu();
118
+
119
+ document.getElementById('topmenufm').innerHTML ='';
120
+ document.getElementById('topmenufm').style.display='none';
121
+ document.getElementById('fmholder').style.display='none';
122
+
123
+ if (page == 'start')
124
+ {
125
+ document.getElementById('bodyel').className = 'start-page';
126
+ }
127
+ else
128
+ {
129
+ document.getElementById('bodyel').className = 'bottom-pages';
130
+ }
131
+
132
+ document.getElementById('pageholder').style.display='';
133
+ document.getElementById('pageholder').innerHTML = translate(top) + pagehtml + translate(pages['bottom']);
134
+
135
+
136
+ addmenuoptions();
137
+
138
+
139
+ $j('#menu_hover').tooltip({ position: "bottom center"});
140
+ $j('#language_hover').tooltip({ position: "bottom center"});
141
+
142
+ if (u_type === 0)
143
+ {
144
+ document.getElementById('menu_login').style.display='none';
145
+ document.getElementById('menu_abort').style.display='';
146
+ }
147
+
148
+
149
+ if ((page == 'developers') && (Ext.userAgent.toLowerCase().indexOf('chrome') > 0))
150
+ {
151
+ $('html')[0].style.height = 'auto';
152
+ $('html')[0].style.overflow = 'auto';
153
+ }
154
+ else
155
+ {
156
+ $('html')[0].style.height = '100%';
157
+ $('html')[0].style.overflow = 'hidden';
158
+ }
159
+
160
+ if ($(".top-head")) $(".top-head")[0].scrollIntoView();
161
+
162
+ $j('#ribon_hover').tooltip({ position: "bottom center" });
163
+ }
164
+
165
+ function init_page_fm()
166
+ {
167
+ if (d) console.log('init_page_fm()');
168
+ if (d) console.log(extjsloaded);
169
+ document.getElementById('bodyel').className = '';
170
+ if (!extjsloaded)
171
+ {
172
+ if (d) console.log('Ext not ready.');
173
+ setTimeout("init_page_fm()",250);
174
+ }
175
+ else
176
+ {
177
+ $('html')[0].style.height = '100%';
178
+ $('html')[0].style.overflow = 'hidden';
179
+ if (!init_l)
180
+ {
181
+ document.getElementById('pageholder').style.display='none';
182
+ document.getElementById('pageholder').innerHTML = '';
183
+
184
+ if (init_anoupload)
185
+ {
186
+ if (ul_method)
187
+ {
188
+ document.getElementById('topmenu').innerHTML = '';
189
+ document.getElementById('start_button1').style.display='none';
190
+ document.getElementById('start_uploadbutton').style.width='1px';
191
+ document.getElementById('start_uploadbutton').style.height='1px';
192
+ }
193
+ else
194
+ {
195
+ document.getElementById('nstartholder').style.display='none';
196
+ document.getElementById('nstartholder').innerHTML = '';
197
+ }
198
+ }
199
+ else
200
+ {
201
+ document.getElementById('nstartholder').style.display='none';
202
+ document.getElementById('nstartholder').innerHTML = '';
203
+ }
204
+ }
205
+ document.getElementById('topmenufm').innerHTML = parsetopmenu();
206
+ addmenuoptions();
207
+ $j('#menu_hover').tooltip({ position: "bottom center"});
208
+ $j('#language_hover').tooltip({position: "bottom center"});
209
+ if (!init_l) document.getElementById('fmholder').style.display='';
210
+ if (!fmstarted) startfm();
211
+ else
212
+ {
213
+ document.getElementById('topmenufm').style.display='';
214
+ mainpanel.doComponentLayout();
215
+ }
216
+ }
217
+ }
218
+
219
+
220
+
221
+ function is_fm()
222
+ {
223
+ if ((((u_type !== false) && (page == '')) || ((u_type !== false) && (page == 'fm')) || ((u_type !== false) && (page == 'start')))) return true;
224
+ else return false;
225
+ }
226
+
227
+ var dlid=false;
228
+ var dlkey=false;
229
+ var cn_url=false;
230
+ var init_l=true;
231
+
232
+
233
+ function init_page()
234
+ {
235
+ if (extjsloaded && u_checked)
236
+ {
237
+ subpage='';
238
+ if (d) console.log(page);
239
+
240
+ if (dl_legacy_ie) document.getElementById('startswfdiv').innerHTML = '<object data="/downloader.swf" id="start_downloaderswf" type="application/x-shockwave-flash" height="0" width="0"><param name="wmode" value="transparent"><param value="always" name="allowscriptaccess"><param value="all" name="allowNetworking"></object>';
241
+
242
+ if (d) console.log(page);
243
+
244
+ page = page.replace('%21','!');
245
+
246
+ if ((page.substr(0,1) == '!') && (page.length > 1))
247
+ {
248
+ dlkey=false;
249
+ var ar = page.substr(1,page.length-1).split('!');
250
+ if (d) console.log(ar);
251
+ if (ar[0]) dlid = ar[0].replace(/[^a-z^A-Z^0-9^_^-]/g,"");
252
+ if (ar[1]) dlkey = ar[1].replace(/[^a-z^A-Z^0-9^_^-]/g,"");
253
+ }
254
+
255
+ confirmcode = false;
256
+ pwchangecode = false;
257
+
258
+ if ((page.substr(0,2) == 'fm') && (page.length > 2))
259
+ {
260
+ fmdirid = page.substr(2,page.length-2).replace(/[^a-z^A-Z^0-9^_^-]/g,"");
261
+ page = 'fm';
262
+ }
263
+
264
+ if (!is_fm())
265
+ {
266
+ init_l=false;
267
+ document.getElementById('loading').style.display='none';
268
+ }
269
+
270
+ if (page.substr(0,7) == 'confirm')
271
+ {
272
+ confirmcode = page.replace("confirm","");
273
+ page = 'confirm';
274
+ }
275
+
276
+
277
+ if (page.substr(0,7) == 'pwreset')
278
+ {
279
+ resetpwcode = page.replace("pwreset","");
280
+ page = 'resetpassword';
281
+ }
282
+
283
+ if (page.substr(0,5) == 'newpw')
284
+ {
285
+ pwchangecode = page.replace("newpw","");
286
+ page = 'newpw';
287
+ }
288
+
289
+ if (page.substr(0,4) == 'help')
290
+ {
291
+ if (page.length > 4) subpage = page.substr(5,page.length-1)
292
+ page = 'help';
293
+ }
294
+
295
+ if (page.substr(0,15) == 'copyrightnotice')
296
+ {
297
+ if (page.length > 15) cn_url = base64urldecode(page.substr(15,page.length-1));
298
+ page = 'copyrightnotice';
299
+ }
300
+
301
+ if (!b_u)
302
+ {
303
+ try { localStorage.test = '1'; }
304
+ catch(err) { page = 'chrome'; chrome_msg = 'an essential browser feature seems disabled and prevents you from accessing MEGA.<br>Please make sure your browser allows local data to be set.'; }
305
+ }
306
+ if ((page.substr(0,4) == 'blog') && (page.length > 4))
307
+ {
308
+ blogid = page.substr(5,page.length-2);
309
+ page = 'blogarticle';
310
+ }
311
+
312
+ if (page.substr(0,6) == 'signup')
313
+ {
314
+ signupcode = subpage = page.substr(6,page.length-1);
315
+ var req =
316
+ {
317
+ a: 'uv',
318
+ c: signupcode
319
+ };
320
+ api_req([req],
321
+ {
322
+ callback : function (json,params)
323
+ {
324
+ if ((typeof json[0] == 'number') && (json[0] < 0))
325
+ {
326
+ alert('Invalid signup code!');
327
+ parsepage(pages['nstart']);
328
+ init_nstart();
329
+ }
330
+ else
331
+ {
332
+ parsepage(pages['register']);
333
+ init_register();
334
+ register_signup(json[0]);
335
+ }
336
+ }
337
+ });
338
+ }
339
+ else if (page == 'newpw')
340
+ {
341
+ setpwset(pwchangecode,{callback: function(res)
342
+ {
343
+ loadingDialog.hide();
344
+ if ((res[0] == EACCESS) || (res[0] == 0)) alert(l[727]);
345
+ else if(res[0] == EEXPIRED) alert(l[728]);
346
+ else if(res[0] == ENOENT) alert(l[729]);
347
+ else alert(l[200]);
348
+ if (u_type == 3)
349
+ {
350
+ page = 'account';
351
+ parsepage(pages['account']);
352
+ load_acc();
353
+ }
354
+ else
355
+ {
356
+ page = 'login';
357
+ parsepage(pages['login']);
358
+ init_login();
359
+ }
360
+ }});
361
+ }
362
+ else if (page == 'confirm')
363
+ {
364
+ var ctx =
365
+ {
366
+ signupcodeok: function(email,name)
367
+ {
368
+ confirmok=true;
369
+ page = 'login';
370
+ parsepage(pages['login']);
371
+ login_txt = l[378];
372
+ init_login();
373
+ document.getElementById('login_email').value = email;
374
+ document.getElementById('login_title').innerHTML = 'Confirm';
375
+ document.getElementById('login_button').innerHTML = 'Confirm';
376
+ document.getElementById('login_password').value = '';
377
+ document.getElementById('login_password').focus();
378
+ },
379
+ signupcodebad: function(res)
380
+ {
381
+ if (res == EINCOMPLETE) alert(l[703]);
382
+ else if (res == ENOENT) login_txt = l[704];
383
+ else alert(l[705] + res);
384
+ page = 'login';
385
+ parsepage(pages['login']);
386
+ init_login();
387
+ }
388
+ }
389
+ verifysignupcode(confirmcode,ctx);
390
+ }
391
+ else if (u_type == 2)
392
+ {
393
+ parsepage(pages['key']);
394
+ if (typeof u_privk == 'undefined')
395
+ {
396
+ genkey();
397
+ }
398
+ }
399
+ else if (page == 'login')
400
+ {
401
+ parsepage(pages['login']);
402
+ init_login();
403
+ }
404
+ else if (page == 'resetpassword')
405
+ {
406
+ api_req([{a: 'upkc', uk: resetpwcode}],
407
+ {
408
+ callback : function (json,params)
409
+ {
410
+ if (typeof json[0] == 'string')
411
+ {
412
+
413
+ resetpwemail = json[0];
414
+ parsepage(pages['forgotpassword']);
415
+ fp_init(true);
416
+ }
417
+ else
418
+ {
419
+ if (json[0] == EEXPIRED) alert(l[743]);
420
+ else alert(l[744]);
421
+ parsepage(pages['forgotpassword']);
422
+ fp_init(false);
423
+ }
424
+ }
425
+ });
426
+ }
427
+ else if (page == 'forgotpassword')
428
+ {
429
+ parsepage(pages['forgotpassword']);
430
+ fp_init(false);
431
+ }
432
+ else if (page == 'investors')
433
+ {
434
+ parsepage(pages['investors']);
435
+ }
436
+ else if (page == 'register')
437
+ {
438
+ parsepage(pages['register']);
439
+ init_register();
440
+ }
441
+ else if (page == 'chrome')
442
+ {
443
+ parsepage(pages['chrome']);
444
+ init_chrome();
445
+ }
446
+ else if (page == 'key')
447
+ {
448
+ parsepage(pages['key']);
449
+ }
450
+ else if (page == 'contact')
451
+ {
452
+ parsepage(pages['contact']);
453
+ }
454
+ else if ((page == 'help') && (subpage != ''))
455
+ {
456
+ parsepage(pages['help']);
457
+ init_helpsub();
458
+ }
459
+ else if (page == 'help')
460
+ {
461
+ parsepage(pages['help']);
462
+ init_help();
463
+ }
464
+ else if (page == 'privacy')
465
+ {
466
+ parsepage(pages['privacy']);
467
+ }
468
+ else if (page == 'privacycompany')
469
+ {
470
+ parsepage(pages['privacycompany']);
471
+ privacycompany_init();
472
+ }
473
+ else if (page == 'developers')
474
+ {
475
+ parsepage(pages['developers']);
476
+ dev_init();
477
+ }
478
+ else if (page == 'about')
479
+ {
480
+ parsepage(pages['about']);
481
+ }
482
+ else if (page == 'terms')
483
+ {
484
+ parsepage(pages['terms']);
485
+ }
486
+ else if (page == 'resellerintro')
487
+ {
488
+ parsepage(pages['resellerintro']);
489
+ }
490
+ else if (page == 'download')
491
+ {
492
+ parsepage(pages['download']);
493
+ }
494
+ else if (page == 'blog')
495
+ {
496
+ parsepage(pages['blog']);
497
+ init_blog();
498
+ }
499
+ else if (page == 'blogarticle')
500
+ {
501
+ parsepage(pages['blogarticle']);
502
+ init_blogarticle();
503
+ }
504
+ else if (page == 'copyright')
505
+ {
506
+ parsepage(pages['copyright']);
507
+ }
508
+ else if (page == 'resellers')
509
+ {
510
+ parsepage(pages['resellers']);
511
+ }
512
+ else if (page == 'pro')
513
+ {
514
+ parsepage(pages['pro']);
515
+ init_pro();
516
+ }
517
+ else if (page == 'hosting')
518
+ {
519
+ parsepage(pages['hosting']);
520
+ }
521
+ else if ((page == 'resellerapp') && (!u_type))
522
+ {
523
+ login_txt = l[376];
524
+ parsepage(pages['login']);
525
+ init_login();
526
+ }
527
+ else if (page == 'resellerapp')
528
+ {
529
+ parsepage(pages['resellerapp']);
530
+ init_resellerapp();
531
+ }
532
+ else if (page == 'flash')
533
+ {
534
+ parsepage(pages['flash']);
535
+ }
536
+ else if (page == 'takedown')
537
+ {
538
+ parsepage(pages['takedown']);
539
+ init_takedown();
540
+ }
541
+ else if (page == 'takedown2')
542
+ {
543
+ parsepage(pages['takedown2']);
544
+ }
545
+ else if (page == 'done')
546
+ {
547
+ if (!done_text1)
548
+ {
549
+ done_text1 = 'Test123';
550
+ done_text2 = 'Test1234';
551
+ }
552
+ parsepage(pages['done']);
553
+ init_done();
554
+ }
555
+ else if ((page.substr(0,7) == 'account') && (!u_type))
556
+ {
557
+ if (u_type == false)
558
+ {
559
+ login_txt = l[376];
560
+ parsepage(pages['login']);
561
+ init_login();
562
+ }
563
+ else
564
+ {
565
+ parsepage(pages['register']);
566
+ init_register();
567
+ }
568
+ }
569
+ else if (page.substr(0,7) == 'account')
570
+ {
571
+ parsepage(pages['account']);
572
+ load_acc();
573
+ }
574
+ else if (page == 'copyrightnotice')
575
+ {
576
+ parsepage(pages['copyrightnotice']);
577
+ init_cn();
578
+ }
579
+ else if (dlid)
580
+ {
581
+ if (d) console.log(dlid);
582
+ if (d) console.log(dlkey);
583
+ page = 'download';
584
+
585
+ parsepage(pages['download']);
586
+ dlinfo(dlid,dlkey,false);
587
+ }
588
+ else if (is_fm())
589
+ {
590
+ if ((fmdirid) && (fmstarted))
591
+ {
592
+ if (currentdirid != fmdirid) opendirectory(fmdirid);
593
+ }
594
+ init_page_fm();
595
+ }
596
+ else if (pages[page])
597
+ {
598
+ parsepage(pages[page]);
599
+ if (init_f[page]) init_f[page]();
600
+ }
601
+ else
602
+ {
603
+ page = 'start';
604
+ parsepage(pages['nstart']);
605
+ init_nstart();
606
+ }
607
+ //setTimeout("document.title = 'MEGA';",200);
608
+ }
609
+ else
610
+ {
611
+ if (d) console.log(extjsloaded);
612
+ if (d) console.log(u_checked);
613
+ }
614
+ }
615
+
616
+
617
+
618
+
619
+
620
+
621
+
622
+ if (ie9)
623
+ {
624
+ function checktitle()
625
+ {
626
+ if (document.title !== 'MEGA') document.title = 'MEGA';
627
+ setTimeout("checktitle()",500);
628
+ }
629
+ setTimeout("checktitle()",1000);
630
+ }
631
+
632
+
633
+ window.onhashchange = function()
634
+ {
635
+ var tpage = document.location.hash;
636
+ if ((downloading || ul_uploading))
637
+ {
638
+ if ((is_fm()) && (document.location.hash.substr(0,3) == '#fm')) return false;
639
+ var h = document.location.hash;
640
+ document.location.hash = hash;
641
+ alert(l[375]);
642
+ return false;
643
+ }
644
+ if ((document.getElementById('overlay').style.display == '') && (page != 'fm'))
645
+ {
646
+ document.location.hash = hash;
647
+ return false;
648
+ }
649
+ if (ext_loading_dialog)
650
+ {
651
+ document.location.hash = hash;
652
+ return false;
653
+ }
654
+ dlid=false;
655
+ hash = window.location.hash;
656
+ if (window.location.hash) page = window.location.hash.replace('#','');
657
+ else page = '';
658
+ init_page();
659
+ }
660
+
661
+
662
+
663
+ window.onbeforeunload = function ()
664
+ {
665
+ if ((downloading) || (ul_uploading)) return l[377];
666
+ }