giuliomoro@0
|
1 <?php
|
giuliomoro@0
|
2 function fisherYatesShuffle(&$items, $seed) // http://stackoverflow.com/questions/6557805/randomize-a-php-array-with-a-seed
|
giuliomoro@0
|
3 {
|
giuliomoro@0
|
4 @mt_srand($seed);
|
giuliomoro@0
|
5 for ($i = count($items) - 1; $i > 0; $i--)
|
giuliomoro@0
|
6 {
|
giuliomoro@0
|
7 $j = @mt_rand(0, $i);
|
giuliomoro@0
|
8 $tmp = $items[$i];
|
giuliomoro@0
|
9 $items[$i] = $items[$j];
|
giuliomoro@0
|
10 $items[$j] = $tmp;
|
giuliomoro@0
|
11 }
|
giuliomoro@0
|
12 }
|
giuliomoro@0
|
13 function url_origin( $s, $use_forwarded_host = false ) //http://stackoverflow.com/questions/6768793/get-the-full-url-in-php
|
giuliomoro@0
|
14 {
|
giuliomoro@0
|
15 $ssl = ( ! empty( $s['HTTPS'] ) && $s['HTTPS'] == 'on' );
|
giuliomoro@0
|
16 $sp = strtolower( $s['SERVER_PROTOCOL'] );
|
giuliomoro@0
|
17 $protocol = substr( $sp, 0, strpos( $sp, '/' ) ) . ( ( $ssl ) ? 's' : '' );
|
giuliomoro@0
|
18 $port = $s['SERVER_PORT'];
|
giuliomoro@0
|
19 $port = ( ( ! $ssl && $port=='80' ) || ( $ssl && $port=='443' ) ) ? '' : ':'.$port;
|
giuliomoro@0
|
20 $host = ( $use_forwarded_host && isset( $s['HTTP_X_FORWARDED_HOST'] ) ) ? $s['HTTP_X_FORWARDED_HOST'] : ( isset( $s['HTTP_HOST'] ) ? $s['HTTP_HOST'] : null );
|
giuliomoro@0
|
21 $host = isset( $host ) ? $host : $s['SERVER_NAME'] . $port;
|
giuliomoro@0
|
22 return $protocol . '://' . $host;
|
giuliomoro@0
|
23 }
|
giuliomoro@0
|
24
|
giuliomoro@0
|
25 function full_url( $s, $use_forwarded_host = false )
|
giuliomoro@0
|
26 {
|
giuliomoro@0
|
27 return url_origin( $s, $use_forwarded_host ) . $s['REQUEST_URI'];
|
giuliomoro@0
|
28 }
|
giuliomoro@0
|
29 $toAppendToUrl = '';
|
giuliomoro@0
|
30 if(isset($_GET["id"])){
|
giuliomoro@0
|
31 $id = $_GET["id"];
|
giuliomoro@0
|
32 } else {
|
giuliomoro@0
|
33 $max = pow(2, 24);
|
giuliomoro@0
|
34 $rand = openssl_random_pseudo_bytes($max);
|
giuliomoro@0
|
35 $id = sha1($rand);
|
giuliomoro@0
|
36 if(sizeof($_GET) == 0){ // if the query string is empty
|
giuliomoro@0
|
37 $toAppendToUrl = '?'; // start the query string
|
giuliomoro@0
|
38 } else {
|
giuliomoro@0
|
39 $toAppendToUrl = '&'; // otherwise, append to it
|
giuliomoro@0
|
40 }
|
giuliomoro@0
|
41 $toAppendToUrl .= 'id='.$id;
|
giuliomoro@0
|
42 }
|
giuliomoro@0
|
43 if(isset($_GET["next"])){
|
giuliomoro@0
|
44 $next = $_GET["next"];
|
giuliomoro@0
|
45 } else {
|
giuliomoro@0
|
46 $next = 0;
|
giuliomoro@0
|
47 }
|
giuliomoro@0
|
48
|
giuliomoro@0
|
49 $absoluteUrl = full_url($_SERVER).$toAppendToUrl;
|
giuliomoro@0
|
50 // echo "<br \>".$absoluteUrl."<br \>";
|
giuliomoro@0
|
51 // if there is a "next" in the query string, create a version of $absoluteUrl with
|
giuliomoro@0
|
52 // next:=next+1
|
giuliomoro@0
|
53 $absoluteUrlSplit = explode('?', $absoluteUrl);
|
giuliomoro@0
|
54 $absoluteUrlNextPlusOne = $absoluteUrl;
|
giuliomoro@0
|
55 if(sizeof($absoluteUrlSplit) === 2){
|
giuliomoro@0
|
56 $queryString = $absoluteUrlSplit[1];
|
giuliomoro@0
|
57 parse_str($queryString, $queryStringParsed);
|
giuliomoro@0
|
58 $queryStringParsed['next'] += 1;
|
giuliomoro@0
|
59 $queryString = http_build_query($queryStringParsed);
|
giuliomoro@0
|
60 $absoluteUrlNextPlusOne = $absoluteUrlSplit[0]."?".$queryString;
|
giuliomoro@0
|
61 }
|
giuliomoro@0
|
62 $defaultTestEntry = Array('url' => null, 'string' => null, 'class' => 'disabled', 'a' => false, 'editable' => false);
|
giuliomoro@0
|
63
|
giuliomoro@0
|
64 require_once('test_list.php'); //this returns $tests
|
giuliomoro@0
|
65
|
giuliomoro@0
|
66 if($next == sizeof($tests)){
|
giuliomoro@0
|
67 // we are done
|
giuliomoro@0
|
68 $bottomBox = 'The test is complete, thank you for your participation.';
|
giuliomoro@0
|
69 } else {
|
giuliomoro@0
|
70 $bottomBox = 'If you want to have a break, come back to this page and continue from where you left, just come back to this URL:<br /><div id="currentUrl">'.$absoluteUrl.'</div>';
|
giuliomoro@0
|
71 }
|
giuliomoro@0
|
72 // until this point, the content of $tests will always be the same for a given $id,
|
giuliomoro@0
|
73 // regardless of how many times we visited this page.
|
giuliomoro@0
|
74 for($n = 0; $n < sizeof($tests); $n++ ){
|
giuliomoro@0
|
75 //TODO: check if the corresponding file exists
|
giuliomoro@0
|
76 // meantime, let us just rely on the GET variable 'next'
|
giuliomoro@0
|
77 if($n <= $next){
|
giuliomoro@0
|
78 $tests[$n]['a'] = true;
|
giuliomoro@0
|
79 $tests[$n]['class'] = 'enabled done';
|
giuliomoro@0
|
80 // if we are going to re-run a test, return to the same page
|
giuliomoro@0
|
81 $tests[$n]['returnUrl'] = urlencode($absoluteUrl);
|
giuliomoro@0
|
82 }
|
giuliomoro@0
|
83 if($n == $next){
|
giuliomoro@0
|
84 $tests[$n]['editable'] = true;
|
giuliomoro@0
|
85 $tests[$n]['class'] = 'enabled editable';
|
giuliomoro@0
|
86 // if we are going to run a new test, return to the same page with next:=next+1
|
giuliomoro@0
|
87 $tests[$n]['returnUrl'] = urlencode($absoluteUrlNextPlusOne);
|
giuliomoro@0
|
88 }
|
giuliomoro@0
|
89 }
|
giuliomoro@0
|
90 ?>
|
giuliomoro@0
|
91 <html>
|
giuliomoro@0
|
92 <head>
|
giuliomoro@0
|
93 <style>
|
giuliomoro@0
|
94 ul.tests-list li{
|
giuliomoro@0
|
95 margin: 10px 0 5px 0;
|
giuliomoro@0
|
96
|
giuliomoro@0
|
97 }
|
giuliomoro@0
|
98 .done {
|
giuliomoro@0
|
99 list-style-image: url('assets/images/checkbox-checked.png');
|
giuliomoro@0
|
100 }
|
giuliomoro@0
|
101 .done a {
|
giuliomoro@0
|
102 color: green;
|
giuliomoro@0
|
103 }
|
giuliomoro@0
|
104 .editable{
|
giuliomoro@0
|
105 list-style-image: url('assets/images/arrow-checkbox-unchecked.png');
|
giuliomoro@0
|
106 list-style-position: inside;
|
giuliomoro@0
|
107 margin-left: -30px;
|
giuliomoro@0
|
108 }
|
giuliomoro@0
|
109 .disabled{
|
giuliomoro@0
|
110 color: grey;
|
giuliomoro@0
|
111 text-decoration: line-through;
|
giuliomoro@0
|
112 list-style-image: url('assets/images/checkbox-unchecked-disabled.png');
|
giuliomoro@0
|
113 }
|
giuliomoro@0
|
114 #currentUrl{
|
giuliomoro@0
|
115 font-weight: bold;
|
giuliomoro@0
|
116 padding-left: 20px;
|
giuliomoro@0
|
117 padding-top: 5px;
|
giuliomoro@0
|
118 }
|
giuliomoro@0
|
119
|
giuliomoro@0
|
120 </style>
|
giuliomoro@0
|
121 <script src="jquery-2.1.4.js"></script>
|
giuliomoro@0
|
122 <script>
|
giuliomoro@0
|
123 function confirmEditing(e){
|
giuliomoro@0
|
124 var message = 'Are you sure you want to edit this item? All previous changes will be lost';
|
giuliomoro@0
|
125 return window.confirm(message);
|
giuliomoro@0
|
126 }
|
giuliomoro@0
|
127 var elements;
|
giuliomoro@0
|
128 $(document).ready(function(){
|
giuliomoro@0
|
129 lis = $('ul');
|
giuliomoro@0
|
130 elements = $('li.done:not(.editable)', lis);
|
giuliomoro@0
|
131 for(var n = 0; n < elements.length; n++){
|
giuliomoro@0
|
132 elements[n].onclick = confirmEditing;
|
giuliomoro@0
|
133 }
|
giuliomoro@0
|
134 history.pushState({}, null, location.pathname+location.search+'<?php echo $toAppendToUrl; ?>');
|
giuliomoro@0
|
135
|
giuliomoro@0
|
136 // elements = $('li:not(.editable.done)', lis);
|
giuliomoro@0
|
137 // for(var element in elements){
|
giuliomoro@0
|
138 // element.onclick = confirmEditing;
|
giuliomoro@0
|
139 // }
|
giuliomoro@0
|
140 });
|
giuliomoro@0
|
141 </script>
|
giuliomoro@0
|
142 </head>
|
giuliomoro@0
|
143 <body>
|
giuliomoro@0
|
144
|
giuliomoro@0
|
145 <ul class = "tests-list">
|
giuliomoro@0
|
146 <?php foreach($tests as $n => $test) : ?>
|
giuliomoro@0
|
147 <li class="test-element <?php echo $test['class'] ?>">
|
giuliomoro@0
|
148 <?php
|
giuliomoro@0
|
149 if($test['a'] === true) {
|
giuliomoro@0
|
150 // parameters passed to the test are used to keep track of the state and should be returned back to
|
giuliomoro@0
|
151 // this page when it is called again.
|
giuliomoro@0
|
152 // These parameters are:
|
giuliomoro@0
|
153 // id= keeps track of the user and of the sorting of the tests in this page
|
giuliomoro@0
|
154 // next= keeps track of the first test not yet undertaken
|
giuliomoro@0
|
155
|
giuliomoro@0
|
156 echo '<a href="'.$test['url'].'&returnUrl='.$test['returnUrl'].'">'.($n+1).' - '.$test['string'].'</a>';
|
giuliomoro@0
|
157 } else {
|
giuliomoro@0
|
158 echo ($n+1).' - '.$test['string'];
|
giuliomoro@0
|
159 }
|
giuliomoro@0
|
160 ?>
|
giuliomoro@0
|
161 </li>
|
giuliomoro@0
|
162 <?php endforeach; ?>
|
giuliomoro@0
|
163 </ul>
|
giuliomoro@0
|
164
|
giuliomoro@0
|
165 <div id="bottomBox">
|
giuliomoro@0
|
166 <?php if($bottomBox!=='') echo $bottomBox ?>
|
giuliomoro@0
|
167 </div>
|
giuliomoro@0
|
168 </body>
|
giuliomoro@0
|
169 </html>
|