PageSourceSearch

https://espanol.online/sites/all/themes/pridea/js/pridea.js?t51i64

js espanol.online collected 2026-10-06 16:48:58 UTC 105,473 bytes, 2,753 lines download raw bytes

1
2
3
4
5(function ($, Drupal, window, document) {
6
7  'use strict';
8
9  window.testDelay = 10000;
10  window.userAnswers = {};
11  window.wordAnswers = {};
12  window.trackMyMouse = false;
13
14window.prideaGetMarkClass = function (mark) {
15  var markClass = 'u';
16  if (mark >= 0.2) markClass = 'r';
17  if (mark >= 0.5) markClass = 'y';
18  if (mark >= 0.8) markClass = 'g';
19  if (mark >= 0.99) markClass = 's';
20  return markClass;
21}
22
23if (window.digObject == undefined)
24  window.digObject = function(p) {
25    var elements = p.split('.');
26    if (window.hasOwnProperty(elements[0])) {
27      var el = window[elements[0]];
28      for (var i = 1; i < elements.length; i++) {
29        if (el.hasOwnProperty(elements[i])) {
30          el = el[elements[i]];
31        } else {
32          return false;
33        }
34      }
35      return el;
36    }
37    return false;
38  }
39//Drupal.settings.pridea.pageData.homework.homework_admin
40
41
42/**
43 * Evaluate the strength of a user's password.
44 *
45 * Returns the estimated strength and the relevant output message.
46 */
47Drupal.evaluatePasswordStrength = function (password) {
48  password = $.trim(password);
49
50  var weaknesses = 0, strength = 100, msg = [];
51
52  var hasLowercase = /[a-z]+/.test(password);
53  var hasUppercase = /[A-Z]+/.test(password);
54  var hasNumbers = /[0-9]+/.test(password);
55  var hasPunctuation = /[^a-zA-Z0-9]+/.test(password);
56
57  // If there is a username edit box on the page, compare password to that, otherwise
58  // use value from the database.
59  var usernameBox = $('input.username');
60  var username = (usernameBox.length > 0) ? usernameBox.val() : translate.username;
61
62  // Lose 5 points for every character less than 6, plus a 30 point penalty.
63  if (password.length < 6) {
64    msg.push(translate.tooShort);
65    strength -= ((6 - password.length) * 5) + 30;
66  }
67
68  // Count weaknesses.
69  if (!hasLowercase) {
70    msg.push(translate.addLowerCase);
71    weaknesses++;
72  }
73  if (!hasUppercase) {
74    msg.push(translate.addUpperCase);
75    weaknesses++;
76  }
77  if (!hasNumbers) {
78    msg.push(translate.addNumbers);
79    weaknesses++;
80  }
81  if (!hasPunctuation) {
82    msg.push(translate.addPunctuation);
83    weaknesses++;
84  }
85
86  // Apply penalty for each weakness (balanced against length penalty).
87  switch (weaknesses) {
88    case 1:
89      strength -= 12.5;
90      break;
91
92    case 2:
93      strength -= 25;
94      break;
95
96    case 3:
97      strength -= 40;
98      break;
99
100    case 4:
101      strength -= 40;
102      break;
103  }
104
105  // Check if password is the same as the username.
106  if (password !== '' && password.toLowerCase() === username.toLowerCase()) {
107    msg.push(translate.sameAsUsername);
108    // Passwords the same as username are always very weak.
109    strength = 5;
110  }
111
112  // Based on the strength, work out what text should be shown by the password strength meter.
113  if (strength < 60) {
114    indicatorText = translate.weak;
115  } else if (strength < 70) {
116    indicatorText = translate.fair;
117  } else if (strength < 80) {
118    indicatorText = translate.good;
119  } else if (strength <= 100) {
120    indicatorText = translate.strong;
121  }
122
123  // Assemble the final message.
124  msg = translate.hasWeaknesses + '<ul><li>' + msg.join('</li><li>') + '</li></ul>';
125  return { strength: strength, message: msg, indicatorText: indicatorText };
126
127};
128
129
130  function checkFooter(){
131  	var footer = $('#footer');
132  	if (footer.length == 1) {
133      $('body').removeClass('sticky-footer');
134    	if (footer.offset().top + footer.outerHeight() < window.innerHeight) {
135    		$('body').addClass('sticky-footer');
136    	} 
137    }
138  }
139
140  function checkLexisExercise() {
141    //console.log('checkLexisExercise');
142    var exercise = $('.exercise').first();
143    if (exercise.length == 1) {
144      var id =  exercise.attr('data-id');
145      $.post('/ajax/exercise/check', {exercise_id: id, answers: JSON.stringify(window.flashcards)}, function(data) {
146          var result = JSON.parse(data);
147          //console.log(result);
148      });      
149    }
150  }
151
152  function wordLurkAppend(typed,lurked_answers) {
153    //console.log(typed,lurked);
154    var lurked = lurked_answers.split('&&')[0]
155    var maxlen = lurked.length;
156    var result = '';
157    var cnt = 3;
158    for (var i = 0; i < typed.length - 1; i++) {
159      if (i < maxlen) {
160        if (typed[i] != lurked[i]) {
161          if (cnt > 0) {
162            cnt--;
163            result += lurked[i];            
164          }
165        } else {
166          result += typed[i];
167        }
168      }
169    }
170    if (cnt>0 && result.length < lurked.length) {
171      result += lurked.substring(result.length, result.length + cnt);
172    }
173    return result;
174  }
175
176  function penalty(btn,message) {
177    var element = $('<div class="penalty-message">' + message + '</div>').appendTo('body');
178    var top = btn.offset().top - 20;
179    var left = btn.offset().left;
180    element.css({
181      top: top,
182      left: left
183    });
184    setTimeout(function() {
185      element.addClass('anim');
186    },100);
187    setTimeout(function() {
188      element.remove();
189    },1700);
190  }
191
192  function pryWord() {
193    window.pryPenalty += 0.2;
194    var btn = $(this).addClass('clicked');
195    btn.find('use').attr('xlink:href', '/sites/all/modules/pridea/media/icons.svg#lurk');
196    var ex = $(this).closest('.exercise');
197    penalty(btn,'-0.2');
198    var pryParse = function(data){
199      if (data.status == 'ok') {
200        console.log('data.lurked',data.lurked)
201        if (Array.isArray(data.lurked) || typeof data.lurked == 'object') {
202          //if (window.lastFocusedInput !== undefined) {
203            var input = btn.parent().find('input');
204            var index = input.attr('data-question');
205            //console.log('lurk index', input);
206            if (data.lurked[index] != undefined) {
207              //console.log('lurk target');
208              var text = input.val().trim();
209              text = wordLurkAppend(text,data.lurked[index]);
210              input.val(text);              
211            }
212          //}
213        } else {
214          var input = ex.find('input.word-type');
215
216          if (input.length>1) {
217            input = $('.active_flashcard_slide').find('input.word-type');
218          }
219          var text = input.val().trim();
220          text = wordLurkAppend(text,data.lurked);
221          input.val(text);
222        }
223      }
224    }
225
226    var eid, eclass = 0;
227    if (ex.find('.exercise_slide').length > 0) {
228      eid = $('.active_flashcard_slide').attr('data-nid');
229      eclass = 'word';
230    } else {
231      eid = ex.attr('data-id');
232      eclass = 'exercise';
233    }
234    if (window.lurked != undefined && window.lurked[eclass][eid] != undefined) {
235      pryParse(window.lurked[eclass][eid]);
236    } else {
237      $.get('/ajax/' + eclass + '/pry/' + eid, function(res) {
238        var data = JSON.parse(res);
239        //console.log('lurked',data);
240        if (window.lurked == undefined) {
241          window.lurked = {};
242        }
243        if (window.lurked[eclass] == undefined) {
244          window.lurked[eclass] = {};
245        }
246        window.lurked[eclass][eid] = data;
247        pryParse(data);
248      });
249    }
250    
251  }
252
253
254  function checkWord() {
255    var btn = $(this);
256    if (!btn.hasClass('disabled')) {
257      btn.addClass('disabled');
258      var exercise = btn.closest('.exercise');
259      var word = $('.active_flashcard_slide');
260      var word_nid = word.attr('data-nid');
261      var answer = word.find('input.word-type').val().trim();
262      $.post('/ajax/word/check', {word_id: word_nid, answer: answer}, function(res) {
263        if (window.wordAnswers[word_nid] == undefined) window.wordAnswers[word_nid] = [];
264        window.wordAnswers[word_nid].push(answer);
265        var data = JSON.parse(res);
266        //console.log(res);
267        btn.removeClass('disabled');
268        if (data.status == 'ok' && data.rating != undefined) {
269          window.flashcards[word_nid] = data.rating - window.pryPenalty;
270          word.removeClass('mistake').removeClass('solved').removeClass('perfect').removeClass('incorrect');
271          if (data.rating >= 0.8) {
272            word.addClass('solved');
273          } else {
274            if (data.rating >= 0.6) {
275              word.addClass('incorrect');
276            } else {
277              word.addClass('mistake');
278            }
279          }
280          if (data.rating == 1) {
281            word.addClass('perfect');
282            btn.hide();
283          }
284          if (word.is(':last-child')) {
285            var id = exercise.attr('data-id');
286            $.post('/ajax/exercise/check', {exercise_id: id, answers: JSON.stringify(window.flashcards), data: JSON.stringify(window.wordAnswers)}, function(data) {
287              var result = JSON.parse(data);
288              //console.log('/ajax/exercise/check', result);
289            });   
290          }
291        }
292      });      
293    }
294  }
295
296  function showExerciseMistake(element, mode, item) {
297    switch (mode) {
298      case 'collate': 
299        element.find('.answers li').eq(item).addClass('mistake');
300      break;
301      case 'radio': 
302        element.find('[data-question="' + item + '"]').parent().addClass('mistake');
303      break;
304      case 'checkboxes': 
305        element.find('[data-question="' + item + '"]').parent().addClass('mistake');
306      break;
307      default: 
308        element.find('[data-question="' + item + '"]').addClass('mistake');
309      break;
310    }
311  }
312
313  function checkExerciseBtn() {
314    $('.check-word').once().click(checkWord);
315  	$('.check-exercise').once().click(function(){
316      var btn = $(this);
317      if (!btn.hasClass('disabled')) {
318        btn.addClass('disabled');
319    		var ex = $(this).closest('.exercise');
320    		var id = ex.attr('data-id');
321    		var mode = ex.attr('data-mode');
322    		var answers = {};
323    		ex.find('[data-question]').each(function(index){
324    			var q = $(this);
325    			var a = -1;
326          var txt = '';
327    			switch (mode) {
328    				case 'selectlist':
329    				case 'select':
330    					a= q.find('option:selected').val();
331    				break;
332    				case 'typelist':
333    				case 'type':
334    					a = q.val().trim();
335    				break;
336    				case 'radio':
337    					a = q.parent().find('input:checked').val();
338    				break;
339    				case 'collate':
340              txt = q.parent().next().children().eq(index).text().trim().toLowerCase();
341              a = [];
342              $('ul.answers li.ui-sortable-handle').each(function(){
343                if (this.textContent.trim().toLowerCase() == txt) a.push(this.getAttribute('data-value'));
344              });
345              //a = q.parent().next().children().eq(index).attr('data-value');
346    				break;
347    				case 'dragdrop':
348              txt = q.children().first().text().trim().toLowerCase();
349              a = [];
350              $('.ui-sortable-handle').each(function(){
351                if (this.textContent.trim().toLowerCase() == txt) a.push(this.getAttribute('data-value'));
352              });
353    					//a = q.children().first().attr('data-value');
354    				break;
355    				case 'paint':
356              txt = q.text().trim().toLowerCase();
357              a = [];
358              q.parent().find('li').each(function(){
359                if (this.textContent.trim().toLowerCase() == txt) {
360                  if (this.getAttribute('data-answer') !== null)  
361                    a.push(this.getAttribute('data-answer'));
362                }
363              });
364    					//a = q.attr('data-answer');
365    				break;
366    				case 'dialog':
367    				case 'sentense':
368              txt = q.text().trim().toLowerCase();
369              a = [];
370              q.parent().find('li').each(function(index){
371                if (this.textContent.trim().toLowerCase() == txt) {
372                  a.push(index);
373                }
374              });
375    					//a = q.index();
376              //console.log(q.attr('data-question'), 'q.index() = ' + q.index() + '  index = ' + index)
377    				break;
378            case 'checkboxes':
379              a = q.is(':checked') * 1;
380            break;
381    			}
382    			answers[q.attr('data-question')] = a;
383    		});
384    		var answersJSON = JSON.stringify(answers);
385        if (window.lastAnswers != undefined) {
386          if (answersJSON == window.lastAnswers) {
387            console.log('ANSWERS DID NOT CHANGED! ')
388          }
389        }
390
391        console.log('answers', answers);
392        window.lastAnswers = answersJSON;
393        var checkdata = {exercise_id: id, answers: answersJSON, penalty: window.pryPenalty};
394        $.post('/ajax/exercise/check', checkdata, function(data) {
395          btn.removeClass('disabled');
396          var result = JSON.parse(data);
397          console.log(result);
398          if (result.status  == 'ok') {
399            if (result.result != undefined) {
400              var eid = '#eid_'+id;
401              $(eid).addClass('solved_' + prideaGetMarkClass(result.result));
402              if (result.result>0.8) {
403                $(eid).addClass('solved_1');
404              }
405            }
406            var exercise_node = '#exercise-' + id;
407            $(exercise_node).find('.mistake').removeClass('mistake');
408            $(exercise_node).find('.incorrect').removeClass('incorrect');
409            if (result.incorrect.length > 0) {
410              for (var i = result.incorrect.length - 1; i >= 0; i--) {
411                $(exercise_node).find('[data-question="' + result.incorrect[i] + '"]').addClass('incorrect');
412              }
413            }
414            if (result.mistakes.length > 0) {
415              for (var i = result.mistakes.length - 1; i >= 0; i--) {
416                showExerciseMistake($(exercise_node),mode,result.mistakes[i]);
417              }
418            } else {
419              $(exercise_node).addClass('solved');
420              if (result.result != undefined) {
421                $('#total_exercise_result').text(Math.round(result.result * 100) / 10).parent().removeClass('hidden');
422              } else {
423                $('#exercise_result_label').hide();
424                $('#total_exercise_result').text().parent().removeClass('hidden');
425              }
426              if (result.incorrect.length == 0) {
427                btn.hide();
428                $('.spain-keyboard').hide();
429              }
430            }
431          } else {
432            if (result.status == 'error') {
433              modalbox(Drupal.t('Error'), '<div class="msg">' + Drupal.t('Your have reached the exercise limit on your plan.') + '</div>', '<a class="btn" href="/plans">' + Drupal.t('See plans')+'</a>')
434            }
435          }
436        });
437      }
438  	});
439  }
440
441  function showProgress() {
442    function addE(exercises) {
443      var exercise_ids = Object.keys(exercises);
444      var solved_state, solved;
445      for (var i = exercise_ids.length - 1; i >= 0; i--) {
446        solved = exercises[exercise_ids[i]];
447        //console.log($('.active1 #e' + exercise_ids[i] + '_result'),solved.toPrecision(2) * 10);
448
449        $('.active1 .e' + exercise_ids[i] + '_result').html('<span class="hwm">
449' + solved.toPrecision(2) * 10 + '</span>');
450        $('.active1 .e' + exercise_ids[i] + '_result').parent().addClass(getMarkClass(solved));
451        if (solved >= 0.8) {
452          solved_state = 1;
453        } else {
454          solved_state = 0;
455        }
456
457        $('#eid_' + exercise_ids[i]).addClass('solved_' + solved).addClass('solved_'+getMarkClass(solved));
458        $('#exercise-' + exercise_ids[i]).addClass('solved_' + solved).addClass('solved_'+getMarkClass(solved));
459        $('.active0 .e' + exercise_ids[i]).addClass('solved_' + solved).addClass('solved_'+getMarkClass(solved));
460        //$('.active0 #e' + exercises[i] + '_result').html(result.toPrecision(2) * 10);
461      }
462    }
463    function addL(lessons){
464      for (var i = lessons.length - 1; i >= 0; i--) {
465        $('#nid_' + lessons[i]).addClass('pass'); 
466        $('#l' + lessons[i]).addClass('pass' );
467        $('.active1 .l' + lessons[i] + '_result').html('<span class="hwm">+</span>').parent().addClass('g');
468      }
469    }
470    if (window.digObject('Drupal.settings.pridea.progress')) {
471    //if (Drupal.settings.pridea !== undefined && Drupal.settings.pridea.progress !== undefined) {
472      var progress = Drupal.settings.pridea.progress;
473      if (Drupal.settings.pridea.progress.length!== undefined) {
474        for (var i = Drupal.settings.pridea.progress.length - 1; i >= 0; i--) {
475          if (Drupal.settings.pridea.progress[i]['e'] !== undefined) {
476            addE(Drupal.settings.pridea.progress[i]['e']);
477          }
478          if (Drupal.settings.pridea.progress[i]['l'] !== undefined) {
479            addL(Object.keys(Drupal.settings.pridea.progress[i]['l']));
480          }       
481          if (Drupal.settings.pridea.progress[i].i !== undefined) {
482            var pcnt = Drupal.settings.pridea.progress[i].i * 100 / Drupal.settings.pridea.progress[i].total;
483            $('#course_' + Drupal.settings.pridea.progress[i].course_id + '_progress').html('<span class="bar"></span>').children('.bar').css({width: Math.ceil(pcnt) + '%'});        
484          }
485        }
486      } else {
487        if (progress['e'] !== undefined) {
488          addE(progress['e']);
489        }
490        if (progress['l'] !== undefined) {
491          addL(Object.keys(progress['l']));
492        }     
493        if (progress.i !== undefined) {
494          var pcnt = progress.i * 100 / progress.total;
495          $('#course_' + progress.course_id + '_progress').html('<span class="bar"></span>').children('.bar').css({width: Math.ceil(pcnt) + '%'});        
496        }   
497      }
498
499      $('.theme-elements').each(function(){
500        var theme = $(this);
501        var elements = theme.children('a').length;
502        var solved = theme.children('a.pass, a.solved_1').length;
503        if (elements == solved) {
504          theme.parent().addClass('solved');
505        }
506      });
507    }
508  }
509
510
511  function playAudioSlide() {
512    $('.slick-active').find('audio').first()[0].play();
513  }
514
515  function slicks() {
516    $('.node-lesson .field-word-reference').addClass('.col-md-8').wrapAll('<div class="word-gallery container"></div>').first().parent().on('init', playAudioSlide).slick({
517      dots: true,
518      arrows: true,
519      infinite: false,
520      nextArrow: '<span class="arrow-right"><svg><use xlink:href="/sites/all/modules/pridea/media/icons.svg#arrow"/></svg></span>',
521      prevArrow: '<span class="arrow-left"><svg><use xlink:href="/sites/all/modules/pridea/media/icons.svg#arrow"/></svg></span>',
522    }).on('afterChange',playAudioSlide);
523  }
524
525  function flashcard_tick() {
526    window.flashcard_timeout--;
527    $('.timer-block').html(window.flashcard_timeout);
528    if (window.flashcard_timeout == 0) {
529      var slide = $('.active_flashcard_slide');
530      $('.timer-block').hide();
531      slide.addClass('unsolved');
532      clearInterval(window.flashcard_timer);
533      var word_nid = slide.attr('data-nid');
534      window.flashcards[word_nid] = -1;
535    }
536  }
537
538  function lexis_slide_next() {
539    clearInterval(window.flashcard_timer);
540    $('.check-word').show();
541    var active_flashcard_slide = $('.active_flashcard_slide');
542    if (active_flashcard_slide.length == 0) {
543      $('.exercise_slide').first().addClass('active_flashcard_slide');
544    } else {
545      if (!active_flashcard_slide.hasClass('solved')) {
546        var word_nid = active_flashcard_slide.attr('data-nid');
547        active_flashcard_slide.addClass('unsolved');
548        window.flashcards[word_nid] = -1;
549        if (active_flashcard_slide.is(':last-child')) {
550          checkLexisExercise();
551        }
552      }
553      active_flashcard_slide.removeClass('active_flashcard_slide').next().addClass('active_flashcard_slide');
554      if ($('.active_flashcard_slide').next().length == 0) {
555        $('.btn.next-slide').hide();
556        $('.msg_finish').removeClass('hidden');
557      }
558    }
559
560    var exercise = $('.active_flashcard_slide').closest('.exercise');
561    if (exercise.hasClass('lexis')) {
562      window.flashcard_timeout = 11;
563      window.flashcard_timer = setInterval(flashcard_tick, 1000);
564      flashcard_tick();
565      $('.timer-block').show();
566    }
567    //checkFooter();
568    window.pryPenalty = 0;
569  }
570
571  function lexis_slides() {
572    $('.flashcard').once(function(){
573      var card = $(this);
574      var img = card.find('img');
575      img.clone().appendTo(card).addClass('placeholder');
576    });
577    setTimeout(function(){
578      $('.exercise_slides').once(function(){
579        window.flashcards = {};
580        console.log('init flashcards');
581        lexis_slide_next();
582        $('.btn.next-slide').click(lexis_slide_next);
583        $('.flashcard').once().click(function(){
584          var slide = $(this).closest('.exercise_slide');
585          var word_nid = slide.attr('data-nid');
586          var fake = $(this).hasClass('fake');
587          console.log('flashcard ' + word_nid, 'click');
588          $(this).find('.ex_text').css({'color': '#000', 'z-index': 10});
589          $(this).addClass('show');
590          if (!slide.hasClass('solved') && !slide.hasClass('unsolved')) {
591            console.log('flashcard ' + word_nid, 'untouched');
592
593            if (window.flashcards[word_nid] !== undefined) {
594              window.flashcards[word_nid]++
595            } else {
596              window.flashcards[word_nid] = 1;
597            }   
598            if (!fake) {
599              console.log('flashcard ' + word_nid, 'solved');
600              clearInterval(window.flashcard_timer);
601              slide.addClass('solved');
602              if (slide.is(':last-child')) {
603                checkLexisExercise();
604              }
605              $('.timer-block').hide();
606            } else {
607              console.log('flashcard ' + word_nid, 'wrong answer');
608              $(this).addClass('fake');       
609            }
610          }
611          
612        });
613      }).addClass('initialized');
614    }, 500);
615  }
616
617  function lurkButtons() {
618    var textinputs = $('.exercise.view-mode-full input[type=text]');
619    if (digObject('Drupal.settings.pridea.needlurk') !== false && Drupal.settings.pridea.needlurk.length > 0) {
620      for (var i = 0; i < Drupal.settings.pridea.needlurk.length; i++) {
621        if (Drupal.settings.pridea.needlurk[i]) {
622          $(textinputs.get(i)).wrap('<span class="text-input-wrapper"></span>').parent().append('<svg class="lurk-button"><use xlink:href="/sites/all/modules/pridea/media/icons.svg#unlurk" /></svg>');
623        }
624      }
625    } else {
626      textinputs.wrap('<span class="text-input-wrapper"></span>').parent().append('<svg class="lurk-button"><use xlink:href="/sites/all/modules/pridea/media/icons.svg#unlurk" /></svg>');
627    }
628    
629    $('.lurk-button').once().click(pryWord);
630  }
631
632  function keyboard() {
633    $('.spain-keyboard .kbrd-key').once().click(function(e){
634      if (window.lastFocusedInput !== undefined) {
635        var input = $('#' + window.lastFocusedInput);
636        input.val(input.val() + $(this).attr('data-value')).focus();
637      }
638    });
639  }
640
641  function exercises() {
642
643    $('.dragdrop .wordpalette').first().each(function(){
644      var w = $(this).wrap('<div id="wordpalette_wrapper"></div>');
645      var p = w.parent();
646      w.css({width: p.width() + 'px'});
647      p.css({height: p.height() + 'px'});
648
649
650    });
651
652    $(window).scroll(function(){
653      var w = $('#wordpalette_wrapper');
654      if (w.length > 0){
655        if (window.scrollY + window.innerHeight < w.offset().top + w.height()) {
656          w.children().addClass('floating')
657        } else {
658          w.children().removeClass('floating')
659        }
660      }
661    });
662
663    $('input[type="text"]').once().each(function(index){
664      $(this).attr('id','input-text-' + index);
665    }).blur(function(){
666      window.lastFocusedInput = $(this).attr('id');
667    });
668    
669
670    lurkButtons();
671
672    $('select').addClass('custom-select');
673  	$('.ex_slides').once().slick({
674			dots: true,
675			arrows: true
676		});
677
678
679		$('.sortable').once().sortable().disableSelection();
680
681		$('.palette li').once().click(function(){
682			$('.palette li').removeClass('selected');
683			$(this).addClass('selected');
684		});
685
686		$('.ex_group .terms li').once().click(function(){
687			var color = $(this).closest('.ex_group').find('.palette li.selected');
688			if (color.length>0) {
689				var color_class = color.attr('data-color');
690        var value = color.attr('data-id');
691				$(this).removeAttr('class').addClass(color_class).attr('data-answer', value);
692			}
693		});
694
695		$('.ex_sentence .words').once().sortable().disableSelection();
696
697		$( ".ex_dialog .sentences" ).once().sortable().disableSelection();
698
699		$('.ex_insert .words, .ex_insert .droppable').once().sortable({ 
700			connectWith: '.wordpalette, span.droppable',
701      receive: function() {
702        $('.mistake').removeClass('.mistake');
703      },
704		}).disableSelection();
705
706    $('.exercise.spell').find('.play-pause-btn').click(function(){
707
708      var e = $(this).closest('.exercise');
709      if (!e.hasClass('checked')) {
710        e.addClass('checked');
711        $.post('/ajax/exercise/check', {exercise_id: e.attr('data-id'), answers: true}, function(data) {
712          var result = JSON.parse(data);
713          console.log(result);
714        });      
715      }
716      
717    });
718  }
719
720
721  function rescale() {
722    $('.ex_sort').each(function(){
723      var ex_sort = $(this);
724      var li = ex_sort.find('li').removeAttr('style');
725      var maxH = 0;
726      li.each(function(){
727        if ($(this).outerHeight() > maxH) maxH = $(this).outerHeight();
728
729      });
730      li.css({height: maxH});
731    });
732    $('#header_style').remove();
733    var nav = document.getElementById('navigation');
734    var bgl = -(nav.children[0].clientWidth - nav.clientWidth) / 2 - 1600;
735    $('body').append('<style id="header_style">#navigation:before {background-position: '+bgl+'px center}</style>');
736    groupExtras();
737  }
738
739
740
741  function stat_chart(container,data) {
742    var box = $(container);
743    var val;
744    if (box.length == 1) {
745      box.html('<div class="chart"></div>').children('.chart').first().html('<div class="empty_chart">' + Drupal.t('No data')+ '</div>');
746      if (data.items.length > 0) {
747        if (data.type == 'matters') {
748          box = box.html('<div class="chart"></div>').children('.chart').first();
749          data.items.forEach(function(item) {
750            if (item.y !== false){
751              val = Math.min(95,Math.atan(item.y / 10)* 2 * 95 / Math.PI);
752              box.append('<div class="bar" style="width:' + (100 / data.items.length) + '%"><div class="label_x">' + item.label_x+ '</div><div class="svg"><svg viewBox="0 0 1 1" class="circle ' + item.class + '" style="width:' + val + '%"><circle cy="0.5" cx="0.5" r="0.49" /></svg><div class="svg_label">' + item.value + '</div></div></div>');
753            } else 
754              box.append('<div class="bar" style="width:' + (100 / data.items.length) + '%"><div class="label_x">' + item.label_x+ '</div></div>');
755          }); 
756        }
757        if (data.type == 'marks') {
758          box = box.html('<div class="chart"></div>').children('.chart').first();
759          var lines = ''; 
760          for (var i = data.labels_y.length - 1; i >= 0; i--) lines += '<div class="x-line" style="height:' + (100 / data.labels_y.length)+ '%"><div class="label_y">' + data.labels_y[i] + '</div></div>';
761          box.append('<div class="axis_y">' + lines + '</div>');
762          data.items.forEach(function(item){
763            if (item.y !== false)
764              box.append('<div class="bar" style="width:' + (100 / data.items.length) + '%"><div class="label_x">' + item.label_x+ '</div><div class="ball ' + item.class + '" style="bottom:' + item.y * 100 + '%">' + item.value + '</div></div>');
765            else 
766              box.append('<div class="bar" style="width:' + (100 / data.items.length) + '%"><div class="label_x">' + item.label_x+ '</div></div>');
767          }); 
768        }
769        if (data.type == 'activity') {
770          box = box.html('<div class="chart"></div>').children('.chart').first();
771          var lines = ''; 
772          for (var i = data.labels_y.length - 1; i >= 0; i--) lines += '<div class="x-line" style="height:' + (100 / data.labels_y.length)+ '%"><div class="label_y">' + data.labels_y[i] + '</div></div>';
773          box.append('<div class="axis_y">' + lines + '</div>');
774          data.items.forEach(function(item){
775            if (item.y !== false && item.y > 0)
776              box.append('<div class="bar" style="width:' + (100 / data.items.length) + '%"><div class="label_x">' + item.label_x+ '</div><div class="ball ' + item.class + '" style="bottom:' + (item.y/data.max_s) * 100 + '%">' + item.value + '</div></div>');
777            else 
778              box.append('<div class="bar" style="width:' + (100 / data.items.length) + '%"><div class="label_x">' + item.label_x+ '</div></div>');
779          }); 
780        }
781      }
782    }
783  }
784
785  function daysInMonth (year, month) {
786    return new Date(year, month, 0).getDate();
787  }
788
789  function dmy(date) {
790    var m,d;
791    m = date.getMonth()*1 + 1;
792    m = m>9 ? m : '0'+m;
793    d = date.getDate()*1;
794    d = d>9 ? d : '0'+d;
795    return d + '.' + m + '.' +(date.getYear()-100);
796  }
797
798  function getWeek(date) {
799    var onejan = new Date(date.getFullYear(), 0, 1);
800    return Math.ceil((((date - onejan) / 86400000) + onejan.getDay() + 1) / 7);
801  }
802
803  function leadZero(a) {
804    return a>9 ? a : '0' + a;
805  }
806
807  function nmd(date) {
808    var m,d;
809    m = date.getMonth()*1 + 1;
810    d = date.getDate()*1;
811    return leadZero(d) + '.' + leadZero(m);
812  }
813
814  function getMarkClass(mark) {
815    var markClass = 'u';
816    if (mark >= 0.2) markClass = 'r';
817    if (mark >= 0.5) markClass = 'y';
818    if (mark >= 0.8) markClass = 'g';
819    if (mark >= 0.99) markClass = 's';
820    return markClass;
821  }
822
823  function stat_chart_view(chart) {
824      var type = chart.attr('data-type');
825      var data = {type: type, items: [], labels_y: []}
825;
826
827      var pushDataMarks = function(curr, tmd, em, label){
828        if (curr < tmd) {
829          data.items.push({label_x: label, class: 'u', y: false, value: false})
830        } else {
831          if (em) {
832            data.items.push({label_x: label, class: getMarkClass(em), y: em, value: Math.round(em * 100)/10})
833          } else {
834            data.items.push({label_x: label, class: 'u', y: 0, value: '-',})
835          }
836        }
837      }
838
839      var calcStartDate = function(curr,start) {
840        var startDate = false;
841        if (group == 'day') {
842          delta_year = curr.getFullYear() + Math.ceil(start / 12);
843          delta_month =  curr.getMonth() + start % 12;    
844          startDate = new Date(delta_year, delta_month, 1);  
845        }
846        if (group == 'annual') {
847          delta_year = curr.getFullYear()*1 + start*1;  
848          startDate = new Date(delta_year, 0, 1);  
849        }
850        if (group == 'month') {
851          delta_year = curr.getFullYear() + Math.ceil(start / 12);
852          delta_month =  curr.getMonth() + start % 12;    
853          startDate = new Date(delta_year, delta_month, 1);  
854        }
855        if (group == 'week') {
856          var shift = curr.getDay() - 1;
857          if (shift == -1) shift = 6;
858          startDate = new Date(curr - (shift - start * 7) * 24*60*60*1000);  
859        }
860        return startDate;
861      }
862
863      var pushDataSessions = function(curr, tmd, sessions, label){
864        if (curr < tmd) {
865          data.items.push({label_x: label, class: '', y: false, value: false})
866        } else {
867          if (sessions) {
868            data.items.push({label_x: label, class: '', y: Math.max(sessions,1), value: Math.max(sessions)})
869          } else {
870            data.items.push({label_x: label, class: '', y: 0, value: '-',})
871          }
872        }
873      }
874
875      
876      var pushDataMatters = function(matters) {
877        for (var i = 0; i <= 4; i++) {
878          if (matters.by_type !== undefined && matters.by_type[i] !== undefined) {
879            if (data.items[i] == undefined) {
880              data.items[i] = {
881                mark: matters.by_type[i].mark,
882                count:matters.by_type[i].e + matters.by_type[i].t,
883                lessons: matters.by_type[i].l
884              }
885            } else {
886              data.items[i].mark += matters.by_type[i].mark*10;
887              data.items[i].count += matters.by_type[i].e + matters.by_type[i].t;
888              data.items[i].lessons += matters.by_type[i].l;
889            }
890          }
891        }
892      }
893      if (type == 'marks') {
894        data.labels_y = ['1','2','3','4','5','6','7','8','9','10'];
895        var group = chart.attr('data-group');
896        if (group == undefined) group = 'day';
897        if (true) {
898          var start = chart.attr('data-start');
899          var curr = new Date();
900          if (start == undefined) start = 0;
901          
902          var data_key = chart.attr('data-key');
903          var dataset = digObject('Drupal.settings.pridea.stat.' + data_key);
904          //if (dataset.days == undefined) return;
905          if ( dataset !== false && dataset.days !== undefined) {
906
907
908            var delta_year, delta_month, loopend, startDate, elem,tmd,ex,em, daycnt,curr_corrected;
909            startDate = calcStartDate(curr,start);
910
911            var parseDays = function(){
912              if (group == 'day') {
913                chart.parent().find('.chart_current').html(Drupal.t(monthNames[startDate.getMonth()],{},{context: 'pridea.js'}) + ' ' + startDate.getFullYear());
914                daycnt = daysInMonth(startDate.getFullYear(), startDate.getMonth() + 1);
915                for (var i = 1; i <= daycnt; i++) {
916                  tmd = new Date(startDate.getFullYear(), startDate.getMonth(), i);
917                  elem = dataset.days[dmy(tmd)];
918                  em = 0;
919                  if (elem) {
920                    ex = elem.e + elem.t;
921                    em = elem.mark;
922                    em = ex > 0 ? em / ex : 0;
923                  }
924                  pushDataMarks(curr,tmd,em,tmd.getDate());
925                } 
926              }
927              if (group == 'annual') {
928                chart.parent().find('.chart_current').html(startDate.getFullYear()); 
929                curr_corrected = new Date(curr.getFullYear(), curr.getMonth() + 1,1);
930                for (var i = 1; i <= 12; i++) {
931                  ex = 0;
932                  em = 0;
933                  daycnt = daysInMonth(startDate.getFullYear(), i, 1);
934                  for (var j = 1; j <= daycnt; j++) {
935                    tmd = new Date(startDate.getFullYear(), i - 1, j);
936                    elem = dataset.days[dmy(tmd)];
937                    if (elem) {
938                      ex += elem.e + elem.t;
939                      em += elem.mark;
940                    }
941                  } 
942                  em = ex > 0 ? em / ex : 0;
943                  pushDataMarks(curr_corrected,tmd,em,tmd.getMonth()+1);
944                }
945              }
946              if (group == 'month') {
947                chart.parent().find('.chart_current').html(Drupal.t(monthNames[startDate.getMonth()],{},{context: 'pridea.js'}) + ' ' + startDate.getFullYear());
948                curr_corrected = new Date(curr.getFullYear(), curr.getMonth(),curr.getDate() + 7);
949                var weekDay = startDate.getDay(); 
950                if (weekDay > 1) startDate = new Date(delta_year, delta_month, 9 - weekDay);
951                if (weekDay == 0) startDate = new Date(delta_year, delta_month, 2);
952                daycnt = daysInMonth(startDate.getFullYear(), startDate.getMonth(), 1);
953                var weekcnt = Math.ceil((daycnt - startDate.getDate()) / 7);
954                for (var i = 0; i < weekcnt; i++) {
955                  ex = 0;
956                  em = 0;
957                  for (var j = 0; j < 7; j++) {
958                    tmd = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + i * 7 + j);
959                    elem = dataset.days[dmy(tmd)];
960                    if (elem) {
961                      ex += elem.e + elem.t;
962                      em += elem.mark;
963                    }
964                  } 
965                  em = ex > 0 ? em / ex : 0;
966                  pushDataMarks(curr_corrected,tmd,em,getWeek(tmd));
967                }
968              }
969              if (group == 'week') {
970                chart.parent().find('.chart_current').html(Drupal.t('Week') + ' ' + getWeek(startDate));
971                for (var i = 0; i < 7; i++) {
972                  tmd = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + i);
973                  elem = dataset.days[dmy(tmd)];
974                  em = 0;
975                  if (elem) {
976                    ex = elem.e + elem.t;
977                    em = elem.mark;
978                    em = ex > 0 ? em / ex : 0;
979                  }
980                  pushDataMarks(curr,tmd,em,nmd(tmd));
981                } 
982              }
983              stat_chart(chart,data);
984            }
985
986            if (startDate.getTime()/1000 > dataset.start) {
987              parseDays();
988            } else {
989              $.post('/user/stat',{stat_start:Math.floor(startDate.getTime()/1000), stat_loaded: dataset.start},function(data){
990                var result = JSON.parse(data);
991                if (result.days !== undefined) {
992                  for (var daymark in result.days) { 
993                    Drupal.settings.pridea.stat.marks.days[daymark] = result.days[daymark]; 
994                  }
995                  Drupal.settings.pridea.stat.marks.start = result.start;
996                  parseDays();
997                }
998              });
999            }
1000          }
1001        }
1002      }
1003
1004      if (type == 'matters') {
1005        var group = chart.attr('data-group');
1006        if (group == undefined) group = 'day';
1007        var start = chart.attr('data-start');
1008        if (start == undefined) start = 0;
1009        var curr = new Date();
1010        var data_key = chart.attr('data-key');
1011        var dataset = digObject('Drupal.settings.pridea.stat.' + data_key);
1012          if ( dataset !== false) {
1013            var delta_year, delta_month, loopend, startDate, elem,tmd,marks, daycnt, keys;
1014            if (group == 'day') {
1015              var keys = Object.keys(dataset.days);
1016              chart.parent().find('.chart_current').html(Drupal.t('Total')); 
1017              for (var i = keys.length - 1; i >= 0; i--) {
1018                pushDataMatters(dataset.days[keys[i]]);
1019              }
1020            }
1021            if (group == 'annual') {
1022              delta_year = curr.getFullYear()*1 + start*1;  
1023              startDate = new Date(delta_year, 0, 1);  
1024              tmd = startDate;
1025              var cnt = 0;
1026              chart.parent().find('.chart_current').html(startDate.getFullYear());
1027              while (!(tmd.getDate()==31 && tmd.getMonth()==11) && cnt<= 365) {
1028                if (dataset.days[dmy(tmd)] !== undefined) {
1029                  pushDataMatters(dataset.days[dmy(tmd)]);
1030                }
1031                cnt++;
1032                tmd = new Date(delta_year, startDate.getMonth(),cnt);
1033              }
1034            }
1035            if (group == 'month') {
1036              delta_year = curr.getFullYear() + Math.ceil(start / 12);
1037              delta_month =  curr.getMonth() + start % 12;    
1038              startDate = new Date(delta_year, delta_month, 1);  
1039              daycnt = daysInMonth(startDate.getFullYear(), startDate.getMonth() + 1);
1040              chart.parent().find('.chart_current').html(Drupal.t(monthNames[startDate.getMonth()],{},{context: 'pridea.js'}) + ' ' + startDate.getFullYear());
1041              for (var i = 1; i <= daycnt; i++) {
1042                tmd = new Date(startDate.getFullYear(), startDate.getMonth(),i);
1043                if (dataset.days[dmy(tmd)] !== undefined) {
1044                  pushDataMatters(dataset.days[dmy(tmd)]);
1045                }
1046              }
1047            }
1048            if (group == 'week') {
1049              var shift = curr.getDay() - 1;
1050              if (shift == -1) shift = 6;
1051              startDate = new Date(curr - (shift - start * 7) * 24*60*60*1000);  
1052              chart.parent().find('.chart_current').html(Drupal.t('Week') + ' ' + getWeek(startDate));
1053              for (var i = 0; i < 7; i++) {
1054                tmd = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + i);
1055                if (dataset.days[dmy(tmd)] !== undefined) {
1056                  pushDataMatters(dataset.days[dmy(tmd)]);
1057                }
1058              }              
1059            }
1060          }
1061
1062
1063        data.items.forEach(function(item,index){
1064          data.items[index].y = item.count + item.lessons;
1065          data.items[index].value = item.count > 0 ? Math.round(item.mark * 10 / item.count) / 10 : 0;
1066          if (lectionMatters[index] !== undefined)
1067            data.items[index].label_x = lectionMatters[index];
1068          data.items[index].class = getMarkClass(data.items[index].value / 10);
1069        });
1070
1071        stat_chart(chart,data);
1072      }
1073
1074      if (type == 'activity') {
1075        var group = chart.attr('data-group');
1076        if (group == undefined) group = 'day';
1077        if (true) {
1078          var start = chart.attr('data-start');
1079          if (start == undefined) start = 0;
1080          var curr = new Date();
1081          var data_key = chart.attr('data-key');
1082          var dataset = digObject('Drupal.settings.pridea.stat.' + data_key);
1083          if ( dataset !== false) {
1084            var delta_year, delta_month, loopend, startDate, elem,tmd,ex,em, daycnt, curr_corrected;
1085            if (group == 'day') {
1086              delta_year = curr.getFullYear() + Math.ceil(start / 12);
1087              delta_month =  curr.getMonth() + start % 12;    
1088              startDate = new Date(delta_year, delta_month, 1);  
1089              chart.parent().find('.chart_current').html(Drupal.t(monthNames[startDate.getMonth()],{},{context: 'pridea.js'}) + ' ' + startDate.getFullYear());
1090              daycnt = daysInMonth(startDate.getFullYear(), startDate.getMonth() + 1);
1091              for (var i = 1; i <= daycnt; i++) {
1092                tmd = new Date(startDate.getFullYear(), startDate.getMonth(), i);
1093                elem = dataset.days[dmy(tmd)];
1094                em = 0;
1095                if (elem !== undefined) {
1096                  if (elem.e !== undefined) em += elem.e;
1097                  if (elem.l !== undefined) em += elem.l;
1098                  if (elem.t !== undefined) em += elem.t;
1099                } 
1100                pushDataSessions(curr, tmd, em, tmd.getDate());
1101              } 
1102            }
1103            if (group == 'annual') {
1104              delta_year = curr.getFullYear()*1 + start*1;  
1105              startDate = new Date(delta_year, 0, 1);  
1106              curr_corrected = new Date(curr.getFullYear(), curr.getMonth() + 1,1);
1107              chart.parent().find('.chart_current').html(startDate.getFullYear()); 
1108              for (var i = 1; i <= 12; i++) {
1109                em = 0;
1110                daycnt = daysInMonth(startDate.getFullYear(), i, 1);
1111                for (var j = 1; j <= daycnt; j++) {
1112                  tmd = new Date(startDate.getFullYear(), i - 1, j);
1113                  elem = dataset.days[dmy(tmd)];
1114                  if (elem !== undefined) {
1115                    if (elem.e !== undefined) em += elem.e;
1116                    if (elem.l !== undefined) em += elem.l;
1117                    if (elem.t !== undefined) em += elem.t;
1118                  } 
1119                } 
1120                pushDataSessions(curr_corrected, tmd, em, tmd.getMonth()+1);
1121              }
1122            }
1123            if (group == 'month') {
1124              delta_year = curr.getFullYear() + Math.ceil(start / 12);
1125              delta_month =  curr.getMonth() + start % 12;    
1126              startDate = new Date(delta_year, delta_month, 1);  
1127              curr_corrected = new Date(curr.getFullYear(), curr.getMonth(),curr.getDate() + 7);
1128              chart.parent().find('.chart_current').html(Drupal.t(monthNames[startDate.getMonth()],{},{context: 'pridea.js'}) + ' ' + startDate.getFullYear());
1129              var weekDay = startDate.getDay(); 
1130              if (weekDay > 1) startDate = new Date(delta_year, delta_month, 9 - weekDay);
1131              if (weekDay == 0) startDate = new Date(delta_year, delta_month, 2);
1132              daycnt = daysInMonth(startDate.getFullYear(), startDate.getMonth(), 1);
1133              var weekcnt = Math.ceil((daycnt - startDate.getDate()) / 7);
1134              for (var i = 0; i < weekcnt; i++) {
1135                em = 0;
1136                for (var j = 0; j < 7; j++) {
1137                  tmd = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + i * 7 + j);
1138                  elem = dataset.days[dmy(tmd)];
1139                  if (elem !== undefined) {
1140                    if (elem.e !== undefined) em += elem.e;
1141                    if (elem.l !== undefined) em += elem.l;
1142                    if (elem.t !== undefined) em += elem.t;
1143                  } 
1144                } 
1145                pushDataSessions(curr_corrected, tmd, em, getWeek(tmd));
1146              }
1147            }
1148            if (group == 'week') {
1149              var shift = curr.getDay() - 1;
1150              if (shift == -1) shift = 6;
1151              startDate = new Date(curr - (shift - start * 7) * 24*60*60*1000);  
1152              chart.parent().find('.chart_current').html(Drupal.t('Week') + ' ' + getWeek(startDate));
1153              for (var i = 0; i < 7; i++) {
1154                tmd = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + i);
1155                elem = dataset.days[dmy(tmd)];
1156                em = 0;
1157                if (elem !== undefined) {
1158                  if (elem.e !== undefined) em += elem.e;
1159                  if (elem.l !== undefined) em += elem.l;
1160                  if (elem.t !== undefined) em += elem.t;
1161                } 
1162                pushDataSessions(curr, tmd, em, nmd(tmd));
1163              } 
1164            }
1165          }
1166        }
1167        var maxVal = 1;
1168        data.items.forEach(function(item,index) {
1169          maxVal = Math.max(maxVal, item.y);
1170        });
1171        data.max_s = maxVal;
1172        stat_chart(chart,data);
1173      }
1174
1175
1176      /*var slice = 
1177      stat_chart(chart,{
1178        items: [
1179          {label_x: 'b', class: '', y: 0.1, value: '10%',},
1180          {label_x: 'c', class: '', y: 0.2, value: '20%',},
1181          {label_x: 'd', class: '', y: 0.3, value: '30%',},
1182        ],
1183        labels_y: ['1','2','3','4','5','6','7','8','9','10'],
1184        type: 'default'
1185      });*/
1186  }
1187
1188  function stat() {
1189    $('.pridea_chart').once(function(){
1190      stat_chart_view($(this));
1191    });
1192    $('.btn_toggle').click(function(){
1193      var btn = $(this);
1194      var chart = btn.closest('.pridea_chart_wrapper').find('.pridea_chart');
1195      chart.attr('data-group',btn.attr('data-group'));
1196      chart.removeAttr('data-start');
1197      btn.closest('.pridea_chart_wrapper').find('.btn_toggle').removeClass('active');
1198      btn.addClass('active');
1199      stat_chart_view(chart);
1200    });
1201    $('.chart_footer .prev').once().click(function(){
1202      var chart = $(this).closest('.pridea_chart_wrapper').find('.pridea_chart');
1203      var start = chart.attr('data-start');
1204      if (start == undefined) start = 0;
1205      chart.attr('data-start', start - 1);
1206      stat_chart_view(chart);
1207    });
1208    $('.chart_footer .next').once().click(function(){
1209      var chart = $(this).closest('.pridea_chart_wrapper').find('.pridea_chart');
1210      var start = chart.attr('data-start')*1;
1211      if (start == undefined) start = 0;
1212      if (start + 1 <= 0) chart.attr('data-start', start + 1);
1213      stat_chart_view(chart);
1214    });
1215    $('.pridea_chart_wrapper').once(function(){
1216      $(this).find('.btn_toggle').last().click();
1217    });
1218    /*$('.chartjs').once(function(){
1219      var chart = $(this);
1220      var data = JSON.parse(chart.attr('data-chart'));
1221      var title = chart.attr('data-title');
1222      var type = chart.attr('data-type');
1223      var max = 1;
1224      if (chart.attr('data-max') !== undefined ) max = chart.attr('data-max') * 1;
1225      if (type == undefined || type == 'ball') {
1226        ballChart(data,chart, title, max);
1227      } 
1228      if (type == 'bar') {
1229        barChart(data,chart, title);
1230      }
1231      
1232    });*/
1233
1234  }
1235
1236
1237  function sessionTimeout() {
1238    var timeout = $.cookie('pridea_session_cookie');
1239    var expires = new Date();
1240    var curr_date = expires.getDate();
1241    var curr_month = expires.getMonth() + 1;
1242    var curr_year = expires.getYear();
1243    var pin = curr_year + "-" + curr_month + "-" + curr_date;
1244    expires.setHours( expires.getHours() + 1);
1245    if (timeout == pin) {
1246      //continue session     
1247      console.log('continue session'); 
1248    } else {
1249      //new session
1250      console.log('new session');
1251      $.get('/ajax/ping');
1252    }
1253    $.cookie('pridea_session_cookie',pin,{expires: expires});
1254  }
1255
1256
1257  function comments() {
1258
1259    $('.comment_reply_btn').once().click(function(){
1260      var btn = $(this);
1261      var parent = btn.closest('.comment_wrapper').find('.comment_reply');
1262      var form = $('form.pridea_messages_reply_form').first();
1263      form.insertAfter(parent).addClass('active');
1264      if (btn.attr('data-cid') !== undefined) {
1265        form.find('[name=answer]').val(btn.attr('data-cid'));
1266      } else {
1267        form.find('[name=answer]').val(0);
1268      }
1269      if (btn.attr('data-nid') !== undefined) form.find('[name=gid]').val(btn.attr('data-nid'));
1270    });
1271
1272    /*$('.expand-comments').each(function(){
1273      var btn = $(this);
1274      var ctotal = btn.parent().find('.msg.comment');
1275      var cnew = ctotal.filter('.new');
1276      var txt = ctotal.length;
1277      if (cnew.length > 0) {
1278        txt += ' <b>(+' + cnew.length + ')</b>';
1279      }
1280      btn.find('.answer_count').html(txt);
1281    });
1282
1283    $('.comment-list .comment-list-comment').once().click(function(){
1284      var c = $(this);
1285      var cid = c.attr('data-cid');
1286      var gid = c.attr('data-gid');
1287      window.location = '/group/' + gid + '/messages/' + cid;
1288    });
1289
1290    $('#comment-admin').once(function(){
1291      var teaserbox = $('#comment-admin-teasers');
1292      var list = $('#comment-admin-thread');
1293      var comments = list.find('.comment-list-comment');
1294      //var teasers = comments.filter('.depth2');
1295      //teasers.clone().removeAttr('id').appendTo(teaserbox);
1296      
1297      comments.find('.comment-icon').click(function(){
1298        var c = $(this).closest('.comment-list-comment');
1299        var f = $('#comment-admin-form').attr('class','depth' + c.attr('data-depth')).insertAfter(c).show();
1300        f.find('input[name="answer"]').val(c.attr('data-cid'));
1301        f.find('input[name="thread"]').val($('#comment-admin').attr('data-thread'));
1302        f.find('input[name="gid"]').val($('#comment-admin').attr('group-id'));
1303      }).html('<svg><use xlink:href="/sites/all/modules/pridea/media/icons.svg#reply"></svg>');
1304
1305      var dataset = JSON.parse($(this).attr('data-list'));
1306      teaserbox.find('.comment-list-comment').click(function(){
1307        $('#comment-admin-form').hide();
1308        var uid = $(this).attr('data-uid');
1309        //var cid = $(this).attr('data-cid');
1310        comments.hide();
1311        var cids = comments.filter('[data-uid=' + uid + ']').filter('[data-depth=2]');
1312        cids.each(function(){
1313          var cid = $(this).attr('data-cid');
1314          $('#comment-admin').attr('data-thread',uid);
1315          var rows = Object.keys(dataset);
1316          for (var i = rows.length - 1; i >= 0; i--) {
1317            for (var j = dataset[rows[i]].length - 1; j >= 0; j--) {
1318              if (dataset[rows[i]][j] == cid) {
1319                $('#cid' + rows[i]).show();
1320              }
1321            }
1322          }
1323        });
1324      });
1325
1326      if (location.hash !== '') 
1327        setTimeout(function(){
1328          console.log('found', teaserbox.find('[data-cid=' + location.hash.replace('#','') + ']'))
1329          teaserbox.find('[data-uid=' + location.hash.replace('#','') + ']').click();
1330        },100);
1331    });
1332
1333    $('#comment-thread').once(function(){
1334      var thread = $(this);
1335      var gid = thread.attr('group-id');
1336      var cid = thread.find('.initial .comment-list-comment').attr('data-cid');
1337      var f = $('#comment-list-form');
1338      f.find('input[name="answer"]').val(cid);
1339      f.find('input[name="gid"]').val(gid);
1340    });*/
1341  }
1342
1343
1344  function notifications() {
1345    var markup = '';
1346    var total = 0;
1347    var count = 0;
1348    var grouped = false;
1349    $('#my-messages').append('<div class="notifications messages"></div>');
1350    $('#my-groups').append('<div class="notifications groups"></div>');
1351    $('#my-notifications').append('<div class="notifications events"></div>');
1352    $('#my-homework').append('<div class="notifications homework"></div>');
1353
1354    $('.notifications').hide();
1355    //*************************///
1356    //return;
1357    //*************************///
1358    if (digObject('Drupal.settings.pridea.pageData') !== false) {
1359      var items = Object.keys(Drupal.settings.pridea.pageData);
1360      for (var i = items.length - 1; i >= 0; i--) {
1361        if (Drupal.settings.pridea.pageData[items[i]].rows !== undefined) {
1362          if (Drupal.settings.pridea.pageData[items[i]].title !== undefined) {
1363            markup += '<h3>' + Drupal.settings.pridea.pageData[items[i]].title + '<h3>';
1364            grouped = true;
1365          } else {
1366            grouped = false;
1367          }
1368          count = 0;
1369
1370          for (var j = Drupal.settings.pridea.pageData[items[i]].rows.length - 1; j >= 0; j--) {
1371            //console.log('data',Drupal.settings.pridea.pageData[items[i]].rows[j]);
1372            total += Drupal.settings.pridea.pageData[items[i]].rows[j].count * 1;
1373            count += Drupal.settings.pridea.pageData[items[i]].rows[j].count * 1;
1374            if (!grouped) { markup += '<h3>';}
1375            markup += '<a href="' + Drupal.settings.basePath + Drupal.settings.pridea.pageData[items[i]].rows[j].url + '">' + 
1376              Drupal.settings.pridea.pageData[items[i]].rows[j].title + 
1377              ' <span class="count">' + Drupal.settings.pridea.pageData[items[i]].rows[j].count + '</span></a>';
1378            if (!grouped) { markup += '</h3>';}
1379            if (Drupal.settings.pridea.pageData[items[i]].rows[j].id !== undefined  && count > 0) {
1380              //console.log(Drupal.settings.pridea.pageData[items[i]].rows[j].id);
1381              $('#node-' + Drupal.settings.pridea.pageData[items[i]].rows[j].id).addClass('notification-exists');
1382              $('.notifications.' + items[i] + '_' + Drupal.settings.pridea.pageData[items[i]].rows[j].id).text(count).show().parent('.messages_parent').addClass('new_messages');
1383
1384            }
1385            
1386          }
1387          //console.log('count',count);
1388          if (count>0) $('.notifications.' + items[i]).text(count).show();
1389        }
1390      }
1391    }
1392    if (total > 0) {
1393      $('.notifications.total').text(total).show();
1394    }
1395    window.notifications_text = markup;
1396    //console.log(markup);
1397  }
1398
1399
1400
1401  function test_answers_post() {
1402    var tests = Object.keys(window.flashcards);
1403    var answers = '';
1404    var rating = 0;
1405    var count = $('.exercise-test-element').length;
1406    if (count>0) {
1407      for (var i = 0; i < tests.length; i++) {
1408        answers += String(window.flashcards[tests[i]]);
1409        rating += window.flashcards[tests[i]];
1410      }
1411      var nid = $('.page-node.node-type-test .node-test, #my-word-test').attr('data-id');
1412      var post = {};
1413      //console.log('Test done ' + count + ' from ',tests.length);
1414      if (tests.length == count) {
1415        var grade = count > 0 ? (rating / count) : 0;
1416        if (isNaN(grade)) grade = 0;
1417        post = {answers: answers, nid: nid, result: grade, finalize: true};
1418        $('#test_grade').html((grade * 10).toFixed(2));
1419        $('#test_results').show();
1420
1421      } else {
1422        post = {answers: answers, nid: nid, result: 0};
1423      }
1424      $.post('/ajax/test/post', post, function(data){
1425        console.log('test res',data);
1426      });
1427    }
1428  }
1429
1430
1431  function conj_answers_post() {
1432    var tests = Object.keys(window.flashcards);
1433    if (tests.length == Drupal.settings.pridea.conjResult.length) {
1434      var res = 0;
1435      for (var i = tests.length - 1; i >= 0; i--) {
1436        res += window.flashcards[tests[i]];
1437      }
1438      res = res/10;
1439      $('#test_grade').html((res * 10).toFixed(2));
1440      $('#test_results').show();
1441      $.post('/ajax/conj/post', {result: res}, function(data){
1442        console.log('test res',data);
1443      });
1444    }
1445  }
1446
1447
1448  function test_answer(id) { // -1 == timeout
1449    clearTimeout(window.testTimer);
1450    $('#timebar').removeClass('armed');
1451    var test = $('.exercise-test-element.active');
1452    var element_id = test.addClass('passed').attr('data-id');
1453    //console.log('id', id);
1454    //console.log('answers', Drupal.settings.pridea.testAnswers[element_id]);
1455    if (id >=0 ) {
1456      if (Drupal.settings.pridea.testAnswers !== undefined && Drupal.settings.pridea.testAnswers[element_id] !== undefined) {
1457        if (id == Drupal.settings.pridea.testAnswers[element_id][0]) {
1458          window.flashcards[element_id] = 1;
1459          $('.test-bullet[data-id=' + element_id +']').addClass('passed');
1460          if ($('.exercise-test-test_v_i').length > 0) {
1461            $('#test-element-' + element_id + ' .test_example').show();
1462          }
1463        } else {
1464          window.flashcards[element_id] = 0;
1465          
1466          $('.test-bullet[data-id=' + element_id +']').addClass('failed');
1467        }
1468        $('#test-element-' + element_id + ' .explanation_row').show();
1469        $('#test-element-' + element_id + ' .btn[data-value='+ Drupal.settings.pridea.testAnswers[element_id][0]+ ']').addClass('this_wins');
1470      } else {
1471        $('.test-bullet[data-id=' + element_id +']').addClass('error');
1472      }
1473    } else {
1474      window.flashcards[element_id] = 0;
1475      $('.test-bullet[data-id=' + element_id +']').addClass('failed');
1476    }
1477    test_answers_post();
1478    if (!test.is(':last-child')) $('.test_navigation a.next').show();
1479  }
1480
1481  function test_compare_words(correct,test) {
1482    var smplf = function($t){return $t.replace(/á/g,'a').replace(/é/g,'e').replace(/í/g,'i').replace(/ó/g,'o').replace(/ú/g,'u');} 
1483    if (correct == test) return 1;
1484    if (smplf(correct) == smplf(test)) return 0.7;
1485    return 0;
1486  }
1487
1488
1489  function test_conj_answer() {
1490    var res = 0;
1491    var total = 0;
1492    var test = $('.exercise-test-element.active').addClass('passed');
1493    var element_id = test.attr('data-id');
1494    if (Drupal.settings.pridea.conjResult !== undefined && Drupal.settings.pridea.conjResult[element_id - 1] !== undefined) {
1495      test.find('.conj_input').each(function(){
1496        var i = $(this);
1497        var t = i.val();
1498        var v = i.attr('data-value');
1499        var correct = Drupal.settings.pridea.conjResult[element_id - 1][v];
1500        total++;
1501        var word_res = test_compare_words(correct,t);
1502        res += word_res;
1503        if (word_res == 1) {
1504          i.replaceWith('<span class="answer">' + t + '</span>');
1505        } else {
1506          if (word_res > 0.5) {
1507            i.replaceWith('<span class="incorrect-answer">' + t + ' <span class="correct">' + correct + '</span></span>');
1508          } else {
1509            i.replaceWith('<span class="wrong-answer">' + t + ' <span class="correct">' + correct + '</span></span>');
1510          }
1511          
1512        }
1513      });
1514      $('.test-bullet[data-id=' + element_id +']').addClass((res > 2) ? 'passed' : 'failed');
1515      window.flashcards[element_id] = res / total;
1516    }
1517    conj_answers_post();
1518    if (!test.is(':last-child')) $('.test_navigation a.next').show();
1519  }
1520
1521  function test_continue($test_id) {
1522    if (Drupal.settings.pridea.testResult !== undefined && Drupal.settings.pridea.testResult[$test_id] !== undefined) {
1523      var progress = Drupal.settings.pridea.testResult[$test_id].progress;
1524      var elements = $('.exercise-test-element');
1525      var count = elements.length;
1526      var type = elements.first().parent().closest('.exercise-test').attr('data-type');
1527      if (type !== 'test_v_t' && progress.length < count) {
1528        for (var i = 0; i < progress.length; i++) {
1529          var element_id = elements.eq(i).addClass('passed').attr('data-id');
1530          window.flashcards[element_id] = progress[i] * 1;
1531          $('.test-bullet[data-id=' + element_id +']').addClass( (progress[i] == 1) ? 'passed' : 'failed');
1532          if (Drupal.settings.pridea.testAnswers[element_id] !== undefined) {
1533            $('#test-element-' + element_id + ' .btn[data-value='+ Drupal.settings.pridea.testAnswers[element_id][0]+ ']').addClass('this_wins');
1534          } else {
1535            return 0;
1536          }
1537        }
1538        return progress.length;
1539      }
1540    }
1541    return 0;
1542  }
1543
1544  function conj_navigate(element = 'start') {
1545    var el = false;
1546    //console.log('Navigate', element);
1547    if (element == 'next') {
1548      el = $('.exercise-test-element.active').next();
1549    } else if (element == 'prev') {
1550      el = $('.exercise-test-element.active').prev();
1551    } else if (element == 'start') {
1552      el = $('.exercise-test-element').eq(0);
1553    }
1554    if (el.length>0) {
1555      $('.exercise-test-element').removeClass('active').hide();
1556      el.addClass('active').show();
1557      $('.test_navigation a').show();
1558      if (!el.hasClass('passed')) $('.test_navigation a.next').hide();
1559      if (el.is(':last-child')) $('.test_navigation a.next').hide();
1560      if (el.is(':first-child')) $('.test_navigation a.prev').hide();
1561    }
1562    var element_id = $('.exercise-test-element.active').attr('data-id');
1563    $('.test-bullet').removeClass('active');
1564    $('.test-bullet[data-id=' + element_id +']').addClass('active');
1565  }
1566
1567  function test_navigate(element = 'next') {
1568    var el = false;
1569    var bul = false;
1570    clearTimeout(window.testTimer);
1571    setTimeout(function(){
1572      $('#timebar').removeClass('armed');
1573      var test = $('.page-node.node-type-test .node-test, #my-word-test');
1574      if (element == 'next') {
1575        el = $('.exercise-test-element.active').next();
1576      } else if (element == 'prev') {
1577        el = $('.exercise-test-element.active').prev();
1578      } else {
1579        if (parseInt(element) != NaN ) {
1580          el = test.find('.exercise-test-element').hide().removeClass('active').eq(element);
1581        }
1582      }
1583      if (el.length>0) {
1584        $('.test_navigation a').show();
1585        if (!el.hasClass('passed')) $('.test_navigation a.next').hide();
1586        if (el.is(':last-child')) $('.test_navigation a.next').hide();
1587        if (el.is(':first-child')) $('.test_navigation a.prev').hide();
1588        test.find('.exercise-test-element').hide().removeClass('active');
1589        el.show().addClass('active');
1590        var element_id = $('.exercise-test-element.active').attr('data-id');
1591        $('.test-bullet').removeClass('active');
1592        $('.test-bullet[data-id=' + element_id +']').addClass('active');
1593        if (!el.hasClass('passed')) {
1594          $('#timebar').addClass('armed');
1595          window.testTimer = setTimeout(function(){
1596            test_answer(-1);
1597            $('#timebar').removeClass('armed');
1598          },window.testDelay);
1599        }
1600      }
1601    },100);
1602  }
1603
1604
1605  function tests() {
1606    var test = $('.page-node.node-type-test .node-test, #my-word-test').once(function(){
1607      window.flashcards = {};
1608      window.testDelay = 10000;
1609      var test = $(this);
1610      if (test.hasClass('exercise-test-test_phr') || test.hasClass('exercise-test-test_grm')) {
1611        window.testDelay = 60000;
1612      }
1613      var start = test_continue($(this).attr('data-id'));  
1614      if (test.attr('id') == 'my-word-test') {
1615        start = 0;
1616      }
1617      $('nav.test_navigation .next').click(function(e){
1618        test_navigate('next');
1619        e.preventDefault();
1620      });
1621      $('nav.test_navigation .prev').click(function(e){
1622        test_navigate('prev');
1623        e.preventDefault();
1624      });
1625      $(this).find('#test_items .btn.btn-main').on('click touchend',function(e){
1626        if (!$(this).closest('.exercise-test-element').hasClass('passed')) {
1627          var answer = $(this).addClass('clicked').attr('data-value');
1628          test_answer(answer);          
1629        }
1630      });
1631      $('#test_start').click(function(){
1632        $('#test_intro').hide();
1633        $('#test_main').show();
1634        setTimeout(function(){
1635          test_navigate(start);
1636        },300);
1637      });
1638      /*setTimeout(function(){
1639        test_navigate(start);
1640      },500);   */   
1641    });
1642
1643    $('.test-intro .result-mark').once(function(){
1644      var p = $(this);
1645      var tid = p.attr('class').replace(/.*progress_([0-9]*).*/,'$1');
1646      if (digObject('Drupal.settings.pridea.testResult') !== false && Drupal.settings.pridea.testResult[tid] !== undefined) {
1647        var res = Drupal.settings.pridea.testResult[tid].result*1; 
1648        var cls = getMarkClass(res);
1649        //if (p.hasClass('test_v_t') || p.hasClass('test_v_i') || p.hasClass('test_v_p')) total = 10;
1650        //var percent = 100 * Drupal.settings.pridea.testResult[tid].progress.length / total;
1651        p.append(Math.round(res * 10) ).addClass('show').addClass(cls);
1652      }
1653    });
1654    var testProgress = false;
1655    if (testProgress = digObject('Drupal.settings.pridea.testResult')) {
1656      var test_ids = Object.keys(testProgress);
1657      var res = 0;
1658      for (var i = test_ids.length - 1; i >= 0; i--) {
1659        res = parseFloat(testProgress[test_ids[i]].result) * 10;
1660        $('.active1 .homework_row .progress_' + test_ids[i]).text(res.toPrecision(2));
1661        
1662      }
1663      
1664    }
1665    //$('.homework_row .progress')
1666
1667    $('.test_example_show').once().click(function(){
1668      $(this).hide().parent().find('.test_example').show();
1669    });
1670
1671    $('.conjugation_container').once(function(){
1672      window.flashcards = {};
1673      var start = test_continue($(this).attr('data-id'));  
1674      $('nav.test_navigation .next').click(function(e){
1675        conj_navigate('next');
1676        e.preventDefault();
1677      });
1678      $('nav.test_navigation .prev').click(function(e){
1679        conj_navigate('prev');
1680        e.preventDefault();
1681      });
1682      $(this).find('.btn.btn-main').click(function(){
1683        if (!$(this).closest('.exercise-test-element').hasClass('passed')) {
1684          test_conj_answer();        
1685          $(this).hide();  
1686        }
1687      });
1688      setTimeout(function(){
1689        conj_navigate();
1690      },500);      
1691    });
1692
1693    $('#tests_back_btn').attr('href',document.referrer);
1694  }
1695
1696
1697  function groupRequests() {
1698    $('.btn-group-request').click(function(){
1699      var btn = $(this);
1700      if (btn.attr('data-uid') !== undefined && btn.attr('data-utype') !== undefined) {
1701        $.post('/ajax/group_request',{rtype: btn.attr('data-utype'), rid: btn.attr('data-uid') },function(data) {
1702          if (data !== '' && data !== undefined) {
1703            var d = JSON.parse(data);
1704            console.log(d);
1705            if (d.result == 'OK' && d.text !== undefined) {
1706              modalbox(Drupal.t('Group request'), d.text);
1707            } else {
1708              if (d.text  !== undefined) {
1709                modalbox(Drupal.t('Error'), d.text);
1710              }
1711            }
1712          }
1713        });
1714      }
1715    })
1716  }
1717
1718  function searchForm() {
1719    var searchDic = function(){
1720      var q = $('#block-block-6 input[type=text]').val().trim();
1721      window.location = '/dictionary/' + q;
1722    }
1723    $('#block-block-6 .btn').once().click(searchDic);
1724    $('#block-block-6 input[type=text]').keyup(function(event){
1725      if (event.which == 13) searchDic();
1726    })
1727
1728    $('#serch_link a').html('<span>' + $('#serch_link a').text() + '</span><svg><use xlink:href="/sites/all/themes/pridea/media/icons.svg#i_search"></svg>');
1729  }
1730
1731
1732  function navigationElements() {
1733    $('.unit_theme_title').once(function(){
1734      var elements = Drupal.settings.pridea.navigator;
1735      if (elements.length>0) {
1736        var theme = $('<span id="theme_navigator" class="col-12 col-md-4 col-lg-5 text-md-right" ></span>').appendTo(this);
1737        for (var i = 0; i < elements.length; i++) {
1738          if (elements[i].node == '1') {
1739            theme.append('<a id="nid_' + elements[i].id + '" href="' + elements[i].url + '">Int.</a>');
1740          } else {
1741            theme.append('<a id="eid_' + elements[i].id + '" href="' + elements[i].url + '">E' + elements[i].eindex + '</a>');
1742          }
1743        }        
1744      }
1745    });
1746    if (digObject('Drupal.settings.pridea.current') !== false) {
1747      $('#' + Drupal.settings.pridea.current.type + 'id_' + Drupal.settings.pridea.current.id).addClass('current');
1748    }
1749  }
1750
1751
1752  function swipe(){
1753    var t = $('.exercise-test,.conjugation_container').addClass('drag-parent');
1754    var dr = t.find('.exercise-test-element');
1755    var x = 0;
1756    var ts = 0;
1757    var dir = 0;
1758    if (dr.length > 0){
1759      var i = dr.draggable({ axis: "x", scroll: false ,
1760        start: function(e, ui) {
1761          $(this).addClass('swipe');
1762          x = ui.position.left;
1763          ts = new Date().getTime();
1764          dir = 0;
1765        },
1766        drag: function(e, ui) {
1767          var cdir = x > ui.position.left ? 1 : -1;
1768          if (cdir != dir) {
1769            dir = cdir;
1770            $(this).removeClass('dir-1').removeClass('dir1').addClass('dir' + dir);
1771          }
1772        },
1773        stop: function(e, ui) {
1774          var delta = x - ui.position.left;
1775          var speed = delta / (new Date().getTime() - ts);
1776          var ret = true;
1777          if (speed > 1 && delta > 100) {
1778            if ($('nav.test_navigation .next').is(':visible')) {
1779              ret = false;
1780              var w = $(this).outerWidth();
1781              $(this).draggable('disable').animate({left: -w},function(){
1782                $('nav.test_navigation .next').click();
1783                $(this).css({left: 0}).draggable('enable');
1784              });
1785            }
1786          }
1787          if (speed < -1 && delta < -100) {
1788            if ($('nav.test_navigation .prev').is(':visible')) {
1789              ret = false;
1790              var w = $(this).outerWidth();
1791              $(this).draggable('disable').animate({left: w},function(){
1792                $('nav.test_navigation .prev').click();
1793                $(this).css({left: 0}).draggable('enable');
1794              });
1795            }
1796          }
1797          if (ret) {
1798            $(this).draggable('disable').animate({left: 0},300,function(){
1799              $(this).draggable('enable');
1800            });
1801          }
1802          $(this).removeClass('swipe');
1803        },
1804      });
1805    }
1806  }
1807
1808
1809  function homeworkProgress(){
1810    $('.hw_toggle_marks').click(function(e){
1811      $(this).closest('.homework-template, .pridea_chart_wrapper').toggleClass('showmarks');
1812      e.preventDefault();
1813    });
1814    $('.homework-template').find('.hw_toggle_description').click(function(e){
1815      $(this).closest('.homework-template').toggleClass('showdescription');
1816      e.preventDefault();
1817    });
1818
1819    if (digObject('Drupal.settings.pridea.homeworkProgress') !== false) {
1820      var hw,elements,exercises,result,cls,item, title;
1821      hw = Object.keys(Drupal.settings.pridea.homeworkProgress);
1822      for (var i = hw.length - 1; i >= 0; i--) {
1823        elements = Object.keys(Drupal.settings.pridea.homeworkProgress[hw[i]].result);
1824
1825
1826
1827        for (var j = elements.length - 1; j >= 0; j--) {
1828          //console.log(Drupal.settings.pridea.homeworkProgress[hw[i]].result[elements[j]]);
1829          exercises = Object.keys(Drupal.settings.pridea.homeworkProgress[hw[i]].result[elements[j]]);
1830          for (var k = exercises.length - 1; k >= 0; k--) {
1831            //$('.active0 #' + elements[j])
1832            result = parseFloat(Drupal.settings.pridea.homeworkProgress[hw[i]].result[elements[j]][exercises[k]]);
1833
1834            item = $('.active0 #' + elements[j] + exercises[k]).parent();
1835            item.parent().removeClass('s').removeClass('r').removeClass('g').removeClass('y');
1836            if (elements[j] == 'e'){
1837              if (result >= 0.2) item.parent().removeClass('u');
1838              if (result >= 0.99) item.parent().addClass('s')
1839                else
1840              if (result >= 0.8) item.parent().addClass('g')
1841                else 
1842              if (result >= 0.5) item.parent().addClass('y')
1843                else 
1844              if (result >= 0.2) item.parent().addClass('r')
1845            } else {
1846              if (result > 0.9) item.parent().addClass('g')
1847            }
1848            
1849
1850            
1851            
1852          
1853            item.attr('title',result);
1854            if (elements[j] == 'e'){
1855              $('.active0 .' + elements[j] + exercises[k] + '_result').html('<span class="hwm">' + result.toPrecision(2) * 10 + '</span>');
1856            }else {
1857              if (result > 0.9)
1858                $('.active0 .' + elements[j] + exercises[k] + '_result').html('<span class="hwm">+</span>');
1859            }
1860            //console.log('.active0 #' + elements[j] + exercises[k],Drupal.settings.pridea.homeworkProgress[hw[i]].result[elements[j]][exercises[k]]);
1861          }
1862        }
1863      }
1864    }
1865    if (digObject('Drupal.settings.pridea.testResult') !== false) {
1866      var testResult,result;
1867      hw = Object.keys(Drupal.settings.pridea.testResult);
1868      for (var i = hw.length - 1; i >= 0; i--) {
1869        testResult = parseFloat(Drupal.settings.pridea.testResult[hw[i]].result);
1870        item = $('.active0 #t' + hw[i]).parent();
1871        item.parent().removeClass('s').removeClass('r').removeClass('g').removeClass('y');
1872        $('.active0 .t' + hw[i] + '_result').html('<span class="hwm">' + testResult.toPrecision(2) * 10 + '</span>');
1873        if (testResult >= 0.2) item.parent().removeClass('u');
1874        item.parent().addClass(prideaGetMarkClass(testResult));
1875      }
1876    }
1877
1878  }
1879
1880
1881  function modalbox(title,body,footer = '') {
1882    $('#modalbox h2').html(title);
1883    $('#modalbox .modal-body').html(body);
1884    $('#modalbox .modal-footer').remove();
1885    if (footer !== '') {
1886      $('#modalbox .modal-body').after('<div class="modal-footer">' + footer + '</div>');
1887    } 
1888    $('#modalbox .modal-body').html(body);
1889    $('#block-user-login').modal('hide');
1890    $('#modalbox').modal();
1891  }
1892  
1893
1894  function homeworkAdminProgress() {   
1895    $('.homework-admin-template').once(function(){
1896      var hw = $(this);
1897      var hw_id = hw.attr('data-id');
1898      var gr_id = hw.attr('data-group');
1899      var hwmval = 0;
1900
1901
1902      var show_hw_data = function(){
1903        var rows_data = {};
1904        var users_data = {};
1905        var users = hw.find('.hw_user');
1906        var rows = hw.find('.homework_row');
1907        var calculatedData = {};
1908        if (calculatedData = digObject('Drupal.settings.pridea.studentProgressCalculated_'+gr_id +'_'+hw_id)) {
1909          rows_data = calculatedData.rows_data;
1910          users_data = calculatedData.users_data;
1911        } else {
1912          hw.find('.hw_rs').addClass('u').removeClass('y').removeClass('r').removeClass('g').removeClass('s').html('<span class="hwm">-</span>');
1913          rows.addClass('u').removeClass('y').removeClass('r').removeClass('g').removeClass('s').find('.result').html('<span class="hwm">-</span>');
1914          rows.each(function(){
1915            var row = $(this);
1916            var item = row.find('a');
1917            var id = item.attr('data-id');
1918            var key = item.attr('data-type');
1919            users.each(function(){
1920              var user = $(this);
1921              var uid = user.attr('data-uid');
1922              var rate = 0;
1923              if (rate = digObject('Drupal.settings.pridea.studentProgress.'+hw_id + '.' +key + '.' + id + '.' + gr_id + '.' + uid)) {
1924                rate = parseFloat(rate);
1925                if (rows_data[key + id] !== undefined) {
1926                  rows_data[key + id] += rate;
1927                } else {
1928                  rows_data[key + id] = rate;
1929                }
1930                if (users_data[uid] !== undefined) {
1931                  users_data[uid] += rate;
1932                } else {
1933                  users_data[uid] = rate;
1934                }              
1935              }
1936            });
1937          });
1938          calculatedData = {};
1939          calculatedData.rows_data = rows_data;
1940          calculatedData.users_data = users_data;
1941          Drupal.settings.pridea['studentProgressCalculated_'+gr_id +'_'+hw_id] = calculatedData;
1942
1943        }
1944        
1945        var row_count = rows.length;
1946        var user_count = users.length;
1947        var row_keys = Object.keys(rows_data);
1948        var user_keys = Object.keys(users_data);
1949        
1950        hw.find('.homework_plate .result').html('<span class="hwm">-</span>');
1951        hw.find('.hw_rs').html('<span class="hwm">-</span>');
1952        var res = 0;
1953        var item = 0;
1954        for (var i = row_keys.length - 1; i >= 0; i--) {
1955          res = rows_data[row_keys[i]] / user_count;
1956          
1957          item = hw.find('#' + row_keys[i]).parent().parent().find('.result').html('<span class="hwm">'+ (res * 10).toPrecision(2) + '</span>');
1958          item.parent().removeClass('s').removeClass('r').removeClass('g').removeClass('y');
1959          if (res >= 0.2) item.parent().removeClass('u');
1960          item.parent().addClass(prideaGetMarkClass(res));
1961        }
1962        for (var i = user_keys.length - 1; i >= 0; i--) {
1963          res = users_data[user_keys[i]] / row_count;
1964          item = hw.find('.u-' + hw_id + '-' + user_keys[i]).html('<span class="hwm">'+ (res *10).toPrecision(2) + '</span>');
1965          if (res >= 0.2) item.removeClass('u');
1966          item.addClass(prideaGetMarkClass(res));
1967        }
1968      };
1969
1970      hw.click(function(e){
1971        e.stopPropagation();
1972        hw.find('.selected').removeClass('selected');
1973        show_hw_data();
1974      });
1975      if (digObject('Drupal.settings.pridea.studentProgress.'+hw_id) !== false) {
1976        show_hw_data();
1977        var rows = hw.find('.homework_row').click(function(e){
1978          hw.find('.selected').removeClass('selected');
1979          var item = $(this).addClass('selected').find('a');
1980          hw.find('.result').html('-');
1981          var id = item.attr('data-id');
1982          var key = item.attr('data-type');
1983          var ul = false;
1984          show_hw_data();
1985
1986          hw.find('.hw_rs').addClass('u').removeClass('y').removeClass('g').removeClass('r').removeClass('s').html('<span class="hwm">-</span>');
1987          if (ul = digObject('Drupal.settings.pridea.studentProgress.'+hw_id + '.' +key + '.' + id + '.' + gr_id)) {
1988            
1989            var users = Object.keys(ul);
1990            var res = 0;
1991            var hwu;
1992            for (var i = users.length - 1; i >= 0; i--) {
1993              res = parseFloat(ul[users[i]]);
1994              hwmval = key == 'l' ? '+' : (res * 10).toPrecision(2)
1995              hwu = hw.find('.u-' + hw_id + '-' + users[i]).html('<span class="hwm">'+hwmval+'</span>');
1996              if (res >= 0.2) hwu.removeClass('u');
1997              hwu.removeClass('l').removeClass('e').removeClass('t');
1998              hwu.addClass(key);
1999              hwu.addClass(prideaGetMarkClass(res));
2000            }
2001          }
2002          e.preventDefault();
2003          return false;
2004        });
2005        hw.find('.hw_user').click(function(e){
2006          var hwu = $(this);
2007          if (!hwu.hasClass('selected')) {
2008            hw.find('.selected').removeClass('selected');
2009            var uid = hwu.addClass('selected').attr('data-uid');
2010            var res = 0;
2011            show_hw_data();
2012            //hw.find('.hw_rs').addClass('r').removeClass('y').removeClass('g').text('-');
2013            rows.addClass('u').removeClass('r').removeClass('g').removeClass('y').removeClass('s').find('.result').html('<span class="hwm">-</span>');
2014            rows.each(function(){
2015              var row = $(this);
2016              var item = row.find('a');
2017              var id = item.attr('data-id');
2018              var key = item.attr('data-type');
2019              var hu = 0;
2020              if (hu = digObject('Drupal.settings.pridea.studentProgress.'+hw_id + '.' +key + '.' + id + '.' + gr_id + '.' + uid)) {
2021                hu = parseFloat(hu);
2022                hwmval = key == 'l' ? '+' : (hu * 10).toPrecision(2)
2023                row.find('.result').html('<span class="hwm">'+hwmval+'</span>');
2024                if (hu >= 0.2) row.removeClass('u');
2025                row.addClass(prideaGetMarkClass(hu));
2026              }
2027            });
2028            e.preventDefault();
2029            return false;
2030          }
2031        });
2032      }
2033    });
2034    
2035  }
2036
2037
2038  function groupExtras(){
2039
2040    $('.group_node_click').each(function(){
2041      /*var lastT = 0;
2042      var trig = false;
2043      var surplus = 0;
2044      var g = $(this);
2045      g.find('.userpic_wrap.hidden').removeClass('hidden');
2046      g.find('.last-on-row').removeClass('last-on-row');
2047      g.find('.extraItems').remove();
2048      g.find('.userpic_wrap').each(function(index){
2049        var i = $(this);
2050        var ot = i.offset().top;
2051        if (index == 0) {
2052          lastT = ot
2053        } else {
2054          if (Math.abs(lastT - ot) > 2) {
2055            i.addClass('hidden');
2056            if (surplus == 0) {
2057              i.prev().addClass('last-on-row');
2058            }
2059            surplus++;
2060          }
2061        }
2062      });
2063      g.find('.last-on-row').append('<div class="extraItems">'+surplus+'</div>');*/
2064      var g = $(this);
2065      var href = g.attr('data-href');
2066      g.click(function(){
2067        window.location = href;
2068      })
2069    });
2070  }
2071
2072
2073  function messages() {
2074    $('.messages.status,.messages.error, .messages.warning').once(function(){
2075      $(this).append('<div class="close-message">×</div>');
2076    });
2077    $('.close-message').click(function(){
2078      $(this).parent().fadeOut(function(){
2079        $(this).remove();
2080      });
2081    });
2082  }
2083
2084
2085  function testAdmin() {
2086    if (digObject('Drupal.settings.pridea.pageData.user_uid') > 0) {
2087      $('.view-id-tests').once(function(){
2088        $.get('/ajax/homework/list/t',function(data){
2089          //console.log('hw_admin',data);
2090          var s = JSON.parse(data);
2091          if (s.result == 1 ) {
2092            $('.test-intro').each(function(){
2093              var cls = $(this).attr('class').replace(/.*test-id-([0-9]*).*/,'$1');
2094              if (s.t !== undefined && s.t.includes(cls)) {
2095                /*$(this).append('<a href="#" class="course-rem-homework btn btn-svg" data-key="t" data-id="' + cls + '"><svg class="btn_svg">'+
2096                  '<use xlink:href="/sites/all/themes/pridea/media/icons.svg#i_hw_minus"></use></svg></a>');*/
2097                $(this).prepend(
2098                  '<div data-id="' + cls + '" data-type="t" class="hw_actions_test added" id="t' + cls + '" ><span class="main">' + 
2099                  Drupal.t('Add to homework') + '</span><svg><use class="minus" xlink:href="/sites/all/themes/pridea/media/icons.svg#cb2_check" /><use class="plus" xlink:href="/sites/all/themes/pridea/media/icons.svg#cb2_empty" /></svg></div>'
2100                );
2101              } else {
2102                /*$(this).append('<a href="#" class="course2homework btn btn-svg" data-key="t" data-id="' + cls + '"><svg class="btn_svg">'+
2103                  '<use xlink:href="/sites/all/themes/pridea/media/icons.svg#i_hw_plus"></use></svg></a>');*/
2104                              $(this).prepend(
2105                  '<div data-id="' + cls + '" data-type="t" class="hw_actions_test" id="t' + cls + '" ><span class="main">' + 
2106                  Drupal.t('Add to homework') + '</span><svg><use class="minus" xlink:href="/sites/all/themes/pridea/media/icons.svg#cb2_check" /><use class="plus" xlink:href="/sites/all/themes/pridea/media/icons.svg#cb2_empty" /></svg></div>'
2107                );
2108              }
2109            });
2110          }
2111          homeworkManage();
2112        },'text');
2113      });
2114    }
2115  }
2116
2117
2118
2119  function exercise_stat_show(uid) {
2120    var el = false;
2121
2122    var stat_assign = function(q, a) {
2123      if (q !== undefined) {
2124        if (q[0].nodeName.toUpperCase() == 'INPUT')  q.val(a);
2125        if (q[0].nodeName.toUpperCase() == 'TD')     q.html(a);
2126        if (q[0].nodeName.toUpperCase() == 'SELECT') q.val(a);
2127        //console.log(q[0].nodeName.toUpperCase());
2128      }
2129    }
2130
2131    $('.exercises > div').addClass('undone').find('.result-mark').removeClass('r').removeClass('y').removeClass('g').removeClass('s').removeClass('u').html('-');
2132    $('.exercises .test_element .answer').removeClass('val0').removeClass('val1').text('');
2133
2134    if (el = digObject('Drupal.settings.pridea.exercise_stat_data.t.' + uid)) {
2135      $('.exercises > div.test_result_view').each(function(){
2136        var t = $(this);
2137        var tid = t.attr('data-nid');
2138        var answers = el[tid];
2139        var mark = Math.round(answers['mark'] * 100) / 10;
2140        var markClass = prideaGetMarkClass(mark / 10);
2141        t.find('.result-mark').addClass(markClass).html(mark);
2142        t.find('.test_element').each(function(index){
2143          var answer = answers['answers'].charAt(index);
2144          //console.log('answer',answer);
2145          $(this).find('.answer').addClass('val'+answer).text(answer);
2146        })
2147      });
2148    }
2149
2150    if (el = digObject('Drupal.settings.pridea.exercise_stat_data.e.' + uid)) {
2151      $('.exercises > div.exercise').each(function(){
2152
2153        var e = $(this);
2154        var eid = e.attr('data-id');
2155        var t = e.attr('data-mode');
2156        var r = false;
2157        
2158        if (el[eid] !== undefined) {
2159          r = el[eid];
2160
2161          //console.log('r', r);
2162          var answer = 0;
2163          var question = false;
2164          
2165
2166          if (r['mark'] !== undefined) {
2167            var mark = Math.round(r['mark'] * 100) / 10;
2168            var markClass = prideaGetMarkClass(mark / 10);
2169            e.find('.result-mark').removeClass('r').removeClass('y').removeClass('g').removeClass('s').removeClass('u').addClass(markClass).html(mark);
2170          }
2171          if (r.u !== undefined) {
2172            e.removeClass('undone');
2173            if (t == 'type' || t == 'selectlist' || t == 'checkboxes') {
2174              var keys = Object.keys(r.u);
2175              for (var i = keys.length - 1; i >= 0; i--) {
2176                answer = r.u[keys[i]];
2177                question = e.find('[data-question=' + keys[i] + ']');
2178                stat_assign(question, answer);
2179              }
2180            }
2181
2182            if (t == 'checkboxes') {
2183              var keys = Object.keys(r.u);
2184              for (var i = keys.length - 1; i >= 0; i--) {
2185                answer = r.u[keys[i]];
2186                question = e.find('[data-question=' + keys[i] + ']').prop('checked',answer);  
2187              }
2188            }
2189  
2190            if (t == 'lexis') {
2191              var keys = Object.keys(r.u);
2192              for (var i = keys.length - 1; i >= 0; i--) {
2193                answer = r.u[keys[i]];
2194                question = e.find('[data-question=' + keys[i] + ']');
2195                stat_assign(question, answer);
2196              }
2197            }
2198  
2199            if (t == 'collate') {
2200              var ula = e.find('ul.answers');
2201              var ulai = ula.children()/*.detach()*/;
2202              e.find('ul.questions').children().each(function(){
2203                var q = $(this).attr('data-question');
2204                var exv = r.u[q]; 
2205                if (exv.length > 0) {
2206                  if (exv.length>1) {
2207                    exv = exv[0]; //все плохо ))
2208                  } else {
2209                    exv = exv[0];
2210                  }
2211                } 
2212                if (r.u[q] !== undefined) {
2213                  ulai.filter('[data-value=' + exv + ']').appendTo(ula);
2214                }
2215              });
2216            }
2217
2218            if (t == 'dragdrop') {
2219              var keys = Object.keys(r.u);
2220              for (var i = keys.length - 1; i >= 0; i--) {
2221                answer = r.u[keys[i]];
2222                if (answer.length > 0) {
2223                  answer = answer[0];
2224                } 
2225                question = e.find('[data-question=' + keys[i] + ']');
2226                e.find('[data-value="' + answer + '"]').appendTo(question);
2227              } 
2228            }
2229  
2230            if (t == 'paint') {
2231              var keys = Object.keys(r.u);
2232              for (var i = keys.length - 1; i >= 0; i--) {
2233                answer = r.u[keys[i]];
2234                if (answer.length > 0) {
2235                  if (answer.length>1) {
2236                    answer = answer[0]; //все плохо ))
2237                  } else {
2238                    answer = answer[0];
2239                  }
2240                } 
2241                question = e.find('[data-question=' + keys[i] + ']').removeAttr('class').addClass('color' + answer);
2242                //stat_assign(question, answer);
2243              }
2244            }
2245
2246            if (t == 'sentense' || t == 'dialog') {
2247              var q = t == 'sentense' ? 'ul.words' : 'ul.sentences';
2248              e.find(q).each(function(){
2249                var ula = $(this);
2250                var ulai = ula.children().detach();
2251                var keys = [];
2252                ulai.each(function(){
2253                  keys.push($(this).attr('data-question'));
2254                });
2255                var inverted = {};
2256                for (var i = keys.length - 1; i >= 0; i--) inverted[r.u[keys[i]]] = keys[i];
2257                Object.keys(inverted).sort().forEach(function(key) {
2258                  ulai.filter('[data-question=' + inverted[key] + ']').appendTo(ula);
2259                });
2260              });
2261            }           
2262          }
2263          e.find('.mistake').removeClass('mistake');
2264          if (r.e !== undefined) {
2265            r.e.forEach(function(err){
2266              showExerciseMistake(e,t,err);
2267            });
2268          }
2269        }
2270      });
2271    }
2272  }
2273
2274
2275
2276  function exercise_stat(){
2277    $('#exercise_stat').once(function(){
2278      var s = $(this);
2279      var u = s.find('.user_stat_card');
2280      u.click(function(){
2281        u.removeClass('viewing');
2282        var uid = $(this).addClass('viewing').attr('data-uid');
2283        exercise_stat_show(uid); 
2284      });
2285      u.first().click();
2286    });
2287  }
2288
2289
2290  function edittables() {
2291    $('#check_all').once().click(function(){
2292      var cb = $(this);
2293      var state = cb.prop('checked');
2294      //console.log(state);
2295      $('input[type=checkbox]').not(cb).prop('checked',state);
2296    });
2297    $('#remove_all').once().click(function(){
2298      var list = [];
2299      $('input[type=checkbox]:checked').each(function(){
2300        list.push($(this).attr('data-value'));
2301      });
2302      if (list.length>0) {
2303        window.location = '/my_words/remove/' + list.join(',')
2304      }
2305    });
2306  }
2307  
2308
2309  function filters() {
2310    $('.views-exposed-widgets .v-exposed-widget.v-widget-filter-test_level_value,.views-exposed-widgets  .views-widget-filter-test_level_value, .views-exposed-widgets .views-exposed-widget.views-widget-filter-level_value, #lexic_filters').first().appendTo('#filternest');
2311    //$('.views-exposed-widget views-submit-button').hide();
2312  }
2313
2314
2315  function mainmenu() {
2316    $('#block-system-main-menu li.expanded > a').on('click mousedown',function(e){
2317      $('.user_menu').removeClass('user_menu');
2318      $('#block-system-main-menu .sub').removeClass('sub');
2319      $(this).parent().addClass('sub');
2320      e.preventDefault();
2321      return false;
2322    });
2323    $('#block-system-main-menu').mouseleave(function(){
2324      $('#block-system-main-menu .sub').removeClass('sub');
2325    })
2326
2327  }
2328
2329  function htmltables(){
2330    $('.field-body table').each(function(){
2331      var t = $(this);
2332      var td = t.find('td');
2333      if (td.length == 2) {
2334        t.replaceWith('<div class="row was_table"><div class="col-12 col-md-6">' + td.eq(0).html() + '</div><div class="col-12 col-md-6">' + td.eq(1).html() + '</div></div>');
2335      } else {
2336        var p = t.closest('.field-body');
2337        t.wrap('<div class="scrollable"></div>');
2338      }
2339    });
2340  }
2341
2342  function ajax_actions(){
2343    $('a.notification_action, a.ajax_action').click(function(e){
2344      e.preventDefault();
2345      var btn = $(this);
2346      var attrs = btn[0].attributes;
2347      var list = {};
2348      for (var i = attrs.length - 1; i >= 0; i--) {
2349        if (attrs[i].name.search('data-') == 0) {
2350          list[attrs[i].name.replace('data-','')] = attrs[i].value;
2351        }
2352      }
2353      //console.log(list);
2354      $.post(btn.attr('href'),list,function(data){
2355        var d = JSON.parse(data);
2356        if (d.result == 'ok') {
2357          if (d.message !== undefined) {
2358            var footer = '';
2359            if (d.button !== undefined) footer = d.button;
2360            //console.log(d.message);
2361            modalbox(Drupal.t('Success'), d.message, d.button);
2362          }
2363        } else {
2364          modalbox(Drupal.t('Error'), Drupal.t('Something went wrong'));
2365        }
2366      });
2367    })
2368  }
2369
2370  function markup() {
2371    $('.phraseology_variant').before('<div class="phraseology_label">' + Drupal.t('Can be translated as ') + '</div>');
2372    $('.langme').each(function(){
2373      var a = $(this);
2374      a.attr('href',a.attr('href') + '?language='+Drupal.settings.current_language);
2375    })
2376  }
2377
2378
2379  function unregistered() {
2380    if (digObject('Drupal.settings.pridea.pageData.user_uid') == 0) {
2381      $('.theme-elements a.exrcs').once().click(function(e){
2382        $('#login-link').click();
2383        e.preventDefault();
2384        return false;
2385      });
2386      $('.view-id-tests a').once().click(function(e){
2387        $('#login-link').click();
2388        e.preventDefault();
2389        return false;
2390      });
2391    }
2392  }
2393
2394  function themeToggleSave(){
2395    var toggled = $.cookie('theme_visibility');
2396    if (toggled == null || toggled == undefined) {
2397      toggled = [];
2398    } else {
2399      toggled = JSON.parse(toggled);
2400    }
2401    $('.theme_toggle').click(function(){
2402      var btn = $(this);
2403      var target = btn.attr('data-target');
2404      if (btn.hasClass('collapsed')) {
2405        toggled.splice(toggled.indexOf(target),1);
2406      } else {
2407        toggled.push(target);
2408      }
2409      $.cookie('theme_visibility',JSON.stringify(toggled));
2410    });
2411
2412    toggled.forEach(function(item){
2413      $('[data-target='+item+']').addClass('collapsed');
2414      $(item).removeClass('show').addClass('collapse');
2415    });
2416  }
2417
2418  Drupal.behaviors.pridea = {
2419    attach: function (context, settings) {
2420
2421      $('audio').once().initAudioPlayer();
2422      filters();
2423      comments();
2424      sessionTimeout();
2425    	rescale();
2426      setTimeout(rescale,600);
2427    	exercises();
2428      keyboard();
2429      lexis_slides();
2430    	checkExerciseBtn();
2431      navigationElements();
2432      showProgress();
2433      slicks();
2434      languageSwitcher();
2435      //stat();
2436      searchForm();
2437      tests();
2438      testAdmin();
2439      htmltables();
2440      markup();
2441      swipe();
2442      homeworkManage();
2443      homeworkManageCheck();
2444      homeworkProgress();
2445      homeworkAdminProgress();
2446      messages();
2447      exercise_stat();
2448      edittables();
2449      groupRequests();
2450      mainmenu();
2451      ajax_actions();
2452      unregistered();
2453      themeToggleSave();
2454
2455      $('.click-reload').click(function(){document.location.reload();});
2456
2457      $('#pridea-group-messages-form .form-textarea, #pridea-messages-reply-form .form-textarea, #group-post-node-form .form-textarea').trumbowyg({
2458          btns: [['strong', 'em','underline'], ['link']],
2459          autogrow: true
2460      });
2461
2462      $('#pridea-base-group-unsubscribe-form').once(function(){
2463        var form = $(this);
2464        var i = form.find('.form-item-notify input');
2465        var sw = function(){
2466          if (i.is(':checked')) {
2467            form.find('.form-item-message').show()
2468          }else {
2469            form.find('.form-item-message').hide()
2470          }
2471        };
2472        sw();
2473        i.change(sw);
2474      });
2475
2476      $('.form-file').once().filestyle();
2477
2478      //checkFooter(); 
2479      //setTimeout(checkFooter,300);
2480
2481      $('#login-link').once().click(function(e){
2482        var btnpath = $(this).attr('href');
2483        $.get('/ajax/is_logged_in',function(data){
2484          if (parseInt(data) > 0) {
2485            location.reload();
2486          } else {
2487            var modal = $('#block-user-login');
2488            if (modal.length == 0) {
2489              window.location = btnpath;
2490            } else {
2491              var form_id = modal.find('[name=form_id]').val();
2492              var form_build_id = modal.find('[name=form_build_id]').val();
2493              var form_callback = modal.find('[name=form_callback]').val();
2494              $.post('/ajax/form_check',{form_data: {form_id: form_id,form_build_id: form_build_id,form_callback: form_callback}},function(data){
2495                var res = JSON.parse(data);
2496                if (res.result == 'REFRESH') {
2497                  modal.find('[name=form_build_id]').val(res.data);
2498                  $('#block-user-login').modal();
2499                } else if (res.result == 'CACHED') {
2500                  $('#block-user-login').modal();
2501                } else {
2502                  window.location = btnpath;
2503                }
2504              });          
2505            } 
2506          }
2507        });
2508        e.preventDefault();
2509      });
2510      $('.user-register-link').click(function(e){
2511        modalbox(Drupal.t('Registration'),
2512          '<div class="container"><div class="row">' + 
2513            '<div class="col text-center text-md-left">' +
2514              '<a class="profile_registration_link register_student" href="/student/register?language=' + Drupal.settings.current_language+ '">' + Drupal.t('I am a student') + '</a>' +
2515            '</div>' +
2516            '<div class="col text-center text-md-right">' +
2517              '<a class="profile_registration_link register_teacher" href="/prof/register?language=' + Drupal.settings.current_language+ '">' + Drupal.t('I am a teacher') + '</a>' +
2518            '</div>' + 
2519          '</div></div>'
2520        );
2521        //$('#profileModal').modal();
2522        e.preventDefault();
2523      });
2524
2525      $('.page-user-messages .msg-node .msg_reply').click(function(){
2526        var a = $(this).closest('.msg-main').find('h2 a');
2527        var b = $(this).attr('href');
2528        if (a.length == 1) {
2529          window.location = a.attr('href') + b;
2530        }
2531      });
2532    }
2533  };
2534
2535
2536  function languageSwitcher() {
2537    if (digObject('Drupal.settings.language') !== false) {
2538      var languages = Object.keys(Drupal.settings.language);
2539      var current = '';
2540      var available = '';
2541      var path = document.location.pathname;
2542      for (var i = languages.length - 1; i >= 0; i--) {
2543        Drupal.settings.language[languages[i]];
2544        if (Drupal.settings.language[languages[i]].current) {
2545          current += '<li id="language_current" class="svgw">' + languages[i] + '<svg preserveAspectRatio="none" class="language_icon"><use xlink:href="/sites/all/themes/pridea/media/icons.svg#flag-' + languages[i] + '"></svg></li>';
2546        }  else {
2547          available += '<li><a href="' + path + '?language=' + languages[i] + '">' + languages[i] + '<svg preserveAspectRatio="none" class="language_icon"><use xlink:href="/sites/all/themes/pridea/media/icons.svg#flag-' + languages[i] + '"></svg></a></li>';
2548        }
2549                
2550      }
2551      available = '<div class="language" id="language_switcher"><ul class="available sub_menu">' + available + current + '</ul></div>';
2552      $('#breadcrumbline .container').append(available);
2553      //$('#language_switcher').append(available);
2554      $('#language_current').click(function(e){
2555        $('#language_switcher').toggleClass('active');
2556        e.stopPropagation();
2557      });
2558    }  
2559  }
2560
2561
2562  function homeworkManageCheck(e = null){
2563    var themes = $('.unit-theme');
2564    if (e !== null) {
2565      themes = $(e).closest('.unit-theme');
2566    }
2567    themes.each(function(){
2568      var theme = $(this);
2569      if (theme.find('.theme-elements li').length == theme.find('.theme-elements li.added').length) {
2570        theme.find('.trw').addClass('added')
2571      } else {
2572        theme.find('.trw').removeClass('added')
2573      }
2574    });
2575  }
2576
2577  function homeworkManage() {
2578    if (digObject('Drupal.settings.pridea.pageData.homework.unpublished')) {
2579      var urlelements = document.location.pathname;
2580      if (urlelements[0] == '/') urlelements = urlelements.substr(1);
2581      urlelements = urlelements.split('/');
2582      if (urlelements[0] !== undefined) {
2583        if (urlelements[0] == 'tests' || urlelements[0] == 'course') {
2584          $('#filternest').once().append('<a id="homework_edit" class="btn btn-main" href="/node/' + Drupal.settings.pridea.pageData.homework.unpublished + '/edit">' + Drupal.t('Edit homework') + '</a>');
2585        } 
2586      }
2587    }
2588    var hwup = function(res){
2589      //console.log(res);
2590      var data =JSON.parse(res);
2591      if (data.success!== undefined) {
2592        if (data.success * 1 == 1) {
2593          if (data.added !== undefined) {
2594            data.added.forEach(function(e){
2595              homeworkManageCheck($('#' + e).addClass('added'));
2596            });
2597          }
2598          if (data.removed !== undefined) {
2599            data.removed.forEach(function(e){
2600              homeworkManageCheck($('#' + e).removeClass('added'));
2601            })
2602          }
2603        }
2604      }
2605    }
2606    if (digObject('Drupal.settings.pridea.pageData.homework.homework_admin')) {
2607      $('.unit-themes-admin .hw_mass').once().click(function(e){
2608        var parent = $(this).parent();
2609        if (parent.hasClass('added')) {
2610          var changes = []; 
2611          parent.next().find('li').each(function(){changes.push({id: this.getAttribute('data-id'), type: this.getAttribute('data-type')})});
2612          $.post('/ajax/homework/rem/',{changes:changes},hwup);
2613        } else {
2614          var changes = []; 
2615          parent.next().find('li').each(function(){changes.push({id: this.getAttribute('data-id'), type: this.getAttribute('data-type')})});
2616          $.post('/ajax/homework/add/',{changes:changes},hwup);
2617        }
2618      });
2619
2620      $('.unit-themes-admin .hw_actions').once().click(function(e){
2621        e.preventDefault();
2622        var btn = $(this);
2623        var parent = btn.closest('li');
2624        if (parent.hasClass('added')) {
2625          $.post('/ajax/homework/rem/',{changes: [{id: this.getAttribute('data-id'), type: this.getAttribute('data-type')}]}, hwup);
2626        } else {
2627          $.post('/ajax/homework/add/',{changes: [{id: this.getAttribute('data-id'), type: this.getAttribute('data-type')}]}, hwup);
2628        }
2629      });
2630
2631      $('.hw_actions_test').once().click(function(e){
2632        e.preventDefault();
2633        var btn = $(this);
2634        if (btn.hasClass('added')) {
2635          $.post('/ajax/homework/rem/',{changes: [{id: this.getAttribute('data-id'), type: this.getAttribute('data-type')}]}, hwup);
2636        } else {
2637          $.post('/ajax/homework/add/',{changes: [{id: this.getAttribute('data-id'), type: this.getAttribute('data-type')}]}, hwup);
2638        }
2639      });
2640    }
2641  }
2642
2643
2644  $(function(){
2645    $('#block-system-user-menu .userpic, #block-menu-block-1 .userpic').once().click(function(e){
2646      $('body').toggleClass('user_menu');
2647      e.stopPropagation(); // This is the preferred method.
2648      return false;     
2649    });
2650    $('#mobile_menu').once().click(function(e){
2651      $('body').toggleClass('main_menu');
2652      e.stopPropagation(); // This is the preferred method.
2653      return false;     
2654    });
2655    $(document).click(function(){
2656      $('body').removeClass('user_menu').removeClass('main_menu');
2657      $('#language_switcher').removeClass('active');
2658    });
2659    notifications();
2660    
2661  });
2662
2663  $(window).resize(rescale);
2664
2665  $(document).bind('cbox_complete', function() { 
2666      var x = setInterval(function(){
2667        if ($('#colorboxNode-login-Wrapper').height() > 300) {
2668
2669          //$.colorbox.resize();
2670          //console.log('$(\'#colorboxNode-login-Wrapper\').height()',$('#colorboxNode-login-Wrapper').height());
2671          //console.log('$(\'#cboxLoadedContent\').height()',$('#cboxLoadedContent').height());
2672          /*if ($('#colorboxNode-login-Wrapper').height() > 300) {
2673            clearInterval(x);
2674          }*/
2675        }
2676      },250);
2677      ///*setTimeout(function(){$.colorbox.resize();},500);
2678  });
2679
2680
2681
2682  /*$(document).mousedown(function(e){
2683    //console.log(e);
2684      window.trackMyMouseLast = {
2685        x: e.pageX,
2686        y: e.pageY,
2687      };
2688  });*/
2689
2690  $(document).dblclick(function(){
2691    var sel = document.getSelection().toString().trim();
2692    //if (window.lastSel !== sel) {
2693      if (sel.indexOf(' ') <0 && sel !== '') {
2694        var url = '/ajax/dictionary/' + sel;
2695        $.get(url,function(data) {
2696          var answer = JSON.parse(data);
2697          $('#dictionary_popup').remove();
2698          $('body').append(answer.data);
2699          $('#dictionary_popup').modal();
2700          //console.log('answer',answer);
2701         // window.lastSel = sel;
2702        });
2703      }
2704    //}
2705  });
2706
2707  /*function translationBoxPosition() {
2708    var box = $('#translateBtn');
2709    var w = document.body.clientWidth;
2710    if (box.offset().left + box.outerWidth() > w) {
2711      box.css({left: w - box.outerWidth()})
2712    }
2713  }*/
2714
2715  /*$(document).bind('selectionchange', function(){
2716    clearTimeout(window.trackMyMouseInterval);
2717    window.trackMyMouseInterval = setTimeout(function(){
2718      $('#translateBtn').remove();
2719      var sel = document.getSelection().toString().trim();
2720      if (sel.indexOf(' ') <0 && sel !== '') {
2721        var url = '/ajax/dictionary/' + sel;
2722        $.get(url,function(data) {
2723          var answer = JSON.parse(data);
2724          $('#dictionary_popup').remove();
2725          $('body').append(answer.data);
2726          $('#dictionary_popup').modal();
2727          //console.log('answer',answer);
2728        });
2729        /*$('<div id="translateBtn"><a href="/dictionary/' + sel + '">' + Drupal.t('Translate') +'</a></div>').css({
2730          left: window.trackMyMouseLast.x,
2731          top: window.trackMyMouseLast.y,
2732        }).appendTo('body').children('a').click(function(e){
2733          var url = '/ajax' + $(this).attr('href');
2734          $(this).text(Drupal.t("Loading") + '...');
2735          $.get(url,function(data) {
2736            var answer = JSON.parse(data);
2737            if (answer.result !== undefined && answer.result.toUpperCase() == 'OK') {
2738              $('#translateBtn').html('<div id="translateResult">' + answer.data + '</div>');
2739            } else {
2740              $('#translateBtn').html('<div id="translateResult">' + Drupal.t('Not found') + '</div>');
2741            }
2742            translationBoxPosition();
2743          });
2744          e.preventDefault();
2745        });
2746        //translationBoxPosition();
2747      }
2748    },500);
2749  });*/
2750
2751
2752})(jQuery, Drupal, this, this.document);
2753

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.