Quiz And Survey Master (Formerly Quiz Master Next) - Version 4.7.0

Version Description

(April 4, 2016) = * Closed Bug: Slash Added Before Quotation Mark When Editing Quiz/Survey Name - Issue #401 * Closed User Request: Add CSS Class To Container When Timer Runs Out - Issue #400 * Closed Bug: Validation breaks on second time through quiz - Issue #398 * Closed Bug: Validation not working when more than one question per page - Issue #395 * Closed Enhancement: Add Spinner/De-activate Submit Button Once Submitted - Issue #387 * Closed Enhancement: Pull changelog from GitHub API - Issue #377 * Closed Bug: Theme Conflict With Button Class (btn) - Issue #370 * Closed User Request: Add Average Points Per Category Variable - Issue #369 * Closed Bug: Mixed content SSL error - Issue #367 * Closed Enhancement: Default Option For Drop Down - Issue #334 * Closed Bug: Disable Answer On Change Not Working - Issue #331 * Closed User Request: Randomize Answers But Not Questions - Issue #330 * Closed User Request: Add Date Taken Variable - Issue #310 * Closed User Request: Copy Questions Between Quizzes - Issue #166

Download this release

Release Info

Developer fpcorso
Plugin Icon 128x128 Quiz And Survey Master (Formerly Quiz Master Next)
Version 4.7.0
Comparing to
See all releases

Code changes from version 4.6.7 to 4.7.0

CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  = 4.6.1 (October 20, 2015) =
2
  * Bug fix for rare bug preventing IE usage on a small number of sites
3
 
1
+ = 4.6.6 (January 11, 2016) =
2
+ * Fixes bug preventing some users to not be able to submit quiz
3
+ * Fixes bug causing undefined titles for some users
4
+
5
+ = 4.6.5 (January 9, 2016) =
6
+ * Fixes timer bug that caused the timer to continue counting down after quiz has been submitted
7
+ * Fixes theme conflict between QSM and some Bootstrap based themes
8
+ * Fixes Quizzes/Surveys page table width issue
9
+ * Fixes bug preventing editing of quiz post settings
10
+ * Minor design changes
11
+
12
+ = 4.6.4 (December 15, 2015) =
13
+ * Fixes undefined results notice displayed on admin results for some users
14
+ * Fixes bug that was causing the disable radio buttons option to not work in all browsers
15
+ * Minor design changes
16
+
17
+ = 4.6.3 (November 4, 2015) =
18
+ * Fixes certificate bug that was preventing quiz/survey submissions
19
+ * Fixes undefined quiz id bug that was affecting some addons
20
+ * Fixes tooltip bug that was affecting required question validation on a few sites
21
+
22
+ = 4.6.2 (October 21, 2015) =
23
+ * Bug fix for browsers with JavaScript turned off
24
+
25
  = 4.6.1 (October 20, 2015) =
26
  * Bug fix for rare bug preventing IE usage on a small number of sites
27
 
css/qmn_admin.css CHANGED
@@ -107,8 +107,8 @@ div.mlw_qmn_icon_wrap {
107
  position: absolute;
108
  top: 0;
109
  right: 0;
110
- background-color: #0d97d8;
111
- color: yellow;
112
  background-position: center 24px;
113
  background-size: 85px 85px;
114
  font-size: 14px;
107
  position: absolute;
108
  top: 0;
109
  right: 0;
110
+ background-color: rgba(54, 58, 66, 1);
111
+ color: #1DD969;
112
  background-position: center 24px;
113
  background-size: 85px 85px;
114
  font-size: 14px;
css/qsm-admin-question.css ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .edit_link,
2
+ .duplicate_link {
3
+ color: #0074a2 !important;
4
+ font-size: 14px !important;
5
+ }
6
+ .delete_link {
7
+ color: red !important;
8
+ font-size: 14px !important;
9
+ }
10
+ .edit_link:hover,
11
+ .duplicate_link:hover,
12
+ .delete_link:hover {
13
+ background-color: black;
14
+ }
15
+
16
+ .row:after,
17
+ .answers:after,
18
+ .answers_single:after {
19
+ clear:both;
20
+ display:table;
21
+ content: " ";
22
+ }
23
+ .row {
24
+ margin-bottom: 15px;
25
+ }
26
+ .row .option_label {
27
+ width:15%;
28
+ float:left;
29
+ font-weight: bold;
30
+ }
31
+ .row .option_input {
32
+ width:84%;
33
+ float:left;
34
+ }
35
+ .question_form {
36
+
37
+ }
38
+ .question_form fieldset {
39
+ margin: 20px 0px;
40
+ background: #fff;
41
+ padding: 5px;
42
+ }
43
+ .question_form legend {
44
+ font-size: 16px;
45
+ font-weight: bold;
46
+ background: #f1f1f1;
47
+ padding: 5px;
48
+ }
49
+ .answer_number,
50
+ .answer_text,
51
+ .answer_points,
52
+ .answer_correct {
53
+ font-weight: bold;
54
+ float:left;
55
+ margin: 1%;
56
+ }
57
+ .answer_number {
58
+ width:10%;
59
+ }
60
+ .answer_text {
61
+ width:60%;
62
+ }
63
+ .answer_points {
64
+ width:10%;
65
+ }
66
+ .answer_correct {
67
+ width:10%;
68
+ }
69
+ .answer_input {
70
+ width: 100%;
71
+ }
72
+ .question_area_header_text {
73
+ padding: 40px 0 0 !important;
74
+ }
75
+
76
+ .other_quiz_question {
77
+ display: flex;
78
+ flex-direction: row;
79
+ justify-content: space-between;
80
+ align-items: center;
81
+ margin: 10px 0;
82
+ border: 1px solid #ccc;
83
+ }
84
+
85
+ .import_question_button,
86
+ .other_quiz_question_text {
87
+ margin-right: 15px !important;
88
+ }
89
+
90
+ @-moz-keyframes qsm-spinner-loader {
91
+ 0% {
92
+ -moz-transform: rotate(0deg);
93
+ transform: rotate(0deg);
94
+ }
95
+ 100% {
96
+ -moz-transform: rotate(360deg);
97
+ transform: rotate(360deg);
98
+ }
99
+ }
100
+ @-webkit-keyframes qsm-spinner-loader {
101
+ 0% {
102
+ -webkit-transform: rotate(0deg);
103
+ transform: rotate(0deg);
104
+ }
105
+ 100% {
106
+ -webkit-transform: rotate(360deg);
107
+ transform: rotate(360deg);
108
+ }
109
+ }
110
+
111
+ @keyframes qsm-spinner-loader {
112
+ 0% {
113
+ -moz-transform: rotate(0deg);
114
+ -ms-transform: rotate(0deg);
115
+ -webkit-transform: rotate(0deg);
116
+ transform: rotate(0deg);
117
+ }
118
+ 100% {
119
+ -moz-transform: rotate(360deg);
120
+ -ms-transform: rotate(360deg);
121
+ -webkit-transform: rotate(360deg);
122
+ transform: rotate(360deg);
123
+ }
124
+ }
125
+
126
+ /* :not(:required) hides this rule from IE9 and below */
127
+ .qsm-spinner-loader:not(:required) {
128
+ -moz-animation: qsm-spinner-loader 1500ms infinite linear;
129
+ -webkit-animation: qsm-spinner-loader 1500ms infinite linear;
130
+ animation: qsm-spinner-loader 1500ms infinite linear;
131
+ -moz-border-radius: 0.5em;
132
+ -webkit-border-radius: 0.5em;
133
+ border-radius: 0.5em;
134
+ -moz-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
135
+ -webkit-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
136
+ box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
137
+ display: inline-block;
138
+ font-size: 10px;
139
+ width: 1em;
140
+ height: 1em;
141
+ margin: 1.5em;
142
+ overflow: hidden;
143
+ text-indent: 100%;
144
+ }
js/qmn_quiz.js CHANGED
@@ -8,6 +8,10 @@ function qmnTimeTakenTimer() {
8
  document.getElementById("timer").value = x;
9
  }
10
 
 
 
 
 
11
  function qmnClearField( field ) {
12
  if ( field.defaultValue == field.value ) field.value = '';
13
  }
@@ -73,6 +77,13 @@ function qmnValidation( element, quiz_form_id ) {
73
  result = false;
74
  }
75
  }
 
 
 
 
 
 
 
76
  if( jQuery( this ).attr( 'class' ).indexOf( 'mlwRequiredCheck' ) > -1 ) {
77
  if ( ! jQuery( this ).find( 'input:checked' ).length ) {
78
  qmnDisplayError( empty_error, jQuery( this ), quiz_form_id );
@@ -87,7 +98,7 @@ function qmnValidation( element, quiz_form_id ) {
87
 
88
  function qmnFormSubmit( quiz_form_id ) {
89
  var quiz_id = +jQuery( '#' + quiz_form_id ).find( '.qmn_quiz_id' ).val();
90
- var container = jQuery( '#' + quiz_form_id ).closest( '.qmn_quiz_container' );
91
  var result = qmnValidation( '#' + quiz_form_id + ' *', quiz_form_id );
92
 
93
  if ( ! result ) { return result; }
@@ -98,28 +109,40 @@ function qmnFormSubmit( quiz_form_id ) {
98
  jQuery( '.mlw_qmn_question_comment' ).attr( 'disabled', false );
99
  jQuery( '.mlw_answer_open_text' ).attr( 'disabled', false );
100
 
101
- clearInterval( qsmTimerInterval );
102
- qmnEndTimer( quiz_id );
103
-
104
  var data = {
105
  action: 'qmn_process_quiz',
106
  quizData: jQuery( '#' + quiz_form_id ).serialize()
107
  };
108
 
 
 
 
 
 
 
 
 
 
109
  jQuery.post( qmn_ajax_object.ajaxurl, data, function( response ) {
110
- qmnDisplayResults( JSON.parse( response ), quiz_form_id, container );
111
  });
112
 
113
  return false;
114
  }
115
 
116
- function qmnDisplayResults( results, quiz_form_id, container ) {
117
- jQuery( container ).empty();
 
 
 
 
 
 
118
  if ( results.redirect ) {
119
  window.location.replace( results.redirect_url );
120
  } else {
121
- container.append( '<div class="qmn_results_page"></div>' );
122
- container.find( '.qmn_results_page' ).html( results.display );
123
  qmnReturnToTop();
124
  }
125
  }
@@ -190,15 +213,15 @@ function qmnTimer( quiz_id ) {
190
  window.sessionStorage.setItem( 'mlw_started_quiz' + quiz_id, "yes" );
191
  jQuery( '#quizForm' + quiz_id + ' .mlw_qmn_timer').html( qmnMinToSec( window.amount ) );
192
  window.document.title = qmnMinToSec( window.amount ) + " " + qsmTitleText;
193
- if ( window.amount <= 0 )
194
- {
195
- clearInterval( window.counter );
196
  jQuery( ".mlw_qmn_quiz input:radio" ).attr( 'disabled',true );
197
  jQuery( ".mlw_qmn_quiz input:checkbox" ).attr( 'disabled',true );
198
  jQuery( ".mlw_qmn_quiz select" ).attr( 'disabled',true );
199
  jQuery( ".mlw_qmn_question_comment" ).attr( 'disabled',true );
200
  jQuery( ".mlw_answer_open_text" ).attr( 'disabled',true );
201
  jQuery( ".mlw_answer_number" ).attr( 'disabled',true );
 
202
  //document.quizForm.submit();
203
  return;
204
  }
@@ -272,8 +295,7 @@ function qmnMinToSec( amount ) {
272
 
273
  //Function to validate the answers provided in quiz
274
  function qmnValidatePage( quiz_form_id ) {
275
- var slide_number = jQuery( '#' + quiz_form_id ).closest( '.qmn_quiz_container' ).find( '.slide_number_hidden' ).val();
276
- var result = qmnValidation( '#' + quiz_form_id + " .quiz_section.slide" + slide_number + ' *', quiz_form_id );
277
  return result;
278
  }
279
 
8
  document.getElementById("timer").value = x;
9
  }
10
 
11
+ function qsmEndTimeTakenTimer() {
12
+ clearInterval( qsmTimerInterval );
13
+ }
14
+
15
  function qmnClearField( field ) {
16
  if ( field.defaultValue == field.value ) field.value = '';
17
  }
77
  result = false;
78
  }
79
  }
80
+ if( jQuery( this ).attr( 'class' ).indexOf( 'qsmRequiredSelect' ) > -1 ) {
81
+ check_val = jQuery( this ).val();
82
+ if ( check_val == "No Answer Provided" ) {
83
+ qmnDisplayError( empty_error, jQuery( this ), quiz_form_id );
84
+ result = false;
85
+ }
86
+ }
87
  if( jQuery( this ).attr( 'class' ).indexOf( 'mlwRequiredCheck' ) > -1 ) {
88
  if ( ! jQuery( this ).find( 'input:checked' ).length ) {
89
  qmnDisplayError( empty_error, jQuery( this ), quiz_form_id );
98
 
99
  function qmnFormSubmit( quiz_form_id ) {
100
  var quiz_id = +jQuery( '#' + quiz_form_id ).find( '.qmn_quiz_id' ).val();
101
+ var $container = jQuery( '#' + quiz_form_id ).closest( '.qmn_quiz_container' );
102
  var result = qmnValidation( '#' + quiz_form_id + ' *', quiz_form_id );
103
 
104
  if ( ! result ) { return result; }
109
  jQuery( '.mlw_qmn_question_comment' ).attr( 'disabled', false );
110
  jQuery( '.mlw_answer_open_text' ).attr( 'disabled', false );
111
 
 
 
 
112
  var data = {
113
  action: 'qmn_process_quiz',
114
  quizData: jQuery( '#' + quiz_form_id ).serialize()
115
  };
116
 
117
+ qsmEndTimeTakenTimer();
118
+
119
+ if ( qmn_quiz_data[quiz_id].hasOwnProperty( 'timer_limit' ) ) {
120
+ qmnEndTimer( quiz_id );
121
+ }
122
+
123
+ jQuery( '#' + quiz_form_id + ' input[type=submit]' ).attr( 'disabled', 'disabled' );
124
+ qsmDisplayLoading( $container );
125
+
126
  jQuery.post( qmn_ajax_object.ajaxurl, data, function( response ) {
127
+ qmnDisplayResults( JSON.parse( response ), quiz_form_id, $container );
128
  });
129
 
130
  return false;
131
  }
132
 
133
+ function qsmDisplayLoading( $container ) {
134
+ $container.empty();
135
+ $container.append( '<div class="qsm-spinner-loader"></div>' );
136
+ qmnReturnToTop();
137
+ }
138
+
139
+ function qmnDisplayResults( results, quiz_form_id, $container ) {
140
+ $container.empty();
141
  if ( results.redirect ) {
142
  window.location.replace( results.redirect_url );
143
  } else {
144
+ $container.append( '<div class="qmn_results_page"></div>' );
145
+ $container.find( '.qmn_results_page' ).html( results.display );
146
  qmnReturnToTop();
147
  }
148
  }
213
  window.sessionStorage.setItem( 'mlw_started_quiz' + quiz_id, "yes" );
214
  jQuery( '#quizForm' + quiz_id + ' .mlw_qmn_timer').html( qmnMinToSec( window.amount ) );
215
  window.document.title = qmnMinToSec( window.amount ) + " " + qsmTitleText;
216
+ if ( window.amount <= 0 ) {
217
+ clearInterval( window.qsmCounter );
 
218
  jQuery( ".mlw_qmn_quiz input:radio" ).attr( 'disabled',true );
219
  jQuery( ".mlw_qmn_quiz input:checkbox" ).attr( 'disabled',true );
220
  jQuery( ".mlw_qmn_quiz select" ).attr( 'disabled',true );
221
  jQuery( ".mlw_qmn_question_comment" ).attr( 'disabled',true );
222
  jQuery( ".mlw_answer_open_text" ).attr( 'disabled',true );
223
  jQuery( ".mlw_answer_number" ).attr( 'disabled',true );
224
+ jQuery( '#quizForm' + quiz_id ).closest( '.qmn_quiz_container' ).addClass( 'qsm_timer_ended' );
225
  //document.quizForm.submit();
226
  return;
227
  }
295
 
296
  //Function to validate the answers provided in quiz
297
  function qmnValidatePage( quiz_form_id ) {
298
+ var result = qmnValidation( '#' + quiz_form_id + ' .quiz_section:visible *', quiz_form_id );
 
299
  return result;
300
  }
301
 
js/{admin_question.js → qsm-admin-question.js} RENAMED
@@ -1,3 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  function add_answer(answer, points, correct)
2
  {
3
  if (!answer) {
@@ -24,6 +118,7 @@ function add_answer(answer, points, correct)
24
  '</div>');
25
  jQuery("#answers").append($answer_single);
26
  }
 
27
  function deleteQuestion( id ) {
28
  jQuery("#delete_dialog").dialog({
29
  autoOpen: false,
@@ -167,7 +262,7 @@ jQuery("#new_question_button").click(function() {
167
  jQuery("#correct_answer_info").val('');
168
  jQuery("#hint").val('');
169
  jQuery("#new_question_order").val(questions_list.length+1);
170
- jQuery("#question_type").val('');
171
  jQuery(".comments_radio").val([1]);
172
  jQuery("#required").val(1);
173
  jQuery("#question_submission").val('new_question');
1
+ /**
2
+ * QSM Question Tab
3
+ */
4
+
5
+ var QSMQuestion;
6
+ (function ($) {
7
+ QSMQuestion = {
8
+ addQuestionFromQuiz: function() {
9
+ jQuery( "#from_other_quiz_dialog" ).dialog({
10
+ autoOpen: false,
11
+ width: 550,
12
+ height: 400,
13
+ buttons: {
14
+ Cancel: function() {
15
+ jQuery( this ).dialog( 'close' );
16
+ }
17
+ }
18
+ });
19
+ QSMQuestion.loadSpinner( '.other_quiz_questions', true );
20
+ jQuery( "#from_other_quiz_dialog" ).dialog( 'open' );
21
+ QSMQuestion.loadQuestionBank();
22
+ },
23
+ loadQuestionBank: function() {
24
+ var data = {
25
+ action: 'qsm_load_all_quiz_questions'
26
+ };
27
+
28
+ jQuery.post( ajaxurl, data, function( response ) {
29
+ QSMQuestion.displayQuestionBank( JSON.parse( response ) );
30
+ });
31
+ },
32
+ displayQuestionBank: function( questions ) {
33
+ QSMQuestion.removeSpinner( '.other_quiz_questions' );
34
+ $.each( questions, function( i, val ) {
35
+ $( '.other_quiz_questions' ).append(
36
+ '<div class="other_quiz_question">' +
37
+ '<input type="hidden" class="hidden_question_id" value="' + val.id + '">' +
38
+ '<button class="import_question_button button">Import Question</button>' +
39
+ '<span class="other_quiz_question_text">' + val.question + '</span> <span class="other_quiz_question_quiz_text"> ' + val.quiz + '</span>' +
40
+ '</div>'
41
+ );
42
+ });
43
+ },
44
+ importQuestion: function( id ) {
45
+ $( '#copy_question_id' ).val( id );
46
+ $( '#copy_question_form' ).submit();
47
+ },
48
+ searchQuestionBank: function( query ) {
49
+ jQuery( ".other_quiz_question" ).each(function() {
50
+ if ( -1 === jQuery( this ).children( '.other_quiz_question_text' ).text().toLowerCase().indexOf( query.toLowerCase() ) ) {
51
+ jQuery( this ).hide();
52
+ } else {
53
+ jQuery( this ).show();
54
+ }
55
+ });
56
+ },
57
+ loadSpinner: function( container, empty ) {
58
+ if ( empty ) {
59
+ $( container ).empty();
60
+ }
61
+ $( container ).append( '<div class="qsm-spinner-loader"></div>' );
62
+ },
63
+ removeSpinner: function( container ) {
64
+ $( container + ' .qsm-spinner-loader' ).remove();
65
+ }
66
+ };
67
+
68
+ // Code to run after DOM is loaded
69
+ $(function() {
70
+
71
+ // Adds event handler for adding question from other quizzes dialog
72
+ $( '#from_other_quiz_button' ).on( 'click', function( event ) {
73
+ event.preventDefault();
74
+ QSMQuestion.addQuestionFromQuiz();
75
+ });
76
+
77
+ // Adds event handler to import button in other quizzes dialog
78
+ $( '.other_quiz_questions' ).on( 'click', '.import_question_button', function( event ) {
79
+ event.preventDefault();
80
+ QSMQuestion.importQuestion( $( this ).prev().val() );
81
+ });
82
+
83
+ // Adds event handlers for searching question bank
84
+ $( "#dialog_question_search" ).keyup(function() {
85
+ QSMQuestion.searchQuestionBank( $( this ).val() );
86
+ });
87
+ $( '#dialog_question_search_button' ).on( 'click', function( event ) {
88
+ event.preventDefault();
89
+ var query = $( "#dialog_question_search" ).val();
90
+ QSMQuestion.searchQuestionBank( query );
91
+ });
92
+ });
93
+ }(jQuery));
94
+
95
  function add_answer(answer, points, correct)
96
  {
97
  if (!answer) {
118
  '</div>');
119
  jQuery("#answers").append($answer_single);
120
  }
121
+
122
  function deleteQuestion( id ) {
123
  jQuery("#delete_dialog").dialog({
124
  autoOpen: false,
262
  jQuery("#correct_answer_info").val('');
263
  jQuery("#hint").val('');
264
  jQuery("#new_question_order").val(questions_list.length+1);
265
+ jQuery("#question_type").val(0);
266
  jQuery(".comments_radio").val([1]);
267
  jQuery("#required").val(1);
268
  jQuery("#question_submission").val('new_question');
mlw_quizmaster2.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Plugin Name: Quiz And Survey Master
4
  * Description: Easily and quickly add quizzes and surveys to your website.
5
- * Version: 4.6.7
6
  * Author: Frank Corso
7
  * Author URI: http://www.quizandsurveymaster.com/
8
  * Plugin URI: http://www.quizandsurveymaster.com/
@@ -10,7 +10,7 @@
10
  * Domain Path: /languages
11
  *
12
  * @author Frank Corso
13
- * @version 4.6.7
14
  */
15
  if ( ! defined( 'ABSPATH' ) ) exit;
16
  /**
@@ -28,7 +28,7 @@ class MLWQuizMasterNext
28
  * @var string
29
  * @since 4.0.0
30
  */
31
- public $version = '4.6.7';
32
 
33
  /**
34
  * QMN Alert Manager Object
@@ -99,6 +99,7 @@ class MLWQuizMasterNext
99
  include("php/admin-results-page.php");
100
  include("php/admin-results-details-page.php");
101
  include("php/tools-page.php");
 
102
  include("php/about-page.php");
103
  include("php/help-page.php");
104
  include("php/dashboard-widgets.php");
2
  /**
3
  * Plugin Name: Quiz And Survey Master
4
  * Description: Easily and quickly add quizzes and surveys to your website.
5
+ * Version: 4.7.0
6
  * Author: Frank Corso
7
  * Author URI: http://www.quizandsurveymaster.com/
8
  * Plugin URI: http://www.quizandsurveymaster.com/
10
  * Domain Path: /languages
11
  *
12
  * @author Frank Corso
13
+ * @version 4.7.0
14
  */
15
  if ( ! defined( 'ABSPATH' ) ) exit;
16
  /**
28
  * @var string
29
  * @since 4.0.0
30
  */
31
+ public $version = '4.7.0';
32
 
33
  /**
34
  * QMN Alert Manager Object
99
  include("php/admin-results-page.php");
100
  include("php/admin-results-details-page.php");
101
  include("php/tools-page.php");
102
+ include("php/class-qsm-changelog-generator.php");
103
  include("php/about-page.php");
104
  include("php/help-page.php");
105
  include("php/dashboard-widgets.php");
php/about-page.php CHANGED
@@ -23,7 +23,7 @@ function mlw_generate_about_page()
23
  <style>
24
  div.mlw_qmn_icon_wrap
25
  {
26
- background: <?php echo 'url("'.plugins_url( 'images/quiz_icon.png' , __FILE__ ).'")'; ?> no-repeat;
27
  }
28
  </style>
29
  <div class="wrap about-wrap">
@@ -39,42 +39,27 @@ function mlw_generate_about_page()
39
  <?php _e('People Who Make QMN Possible', 'quiz-master-next'); ?></a>
40
  </h2>
41
  <div id="mlw_quiz_what_new" class="qmn_tab">
42
- <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">New Dynamic Form Submission</h2>
43
- <p style="text-align: center;">Rather than making a user wait for an entire page submission, now the plugin dynamically calculates the results and displays the results page.</p>
44
  <br />
45
- <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">Specify From Email Address And Reply-To</h2>
46
- <p style="text-align: center;">After several requests, I have finally added the option to specify a from email address for sending emails. I also added the option to add a reply-to email to the admin emails using the user email.</p>
 
 
 
 
 
 
47
  <br />
48
  <hr />
49
  <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">For Developers:</h2>
50
- <br />
51
- <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">JavaScript Re-write</h2>
52
- <p style="text-align: center;">I re-wrote all the JavaScript files and combined them into one file.</p>
53
- <br />
54
- <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">Renamed files/functions</h2>
55
- <p style="text-align: center;">I renamed many files and functions to align with WordPress standards. None of these were externally used and will not affect your customizations/code.</p>
56
- <br />
57
- <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">We Are On GitHub Now</h2>
58
- <p style="text-align: center;">We love github and use it for all of our plugins! Be sure to <a href="https://github.com/fpcorso/quiz_master_next/">make suggestions or contribute</a> to our Quiz And Survey Master repository.</p>
59
  <br />
60
  </div>
61
  <div id="mlw_quiz_changelog" class="qmn_tab" style="display: none;">
62
  <h2>Changelog</h2>
63
- <h3><?php echo $mlw_quiz_version; ?> (January 22, 2015)</h3>
64
- <ul class="changelog">
65
- <!--
66
- Examples:
67
- <li class="add"><div class="two">Add</div>Some feature was added</li>
68
- <li class="fixed"><div class="two">Fixed</div>Fixed some bug</li>
69
- <li class="update"><div class="two">Updated</div>Fixed some bug</li>
70
- -->
71
- <li class="fixed"><div class="two">Fixed</div>* Fixes bug causing multiple response to be on a single line for some users</li>
72
- <li class="fixed"><div class="two">Fixed</div>* Fixes bug causing the incorrect/correct CSS class from being not added on results page correctly</li>
73
- <li class="fixed"><div class="two">Fixed</div>* Fixes bug causing unexpected output error when activating plugin</li>
74
- <li class="update"><div class="two">Updated</div>* Changes comment section to default to off in newer quizzes</li>
75
- <li class="update"><div class="two">Updated</div>* Adds link to online academy to help page</li>
76
- <li class="update"><div class="two">Updated</div>* Cleans up installation function code</li>
77
- </ul>
78
  </div>
79
  <div id="qmn_contributors" class="qmn_tab" style="display:none;">
80
  <h2>GitHub Contributors</h2>
23
  <style>
24
  div.mlw_qmn_icon_wrap
25
  {
26
+ background: <?php echo 'url("'.plugins_url( '../assets/icon-128x128.png' , __FILE__ ).'")'; ?> no-repeat;
27
  }
28
  </style>
29
  <div class="wrap about-wrap">
39
  <?php _e('People Who Make QMN Possible', 'quiz-master-next'); ?></a>
40
  </h2>
41
  <div id="mlw_quiz_what_new" class="qmn_tab">
42
+ <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">Copy Questions From Other Surveys And Quizzes</h2>
43
+ <p style="text-align: center;">There are many times that quiz/survey creators will want to use a similar question from another survey or quiz. You can now copy questions from other quizzes and surveys using the new "Add Question From Other Survey/Quiz" button.</p>
44
  <br />
45
+ <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">Randomize Answers Only</h2>
46
+ <p style="text-align: center;">Many admins have asked for the ability to randomize the answers only without randomizing the questions. This option has now been enhanced to include randomizing answers only.</p>
47
+ <br />
48
+ <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">New Template Variables</h2>
49
+ <p style="text-align: center;">Two new variables have been added. %DATE_TAKEN% allows you to display the date the quiz was taken which is useful when creating certificates after the date the user completed the quiz or survey. %AVERAGE_CATEGORY_POINTS% is used to show the average points earned per question in a particular category.</p>
50
+ <br />
51
+ <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">New Loading Icon</h2>
52
+ <p style="text-align: center;">Many admins have encountered a scenario where users will click the submit button multiple times while the results are loading. To prevent this, a new loading icon appears once the button has been clicked and the submit button is now removed.</p>
53
  <br />
54
  <hr />
55
  <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">For Developers:</h2>
56
+ <h2 style="margin: 1.1em 0 .2em;font-size: 2.4em;font-weight: 300;line-height: 1.3;text-align: center;">New Timer Ended Class</h2>
57
+ <p style="text-align: center;">A new CSS class 'qsm_timer_ended' is now added to the quiz container when the timer ends allowing you to style the form differently once the timer runs out.</p>
 
 
 
 
 
 
 
58
  <br />
59
  </div>
60
  <div id="mlw_quiz_changelog" class="qmn_tab" style="display: none;">
61
  <h2>Changelog</h2>
62
+ <?php QSM_Changelog_Generator::get_changelog_list( 'fpcorso/quiz_master_next', 15 ); ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  </div>
64
  <div id="qmn_contributors" class="qmn_tab" style="display:none;">
65
  <h2>GitHub Contributors</h2>
php/admin-results-details-page.php CHANGED
@@ -100,6 +100,7 @@ function qmn_generate_results_details_tab() {
100
  'user_phone' => $mlw_results_data->phone,
101
  'user_id' => $mlw_results_data->user,
102
  'timer' => $results[0],
 
103
  'total_points' => $mlw_results_data->point_score,
104
  'total_score' => $mlw_results_data->correct_score,
105
  'total_correct' => $mlw_results_data->correct,
@@ -163,6 +164,7 @@ function qmn_generate_results_certificate_tab() {
163
  'user_phone' => $mlw_quiz_results->phone,
164
  'user_id' => $mlw_quiz_results->user,
165
  'timer' => $results[0],
 
166
  'total_points' => $mlw_quiz_results->point_score,
167
  'total_score' => $mlw_quiz_results->correct_score,
168
  'total_correct' => $mlw_quiz_results->correct,
100
  'user_phone' => $mlw_results_data->phone,
101
  'user_id' => $mlw_results_data->user,
102
  'timer' => $results[0],
103
+ 'time_taken' => $mlw_results_data->time_taken,
104
  'total_points' => $mlw_results_data->point_score,
105
  'total_score' => $mlw_results_data->correct_score,
106
  'total_correct' => $mlw_results_data->correct,
164
  'user_phone' => $mlw_quiz_results->phone,
165
  'user_id' => $mlw_quiz_results->user,
166
  'timer' => $results[0],
167
+ 'time_taken' => $mlw_quiz_results->time_taken,
168
  'total_points' => $mlw_quiz_results->point_score,
169
  'total_score' => $mlw_quiz_results->correct_score,
170
  'total_correct' => $mlw_quiz_results->correct,
php/admin-results-page.php CHANGED
@@ -152,11 +152,7 @@ function mlw_generate_quiz_results()
152
  {
153
  $mlw_quiz_data = $wpdb->get_results( "SELECT * FROM " . $wpdb->prefix . "mlw_results WHERE deleted='0'$search_phrase_sql $order_by_sql LIMIT $mlw_qmn_result_begin, $mlw_qmn_table_limit" );
154
  }
155
- ?>
156
- <!-- css -->
157
- <link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css" rel="stylesheet" />
158
- <!-- jquery scripts -->
159
- <?php
160
  wp_enqueue_script( 'jquery' );
161
  wp_enqueue_script( 'jquery-ui-core' );
162
  wp_enqueue_script( 'jquery-ui-dialog' );
@@ -164,6 +160,7 @@ function mlw_generate_quiz_results()
164
  wp_enqueue_script( 'jquery-effects-blind' );
165
  wp_enqueue_script( 'jquery-effects-explode' );
166
  wp_enqueue_script('qmn_admin_js', plugins_url( '../js/admin.js' , __FILE__ ));
 
167
  ?>
168
  <script type="text/javascript">
169
  var $j = jQuery.noConflict();
152
  {
153
  $mlw_quiz_data = $wpdb->get_results( "SELECT * FROM " . $wpdb->prefix . "mlw_results WHERE deleted='0'$search_phrase_sql $order_by_sql LIMIT $mlw_qmn_result_begin, $mlw_qmn_table_limit" );
154
  }
155
+
 
 
 
 
156
  wp_enqueue_script( 'jquery' );
157
  wp_enqueue_script( 'jquery-ui-core' );
158
  wp_enqueue_script( 'jquery-ui-dialog' );
160
  wp_enqueue_script( 'jquery-effects-blind' );
161
  wp_enqueue_script( 'jquery-effects-explode' );
162
  wp_enqueue_script('qmn_admin_js', plugins_url( '../js/admin.js' , __FILE__ ));
163
+ wp_enqueue_style( 'qmn_jquery_redmond_theme', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css' );
164
  ?>
165
  <script type="text/javascript">
166
  var $j = jQuery.noConflict();
php/adverts-generate.php CHANGED
@@ -9,33 +9,29 @@ if ( ! defined( 'ABSPATH' ) ) exit;
9
  * @return $mlw_advert This variable is the main variable of the function and contains the advertisement content.
10
  * @since 4.4.0
11
  */
12
- function mlw_qmn_show_adverts()
13
- {
14
  $mlw_advert = "";
15
  $mlw_advert_text = "";
16
- if ( get_option('mlw_advert_shows') == 'true' )
17
- {
18
- $mlw_random_int = rand(0, 4);
19
- switch ($mlw_random_int) {
20
  case 0:
21
- // Support Advert 1
22
- $mlw_advert_text = "Need support or features? Check out our Premium Support options! Visit our <a href=\"http://quizandsurveymaster.com/support-levels/?utm_source=qsm-plugin-ads&utm_medium=plugin&utm_content=support-advert-1&utm_campaign=qsm_plugin\">Quiz And Survey Master Support</a> for details!";
23
- break;
24
- case 1:
25
  // Subscribe Newsletter 1
26
- $mlw_advert_text = "Want 25% off your next addon purchase? Keep updated on our news, updated, and more by <a href=\"http://quizandsurveymaster.com/subscribe-to-our-newsletter/?utm_source=qsm-plugin-ads&utm_medium=plugin&utm_content=subscribe-newsletter-1&utm_campaign=qsm_plugin\">subscribing to our mailing list</a> and receive a 25% discount on your next purchase!";
27
  break;
28
- case 2:
29
  // Continued development 1
30
  $mlw_advert_text = "Are you finding this plugin very beneficial? Please consider checking out our premium addons which help support continued development of this plugin. Visit our <a href=\"http://quizandsurveymaster.com/addons/?utm_source=qsm-plugin-ads&utm_medium=plugin&utm_content=continued-development-1&utm_campaign=qsm_plugin\">Addon Store</a> for details!";
31
  break;
32
- case 3:
33
  // Reporting and anaylsis 1
34
  $mlw_advert_text = "Are you receiving a lot of responses to your quizzes and surveys? Consider our Reporting and Anaylsis addon which analyzes the data for you and allows you to filter the data as well as export it! <a href=\"http://quizandsurveymaster.com/downloads/results-analysis/?utm_source=qsm-plugin-ads&utm_medium=plugin&utm_content=reporting-analysis-1&utm_campaign=qsm_plugin\">Click here for more details!</a>";
35
  break;
36
  default:
37
- // Support Advert 2
38
- $mlw_advert_text = "Need support or features? Check out our Premium Support options! Visit our <a href=\"http://quizandsurveymaster.com/support-levels/?utm_source=qsm-plugin-ads&utm_medium=plugin&utm_content=support-advert-2&utm_campaign=qsm_plugin\">Quiz And Survey Master Support</a> for details!";
39
  }
40
  $mlw_advert .= "
41
  <style>
9
  * @return $mlw_advert This variable is the main variable of the function and contains the advertisement content.
10
  * @since 4.4.0
11
  */
12
+ function mlw_qmn_show_adverts() {
13
+
14
  $mlw_advert = "";
15
  $mlw_advert_text = "";
16
+ if ( 'true' == get_option( 'mlw_advert_shows' ) ) {
17
+
18
+ $mlw_random_int = rand( 0, 3 );
19
+ switch ( $mlw_random_int ) {
20
  case 0:
 
 
 
 
21
  // Subscribe Newsletter 1
22
+ $mlw_advert_text = "Want a discount on your next addon purchase? Keep updated on our news, updated, and more by <a href=\"http://quizandsurveymaster.com/subscribe-to-our-newsletter/?utm_source=qsm-plugin-ads&utm_medium=plugin&utm_content=subscribe-newsletter-1&utm_campaign=qsm_plugin\">subscribing to our mailing list</a> and receive a discount on your next purchase!";
23
  break;
24
+ case 1:
25
  // Continued development 1
26
  $mlw_advert_text = "Are you finding this plugin very beneficial? Please consider checking out our premium addons which help support continued development of this plugin. Visit our <a href=\"http://quizandsurveymaster.com/addons/?utm_source=qsm-plugin-ads&utm_medium=plugin&utm_content=continued-development-1&utm_campaign=qsm_plugin\">Addon Store</a> for details!";
27
  break;
28
+ case 2:
29
  // Reporting and anaylsis 1
30
  $mlw_advert_text = "Are you receiving a lot of responses to your quizzes and surveys? Consider our Reporting and Anaylsis addon which analyzes the data for you and allows you to filter the data as well as export it! <a href=\"http://quizandsurveymaster.com/downloads/results-analysis/?utm_source=qsm-plugin-ads&utm_medium=plugin&utm_content=reporting-analysis-1&utm_campaign=qsm_plugin\">Click here for more details!</a>";
31
  break;
32
  default:
33
+ // Reporting and anaylsis 2
34
+ $mlw_advert_text = "Are you receiving a lot of responses to your quizzes and surveys? Consider our Reporting and Anaylsis addon which analyzes the data for you, graphs the data, allows you to filter the data, and export the data! <a href=\"http://quizandsurveymaster.com/downloads/results-analysis/?utm_source=qsm-plugin-ads&utm_medium=plugin&utm_content=reporting-analysis-2&utm_campaign=qsm_plugin\">Click here for more details!</a>";
35
  }
36
  $mlw_advert .= "
37
  <style>
php/class-qmn-plugin-helper.php CHANGED
@@ -225,9 +225,8 @@ class QMNPluginHelper
225
  array($question->answer_five, $question->answer_five_points, $mlw_answer_array_correct[4]),
226
  array($question->answer_six, $question->answer_six_points, $mlw_answer_array_correct[5]));
227
  }
228
- if ($quiz_options->randomness_order == 2)
229
- {
230
- shuffle($answers);
231
  }
232
  foreach($this->question_types as $type)
233
  {
225
  array($question->answer_five, $question->answer_five_points, $mlw_answer_array_correct[4]),
226
  array($question->answer_six, $question->answer_six_points, $mlw_answer_array_correct[5]));
227
  }
228
+ if ( 2 == $quiz_options->randomness_order || 3 == $quiz_options->randomness_order ) {
229
+ shuffle( $answers );
 
230
  }
231
  foreach($this->question_types as $type)
232
  {
php/class-qmn-quiz-creator.php CHANGED
@@ -264,10 +264,10 @@ class QMNQuizCreator
264
  'message_before' => 'Welcome to your %QUIZ_NAME%',
265
  'message_after' => '%QUESTIONS_ANSWERS%',
266
  'message_comment' => 'Please fill in the comment box below.',
267
- 'message_end_template' => 'Be sure to click Submit Quiz to see your results!',
268
  'user_email_template' => '%QUESTIONS_ANSWERS%',
269
  'admin_email_template' => '%QUESTIONS_ANSWERS%',
270
- 'submit_button_text' => 'Submit Quiz',
271
  'name_field_text' => 'Name',
272
  'business_field_text' => 'Business',
273
  'email_field_text' => 'Email',
@@ -306,7 +306,7 @@ class QMNQuizCreator
306
  'require_log_in' => 0,
307
  'require_log_in_text' => 'This quiz is for logged in users only.',
308
  'limit_total_entries' => 0,
309
- 'limit_total_entries_text' => 'Unfortunately, this quiz is limited the amount of entries it can recieve and has already reached that limit.',
310
  'scheduled_timeframe' => '',
311
  'scheduled_timeframe_text' => '',
312
  'quiz_views' => 0,
264
  'message_before' => 'Welcome to your %QUIZ_NAME%',
265
  'message_after' => '%QUESTIONS_ANSWERS%',
266
  'message_comment' => 'Please fill in the comment box below.',
267
+ 'message_end_template' => '',
268
  'user_email_template' => '%QUESTIONS_ANSWERS%',
269
  'admin_email_template' => '%QUESTIONS_ANSWERS%',
270
+ 'submit_button_text' => 'Submit',
271
  'name_field_text' => 'Name',
272
  'business_field_text' => 'Business',
273
  'email_field_text' => 'Email',
306
  'require_log_in' => 0,
307
  'require_log_in_text' => 'This quiz is for logged in users only.',
308
  'limit_total_entries' => 0,
309
+ 'limit_total_entries_text' => 'Unfortunately, this quiz has a limited amount of entries it can recieve and has already reached that limit.',
310
  'scheduled_timeframe' => '',
311
  'scheduled_timeframe_text' => '',
312
  'quiz_views' => 0,
php/class-qmn-quiz-manager.php CHANGED
@@ -268,7 +268,7 @@ class QMNQuizManager
268
  wp_enqueue_script( 'jquery-ui-dialog' );
269
  wp_enqueue_script( 'jquery-ui-button' );
270
  wp_enqueue_script( 'jquery-ui-tooltip' );
271
- wp_enqueue_style( 'qmn_jquery_redmond_theme', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css' );
272
 
273
  global $qmn_json_data;
274
  $qmn_json_data["error_messages"] = array(
@@ -551,6 +551,7 @@ class QMNQuizManager
551
  $qmn_array_for_variables['user_phone'] = $mlw_user_phone;
552
  $qmn_array_for_variables['user_id'] = get_current_user_id();
553
  $qmn_array_for_variables['timer'] = $mlw_qmn_timer;
 
554
 
555
  if (!isset($_POST["mlw_code_captcha"]) || (isset($_POST["mlw_code_captcha"]) && $_POST["mlw_user_captcha"] == $_POST["mlw_code_captcha"]))
556
  {
@@ -595,8 +596,8 @@ class QMNQuizManager
595
  'email' => $qmn_array_for_variables['user_email'],
596
  'phone' => $qmn_array_for_variables['user_phone'],
597
  'user' => $qmn_array_for_variables['user_id'],
598
- 'time_taken' => date("h:i:s A m/d/Y"),
599
- 'time_taken_real' => date("Y-m-d H:i:s"),
600
  'quiz_results' => $mlw_quiz_results,
601
  'deleted' => 0
602
  ),
268
  wp_enqueue_script( 'jquery-ui-dialog' );
269
  wp_enqueue_script( 'jquery-ui-button' );
270
  wp_enqueue_script( 'jquery-ui-tooltip' );
271
+ wp_enqueue_style( 'qmn_jquery_redmond_theme', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css' );
272
 
273
  global $qmn_json_data;
274
  $qmn_json_data["error_messages"] = array(
551
  $qmn_array_for_variables['user_phone'] = $mlw_user_phone;
552
  $qmn_array_for_variables['user_id'] = get_current_user_id();
553
  $qmn_array_for_variables['timer'] = $mlw_qmn_timer;
554
+ $qmn_array_for_variables['time_taken'] = date("h:i:s A m/d/Y");
555
 
556
  if (!isset($_POST["mlw_code_captcha"]) || (isset($_POST["mlw_code_captcha"]) && $_POST["mlw_user_captcha"] == $_POST["mlw_code_captcha"]))
557
  {
596
  'email' => $qmn_array_for_variables['user_email'],
597
  'phone' => $qmn_array_for_variables['user_phone'],
598
  'user' => $qmn_array_for_variables['user_id'],
599
+ 'time_taken' => $qmn_array_for_variables['time_taken'],
600
+ 'time_taken_real' => date( "Y-m-d H:i:s", strtotime( $qmn_array_for_variables['time_taken'] ) ),
601
  'quiz_results' => $mlw_quiz_results,
602
  'deleted' => 0
603
  ),
php/class-qsm-changelog-generator.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) exit;
3
+
4
+ /**
5
+ * This class pings the GitHub API to load in the changelog for a particular milestone
6
+ *
7
+ * @since 4.7.0
8
+ */
9
+ class QSM_Changelog_Generator {
10
+
11
+ /**
12
+ * Gets the changelog as an HTML list. Either echos or returns the list
13
+ *
14
+ * @since 4.7.0
15
+ * @uses QSM_Changelog_Generator::get_changelog Used to retrieve the changelog from GitHub
16
+ * @param string $repo The name of the GitHub repo. Should be similar to 'fpcorso/quiz_master_next'
17
+ * @param int $milestone The number of the milestone in your GitHub repo
18
+ * @param bool $echo Whether to echo or return the HTML list. Defaults to true
19
+ * @return string The HTML list is returned if $echo is set to false
20
+ */
21
+ public static function get_changelog_list( $repo, $milestone, $echo = true ) {
22
+
23
+ // Gets the changelog array
24
+ $changelog = QSM_Changelog_Generator::get_changelog( $repo, $milestone );
25
+
26
+ if ( $changelog && is_array( $changelog ) ) {
27
+
28
+ // Creates header for milestone
29
+ $display = "<h3>{$changelog["milestone"]["title"]}</h3>";
30
+
31
+ // Creates paragraph for description
32
+ if ( ! empty( $changelog["milestone"]["description"] ) ) {
33
+ $display .= "<p>{$changelog["milestone"]["description"]}</p>";
34
+ }
35
+
36
+ // Creates paragraph for closed date
37
+ $display .= "<p>Closed on {$changelog["milestone"]["closed_date"]}</p>";
38
+
39
+ // Converts the issues array into HTML list
40
+ $display .= '<ul class="changelog">';
41
+ foreach ( $changelog["issues"] as $change ) {
42
+ $label_type = $change["labels"][0]["name"];
43
+ $display .= "<li class='fixed'><div class='two'>Closed</div>$label_type: {$change['title']} - <a target='_blank' href='{$change['url']}'>Issue #{$change['issue']}</a></li>";
44
+ }
45
+ $display .= '</ul>';
46
+
47
+ // Echos or returns HTML list based on $echo parameter
48
+ if ( true === $echo ) {
49
+ echo $display;
50
+ } else {
51
+ return $display;
52
+ }
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Gets the changelog from GitHub and returns as an array
58
+ *
59
+ * @since 4.7.0
60
+ * @uses QSM_Changelog_Generator::api_call Used to retrieve the changelog from GitHub
61
+ * @param string $repo The name of the GitHub repo. Should be similar to 'fpcorso/quiz_master_next'
62
+ * @param int $milestone The number of the milestone in your GitHub repo
63
+ * @return array An array of all the titles of closed issues for the milestone
64
+ */
65
+ public static function get_changelog( $repo, $milestone ) {
66
+
67
+ // Gets transient if available
68
+ $changelog = get_transient( "changelog-$repo-$milestone" );
69
+ if ( false === $changelog ) {
70
+
71
+ $changelog = array();
72
+
73
+ // Constructs url and then calls the api
74
+ $issue_url = "https://api.github.com/repos/$repo/issues?milestone=$milestone&state=all";
75
+ $issue_data = QSM_Changelog_Generator::api_call( $issue_url );
76
+
77
+ if ( $issue_data ) {
78
+
79
+ // Constructs url and then calls the api
80
+ $milestone_url = "https://api.github.com/repos/$repo/milestones/$milestone";
81
+ $milestone_data = QSM_Changelog_Generator::api_call( $milestone_url );
82
+
83
+ if ( $milestone_data ) {
84
+ $milestone_array = array(
85
+ 'title' => $milestone_data["title"],
86
+ 'description' => $milestone_data["description"],
87
+ 'closed_date' => $milestone_data["closed_at"]
88
+ );
89
+ } else {
90
+ $milestone_array = array(
91
+ 'title' => '',
92
+ 'description' => '',
93
+ 'closed_date' => ''
94
+ );
95
+ }
96
+
97
+ $changelog["milestone"] = $milestone_array;
98
+ $changelog["issues"] = array();
99
+
100
+ // Creates an array of all issues that are closed
101
+ foreach ( $issue_data as $issue ) {
102
+ if ( ! isset( $issue["pull_request"] ) ) {
103
+ if ( "closed" === $issue["state"] ) {
104
+ $changelog["issues"][] = array(
105
+ 'title' => $issue["title"],
106
+ 'labels' => $issue["labels"],
107
+ 'issue' => $issue["number"],
108
+ 'url' => $issue["html_url"]
109
+ );
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ // Sets the transient
116
+ set_transient( "changelog-$repo-$milestone", $changelog, 3600 );
117
+ }
118
+ return $changelog;
119
+ }
120
+
121
+ /**
122
+ * Gets the contents of the $url that is passed
123
+ *
124
+ * @since 4.7.0
125
+ * @param string $url The url to get the contents of
126
+ * @return bool|array Returns false if encounters an error. Returns an associated array if successful
127
+ */
128
+ public static function api_call( $url ) {
129
+
130
+ // Gets the url
131
+ $response = wp_remote_get( $url );
132
+
133
+ // If an error occurs, return false. If successful, return json_decoded array
134
+ if ( is_wp_error( $response ) ) {
135
+ return false;
136
+ } else {
137
+ $data = wp_remote_retrieve_body( $response );
138
+ if ( is_wp_error( $data ) ) {
139
+ return false;
140
+ } else {
141
+ return json_decode( $data, true );
142
+ }
143
+ }
144
+ }
145
+ }
146
+
147
+ ?>
php/options-page-certificate-tab.php CHANGED
@@ -4,8 +4,6 @@ if ( ! defined( 'ABSPATH' ) ) exit;
4
  /**
5
  * This function adds the certificate tab using our API.
6
  *
7
- * Long Description
8
- *
9
  * @return type description
10
  * @since 4.4.0
11
  */
@@ -141,6 +139,7 @@ function mlw_options_certificate_tab_content()
141
  <p style="margin: 2px 0">- %USER_PHONE%</p>
142
  <p style="margin: 2px 0">- %USER_EMAIL%</p>
143
  <p style="margin: 2px 0">- %CURRENT_DATE%</p>
 
144
  </td>
145
  <td><label for="certificate_template">Allowed tags: &lt;b&gt; - bold, &lt;i&gt;-italics, &lt;u&gt;-underline, &lt;br&gt;-New Line or start a new line by pressing enter</label><textarea cols="80" rows="15" id="certificate_template" name="certificate_template"><?php echo $mlw_certificate_options[1]; ?></textarea>
146
  </td>
4
  /**
5
  * This function adds the certificate tab using our API.
6
  *
 
 
7
  * @return type description
8
  * @since 4.4.0
9
  */
139
  <p style="margin: 2px 0">- %USER_PHONE%</p>
140
  <p style="margin: 2px 0">- %USER_EMAIL%</p>
141
  <p style="margin: 2px 0">- %CURRENT_DATE%</p>
142
+ <p style="margin: 2px 0">- %DATE_TAKEN%</p>
143
  </td>
144
  <td><label for="certificate_template">Allowed tags: &lt;b&gt; - bold, &lt;i&gt;-italics, &lt;u&gt;-underline, &lt;br&gt;-New Line or start a new line by pressing enter</label><textarea cols="80" rows="15" id="certificate_template" name="certificate_template"><?php echo $mlw_certificate_options[1]; ?></textarea>
145
  </td>
php/options-page-email-tab.php CHANGED
@@ -370,6 +370,9 @@ function mlw_options_emails_tab_content()
370
  <div class="template_variable">
371
  <span class="template_name">%CATEGORY_POINTS%%/CATEGORY_POINTS%</span> - <?php _e('The amount of points a specific category earned.', 'quiz-master-next'); ?>
372
  </div>
 
 
 
373
  <div class="template_variable">
374
  <span class="template_name">%CATEGORY_SCORE%%/CATEGORY_SCORE%</span> - <?php _e('The score a specific category earned.', 'quiz-master-next'); ?>
375
  </div>
370
  <div class="template_variable">
371
  <span class="template_name">%CATEGORY_POINTS%%/CATEGORY_POINTS%</span> - <?php _e('The amount of points a specific category earned.', 'quiz-master-next'); ?>
372
  </div>
373
+ <div class="template_variable">
374
+ <spane class="template_name">%AVERAGE_CATEGORY_POINTS%%/AVERAGE_CATEGORY_POINTS%</span> - <?php _e('The average amount of points a specific category earned.', 'quiz-master-next'); ?>
375
+ </div>
376
  <div class="template_variable">
377
  <span class="template_name">%CATEGORY_SCORE%%/CATEGORY_SCORE%</span> - <?php _e('The score a specific category earned.', 'quiz-master-next'); ?>
378
  </div>
php/options-page-option-tab.php CHANGED
@@ -223,6 +223,7 @@ function mlw_options_option_tab_content()
223
  <td>
224
  <input type="radio" id="radio24" name="randomness_order" <?php if ($mlw_quiz_options->randomness_order == 1) {echo 'checked="checked"';} ?> value='1' /><label for="radio24"><?php _e('Random Questions', 'quiz-master-next'); ?></label><br>
225
  <input type="radio" id="randomness2" name="randomness_order" <?php if ($mlw_quiz_options->randomness_order == 2) {echo 'checked="checked"';} ?> value='2' /><label for="randomness2"><?php _e('Random Questions And Answers', 'quiz-master-next'); ?></label><br>
 
226
  <input type="radio" id="radio23" name="randomness_order" <?php if ($mlw_quiz_options->randomness_order == 0) {echo 'checked="checked"';} ?> value='0' /><label for="radio23"><?php _e('No', 'quiz-master-next'); ?></label><br>
227
  </td>
228
  </tr>
223
  <td>
224
  <input type="radio" id="radio24" name="randomness_order" <?php if ($mlw_quiz_options->randomness_order == 1) {echo 'checked="checked"';} ?> value='1' /><label for="radio24"><?php _e('Random Questions', 'quiz-master-next'); ?></label><br>
225
  <input type="radio" id="randomness2" name="randomness_order" <?php if ($mlw_quiz_options->randomness_order == 2) {echo 'checked="checked"';} ?> value='2' /><label for="randomness2"><?php _e('Random Questions And Answers', 'quiz-master-next'); ?></label><br>
226
+ <input type="radio" id="randomness3" name="randomness_order" <?php checked( $mlw_quiz_options->randomness_order, 3 ); ?>value='3'><label for="randomness3"><?php _e('Random Answers', 'quiz-master-next'); ?></label><br>
227
  <input type="radio" id="radio23" name="randomness_order" <?php if ($mlw_quiz_options->randomness_order == 0) {echo 'checked="checked"';} ?> value='0' /><label for="radio23"><?php _e('No', 'quiz-master-next'); ?></label><br>
228
  </td>
229
  </tr>
php/options-page-questions-tab.php CHANGED
@@ -30,7 +30,8 @@ function mlw_options_questions_tab_content()
30
  <?php
31
  wp_enqueue_script( 'jquery' );
32
  wp_enqueue_script( 'jquery-ui-sortable' );
33
- wp_enqueue_script('qmn_admin_question_js', plugins_url( '../js/admin_question.js' , __FILE__ ), array( 'jquery-ui-sortable' ) );
 
34
  wp_enqueue_script( 'math_jax', '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML' );
35
 
36
  global $wpdb;
@@ -426,7 +427,68 @@ function mlw_options_questions_tab_content()
426
  }
427
  }
428
 
 
 
429
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
430
 
431
  //Load questions
432
  $questions = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . $wpdb->prefix . "mlw_questions WHERE quiz_id=%d AND deleted='0'
@@ -519,23 +581,8 @@ function mlw_options_questions_tab_content()
519
 
520
  $is_new_quiz = $wpdb->num_rows;
521
  ?>
522
- <style>
523
- .edit_link,
524
- .duplicate_link {
525
- color: #0074a2 !important;
526
- font-size: 14px !important;
527
- }
528
- .delete_link {
529
- color: red !important;
530
- font-size: 14px !important;
531
- }
532
- .edit_link:hover,
533
- .duplicate_link:hover,
534
- .delete_link:hover {
535
- background-color: black;
536
- }
537
- </style>
538
  <button class="add-new-h2" id="new_question_button"><?php _e('Add Question', 'quiz-master-next'); ?></button>
 
539
  <button class="add-new-h2" id="save_question_order"><?php _e('Save Question Order', 'quiz-master-next'); ?></button>
540
  <form style="display:none;" action="" method="post" name="save_question_order_form" id="save_question_order_form">
541
  <input type="hidden" name="save_question_order_input" id="save_question_order_input" value="" />
@@ -573,68 +620,6 @@ function mlw_options_questions_tab_content()
573
  </tbody>
574
  </table>
575
 
576
- <style>
577
- .row:after,
578
- .answers:after,
579
- .answers_single:after {
580
- clear:both;
581
- display:table;
582
- content: " ";
583
- }
584
- .row {
585
- margin-bottom: 15px;
586
- }
587
- .row .option_label {
588
- width:15%;
589
- float:left;
590
- font-weight: bold;
591
- }
592
- .row .option_input {
593
- width:84%;
594
- float:left;
595
- }
596
- .question_form {
597
-
598
- }
599
- .question_form fieldset {
600
- margin: 20px 0px;
601
- background: #fff;
602
- padding: 5px;
603
- }
604
- .question_form legend {
605
- font-size: 16px;
606
- font-weight: bold;
607
- background: #f1f1f1;
608
- padding: 5px;
609
- }
610
- .answer_number,
611
- .answer_text,
612
- .answer_points,
613
- .answer_correct {
614
- font-weight: bold;
615
- float:left;
616
- margin: 1%;
617
- }
618
- .answer_number {
619
- width:10%;
620
- }
621
- .answer_text {
622
- width:60%;
623
- }
624
- .answer_points {
625
- width:10%;
626
- }
627
- .answer_correct {
628
- width:10%;
629
- }
630
- .answer_input {
631
- width: 100%;
632
- }
633
- .question_area_header_text {
634
- padding: 40px 0 0 !important;
635
- }
636
- </style>
637
-
638
  <div class="question_area" id="question_area">
639
  <h2 class="question_area_header_text">Add New Question</h2>
640
  <form action="" method="post" class="question_form">
@@ -750,6 +735,56 @@ function mlw_options_questions_tab_content()
750
  <p class='submit'><input type='submit' class='button-primary' value='<?php _e ('Duplicate Question', 'quiz-master-next'); ?>' /></p>
751
  </form>
752
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
753
  <?php
754
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
755
  ?>
30
  <?php
31
  wp_enqueue_script( 'jquery' );
32
  wp_enqueue_script( 'jquery-ui-sortable' );
33
+ wp_enqueue_script('qmn_admin_question_js', plugins_url( '../js/qsm-admin-question.js' , __FILE__ ), array( 'jquery-ui-sortable' ) );
34
+ wp_enqueue_style('qmn_admin_question_css', plugins_url( '../css/qsm-admin-question.css' , __FILE__ ) );
35
  wp_enqueue_script( 'math_jax', '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML' );
36
 
37
  global $wpdb;
427
  }
428
  }
429
 
430
+ // Import question from another quiz
431
+ if ( isset( $_POST["add_question_from_quiz_nonce"] ) && wp_verify_nonce( $_POST['add_question_from_quiz_nonce'], 'add_question_from_quiz') ) {
432
 
433
+ // Load question from question bank
434
+ $question_id = intval( $_POST["copy_question_id"] );
435
+ $quiz_id = intval( $_POST["quiz_id"] );
436
+ $importing_question = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}mlw_questions WHERE question_id=%d", $question_id ) );
437
+
438
+ // Save question into question bank for this quiz
439
+ $results = $wpdb->insert(
440
+ $wpdb->prefix."mlw_questions",
441
+ array(
442
+ 'quiz_id' => $quiz_id,
443
+ 'question_name' => $importing_question->question_name,
444
+ 'answer_array' => $importing_question->answer_array,
445
+ 'question_answer_info' => $importing_question->question_answer_info,
446
+ 'comments' => $importing_question->comments,
447
+ 'hints' => $importing_question->hints,
448
+ 'question_order' => $importing_question->question_order,
449
+ 'question_type_new' => $importing_question->question_type_new,
450
+ 'question_settings' => $importing_question->question_settings,
451
+ 'category' => $importing_question->category,
452
+ 'deleted' => 0
453
+ ),
454
+ array(
455
+ '%d',
456
+ '%s',
457
+ '%s',
458
+ '%s',
459
+ '%d',
460
+ '%s',
461
+ '%d',
462
+ '%s',
463
+ '%s',
464
+ '%s',
465
+ '%d'
466
+ )
467
+ );
468
+ if ( false !== $results ) {
469
+ $mlwQuizMasterNext->alertManager->newAlert( __( 'The question has been created successfully.', 'quiz-master-next' ), 'success' );
470
+
471
+ //Insert Action Into Audit Trail
472
+ global $current_user;
473
+ get_currentuserinfo();
474
+ $wpdb->insert(
475
+ $wpdb->prefix . "mlw_qm_audit_trail",
476
+ array(
477
+ 'action_user' => $current_user->display_name,
478
+ 'action' => "Question Has Been Added: {$importing_question->question_name}",
479
+ 'time' => date("h:i:s A m/d/Y")
480
+ ),
481
+ array(
482
+ '%s',
483
+ '%s',
484
+ '%s'
485
+ )
486
+ );
487
+ } else {
488
+ $mlwQuizMasterNext->alertManager->newAlert( sprintf( __( 'There has been an error in this action. Please share this with the developer. Error Code: %s', 'quiz-master-next' ), '0023' ), 'error' );
489
+ $mlwQuizMasterNext->log_manager->add( "Error 0023", $wpdb->last_error.' from '.$wpdb->last_query, 0, 'error' );
490
+ }
491
+ }
492
 
493
  //Load questions
494
  $questions = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . $wpdb->prefix . "mlw_questions WHERE quiz_id=%d AND deleted='0'
581
 
582
  $is_new_quiz = $wpdb->num_rows;
583
  ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
584
  <button class="add-new-h2" id="new_question_button"><?php _e('Add Question', 'quiz-master-next'); ?></button>
585
+ <button class="add-new-h2" id="from_other_quiz_button"><?php _e('Add Question From Other Survey/Quiz', 'quiz-master-next'); ?></button>
586
  <button class="add-new-h2" id="save_question_order"><?php _e('Save Question Order', 'quiz-master-next'); ?></button>
587
  <form style="display:none;" action="" method="post" name="save_question_order_form" id="save_question_order_form">
588
  <input type="hidden" name="save_question_order_input" id="save_question_order_input" value="" />
620
  </tbody>
621
  </table>
622
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
623
  <div class="question_area" id="question_area">
624
  <h2 class="question_area_header_text">Add New Question</h2>
625
  <form action="" method="post" class="question_form">
735
  <p class='submit'><input type='submit' class='button-primary' value='<?php _e ('Duplicate Question', 'quiz-master-next'); ?>' /></p>
736
  </form>
737
  </div>
738
+
739
+ <div id="from_other_quiz_dialog" title="Add Question From Other Quiz" style="display:none;">
740
+ <h3><?php _e('Select a question to import into this quiz', 'quiz-master-next'); ?></h3>
741
+ <p>
742
+ <label class="screen-reader-text" for="question_search">Search Questions:</label>
743
+ <input type="search" id="dialog_question_search" name="dialog_question_search" value="">
744
+ <button class="button" id="dialog_question_search_button">Search Questions</button>
745
+ </p>
746
+ <div class="other_quiz_questions">
747
+
748
+ </div>
749
+ <form action='' method='post' id="copy_question_form">
750
+ <?php wp_nonce_field('add_question_from_quiz','add_question_from_quiz_nonce'); ?>
751
+ <input type='hidden' id='copy_question_id' name='copy_question_id' value='' />
752
+ <input type='hidden' name='quiz_id' value='<?php echo $quiz_id; ?>' />
753
+ </form>
754
+ </div>
755
  <?php
756
  }
757
+
758
+ add_action( 'wp_ajax_qsm_load_all_quiz_questions', 'qsm_load_all_quiz_questions_ajax' );
759
+ add_action( 'wp_ajax_nopriv_qsm_load_all_quiz_questions', 'qsm_load_all_quiz_questions_ajax' );
760
+
761
+ /**
762
+ * Loads all the questions and echos out JSON
763
+ *
764
+ * @since 0.1.0
765
+ * @return void
766
+ */
767
+ function qsm_load_all_quiz_questions_ajax() {
768
+ global $wpdb;
769
+ global $mlwQuizMasterNext;
770
+
771
+ // Loads questions
772
+ $questions = $wpdb->get_results( "SELECT {$wpdb->prefix}mlw_questions.question_id, {$wpdb->prefix}mlw_questions.question_name, {$wpdb->prefix}mlw_quizzes.quiz_name FROM {$wpdb->prefix}mlw_questions
773
+ LEFT JOIN {$wpdb->prefix}mlw_quizzes ON {$wpdb->prefix}mlw_questions.quiz_id={$wpdb->prefix}mlw_quizzes.quiz_id WHERE {$wpdb->prefix}mlw_questions.deleted='0' ORDER BY {$wpdb->prefix}mlw_questions.question_id DESC" );
774
+
775
+ // Creates question array
776
+ $question_json = array();
777
+ foreach ( $questions as $question ) {
778
+ $question_json[] = array(
779
+ 'id' => $question->question_id,
780
+ 'question' => $question->question_name,
781
+ 'quiz' => $question->quiz_name
782
+ );
783
+ }
784
+
785
+ // Echos JSON and dies
786
+ echo json_encode( $question_json );
787
+ die();
788
+ }
789
+
790
  ?>
php/options-page-results-page-tab.php CHANGED
@@ -201,7 +201,7 @@ function mlw_options_results_tab_content()
201
  <div class="template_variable">
202
  <span class="template_name">%COMMENT_SECTION%</span> - <?php _e('The comments the user entered into comment box if enabled', 'quiz-master-next'); ?>
203
  </div>
204
- <div class="template_variable">
205
  <span class="template_name">%TIMER_MINUTES%</span> - <?php _e('The amount of time user spent taking quiz in minutes', 'quiz-master-next'); ?>
206
  </div>
207
  <div class="template_variable">
@@ -213,6 +213,9 @@ function mlw_options_results_tab_content()
213
  <div class="template_variable">
214
  <span class="template_name">%CATEGORY_POINTS%%/CATEGORY_POINTS%</span> - <?php _e('The amount of points a specific category earned.', 'quiz-master-next'); ?>
215
  </div>
 
 
 
216
  <div class="template_variable">
217
  <span class="template_name">%CATEGORY_SCORE%%/CATEGORY_SCORE%</span> - <?php _e('The score a specific category earned.', 'quiz-master-next'); ?>
218
  </div>
201
  <div class="template_variable">
202
  <span class="template_name">%COMMENT_SECTION%</span> - <?php _e('The comments the user entered into comment box if enabled', 'quiz-master-next'); ?>
203
  </div>
204
+ <div class="template_variable">
205
  <span class="template_name">%TIMER_MINUTES%</span> - <?php _e('The amount of time user spent taking quiz in minutes', 'quiz-master-next'); ?>
206
  </div>
207
  <div class="template_variable">
213
  <div class="template_variable">
214
  <span class="template_name">%CATEGORY_POINTS%%/CATEGORY_POINTS%</span> - <?php _e('The amount of points a specific category earned.', 'quiz-master-next'); ?>
215
  </div>
216
+ <div class="template_variable">
217
+ <spane class="template_name">%AVERAGE_CATEGORY_POINTS%%/AVERAGE_CATEGORY_POINTS%</span> - <?php _e('The average amount of points a specific category earned.', 'quiz-master-next'); ?>
218
+ </div>
219
  <div class="template_variable">
220
  <span class="template_name">%CATEGORY_SCORE%%/CATEGORY_SCORE%</span> - <?php _e('The score a specific category earned.', 'quiz-master-next'); ?>
221
  </div>
php/question-types.php CHANGED
@@ -207,8 +207,15 @@ function qmn_drop_down_display($id, $question, $answers)
207
  {
208
  $question_display = '';
209
  global $mlwQuizMasterNext;
210
- $question_display .= "<span class='mlw_qmn_question'>".do_shortcode(htmlspecialchars_decode($question, ENT_QUOTES))."</span>";
211
- $question_display .= "<select name='question".$id."'>";
 
 
 
 
 
 
 
212
  if (is_array($answers))
213
  {
214
  $mlw_answer_total = 0;
207
  {
208
  $question_display = '';
209
  global $mlwQuizMasterNext;
210
+ $required = $mlwQuizMasterNext->pluginHelper->get_question_setting( $id, 'required' );
211
+ if ( 0 == $required ) {
212
+ $require_class = "qsmRequiredSelect";
213
+ } else {
214
+ $require_class = "";
215
+ }
216
+ $question_display .= "<span class='mlw_qmn_question'>" . do_shortcode( htmlspecialchars_decode( $question, ENT_QUOTES ) ) . "</span>";
217
+ $question_display .= "<select class='qsm_select $require_class' name='question".$id."'>";
218
+ $question_display .= "<option value='No Answer Provided' selected='selected'>&nbsp;</option>";
219
  if (is_array($answers))
220
  {
221
  $mlw_answer_total = 0;
php/quiz-options-page.php CHANGED
@@ -29,9 +29,6 @@ function mlw_generate_quiz_options()
29
  <script type="text/javascript"
30
  src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
31
  </script>
32
- <!-- css -->
33
- <link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css" rel="stylesheet" />
34
- <!-- jquery scripts -->
35
  <?php
36
  wp_enqueue_script( 'jquery' );
37
  wp_enqueue_script( 'jquery-ui-core' );
@@ -41,6 +38,7 @@ function mlw_generate_quiz_options()
41
  wp_enqueue_script( 'jquery-ui-tabs' );
42
  wp_enqueue_script( 'jquery-effects-blind' );
43
  wp_enqueue_script( 'jquery-effects-explode' );
 
44
  ?>
45
  <style>
46
  .mlw_tab_content
29
  <script type="text/javascript"
30
  src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
31
  </script>
 
 
 
32
  <?php
33
  wp_enqueue_script( 'jquery' );
34
  wp_enqueue_script( 'jquery-ui-core' );
38
  wp_enqueue_script( 'jquery-ui-tabs' );
39
  wp_enqueue_script( 'jquery-effects-blind' );
40
  wp_enqueue_script( 'jquery-effects-explode' );
41
+ wp_enqueue_style( 'qmn_jquery_redmond_theme', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css' );
42
  ?>
43
  <style>
44
  .mlw_tab_content
php/quizzes-page.php CHANGED
@@ -36,7 +36,7 @@ function mlw_generate_quiz_admin()
36
  if (isset($_POST["quiz_name_editted"]) && $_POST["quiz_name_editted"] == "confirmation")
37
  {
38
  $mlw_edit_quiz_id = intval($_POST["edit_quiz_id"]);
39
- $mlw_edit_quiz_name = htmlspecialchars($_POST["edit_quiz_name"], ENT_QUOTES);
40
  $mlwQuizMasterNext->quizCreator->edit_quiz_name($mlw_edit_quiz_id, $mlw_edit_quiz_name);
41
  }
42
 
@@ -89,9 +89,8 @@ function mlw_generate_quiz_admin()
89
  wp_enqueue_script( 'jquery-ui-button' );
90
  wp_enqueue_script( 'jquery-effects-blind' );
91
  wp_enqueue_script( 'jquery-effects-explode' );
 
92
  ?>
93
- <!-- css -->
94
- <link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css" rel="stylesheet" />
95
  <script type="text/javascript"
96
  src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
97
  </script>
36
  if (isset($_POST["quiz_name_editted"]) && $_POST["quiz_name_editted"] == "confirmation")
37
  {
38
  $mlw_edit_quiz_id = intval($_POST["edit_quiz_id"]);
39
+ $mlw_edit_quiz_name = htmlspecialchars( stripslashes( $_POST["edit_quiz_name"] ), ENT_QUOTES);
40
  $mlwQuizMasterNext->quizCreator->edit_quiz_name($mlw_edit_quiz_id, $mlw_edit_quiz_name);
41
  }
42
 
89
  wp_enqueue_script( 'jquery-ui-button' );
90
  wp_enqueue_script( 'jquery-effects-blind' );
91
  wp_enqueue_script( 'jquery-effects-explode' );
92
+ wp_enqueue_style( 'qmn_jquery_redmond_theme', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css' );
93
  ?>
 
 
94
  <script type="text/javascript"
95
  src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
96
  </script>
php/template-variables.php CHANGED
@@ -34,6 +34,7 @@ $mlw_qmn_result_array = array(
34
 
35
  */
36
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_category_points',10,2);
 
37
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_category_score',10,2);
38
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_category_average_score',10,2);
39
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_category_average_points',10,2);
@@ -52,6 +53,7 @@ add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_comments'
52
  add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_timer',10,2);
53
  add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_timer_minutes',10,2);
54
  add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_date',10,2);
 
55
  add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_certificate_link',10,2);
56
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_facebook_share',10,2);
57
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_twitter_share',10,2);
@@ -235,7 +237,7 @@ function mlw_qmn_variable_timer($content, $mlw_quiz_array)
235
  }
236
  function mlw_qmn_variable_timer_minutes($content, $mlw_quiz_array)
237
  {
238
- $mlw_minutes = round($mlw_quiz_array["timer"]/60,2);
239
  $content = str_replace( "%TIMER_MINUTES%" , $mlw_minutes, $content);
240
  return $content;
241
  }
@@ -244,6 +246,12 @@ function mlw_qmn_variable_date($content, $mlw_quiz_array)
244
  $content = str_replace( "%CURRENT_DATE%" , date("F jS Y"), $content);
245
  return $content;
246
  }
 
 
 
 
 
 
247
  function mlw_qmn_variable_certificate_link($content, $mlw_quiz_array)
248
  {
249
  while (strpos($content, '%CERTIFICATE_LINK%') != false)
@@ -282,6 +290,38 @@ function qmn_variable_category_points($content, $mlw_quiz_array)
282
  return $content;
283
  }
284
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
285
  /*
286
  * Replaces variable %CATEGORY_SCORE% with the score for that category
287
  *
34
 
35
  */
36
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_category_points',10,2);
37
+ add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_average_category_points',10,2);
38
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_category_score',10,2);
39
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_category_average_score',10,2);
40
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_category_average_points',10,2);
53
  add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_timer',10,2);
54
  add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_timer_minutes',10,2);
55
  add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_date',10,2);
56
+ add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_date_taken',10,2);
57
  add_filter('mlw_qmn_template_variable_results_page', 'mlw_qmn_variable_certificate_link',10,2);
58
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_facebook_share',10,2);
59
  add_filter('mlw_qmn_template_variable_results_page', 'qmn_variable_twitter_share',10,2);
237
  }
238
  function mlw_qmn_variable_timer_minutes($content, $mlw_quiz_array)
239
  {
240
+ $mlw_minutes = round($mlw_quiz_array["timer"]/60,2);
241
  $content = str_replace( "%TIMER_MINUTES%" , $mlw_minutes, $content);
242
  return $content;
243
  }
246
  $content = str_replace( "%CURRENT_DATE%" , date("F jS Y"), $content);
247
  return $content;
248
  }
249
+
250
+ function mlw_qmn_variable_date_taken( $content, $mlw_quiz_array ) {
251
+ $content = str_replace( "%DATE_TAKEN%" , date("m/d/Y", strtotime( $mlw_quiz_array["time_taken"] ) ), $content);
252
+ return $content;
253
+ }
254
+
255
  function mlw_qmn_variable_certificate_link($content, $mlw_quiz_array)
256
  {
257
  while (strpos($content, '%CERTIFICATE_LINK%') != false)
290
  return $content;
291
  }
292
 
293
+ /*
294
+ * Replaces variable %CATEGORY_POINTS% with the average points for that category
295
+ *
296
+ * Filter function that replaces variable %CATEGORY_POINTS% with the average points from the category inside the variable tags. i.e. %CATEGORY_POINTS%category 1%/CATEGORY_POINTS%
297
+ *
298
+ * @since 4.0.0
299
+ * @param string $content The contents of the results page
300
+ * @param array $mlw_quiz_array The array of all the results from user taking the quiz
301
+ * @return string Returns the contents for the results page
302
+ */
303
+ function qmn_variable_average_category_points( $content, $mlw_quiz_array ) {
304
+ $return_points = 0;
305
+ while ( strpos( $content, '%AVERAGE_CATEGORY_POINTS%' ) !== false ) {
306
+ $return_points = 0;
307
+ $total_questions = 0;
308
+ preg_match( "~%AVERAGE_CATEGORY_POINTS%(.*?)%/AVERAGE_CATEGORY_POINTS%~i", $content, $answer_text );
309
+ foreach ( $mlw_quiz_array['question_answers_array'] as $answer ) {
310
+ if ( $answer["category"] == $answer_text[1] ) {
311
+ $total_questions += 1;
312
+ $return_points += $answer["points"];
313
+ }
314
+ }
315
+ if ( $total_questions !== 0 ) {
316
+ $return_points = round( $return_points / $total_questions, 2 );
317
+ } else {
318
+ $return_points = 0;
319
+ }
320
+ $content = str_replace( $answer_text[0], $return_points, $content );
321
+ }
322
+ return $content;
323
+ }
324
+
325
  /*
326
  * Replaces variable %CATEGORY_SCORE% with the score for that category
327
  *
php/tools-page.php CHANGED
@@ -22,11 +22,7 @@ function mlw_generate_quiz_tools()
22
  }
23
  add_meta_box("qmn_restore_box", 'Restore Quiz', "qmn_restore_function", "quiz_wpss");
24
  add_meta_box("qmn_audit_box", 'Audit Trail', "mlw_tools_box", "quiz_wpss");
25
- ?>
26
- <!-- css -->
27
- <link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css" rel="stylesheet" />
28
- <!-- jquery scripts -->
29
- <?php
30
  wp_enqueue_script( 'jquery' );
31
  wp_enqueue_script( 'jquery-ui-core' );
32
  wp_enqueue_script( 'jquery-ui-dialog' );
@@ -36,9 +32,9 @@ function mlw_generate_quiz_tools()
36
  wp_enqueue_script( 'jquery-ui-tabs' );
37
  wp_enqueue_script( 'jquery-effects-blind' );
38
  wp_enqueue_script( 'jquery-effects-explode' );
 
39
  ?>
40
- <!--<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
41
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>-->
42
  <script type="text/javascript">
43
  var $j = jQuery.noConflict();
44
  // increase the default animation speed to exaggerate the effect
22
  }
23
  add_meta_box("qmn_restore_box", 'Restore Quiz', "qmn_restore_function", "quiz_wpss");
24
  add_meta_box("qmn_audit_box", 'Audit Trail', "mlw_tools_box", "quiz_wpss");
25
+
 
 
 
 
26
  wp_enqueue_script( 'jquery' );
27
  wp_enqueue_script( 'jquery-ui-core' );
28
  wp_enqueue_script( 'jquery-ui-dialog' );
32
  wp_enqueue_script( 'jquery-ui-tabs' );
33
  wp_enqueue_script( 'jquery-effects-blind' );
34
  wp_enqueue_script( 'jquery-effects-explode' );
35
+ wp_enqueue_style( 'qmn_jquery_redmond_theme', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css' );
36
  ?>
37
+
 
38
  <script type="text/javascript">
39
  var $j = jQuery.noConflict();
40
  // increase the default animation speed to exaggerate the effect
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: mylocalwebstop, fpcorso, elrath
3
  Donate link: http://mylocalwebstop.com/downloads/donation-service-payment/
4
  Tags: quiz, survey, test, score, exam, questionnaire, email, answer, question, certificate, points, results
5
  Requires at least: 4.0.1
6
- Tested up to: 4.4.1
7
- Stable tag: 4.6.7
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -104,7 +104,23 @@ This is usually a theme conflict. You can [checkout out our common conflict solu
104
 
105
  == Changelog ==
106
 
107
- = 4.6.7 (January 22, 2015) =
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  * Fixes bug causing multiple response to be on a single line for some users
109
  * Fixes bug causing the incorrect/correct CSS class from being not added on results page correctly
110
  * Fixes bug causing unexpected output error when activating plugin
@@ -112,33 +128,9 @@ This is usually a theme conflict. You can [checkout out our common conflict solu
112
  * Adds link to online academy to help page
113
  * Cleans up installation function code
114
 
115
- = 4.6.6 (January 11, 2015) =
116
- * Fixes bug preventing some users to not be able to submit quiz
117
- * Fixes bug causing undefined titles for some users
118
-
119
- = 4.6.5 (January 9, 2015) =
120
- * Fixes timer bug that caused the timer to continue counting down after quiz has been submitted
121
- * Fixes theme conflict between QSM and some Bootstrap based themes
122
- * Fixes Quizzes/Surveys page table width issue
123
- * Fixes bug preventing editing of quiz post settings
124
- * Minor design changes
125
-
126
- = 4.6.4 (December 15, 2015) =
127
- * Fixes undefined results notice displayed on admin results for some users
128
- * Fixes bug that was causing the disable radio buttons option to not work in all browsers
129
- * Minor design changes
130
-
131
- = 4.6.3 (November 4, 2015) =
132
- * Fixes certificate bug that was preventing quiz/survey submissions
133
- * Fixes undefined quiz id bug that was affecting some addons
134
- * Fixes tooltip bug that was affecting required question validation on a few sites
135
-
136
- = 4.6.2 (October 21, 2015) =
137
- * Bug fix for browsers with JavaScript turned off
138
-
139
  ([Read Full Changelog](https://github.com/fpcorso/quiz_master_next/blob/master/CHANGELOG.md))
140
 
141
  == Upgrade Notice ==
142
 
143
- = 4.6.7 =
144
- Upgrade to fix bugs that affected the appearance of the multiple response questions and other minor bugs
3
  Donate link: http://mylocalwebstop.com/downloads/donation-service-payment/
4
  Tags: quiz, survey, test, score, exam, questionnaire, email, answer, question, certificate, points, results
5
  Requires at least: 4.0.1
6
+ Tested up to: 4.4.2
7
+ Stable tag: 4.7.0
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
104
 
105
  == Changelog ==
106
 
107
+ = 4.7.0 (April 4, 2016) =
108
+ * Closed Bug: Slash Added Before Quotation Mark When Editing Quiz/Survey Name - Issue #401
109
+ * Closed User Request: Add CSS Class To Container When Timer Runs Out - Issue #400
110
+ * Closed Bug: Validation breaks on second time through quiz - Issue #398
111
+ * Closed Bug: Validation not working when more than one question per page - Issue #395
112
+ * Closed Enhancement: Add Spinner/De-activate Submit Button Once Submitted - Issue #387
113
+ * Closed Enhancement: Pull changelog from GitHub API - Issue #377
114
+ * Closed Bug: Theme Conflict With Button Class (btn) - Issue #370
115
+ * Closed User Request: Add Average Points Per Category Variable - Issue #369
116
+ * Closed Bug: Mixed content SSL error - Issue #367
117
+ * Closed Enhancement: Default Option For Drop Down - Issue #334
118
+ * Closed Bug: Disable Answer On Change Not Working - Issue #331
119
+ * Closed User Request: Randomize Answers But Not Questions - Issue #330
120
+ * Closed User Request: Add Date Taken Variable - Issue #310
121
+ * Closed User Request: Copy Questions Between Quizzes - Issue #166
122
+
123
+ = 4.6.7 (January 22, 2016) =
124
  * Fixes bug causing multiple response to be on a single line for some users
125
  * Fixes bug causing the incorrect/correct CSS class from being not added on results page correctly
126
  * Fixes bug causing unexpected output error when activating plugin
128
  * Adds link to online academy to help page
129
  * Cleans up installation function code
130
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
  ([Read Full Changelog](https://github.com/fpcorso/quiz_master_next/blob/master/CHANGELOG.md))
132
 
133
  == Upgrade Notice ==
134
 
135
+ = 4.7.0 =
136
+ Upgrade to gain ability to copy questions from other quizzes/surveys, new loading icon when quiz/survey is submitted, option to randomize the answers only, and much more.
templates/qmn_amethyst.css CHANGED
@@ -9,6 +9,62 @@
9
  color:rgb(0,0,255);
10
  }
11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  .mlw_qmn_message_before {
14
  color: #666;
@@ -201,7 +257,7 @@ border: 1px solid #e3e3e3;
201
  border-radius: 3px;
202
  }
203
 
204
- .qmn_btn, .btn {
205
  display: relative;
206
  display: inline-block;
207
  color: #666 !important;
@@ -220,7 +276,7 @@ border: 1px solid #e3e3e3;
220
  transition: background .25s ease-out;
221
  }
222
 
223
- .qmn_btn:hover, .btn:hover {
224
  color: #fff;
225
  background: #666;
226
  }
9
  color:rgb(0,0,255);
10
  }
11
 
12
+ @-moz-keyframes spinner-loader {
13
+ 0% {
14
+ -moz-transform: rotate(0deg);
15
+ transform: rotate(0deg);
16
+ }
17
+ 100% {
18
+ -moz-transform: rotate(360deg);
19
+ transform: rotate(360deg);
20
+ }
21
+ }
22
+ @-webkit-keyframes spinner-loader {
23
+ 0% {
24
+ -webkit-transform: rotate(0deg);
25
+ transform: rotate(0deg);
26
+ }
27
+ 100% {
28
+ -webkit-transform: rotate(360deg);
29
+ transform: rotate(360deg);
30
+ }
31
+ }
32
+
33
+ @keyframes spinner-loader {
34
+ 0% {
35
+ -moz-transform: rotate(0deg);
36
+ -ms-transform: rotate(0deg);
37
+ -webkit-transform: rotate(0deg);
38
+ transform: rotate(0deg);
39
+ }
40
+ 100% {
41
+ -moz-transform: rotate(360deg);
42
+ -ms-transform: rotate(360deg);
43
+ -webkit-transform: rotate(360deg);
44
+ transform: rotate(360deg);
45
+ }
46
+ }
47
+
48
+ /* :not(:required) hides this rule from IE9 and below */
49
+ .qsm-spinner-loader:not(:required) {
50
+ -moz-animation: spinner-loader 1500ms infinite linear;
51
+ -webkit-animation: spinner-loader 1500ms infinite linear;
52
+ animation: spinner-loader 1500ms infinite linear;
53
+ -moz-border-radius: 0.5em;
54
+ -webkit-border-radius: 0.5em;
55
+ border-radius: 0.5em;
56
+ -moz-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
57
+ -webkit-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
58
+ box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
59
+ display: inline-block;
60
+ font-size: 10px;
61
+ width: 1em;
62
+ height: 1em;
63
+ margin: 1.5em;
64
+ overflow: hidden;
65
+ text-indent: 100%;
66
+ }
67
+
68
 
69
  .mlw_qmn_message_before {
70
  color: #666;
257
  border-radius: 3px;
258
  }
259
 
260
+ .qmn_btn, .qmn_quiz_container .btn {
261
  display: relative;
262
  display: inline-block;
263
  color: #666 !important;
276
  transition: background .25s ease-out;
277
  }
278
 
279
+ .qmn_btn:hover, .qmn_quiz_container .btn:hover {
280
  color: #fff;
281
  background: #666;
282
  }
templates/qmn_base.css CHANGED
@@ -9,6 +9,62 @@
9
  color:rgb(0,0,255);
10
  }
11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  .mlw_qmn_message_before {
14
  color: #666;
@@ -200,7 +256,7 @@ border: 1px solid #e3e3e3;
200
  border-radius: 3px;
201
  }
202
 
203
- .qmn_btn, .btn {
204
  display: relative;
205
  display: inline-block;
206
  color: #666 !important;
@@ -219,7 +275,7 @@ border: 1px solid #e3e3e3;
219
  transition: background .25s ease-out;
220
  }
221
 
222
- .qmn_btn:hover, .btn:hover {
223
  color: #fff;
224
  background: #666;
225
  }
@@ -299,12 +355,12 @@ border: 1px solid #e3e3e3;
299
  box-shadow: 0 0 10px rgba(155, 89, 182, .35);
300
  }
301
 
302
- .amethyst .btn {
303
  color: #fff;
304
  background: #9b59b6;
305
  }
306
 
307
- .amethyst .btn:hover { background: #8e44ad; }
308
 
309
 
310
  /* emerald */
9
  color:rgb(0,0,255);
10
  }
11
 
12
+ @-moz-keyframes spinner-loader {
13
+ 0% {
14
+ -moz-transform: rotate(0deg);
15
+ transform: rotate(0deg);
16
+ }
17
+ 100% {
18
+ -moz-transform: rotate(360deg);
19
+ transform: rotate(360deg);
20
+ }
21
+ }
22
+ @-webkit-keyframes spinner-loader {
23
+ 0% {
24
+ -webkit-transform: rotate(0deg);
25
+ transform: rotate(0deg);
26
+ }
27
+ 100% {
28
+ -webkit-transform: rotate(360deg);
29
+ transform: rotate(360deg);
30
+ }
31
+ }
32
+
33
+ @keyframes spinner-loader {
34
+ 0% {
35
+ -moz-transform: rotate(0deg);
36
+ -ms-transform: rotate(0deg);
37
+ -webkit-transform: rotate(0deg);
38
+ transform: rotate(0deg);
39
+ }
40
+ 100% {
41
+ -moz-transform: rotate(360deg);
42
+ -ms-transform: rotate(360deg);
43
+ -webkit-transform: rotate(360deg);
44
+ transform: rotate(360deg);
45
+ }
46
+ }
47
+
48
+ /* :not(:required) hides this rule from IE9 and below */
49
+ .qsm-spinner-loader:not(:required) {
50
+ -moz-animation: spinner-loader 1500ms infinite linear;
51
+ -webkit-animation: spinner-loader 1500ms infinite linear;
52
+ animation: spinner-loader 1500ms infinite linear;
53
+ -moz-border-radius: 0.5em;
54
+ -webkit-border-radius: 0.5em;
55
+ border-radius: 0.5em;
56
+ -moz-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
57
+ -webkit-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
58
+ box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
59
+ display: inline-block;
60
+ font-size: 10px;
61
+ width: 1em;
62
+ height: 1em;
63
+ margin: 1.5em;
64
+ overflow: hidden;
65
+ text-indent: 100%;
66
+ }
67
+
68
 
69
  .mlw_qmn_message_before {
70
  color: #666;
256
  border-radius: 3px;
257
  }
258
 
259
+ .qmn_btn, .qmn_quiz_container .btn {
260
  display: relative;
261
  display: inline-block;
262
  color: #666 !important;
275
  transition: background .25s ease-out;
276
  }
277
 
278
+ .qmn_btn:hover, .qmn_quiz_container .btn:hover {
279
  color: #fff;
280
  background: #666;
281
  }
355
  box-shadow: 0 0 10px rgba(155, 89, 182, .35);
356
  }
357
 
358
+ .amethyst .qmn_quiz_container .btn {
359
  color: #fff;
360
  background: #9b59b6;
361
  }
362
 
363
+ .amethyst .qmn_quiz_container .btn:hover { background: #8e44ad; }
364
 
365
 
366
  /* emerald */
templates/qmn_emerald.css CHANGED
@@ -9,6 +9,61 @@
9
  color:rgb(0,0,255);
10
  }
11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  .mlw_qmn_message_before {
14
  color: #666;
@@ -201,7 +256,7 @@ border: 1px solid #e3e3e3;
201
  border-radius: 3px;
202
  }
203
 
204
- .qmn_btn, .btn {
205
  display: relative;
206
  display: inline-block;
207
  color: #666 !important;
@@ -220,7 +275,7 @@ border: 1px solid #e3e3e3;
220
  transition: background .25s ease-out;
221
  }
222
 
223
- .qmn_btn:hover, .btn:hover {
224
  color: #fff;
225
  background: #666;
226
  }
9
  color:rgb(0,0,255);
10
  }
11
 
12
+ @-moz-keyframes spinner-loader {
13
+ 0% {
14
+ -moz-transform: rotate(0deg);
15
+ transform: rotate(0deg);
16
+ }
17
+ 100% {
18
+ -moz-transform: rotate(360deg);
19
+ transform: rotate(360deg);
20
+ }
21
+ }
22
+ @-webkit-keyframes spinner-loader {
23
+ 0% {
24
+ -webkit-transform: rotate(0deg);
25
+ transform: rotate(0deg);
26
+ }
27
+ 100% {
28
+ -webkit-transform: rotate(360deg);
29
+ transform: rotate(360deg);
30
+ }
31
+ }
32
+
33
+ @keyframes spinner-loader {
34
+ 0% {
35
+ -moz-transform: rotate(0deg);
36
+ -ms-transform: rotate(0deg);
37
+ -webkit-transform: rotate(0deg);
38
+ transform: rotate(0deg);
39
+ }
40
+ 100% {
41
+ -moz-transform: rotate(360deg);
42
+ -ms-transform: rotate(360deg);
43
+ -webkit-transform: rotate(360deg);
44
+ transform: rotate(360deg);
45
+ }
46
+ }
47
+
48
+ /* :not(:required) hides this rule from IE9 and below */
49
+ .qsm-spinner-loader:not(:required) {
50
+ -moz-animation: spinner-loader 1500ms infinite linear;
51
+ -webkit-animation: spinner-loader 1500ms infinite linear;
52
+ animation: spinner-loader 1500ms infinite linear;
53
+ -moz-border-radius: 0.5em;
54
+ -webkit-border-radius: 0.5em;
55
+ border-radius: 0.5em;
56
+ -moz-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
57
+ -webkit-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
58
+ box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
59
+ display: inline-block;
60
+ font-size: 10px;
61
+ width: 1em;
62
+ height: 1em;
63
+ margin: 1.5em;
64
+ overflow: hidden;
65
+ text-indent: 100%;
66
+ }
67
 
68
  .mlw_qmn_message_before {
69
  color: #666;
256
  border-radius: 3px;
257
  }
258
 
259
+ .qmn_btn, .qmn_quiz_container .btn {
260
  display: relative;
261
  display: inline-block;
262
  color: #666 !important;
275
  transition: background .25s ease-out;
276
  }
277
 
278
+ .qmn_btn:hover, .qmn_quiz_container .btn:hover {
279
  color: #fff;
280
  background: #666;
281
  }
templates/qmn_gray.css CHANGED
@@ -9,6 +9,62 @@
9
  color:rgb(0,0,255);
10
  }
11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  .mlw_qmn_message_before {
14
  color: #666;
@@ -201,7 +257,7 @@ border: 1px solid #e3e3e3;
201
  border-radius: 3px;
202
  }
203
 
204
- .qmn_btn, .btn {
205
  display: relative;
206
  display: inline-block;
207
  color: #666 !important;
@@ -220,7 +276,7 @@ border: 1px solid #e3e3e3;
220
  transition: background .25s ease-out;
221
  }
222
 
223
- .qmn_btn:hover, .btn:hover {
224
  color: #fff;
225
  background: #666;
226
  }
9
  color:rgb(0,0,255);
10
  }
11
 
12
+ @-moz-keyframes spinner-loader {
13
+ 0% {
14
+ -moz-transform: rotate(0deg);
15
+ transform: rotate(0deg);
16
+ }
17
+ 100% {
18
+ -moz-transform: rotate(360deg);
19
+ transform: rotate(360deg);
20
+ }
21
+ }
22
+ @-webkit-keyframes spinner-loader {
23
+ 0% {
24
+ -webkit-transform: rotate(0deg);
25
+ transform: rotate(0deg);
26
+ }
27
+ 100% {
28
+ -webkit-transform: rotate(360deg);
29
+ transform: rotate(360deg);
30
+ }
31
+ }
32
+
33
+ @keyframes spinner-loader {
34
+ 0% {
35
+ -moz-transform: rotate(0deg);
36
+ -ms-transform: rotate(0deg);
37
+ -webkit-transform: rotate(0deg);
38
+ transform: rotate(0deg);
39
+ }
40
+ 100% {
41
+ -moz-transform: rotate(360deg);
42
+ -ms-transform: rotate(360deg);
43
+ -webkit-transform: rotate(360deg);
44
+ transform: rotate(360deg);
45
+ }
46
+ }
47
+
48
+ /* :not(:required) hides this rule from IE9 and below */
49
+ .qsm-spinner-loader:not(:required) {
50
+ -moz-animation: spinner-loader 1500ms infinite linear;
51
+ -webkit-animation: spinner-loader 1500ms infinite linear;
52
+ animation: spinner-loader 1500ms infinite linear;
53
+ -moz-border-radius: 0.5em;
54
+ -webkit-border-radius: 0.5em;
55
+ border-radius: 0.5em;
56
+ -moz-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
57
+ -webkit-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
58
+ box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
59
+ display: inline-block;
60
+ font-size: 10px;
61
+ width: 1em;
62
+ height: 1em;
63
+ margin: 1.5em;
64
+ overflow: hidden;
65
+ text-indent: 100%;
66
+ }
67
+
68
 
69
  .mlw_qmn_message_before {
70
  color: #666;
257
  border-radius: 3px;
258
  }
259
 
260
+ .qmn_btn, .qmn_quiz_container .btn {
261
  display: relative;
262
  display: inline-block;
263
  color: #666 !important;
276
  transition: background .25s ease-out;
277
  }
278
 
279
+ .qmn_btn:hover, .qmn_quiz_container .btn:hover {
280
  color: #fff;
281
  background: #666;
282
  }
templates/qmn_primary.css CHANGED
@@ -9,6 +9,62 @@
9
  color:rgb(0,0,255);
10
  }
11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  .mlw_qmn_message_before {
14
  color: #666;
@@ -201,7 +257,7 @@ border: 1px solid #e3e3e3;
201
  border-radius: 3px;
202
  }
203
 
204
- .qmn_btn, .btn {
205
  display: relative;
206
  display: inline-block;
207
  color: #666 !important;
@@ -220,7 +276,7 @@ border: 1px solid #e3e3e3;
220
  transition: background .25s ease-out;
221
  }
222
 
223
- .qmn_btn:hover, .btn:hover {
224
  color: #fff;
225
  background: #666;
226
  }
9
  color:rgb(0,0,255);
10
  }
11
 
12
+ @-moz-keyframes spinner-loader {
13
+ 0% {
14
+ -moz-transform: rotate(0deg);
15
+ transform: rotate(0deg);
16
+ }
17
+ 100% {
18
+ -moz-transform: rotate(360deg);
19
+ transform: rotate(360deg);
20
+ }
21
+ }
22
+ @-webkit-keyframes spinner-loader {
23
+ 0% {
24
+ -webkit-transform: rotate(0deg);
25
+ transform: rotate(0deg);
26
+ }
27
+ 100% {
28
+ -webkit-transform: rotate(360deg);
29
+ transform: rotate(360deg);
30
+ }
31
+ }
32
+
33
+ @keyframes spinner-loader {
34
+ 0% {
35
+ -moz-transform: rotate(0deg);
36
+ -ms-transform: rotate(0deg);
37
+ -webkit-transform: rotate(0deg);
38
+ transform: rotate(0deg);
39
+ }
40
+ 100% {
41
+ -moz-transform: rotate(360deg);
42
+ -ms-transform: rotate(360deg);
43
+ -webkit-transform: rotate(360deg);
44
+ transform: rotate(360deg);
45
+ }
46
+ }
47
+
48
+ /* :not(:required) hides this rule from IE9 and below */
49
+ .qsm-spinner-loader:not(:required) {
50
+ -moz-animation: spinner-loader 1500ms infinite linear;
51
+ -webkit-animation: spinner-loader 1500ms infinite linear;
52
+ animation: spinner-loader 1500ms infinite linear;
53
+ -moz-border-radius: 0.5em;
54
+ -webkit-border-radius: 0.5em;
55
+ border-radius: 0.5em;
56
+ -moz-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
57
+ -webkit-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
58
+ box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
59
+ display: inline-block;
60
+ font-size: 10px;
61
+ width: 1em;
62
+ height: 1em;
63
+ margin: 1.5em;
64
+ overflow: hidden;
65
+ text-indent: 100%;
66
+ }
67
+
68
 
69
  .mlw_qmn_message_before {
70
  color: #666;
257
  border-radius: 3px;
258
  }
259
 
260
+ .qmn_btn, .qmn_quiz_container .btn {
261
  display: relative;
262
  display: inline-block;
263
  color: #666 !important;
276
  transition: background .25s ease-out;
277
  }
278
 
279
+ .qmn_btn:hover, .qmn_quiz_container .btn:hover {
280
  color: #fff;
281
  background: #666;
282
  }
templates/qmn_turquoise.css CHANGED
@@ -9,6 +9,62 @@
9
  color:rgb(0,0,255);
10
  }
11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  .mlw_qmn_message_before {
14
  color: #666;
@@ -201,7 +257,7 @@ border: 1px solid #e3e3e3;
201
  border-radius: 3px;
202
  }
203
 
204
- .qmn_btn, .btn {
205
  display: relative;
206
  display: inline-block;
207
  color: #666 !important;
@@ -220,7 +276,7 @@ border: 1px solid #e3e3e3;
220
  transition: background .25s ease-out;
221
  }
222
 
223
- .qmn_btn:hover, .btn:hover {
224
  color: #fff;
225
  background: #666;
226
  }
9
  color:rgb(0,0,255);
10
  }
11
 
12
+ @-moz-keyframes spinner-loader {
13
+ 0% {
14
+ -moz-transform: rotate(0deg);
15
+ transform: rotate(0deg);
16
+ }
17
+ 100% {
18
+ -moz-transform: rotate(360deg);
19
+ transform: rotate(360deg);
20
+ }
21
+ }
22
+ @-webkit-keyframes spinner-loader {
23
+ 0% {
24
+ -webkit-transform: rotate(0deg);
25
+ transform: rotate(0deg);
26
+ }
27
+ 100% {
28
+ -webkit-transform: rotate(360deg);
29
+ transform: rotate(360deg);
30
+ }
31
+ }
32
+
33
+ @keyframes spinner-loader {
34
+ 0% {
35
+ -moz-transform: rotate(0deg);
36
+ -ms-transform: rotate(0deg);
37
+ -webkit-transform: rotate(0deg);
38
+ transform: rotate(0deg);
39
+ }
40
+ 100% {
41
+ -moz-transform: rotate(360deg);
42
+ -ms-transform: rotate(360deg);
43
+ -webkit-transform: rotate(360deg);
44
+ transform: rotate(360deg);
45
+ }
46
+ }
47
+
48
+ /* :not(:required) hides this rule from IE9 and below */
49
+ .qsm-spinner-loader:not(:required) {
50
+ -moz-animation: spinner-loader 1500ms infinite linear;
51
+ -webkit-animation: spinner-loader 1500ms infinite linear;
52
+ animation: spinner-loader 1500ms infinite linear;
53
+ -moz-border-radius: 0.5em;
54
+ -webkit-border-radius: 0.5em;
55
+ border-radius: 0.5em;
56
+ -moz-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
57
+ -webkit-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
58
+ box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0;
59
+ display: inline-block;
60
+ font-size: 10px;
61
+ width: 1em;
62
+ height: 1em;
63
+ margin: 1.5em;
64
+ overflow: hidden;
65
+ text-indent: 100%;
66
+ }
67
+
68
 
69
  .mlw_qmn_message_before {
70
  color: #666;
257
  border-radius: 3px;
258
  }
259
 
260
+ .qmn_btn, .qmn_quiz_container .btn {
261
  display: relative;
262
  display: inline-block;
263
  color: #666 !important;
276
  transition: background .25s ease-out;
277
  }
278
 
279
+ .qmn_btn:hover, .qmn_quiz_container .btn:hover {
280
  color: #fff;
281
  background: #666;
282
  }