Merge branch 'master' into gruntmaster
[gruntmaster-page.git] / js / 90-tracker.js
diff --git a/js/90-tracker.js b/js/90-tracker.js
new file mode 100644 (file)
index 0000000..a475ee8
--- /dev/null
@@ -0,0 +1,107 @@
+(function(){
+       'use strict';
+
+       function tick()  { return $('<span class="tick tracker-mark">✔</span>') }
+       function xmark() { return $('<span class="x tracker-mark">✘</span>')    }
+
+       function clean_tracker(){
+               $('.tracker-mark').detach();
+               $('.tracker-info').removeClass('tracker-info info');
+       }
+
+       function update_tracker(){
+               var data = localStorage.getItem('tracker_data');
+               var user = localStorage.getItem('tracker_username');
+               if(!data)
+                       return;
+               data = JSON.parse(data);
+               var solved = {};
+               var attempted = {};
+               var solvednr = 0;
+               var attemptednr = 0;
+               data.problems.forEach(function(e){
+                       if(e.solved){
+                               solved[e.problem] = 1;
+                               solvednr++;
+                       } else {
+                               attempted[e.problem] = 1;
+                               attemptednr++;
+                       }
+               });
+
+               var contests = {};
+               data.contests.forEach(function(e){
+                       contests[e.contest] = 1;
+               });
+
+               clean_tracker();
+               $('#tracker_userlink').html(data.name);
+               $('#tracker_solved').html(solvednr);
+               $('#tracker_attempted').html(attemptednr);
+               $('#tracker_contests').html(data.contests.length);
+
+               if(location.pathname == '/pb/')
+                       $('table').find('.name').find('a').each(function() {
+                               var id = $(this).attr('href').split('?', 2)[0];
+                               if(solved[id])
+                                       $(this).parent().append(tick());
+                               else if(attempted[id])
+                                       $(this).parent().append(xmark());
+                       });
+
+               if(location.pathname == '/ct/')
+                       $('table').find('.name').find('a').each(function() {
+                               var id = $(this).attr('href').substr(4);
+                               if(contests[id])
+                                       $(this).parent().append(tick());
+                       });
+
+               if(location.pathname == '/log/')
+                       $('table').find('tbody').find('tr').each(function() {
+                               if($(this).find('.owner').find('a').attr('href') != '/us/' + user)
+                                       return;
+                               $(this).find('.id').append($(this).find('.r0').size() ? tick() : xmark());
+                       });
+
+               if(location.pathname.match(/^\/st\//) || location.pathname == '/us/')
+                       $('table').find('tbody').find('tr').each(function() {
+                               if($(this).find('.user').find('a').attr('href') == '/us/' + user)
+                                       $(this).addClass('info tracker-info');
+                       });
+       }
+
+       function start_tracking(user){
+               localStorage.setItem('tracker_username', user);
+               $('#tracker_userlink').attr('href', '/us/' + user).html(user);
+               $('#tracker_tracking').removeClass('hidden');
+               $('#tracker_form').addClass('hidden');
+               update_tracker();
+               var xhr = new XMLHttpRequest();
+               xhr.open('GET', '/us/' + user);
+               xhr.setRequestHeader('Accept', 'application/json');
+               xhr.onload = function () {
+                       localStorage.setItem('tracker_data', this.responseText);
+                       update_tracker();
+               };
+               xhr.send();
+       }
+
+       function stop_tracking(){
+               clean_tracker();
+               localStorage.removeItem('tracker_username');
+               localStorage.removeItem('tracker_data');
+               $('#tracker_tracking').addClass('hidden');
+               $('#tracker_form').removeClass('hidden');
+       }
+
+       $( document ).ready(function(){
+               $('#tracker').detach().prependTo($('#sidebar')).removeClass('hidden');
+               $('#tracker_button').on('click', function() { start_tracking($('#tracker_username').val()) });
+               $('#tracker_stop').on('click', stop_tracking);
+               $('#track_user').removeClass('hidden');
+               $('#track_user').on('click', function() { stop_tracking(); start_tracking($(this).data('user')) });
+
+               if(localStorage.getItem('tracker_username'))
+                       start_tracking(localStorage.getItem('tracker_username'));
+       });
+})();
This page took 0.011289 seconds and 4 git commands to generate.