Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 14th, 2012  |  syntax: None  |  size: 8.52 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /**
  2.  * @author Artyom Grigoriev
  3.  */
  4.  
  5. var uid;
  6. var nav = ge('nav');
  7. each (nav.childNodes, function (i, x) {
  8.         if (x.firstChild != null && x.firstChild.href.match(/mail.php/)) {
  9.                 var h = x.firstChild.href.split('?id=');
  10.                 uid = h[1];
  11.         }
  12. });
  13.  
  14. var stats = {};
  15. var f = [];
  16. var href2name = {};
  17. var dates = {};
  18. var times = {};
  19.  
  20. var ei = 0;
  21. var eo = 0;
  22. var index = 0;
  23. var finished = false;
  24.  
  25. // planner
  26. var p = {
  27.         st: 0,
  28.         out: 0,
  29.         hd: function () {
  30.                 p.st = 0;
  31.                 index += p.st;
  32.                 p.out = 1;
  33.                 p.hd = function () {
  34.                         out.debug('finished');
  35.                         calculation();
  36.                         finished = true;
  37.                 };
  38.                 la();
  39.         }
  40. };
  41.  
  42. index = p.st;
  43.  
  44. var out = {
  45.         countDiv: null,
  46.         timeDiv: null,
  47.         init: function () {
  48.                 ge('content').innerHTML = '';
  49.                 ge('content').appendChild(
  50.                         ce('img',
  51.                                 {src: '/images/progress7.gif'},
  52.                                 {
  53.                                         paddingLeft: '240px'
  54.                                 }
  55.                         )
  56.                 );
  57.                 ge('header').innerHTML = '<h1>Статистика личной переписки 2</h1>';
  58.         },
  59.         loaded: function () {
  60.                 ge('content').innerHTML = '';
  61.                 var pr = ce('div',
  62.                         { id: 'sprogr' },
  63.                         { position: 'relative', width: '100%', height: '30px', margin: '3px', backgroundColor: '#DAE2E8' }
  64.                 );
  65.                 pr.appendChild(
  66.                         ce('div',
  67.                         {id: 'sprogb'}, {width: '0', height: 'inherit', backgroundColor: '#45688E'}
  68.                         )
  69.                 );
  70.                 pr.appendChild(
  71.                         ce('div',
  72.                         {id: 'scnt'}, {position: 'absolute', left: '10px', top: '7px', width: '200px', height: 'inherit', color: '#fff', zIndex: 69}
  73.                         )
  74.                 );
  75.                
  76.                 ge('content').appendChild(pr);
  77.         },
  78.         progress: function () {
  79.                 ge('sprogb').style.width = (100 * index / (1 * ei + 1 * eo)) + '%';
  80.                 ge('scnt').innerHTML = 'Обработано сообщений: ' + index;
  81.         },
  82.         debug: function (msg) {
  83.                
  84.         },
  85.         generateCount: function () {
  86.                 this.countDiv = ce('div');
  87.                
  88.                 var table = ce('table', {className: 'wikiTable'});
  89.                 table.innerHTML += '<thead><th></th><th>Имя</th><th onclick="javascript: calculation();" style="cursor: pointer">Всего сообщений</th><th onclick="javascript: calculation(\'out\');" style="cursor: pointer">Вы отправили</th><th onclick="javascript: calculation(\'in\');" style="cursor: pointer">Вы получили</th></thead>';
  90.                
  91.                 var tbody = ce('tbody');
  92.                 table.appendChild(tbody);
  93.                
  94.                 for (var i = 0; i < f.length; i++) {
  95.                         var tr = ce('tr');
  96.                         var tdR = ce('td', {innerHTML: i+1});
  97.                         var tdN = ce('td', {innerHTML: '<a href="'+f[i].href+'">' + f[i].name + '</a>'});
  98.                         var tdT = ce('td', {innerHTML: f[i].count});
  99.                         var tdO = ce('td', {innerHTML: f[i].count_outgoing});
  100.                         var tdI = ce('td', {innerHTML: f[i].count_incoming});
  101.                        
  102.                         tr.appendChild(tdR);
  103.                         tr.appendChild(tdN);
  104.                         tr.appendChild(tdT);
  105.                         tr.appendChild(tdO);
  106.                         tr.appendChild(tdI);
  107.                         tbody.appendChild(tr);
  108.                 }
  109.                
  110.                 this.countDiv.appendChild(table);
  111.                 ge('content').appendChild(this.countDiv);
  112.         },
  113.         generateTime: function () {
  114.                 this.timeDiv = ce('div');
  115.                
  116.                 var maxTime = ''; var maxTV = 0;
  117.                 var maxDate = ''; var maxDV = 0;
  118.                
  119.                 for (var key in dates) {
  120.                         if (dates[key].inb + dates[key].out > maxDV) {
  121.                                 maxDate = key;
  122.                                 maxDV = dates[key].inb + dates[key].out;
  123.                         }
  124.                 }
  125.                
  126.                 for (var key in times) {
  127.                         if (times[key].inb + times[key].out > maxTV) {
  128.                                 maxTime = key;
  129.                                 maxTV = times[key].inb + times[key].out;
  130.                         }
  131.                 }
  132.                
  133.                 this.timeDiv.innerHTML = 'Больше всего сообщений было ' + maxDate + ' &mdash; ' + maxDV;
  134.                 this.timeDiv.innerHTML += '<br/>Больше всего сообщений ' + maxTime + ' &mdash; ' + maxTV;          
  135.                
  136.                 ge('content').appendChild(this.timeDiv);
  137.         },
  138.         generate: function () {
  139.                 ge('content').innerHTML = 'Спасибо, что дождались, надеюсь, оно того стоило!<br/><br/>';
  140.                 this.generateTime();
  141.                 ge('content').innerHTML += '<a href="#" onclick="javascript: out.exportDT();">Экспорт статистики по времени</a> | <a href="#" onclick="javascript: out.exportMsgs();">Экспорт статистики по сообщениям</a><br/>';
  142.                 ge('content').appendChild(ce('div', {id: 'export'}));
  143.                 ge('content').innerHTML += '<br/>';
  144.                 out.generateCount();
  145.         },
  146.         showCount: function () {
  147.  
  148.         },
  149.         showTime: function () {
  150.  
  151.         },
  152.        
  153.         exportDT: function () {
  154.                 ge('export').innerHTML = '';
  155.                 var t = ce('textarea', {}, {width: '100%', height: '200px'});
  156.                 var d = [], z = [];
  157.                 for (var key in dates) {
  158.                         d.push({
  159.                                 date: key,
  160.                                 inb: dates[key].inb,
  161.                                 out: dates[key].out
  162.                         });
  163.                 }
  164.                
  165.                 for (var key in times) {
  166.                         z.push({
  167.                                 time: key,
  168.                                 inb: times[key].inb,
  169.                                 out: times[key].out
  170.                         });
  171.                 }              
  172.                
  173.                 t.innerHTML = '{"dates":[';
  174.                 for (var i = 0; i < d.length; i++) {
  175.                         t.innerHTML += '{"d":"'+d[i].date+'","i":'+d[i].inb+',"o":'+d[i].out+'}';
  176.                         if (i < d.length-1) t.innerHTML += ',';
  177.                 }
  178.                 t.innerHTML += '],"times":[';
  179.                 for (var i = 0; i < z.length; i++) {
  180.                         t.innerHTML += '{"t":"'+z[i].time+'","i":'+z[i].inb+',"o":'+z[i].out+'}';
  181.                         if (i < z.length-1) t.innerHTML += ',';
  182.                 }
  183.                 t.innerHTML += ']}';
  184.                
  185.                 ge('export').appendChild(t);
  186.         },
  187.        
  188.         exportMsgs: function () {
  189.                 ge('export').innerHTML = '';
  190.                 var t = ce('textarea', {}, {width: '100%', height: '200px'});
  191.                 t.innerHTML = '[';
  192.                 for (var i = 0; i < f.length; i++) {
  193.                         var g = f[i].href.split('/');
  194.                         var a = g[3];
  195.                         t.innerHTML += '{"h":"'+a+'","n":"'+f[i].name+'","o":'+f[i].count_outgoing+',"i":'+f[i].count_incoming+'}';
  196.                         if (i < f.length-1) t.innerHTML += ',';
  197.                 }
  198.                 t.innerHTML += ']';
  199.                 ge('export').appendChild(t);
  200.         }
  201. };
  202.  
  203. function calculation(t) {
  204.         if (f.length == 0) {
  205.                 for (var key in stats) {
  206.                         f.push({
  207.                                 href: key,
  208.                                 name: href2name[key],
  209.                                 count: stats[key].count_out + stats[key].count_in,
  210.                                 count_incoming: stats[key].count_in,
  211.                                 count_outgoing: stats[key].count_out
  212.                         });
  213.                 }
  214.         }
  215.  
  216.         if (t == undefined) {
  217.                 f.sort(function (a, b) {
  218.                         return b.count - a.count;
  219.                 });
  220.         } else if (t == 'out') {
  221.                 f.sort(function (a, b) {
  222.                         return b.count_outgoing - a.count_outgoing;
  223.                 })
  224.         } else {
  225.                 f.sort(function (a, b) {
  226.                         return b.count_incoming - a.count_incoming;
  227.                 });
  228.         }
  229.        
  230.         out.generate();
  231. }
  232.  
  233. out.init();
  234.  
  235. Ajax.Get({
  236.         url: 'mail.php?id=' + uid,
  237.         onDone: function (ao, rt) {
  238.                 var res = eval('(' + rt + ')');
  239.                 ei = res.count;
  240.                 out.debug('end of incoming = ' + ei);
  241.                
  242.                 Ajax.Get({
  243.                         url: 'mail.php?id=' + uid + '&out=1',
  244.                         onDone: function (ao, rt) {
  245.                                 var res = eval('(' + rt + ')');
  246.                                 eo = res.count;
  247.                                 out.debug('end of outgoing = ' + eo);
  248.                                 out.loaded();
  249.                                 setTimeout("la()", 1000);
  250.                         }
  251.                 })
  252.         }
  253. });
  254.  
  255. function la() {
  256.         var ajax = new Ajax();
  257.         var start = (new Date()).getTime();
  258.         ajax.onDone = function (ao, rt) {
  259.                 if (ao.data.st != p.st || ao.data.out != p.out) return; // synchronization failed
  260.        
  261.                 var r = eval('(' + rt + ')'),
  262.                         t = r.content,
  263.                         d = ce('div');
  264.                 d.innerHTML = t;
  265.                 each (
  266.                         geByClass('name', d, 'div'),
  267.                         function (i, x) {
  268.                                 var href = x.children[0].href;
  269.                                 var name = x.children[0].innerHTML;
  270.                                 var ch = x.parentNode.children;
  271.                                 var dt = ch[ch.length - 1].innerHTML.split(' в ');
  272.                                 var dt2 = dt[1].split('<br>');
  273.                                 if (dates[dt[0]] == undefined) dates[dt[0]] = {inb: 0, out: 0};
  274.                                 if (times[dt2[0]] == undefined) times[dt2[0]] = {inb: 0, out: 0};
  275.                                                                
  276.                                 if (href2name[href] == undefined) {
  277.                                         href2name[href] = name;
  278.                                         //out.debug('[h2n] ' + href + ' -> ' + name);
  279.                                 }
  280.                                
  281.                                 if (stats[href] == undefined) {
  282.                                         stats[href] = {
  283.                                                 count_out: 0,
  284.                                                 count_in: 0
  285.                                         };
  286.                                         //out.debug('[stats] ' + href + ' started');
  287.                                 }
  288.                                
  289.                                 if (ao.data.out == 0) {
  290.                                         stats[href].count_in++;
  291.                                         dates[dt[0]].inb++;
  292.                                         times[dt2[0]].inb++;
  293.                                 } else {
  294.                                         stats[href].count_out++;
  295.                                         dates[dt[0]].out++;
  296.                                         times[dt2[0]].out++;
  297.                                 }
  298.        
  299.                                 //out.debug('[stats] ' + href + ' handled');                                                                   
  300.                         }
  301.                 );
  302.                
  303.                 out.debug('[ajax] handled');
  304.                
  305.                 index += 20;
  306.                 out.progress();
  307.                
  308.                 var spent = (new Date()).getTime() - start;
  309.                 p.st += 20;
  310.                 if (p.st < ((p.out == 0) ? ei : eo)) {
  311.                         if (spent < 1000) {
  312.                                 setTimeout("la()", 1000 - spent);
  313.                                 out.debug('[timeout] ' + (1000 - spent) + 'ms');
  314.                         } else {
  315.                                 la();
  316.                         }
  317.                 } else {
  318.                         p.hd();
  319.                 }
  320.         };
  321.        
  322.         out.debug('[ajax] st='+p.st+', out='+p.out);
  323.        
  324.         ajax.post(
  325.                 'mail.php',
  326.                 {
  327.                         'out': p.out,
  328.                         'mid': uid,
  329.                         'st': p.st
  330.                 }
  331.         );
  332.        
  333. }
  334.  
  335. var prev = -1;
  336.  
  337. function stable() {
  338.         if (prev == index && !finished) {
  339.                 la();
  340.                 out.debug('[restarted]');
  341.         }
  342.        
  343.         prev = index;
  344.         if (!finished) setTimeout("stable()", 5000);
  345. }
  346.  
  347. stable();