From 7db6b8ea39363f7fac04623ec0712388ff93958c Mon Sep 17 00:00:00 2001 From: bdaloukas Date: Sun, 14 Oct 2012 12:25:04 +0300 Subject: [PATCH] First commit 1.9 to git --- README.txt | 69 + attempt.php | 243 ++ backuplib.php | 281 +++ bookquiz/importodt.php | 779 ++++++ bookquiz/importppt.php | 469 ++++ bookquiz/pix/add.gif | Bin 0 -> 68 bytes bookquiz/pix/generateimscp.gif | Bin 0 -> 803 bytes bookquiz/pix/nav_exit.gif | Bin 0 -> 248 bytes bookquiz/pix/nav_next.gif | Bin 0 -> 246 bytes bookquiz/pix/nav_prev.gif | Bin 0 -> 247 bytes bookquiz/pix/nav_prev_dis.gif | Bin 0 -> 209 bytes bookquiz/pix/nav_sep.gif | Bin 0 -> 41 bytes bookquiz/pix/print_book.gif | Bin 0 -> 204 bytes bookquiz/pix/print_chapter.gif | Bin 0 -> 158 bytes bookquiz/play.php | 398 +++ bookquiz/questions.php | 193 ++ bookquiz/toc.php | 135 + bookquiz/view.php | 202 ++ contest/play.php | 248 ++ cross/cross_class.php | 749 ++++++ cross/crossdb_class.php | 226 ++ cross/play.php | 1125 +++++++++ cryptex/cryptexdb_class.php | 237 ++ cryptex/play.php | 322 +++ db/access.php | 105 + db/createsnakes.php | 8 + db/importsnakes.php | 51 + db/importsudoku.php | 1852 ++++++++++++++ db/install.xml | 350 +++ db/upgrade.php | 1497 +++++++++++ docs/Readme_en.pdf | Bin 0 -> 176918 bytes docs/database.pdf | Bin 0 -> 35027 bytes docs/database.xmi | 1047 ++++++++ docs/readme_el.pdf | Bin 0 -> 196972 bytes export.php | 256 ++ export/html/snakes/css/game.css | 40 + export/html/snakes/css/modal.css | 41 + export/html/snakes/css/snakes.css | 134 + export/html/snakes/css/style.css | 15 + export/html/snakes/css/subModal.css | 69 + export/html/snakes/js/common.js | 78 + export/html/snakes/js/jquery-1.6.1.min.js | 18 + .../snakes/js/jquery-ui-1.7.2.custom.min.js | 298 +++ export/html/snakes/js/snakes-mod.js | 473 ++++ export/html/snakes/js/subModal.js | 295 +++ export/html/snakes/maskBG.png | Bin 0 -> 137 bytes export/html/snakes/modalContent.html | 14 + export/javame/hangman/simple/KeyCanvas.class | Bin 0 -> 11726 bytes export/javame/hangman/simple/KeyCanvas.java | 537 ++++ export/javame/hangman/simple/hangman-1.class | Bin 0 -> 718 bytes export/javame/hangman/simple/hangman.class | Bin 0 -> 1186 bytes export/javame/hangman/simple/hangman.java | 566 +++++ .../hangman/simple/lang/el_utf8/language.txt | 3 + .../hangman/simple/lang/en_utf8/language.txt | 4 + .../hangman/simple/lang/es_utf8/language.txt | 4 + .../javame/hangmanp/simple/hangmanp-1.class | Bin 0 -> 724 bytes export/javame/hangmanp/simple/hangmanp.class | Bin 0 -> 1192 bytes export/javame/hangmanp/simple/hangmanp.java | 33 + .../javame/hangmanp/simple/keycanvasp.class | Bin 0 -> 12075 bytes export/javame/hangmanp/simple/keycanvasp.java | 570 +++++ .../hangmanp/simple/lang/el_utf8/language.txt | 3 + .../hangmanp/simple/lang/en_utf8/language.txt | 4 + .../hangmanp/simple/lang/es_utf8/language.txt | 4 + exporthtml.php | 256 ++ exporthtml_hangman.php | 361 +++ exporthtml_millionaire.php | 521 ++++ exporthtml_snakes.php | 502 ++++ exportjavame.php | 325 +++ hangman/1/hangman_0.jpg | Bin 0 -> 3241 bytes hangman/1/hangman_1.jpg | Bin 0 -> 3649 bytes hangman/1/hangman_2.jpg | Bin 0 -> 3932 bytes hangman/1/hangman_3.jpg | Bin 0 -> 4176 bytes hangman/1/hangman_4.jpg | Bin 0 -> 4344 bytes hangman/1/hangman_5.jpg | Bin 0 -> 4500 bytes hangman/1/hangman_6.jpg | Bin 0 -> 4646 bytes hangman/play.php | 449 ++++ header.php | 57 + hiddenpicture/numbers.png | Bin 0 -> 6574 bytes hiddenpicture/picture.php | 127 + hiddenpicture/play.php | 447 ++++ icon.gif | Bin 0 -> 7074 bytes images/icon1.gif | Bin 0 -> 1111 bytes images/soundplay.gif | Bin 0 -> 449 bytes index.php | 164 ++ lang/ca_utf8/game.php | 295 +++ lang/de_utf8/game.php | 294 +++ lang/el_utf8/game.php | 300 +++ lang/en_utf8/game.php | 300 +++ lang/en_utf8/help/game/timeopen.html | 5 + lang/es_utf8/game.php | 295 +++ lang/eu_utf8/game.php | 294 +++ lang/fr_utf8/game.php | 293 +++ lang/he_utf8/game.php | 294 +++ lang/hr_utf8/game.php | 296 +++ lang/it_utf8/game.php | 295 +++ lang/lt_utf8/game.php | 304 +++ lang/nl_utf8/game.php | 303 +++ lang/no_utf8/game.php | 295 +++ lang/pl_utf8/game.php | 294 +++ lang/pt_br_utf8/game.php | 295 +++ lang/ru_utf8/game.php | 295 +++ lang/sq_utf8/game.php | 294 +++ lang/uk_utf8/game.php | 295 +++ lang/zh_cn_utf8/game.php | 294 +++ lib.php | 956 ++++++++ locallib.php | 1506 ++++++++++++ millionaire/1/5050.gif | Bin 0 -> 2199 bytes millionaire/1/5050x.gif | Bin 0 -> 1982 bytes millionaire/1/people.gif | Bin 0 -> 1975 bytes millionaire/1/peoplex.gif | Bin 0 -> 2019 bytes millionaire/1/telephone.gif | Bin 0 -> 1559 bytes millionaire/1/telephonex.gif | Bin 0 -> 1900 bytes millionaire/1/x.gif | Bin 0 -> 1724 bytes millionaire/play.php | 644 +++++ mod.html | 684 ++++++ mod_form.php | 434 ++++ pagelib.php | 92 + preview.php | 278 +++ print.php | 41 + report.php | 80 + report/default.php | 49 + report/overview/report.php | 615 +++++ restorelib.php | 784 ++++++ review.php | 379 +++ showanswers.php | 374 +++ snakes/1/dice1.png | Bin 0 -> 205 bytes snakes/1/dice2.png | Bin 0 -> 218 bytes snakes/1/dice3.png | Bin 0 -> 230 bytes snakes/1/dice4.png | Bin 0 -> 214 bytes snakes/1/dice5.png | Bin 0 -> 227 bytes snakes/1/dice6.png | Bin 0 -> 990 bytes snakes/1/la11.png | Bin 0 -> 3163 bytes snakes/1/la13.png | Bin 0 -> 4954 bytes snakes/1/la31.png | Bin 0 -> 5334 bytes snakes/1/numbers.png | Bin 0 -> 4983 bytes snakes/1/player1.png | Bin 0 -> 497 bytes snakes/1/sa11.png | Bin 0 -> 8334 bytes snakes/1/sa12.png | Bin 0 -> 4092 bytes snakes/1/sa21.png | Bin 0 -> 3903 bytes snakes/1/sa22.png | Bin 0 -> 4057 bytes snakes/1/sa23.png | Bin 0 -> 4568 bytes snakes/1/sa24.png | Bin 0 -> 5611 bytes snakes/1/sa42.png | Bin 0 -> 5062 bytes snakes/boards/fidaki.jpg | Bin 0 -> 48398 bytes snakes/boards/fidaki2.jpg | Bin 0 -> 38119 bytes snakes/createboard.php | 290 +++ snakes/play.php | 527 ++++ sudoku/class.Sudoku.php | 2181 +++++++++++++++++ sudoku/create.php | 145 ++ sudoku/export.php | 33 + sudoku/license.htm | 44 + sudoku/play.php | 629 +++++ sudoku/sdd/class.SDD.php | 495 ++++ sudoku/sdd/class.logfile.php | 69 + tabs.php | 126 + translate.php | 442 ++++ version.php | 15 + view.php | 439 ++++ 158 files changed, 35235 insertions(+) create mode 100644 README.txt create mode 100644 attempt.php create mode 100644 backuplib.php create mode 100644 bookquiz/importodt.php create mode 100644 bookquiz/importppt.php create mode 100644 bookquiz/pix/add.gif create mode 100644 bookquiz/pix/generateimscp.gif create mode 100644 bookquiz/pix/nav_exit.gif create mode 100644 bookquiz/pix/nav_next.gif create mode 100644 bookquiz/pix/nav_prev.gif create mode 100644 bookquiz/pix/nav_prev_dis.gif create mode 100644 bookquiz/pix/nav_sep.gif create mode 100644 bookquiz/pix/print_book.gif create mode 100644 bookquiz/pix/print_chapter.gif create mode 100644 bookquiz/play.php create mode 100644 bookquiz/questions.php create mode 100644 bookquiz/toc.php create mode 100644 bookquiz/view.php create mode 100644 contest/play.php create mode 100644 cross/cross_class.php create mode 100644 cross/crossdb_class.php create mode 100644 cross/play.php create mode 100644 cryptex/cryptexdb_class.php create mode 100644 cryptex/play.php create mode 100644 db/access.php create mode 100644 db/createsnakes.php create mode 100644 db/importsnakes.php create mode 100644 db/importsudoku.php create mode 100644 db/install.xml create mode 100644 db/upgrade.php create mode 100644 docs/Readme_en.pdf create mode 100644 docs/database.pdf create mode 100644 docs/database.xmi create mode 100644 docs/readme_el.pdf create mode 100644 export.php create mode 100755 export/html/snakes/css/game.css create mode 100755 export/html/snakes/css/modal.css create mode 100755 export/html/snakes/css/snakes.css create mode 100755 export/html/snakes/css/style.css create mode 100755 export/html/snakes/css/subModal.css create mode 100644 export/html/snakes/js/common.js create mode 100644 export/html/snakes/js/jquery-1.6.1.min.js create mode 100644 export/html/snakes/js/jquery-ui-1.7.2.custom.min.js create mode 100644 export/html/snakes/js/snakes-mod.js create mode 100644 export/html/snakes/js/subModal.js create mode 100644 export/html/snakes/maskBG.png create mode 100644 export/html/snakes/modalContent.html create mode 100755 export/javame/hangman/simple/KeyCanvas.class create mode 100755 export/javame/hangman/simple/KeyCanvas.java create mode 100755 export/javame/hangman/simple/hangman-1.class create mode 100755 export/javame/hangman/simple/hangman.class create mode 100755 export/javame/hangman/simple/hangman.java create mode 100644 export/javame/hangman/simple/lang/el_utf8/language.txt create mode 100644 export/javame/hangman/simple/lang/en_utf8/language.txt create mode 100644 export/javame/hangman/simple/lang/es_utf8/language.txt create mode 100644 export/javame/hangmanp/simple/hangmanp-1.class create mode 100644 export/javame/hangmanp/simple/hangmanp.class create mode 100644 export/javame/hangmanp/simple/hangmanp.java create mode 100644 export/javame/hangmanp/simple/keycanvasp.class create mode 100644 export/javame/hangmanp/simple/keycanvasp.java create mode 100644 export/javame/hangmanp/simple/lang/el_utf8/language.txt create mode 100644 export/javame/hangmanp/simple/lang/en_utf8/language.txt create mode 100644 export/javame/hangmanp/simple/lang/es_utf8/language.txt create mode 100644 exporthtml.php create mode 100644 exporthtml_hangman.php create mode 100644 exporthtml_millionaire.php create mode 100644 exporthtml_snakes.php create mode 100644 exportjavame.php create mode 100644 hangman/1/hangman_0.jpg create mode 100644 hangman/1/hangman_1.jpg create mode 100644 hangman/1/hangman_2.jpg create mode 100644 hangman/1/hangman_3.jpg create mode 100644 hangman/1/hangman_4.jpg create mode 100644 hangman/1/hangman_5.jpg create mode 100644 hangman/1/hangman_6.jpg create mode 100644 hangman/play.php create mode 100644 header.php create mode 100644 hiddenpicture/numbers.png create mode 100644 hiddenpicture/picture.php create mode 100644 hiddenpicture/play.php create mode 100644 icon.gif create mode 100644 images/icon1.gif create mode 100644 images/soundplay.gif create mode 100644 index.php create mode 100644 lang/ca_utf8/game.php create mode 100644 lang/de_utf8/game.php create mode 100644 lang/el_utf8/game.php create mode 100644 lang/en_utf8/game.php create mode 100644 lang/en_utf8/help/game/timeopen.html create mode 100644 lang/es_utf8/game.php create mode 100644 lang/eu_utf8/game.php create mode 100644 lang/fr_utf8/game.php create mode 100644 lang/he_utf8/game.php create mode 100644 lang/hr_utf8/game.php create mode 100644 lang/it_utf8/game.php create mode 100644 lang/lt_utf8/game.php create mode 100644 lang/nl_utf8/game.php create mode 100644 lang/no_utf8/game.php create mode 100644 lang/pl_utf8/game.php create mode 100644 lang/pt_br_utf8/game.php create mode 100644 lang/ru_utf8/game.php create mode 100644 lang/sq_utf8/game.php create mode 100644 lang/uk_utf8/game.php create mode 100644 lang/zh_cn_utf8/game.php create mode 100644 lib.php create mode 100644 locallib.php create mode 100644 millionaire/1/5050.gif create mode 100644 millionaire/1/5050x.gif create mode 100644 millionaire/1/people.gif create mode 100644 millionaire/1/peoplex.gif create mode 100644 millionaire/1/telephone.gif create mode 100644 millionaire/1/telephonex.gif create mode 100644 millionaire/1/x.gif create mode 100644 millionaire/play.php create mode 100644 mod.html create mode 100644 mod_form.php create mode 100644 pagelib.php create mode 100644 preview.php create mode 100644 print.php create mode 100644 report.php create mode 100644 report/default.php create mode 100644 report/overview/report.php create mode 100644 restorelib.php create mode 100644 review.php create mode 100644 showanswers.php create mode 100644 snakes/1/dice1.png create mode 100644 snakes/1/dice2.png create mode 100644 snakes/1/dice3.png create mode 100644 snakes/1/dice4.png create mode 100644 snakes/1/dice5.png create mode 100644 snakes/1/dice6.png create mode 100644 snakes/1/la11.png create mode 100644 snakes/1/la13.png create mode 100644 snakes/1/la31.png create mode 100644 snakes/1/numbers.png create mode 100644 snakes/1/player1.png create mode 100644 snakes/1/sa11.png create mode 100644 snakes/1/sa12.png create mode 100644 snakes/1/sa21.png create mode 100644 snakes/1/sa22.png create mode 100644 snakes/1/sa23.png create mode 100644 snakes/1/sa24.png create mode 100644 snakes/1/sa42.png create mode 100644 snakes/boards/fidaki.jpg create mode 100644 snakes/boards/fidaki2.jpg create mode 100644 snakes/createboard.php create mode 100644 snakes/play.php create mode 100644 sudoku/class.Sudoku.php create mode 100644 sudoku/create.php create mode 100644 sudoku/export.php create mode 100644 sudoku/license.htm create mode 100644 sudoku/play.php create mode 100644 sudoku/sdd/class.SDD.php create mode 100644 sudoku/sdd/class.logfile.php create mode 100644 tabs.php create mode 100644 translate.php create mode 100644 version.php create mode 100644 view.php diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..0968b0b --- /dev/null +++ b/README.txt @@ -0,0 +1,69 @@ +Game module for Moodle +Copyright (C) 2004-2011 Vasilis Daloukas (http://bdaloukas.gr) + + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details: + +http:www.gnu.org/copyleft/gpl.html + +Game module for Moodle +=============================================================================== +Created by: + Vasilis Daloukas (bdaloukas) + +Many ideas and code were taken from other Moodle modules and Moodle itself + +Installation: + * see http://docs.moodle.org/en/Installing_contributed_modules_or_plugins + +This module gets input from quiz, glossary or questions and plays some games. The games are: + +* hangman +* crossword +* cryptex +* millionaire +* sudoku +* Snakes and Ladders +* The hidden picture +* Book with questions + +If you like the idea goto http://play2learn.gr/moodle for a demo in Moodle 1.9 or goto to http://ebusiness-lab.epdo.teimes.gr/play2learn/ for a demo in Moodle 2. + +Currently works with 17 languages Català (ca), Deutsch (de), Ελληνικά (el), English (en), Español - Internacional (es), Euskara (eu), Français (fr), ית (he), Hrvatski (hr), Italiano (it), Nederlands (nl), Norsk - bokmal ( no), Polski (pl), Português - Brasil (pt_br), Русский (ru), Shqip (sq), Українська (uk), 简体中文 (zh_cn) languages. + +If you like the module Game please donate at http://bdaloukas.gr/donate/moodlegame/, help me to have more time to continue working on this project. This module is and will remain free, but your donation allows me to continue the development, and any amount is greatly appreciated. + + +Documentation http://docs.moodle.org/en/Game_module +Browse source code http://cvs.moodle.org/contrib/plugins/mod/game/ +Changelog https://docs.google.com/document/pub?id=1-WJUa_Hbdo9eualKSjjP9wTnI4GVMs4JYDaLypU2IDQ +Discussion http://moodle.org/mod/forum/view.php?id=7220 +Download for Moodle 2.0 http://download.moodle.org/download.php/plugins/mod/game.zip +Download for Moodle 1.9 http://download.moodle.org/download.php/plugins19/mod/game.zip +Bugs and Issues http://tracker.moodle.org/browse/CONTRIB/component/10295 + +Interface: + + * The interface is like a quiz. The student plays games and teacher can see the grades + * You can set a text that will be visible at the bottom of the game. In this way will be a picture at the bottom and a crossword with questions about the picture + * You can use pictures inside questions + + +Restrictions: + + * You can only backup/restore the data of game not the user attempts. (not works backup now) + * In the report overview you can see only what students said for questions not for glossaryentries + + +Upgrade + + * Delete the files from mod/game + * Copy the new files to mod/game diff --git a/attempt.php b/attempt.php new file mode 100644 index 0000000..5a30165 --- /dev/null +++ b/attempt.php @@ -0,0 +1,243 @@ +timeopen || ($game->timeclose && $timestamp > $game->timeclose))) { + if (!has_capability('mod/game:manage', $context)) { + if ($timestamp < $game->timeopen) { + $s = get_string("gamenotavailable", "game", userdate($game->timeopen)); + } else { + $s = get_string("gameclosed", "game", userdate($game->timeclose)); + } + error($s, "view.php?id={$cm->id}"); + } + } + + + $forcenew = optional_param('forcenew', false, PARAM_BOOL); // Teacher has requested new preview + + // Hangman params + $newletter = optional_param('newletter', '', PARAM_TEXT); + + // Bookquiz params + $chapterid = optional_param('chapterid', 0, PARAM_INT); + + // Sudoku params + $pos = optional_param('pos', 0, PARAM_INT); + $num = optional_param('num', 0, PARAM_INT); + + // Cryptex (Wordfind) params + $q = optional_param('q', '', PARAM_TEXT); + $answer = optional_param('answer', '', PARAM_TEXT); + + // Crossword params + $get_g = optional_param('g', '', PARAM_TEXT); + + + $endofgame = optional_param('endofgame', 0, PARAM_INT); + $finishattempt = optional_param('finishattempt', 0, PARAM_INT); + + /// Print the main part of the page + switch( $action) + { + case 'crosscheck': + $attempt = game_getattempt($game, $detail); + $g = game_cross_unpackpuzzle($get_g); + game_cross_continue( $id, $game, $attempt, $detail, $g, $finishattempt); + break; + case 'crossprint': + $attempt = game_getattempt($game, $detail); + game_cross_play($id, $game, $attempt, $detail, '', true, false, false, true); + break; + case 'sudokucheck': //the student tries to answer a question + $attempt = game_getattempt($game, $detail); + game_sudoku_check_questions($id, $game, $attempt, $detail, $finishattempt); + break; + case 'sudokucheckg': //the student tries to guess a glossaryenry + $attempt = game_getattempt($game, $detail); + game_sudoku_check_glossaryentries($id, $game, $attempt, $detail, $endofgame); + break; + case 'sudokucheckn': //the user tries to guess a number + $attempt = game_getattempt($game, $detail); + game_sudoku_check_number($id, $game, $attempt, $detail, $pos, $num); + break; + case 'cryptexcheck': //the user tries to guess a question + $attempt = game_getattempt($game, $detail); + game_cryptex_check($id, $game, $attempt, $detail, $q, $answer); + break; + case 'bookquizcheck': //the student tries to answer a question + $attempt = game_getattempt($game, $detail); + game_bookquiz_check_questions($id, $game, $attempt, $detail); + break; + case 'snakescheck': //the student tries to answer a question + $attempt = game_getattempt($game, $detail); + game_snakes_check_questions($id, $game, $attempt, $detail); + break; + case 'snakescheckg': //the student tries to answer a question + $attempt = game_getattempt($game, $detail); + game_snakes_check_glossary($id, $game, $attempt, $detail); + break; + case 'hiddenpicturecheck': //the student tries to answer a question + $attempt = game_getattempt($game, $detail); + $finishattempt = optional_param('finishattempt', 0, PARAM_INT); + game_hiddenpicture_check_questions($id, $game, $attempt, $detail, $finishattempt); + break; + case 'hiddenpicturecheckg': //the student tries to guess a glossaryenry + $attempt = game_getattempt($game, $detail); + $endofgame = optional_param('endofgame', 0, PARAM_INT); + game_hiddenpicture_check_mainquestion($id, $game, $attempt, $detail, $endofgame); + break; + case "": + game_create($game, $id, $forcenew, $course); + break; + default: + error('Not found action='.$action); + } + /// Finish the page + print_footer($course); + + + function game_create($game, $id, $forcenew, $course){ + global $USER, $CFG; + + $attempt = game_getattempt($game, $detail); + + switch($game->gamekind){ + case 'cross': + game_cross_continue($id, $game, $attempt, $detail, '', $forcenew); + break; + case 'hangman': + $action2 = optional_param('action2', '', PARAM_TEXT); + $newletter = optional_param('newletter', '', PARAM_TEXT); + game_hangman_continue($id, $game, $attempt, $detail, $newletter, $action2); + break; + case 'millionaire': + game_millionaire_continue($id, $game, $attempt, $detail); + break; + case 'bookquiz': + $chapterid = optional_param('chapterid', 0, PARAM_INT); + game_bookquiz_continue($id, $game, $attempt, $detail, $chapterid); + break; + case 'sudoku': + game_sudoku_continue($id, $game, $attempt, $detail); + break; + case 'cryptex': + game_cryptex_continue($id, $game, $attempt, $detail, $forcenew); + break; + case 'snakes': + game_snakes_continue($id, $game, $attempt, $detail); + break; + case 'hiddenpicture': + game_hiddenpicture_continue($id, $game, $attempt, $detail); + break; + case 'contest': + require( 'contest/play.php'); + $entryid = optional_param('entryid', 0, PARAM_INT); + game_contest_continue($id, $game, $attempt, $detail, $entryid); + break; + default: + error("Game {$game->gamekind} not found"); + break; + } + } + + //inserts a record to game_attempts + function game_addattempt($game){ + global $CFG, $USER; + + $newrec->gamekind = $game->gamekind; + $newrec->gameid = $game->id; + $newrec->userid = $USER->id; + $newrec->timestart = time(); + $newrec->timefinish = 0; + $newrec->timelastattempt = 0; + $newrec->preview = 0; + $newrec->attempt = get_field( 'game_attempts', 'max(attempt)', 'gameid', $game->id, 'userid', $USER->id) + 1; + $newrec->score = 0; + + if (!($newid = insert_record( 'game_attempts', $newrec))){ + error("Insert game_attempts: new rec not inserted"); + } + + if($USER->username == 'guest'){ + $key = 'mod/game:instanceid'.$game->id; + $_SESSION[ $key] = $newid; + } + + return get_record_select('game_attempts', 'id='.$newid); + } + + + function game_cross_unpackpuzzle($g){ + $ret = ""; + $textlib = textlib_get_instance(); + + $len = $textlib->strlen($g); + while($len){ + for($i=0; $i < $len; $i++){ + $c = $textlib->substr($g, $i, 1); + if($c >= '1' and $c <= '9'){ + if($i > 0){ + //found escape character + if($textlib->substr( $g, $i-1, 1) == '/'){ + $g = $textlib->substr( $g, 0, $i-1).$textlib->substr( $g, $i); + $i--; + $len--; + continue; + } + } + break; + } + } + + if( $i < $len){ + //found the start of a number + for( $j=$i+1; $j < $len; $j++){ + $c = $textlib->substr( $g, $j, 1); + if( $c < '0' or $c > '9'){ + break; + } + } + $count = $textlib->substr( $g, $i, $j-$i); + $ret .= $textlib->substr( $g, 0, $i) . str_repeat( '_', $count); + + $g = $textlib->substr( $g, $j); + $len = $textlib->strlen( $g); + + } + else{ + $ret .= $g; + break; + } + } + + return $ret; + } diff --git a/backuplib.php b/backuplib.php new file mode 100644 index 0000000..1a0ad0b --- /dev/null +++ b/backuplib.php @@ -0,0 +1,281 @@ +id) + // | + // Meaning: pk->primary key field of the table + // fk->foreign key to link with parent + // nt->nested field (recursive data) + // SL->site level info + // CL->course level info + // UL->user level info + // files->table may have files + // + //----------------------------------------------------------- + + // When we backup a game we also need to backup the questions and possibly + // the data about student interaction with the questions. The functions to do + // that are included with the following library + + /* + * Insert necessary category ids to backup_ids table. Called during backup_check.html + */ + function game_insert_category_and_question_ids($course, $backup_unique_code, $instances = null) { + global $CFG; + + // Insert categories used by games + $sql = "SELECT DISTINCT g.questioncategoryid as id + FROM {$CFG->prefix}game g + WHERE g.course=$course"; + if( ($recs = get_records_sql( $sql)) == false){ + return true; + } + $status = true; + $table = 'question_categories'; + foreach( $recs as $rec){ + if( $rec->id == 0){ + continue; + } + + $select = "backup_code='$backup_unique_code' AND table_name='$table' AND old_id = '$rec->id'"; + if( ($found = get_record_select( 'backup_ids', $select)) != false){ + continue; + } + + unset( $newrec); + $newrec->backup_code = $backup_unique_code; + $newrec->table_name = $table; + $newrec->old_id = $rec->id; + $newrec->info = ''; + if (!insert_record( 'backup_ids', $newrec)){ + print_object( $newrec); + error("game_insert_category_and_question_ids: Can't insert to backup_ids"); + } + + } + + return $status; + } + + function game_insert_glossaries_ids($course, $backup_unique_code, $instances = null) { + global $CFG; + + // Insert categories used by games + $status = execute_sql("INSERT INTO {$CFG->prefix}backup_ids + (backup_code, table_name, old_id, info) + SELECT DISTINCT $backup_unique_code, 'glossary', g.glossaryid, '' + FROM {$CFG->prefix}game g + WHERE g.course=$course", false); + + return $status; + } + +//STEP 2. Backup games and associated structures + // (course dependent) + + function game_backup_one_mod($bf,$preferences,$game) { + global $CFG; + + $status = true; + + if (is_numeric($game)) { + $game = get_record('game','id',$game); + } + + //Start mod + fwrite ($bf,start_tag("MOD",3,true)); + + //Print game data + $game->modtype = 'game'; + + game_backup_record( $bf, $game, 4); + + $recs = get_records_select( 'game_snakes_database'); + game_backup_table( $bf, $recs, 'GAME_SNAKES_DATABASE',5, 'GAME_SNAKES_DATABASE_RECORD', 6); + + $recs = get_records_select( 'game_bookquiz_questions', "gameid=$game->id"); + game_backup_table( $bf, $recs, 'GAME_BOOKQUIZ_QUESTIONS',5, 'GAME_BOOKQUIZ_QUESTION', 6); + + $recs = get_records_select( 'game_grades', "gameid=$game->id"); + game_backup_table( $bf, $recs, 'GAME_GRADES',5, 'GAME_GRADE', 6); + + $recs = get_records_select( 'game_export_html', "id=$game->id"); + game_backup_table( $bf, $recs, 'GAME_GRADES',5, 'GAME_GRADE', 6); + + $recs = get_records_select( 'game_export_javame', "id=$game->id"); + game_backup_table( $bf, $recs, 'GAME_GRADES',5, 'GAME_GRADE', 6); + + $sql = "SELECT DISTINCT g.questioncategoryid as id,qc.stamp FROM ". + " {$CFG->prefix}game g,{$CFG->prefix}question_categories qc ". + " WHERE g.questioncategoryid = qc.id"; + $recs = get_records_sql( $sql); + game_backup_table( $bf, $recs, 'QUESTION_CATEGORIES',5, 'QUESTION_CATEGORY', 6); + + game_backup_attempts( $bf,$preferences,$game->id); + + //End mod + $status = fwrite ($bf,end_tag("MOD",3,true)); + + return $status; + } + + function game_backup_table( $bf,$recs, $tags, $levels, $tag, $level) + { + $status = true; + + //If there are records + if ($recs != false) { + //Write start tag + $status = fwrite ($bf,start_tag( $tags, $levels, true)); + //Iterate over each attempt + foreach ($recs as $rec) { + //Start game_snakes_database + $status = fwrite ($bf, start_tag( $tag, $level, true)); + game_backup_record( $bf, $rec, $level); + $status = fwrite ($bf, end_tag( $tag, $level, true)); + } + + $status = fwrite ($bf,end_tag( $tags, $levels, true)); + } + + return $status; + } + + function game_backup_record( $bf, $rec, $level){ + foreach( $rec as $field => $value){ + fwrite ($bf,full_tag( strtoupper( $field), $level, false, $rec->$field)); + } + } + + function game_backup_attempts( $bf,$preferences,$gameid) + { + $status = true; + + $attempts = get_records("game_attempts","gameid",$gameid,"id"); + //If there are attempts + if ($attempts) { + //Write start tag + $status = fwrite ($bf,start_tag("GAME_ATTEMPTS",5,true)); + //Iterate over each attempt + foreach ($attempts as $attempt) { + //Start game_attempt + $status = fwrite ($bf,start_tag("GAME_ATTEMPT",6,true)); + game_backup_record( $bf, $attempt, 7); + + ////////////game_queries + $queries = get_records("game_queries","attemptid",$attempt->id,"id"); + if( $queries != false){ + //Write start tag + $status = fwrite ($bf,start_tag("GAME_QUERIES",8,true)); + foreach ($queries as $query) { + //Start game_query + $status = fwrite ($bf,start_tag("GAME_QUERY",9,true)); + game_backup_record( $bf, $query, 10); + $status = fwrite ($bf,end_tag("GAME_QUERY",9,true)); + } + $status = fwrite ($bf,end_tag("GAME_QUERIES",8,true)); + } + + $names = array( 'game_hangman', 'game_cross', 'game_cryptex', 'game_millionaire', 'game_sudoku', 'game_snakes', 'game_hiddenpicture'); + game_backup_game( $bf, $attempt->id, $names); + + //End question instance + $status = fwrite ($bf,end_tag("GAME_ATTEMPT",6,true)); + } + //Write end tag + $status = fwrite ($bf,end_tag("GAME_ATTEMPTS",5,true)); + } + return $status; + } + + + function game_backup_game( $bf, $attemptid, $names) + { + foreach( $names as $name){ + if( ($rec = get_record_select( $name, "id=$attemptid")) == false){ + continue; + } + + $uppername = strtoupper( $name); + $status = fwrite ($bf,start_tag( $uppername,7,true)); + game_backup_record( $bf, $rec, 8); + $status = fwrite ($bf,end_tag( $uppername,7,true)); + } + } + + function game_backup_mods($bf,$preferences) { + + global $CFG; + + $status = true; + + //Iterate over game table + $games = get_records ("game","course",$preferences->backup_course,"id"); + if ($games) { + foreach ($games as $game) { + if (backup_mod_selected($preferences,'game',$game->id)) { + $status = game_backup_one_mod( $bf,$preferences,$game); + } + } + } + return $status; + } + + + ////Return an array of info (name,value) +/// $instances is an array with key = instanceid, value = object (name,id,userdata) + function game_check_backup_mods($course,$user_data= false,$backup_unique_code,$instances=null) { + //this function selects all the questions / categories to be backed up. + game_insert_category_and_question_ids($course, $backup_unique_code, $instances); + game_insert_glossaries_ids($course, $backup_unique_code, $instances); + + if (!empty($instances) && is_array($instances) && count($instances)) { + $info = array(); + foreach ($instances as $id => $instance) { + $info += game_check_backup_mods_instances($instance,$backup_unique_code); + } + return $info; + } + + //First the course data + $info[0][0] = get_string("modulenameplural","game"); + if ($ids = game_ids ($course)) { + $info[0][1] = count($ids); + } else { + $info[0][1] = 0; + } + + return $info; + } + + + function game_check_backup_mods_instances($instance,$backup_unique_code) { + // the keys in this array need to be unique as they get merged... + $info[$instance->id.'0'][0] = ''.$instance->name.''; + $info[$instance->id.'0'][1] = ''; + + + return $info; + } + + +// INTERNAL FUNCTIONS. BASED IN THE MOD STRUCTURE + + //Returns an array of quiz id + function game_ids ($course) { + + global $CFG; + + return get_records_sql ("SELECT a.id, a.course + FROM {$CFG->prefix}game a + WHERE a.course = '$course'"); + } + + +?> diff --git a/bookquiz/importodt.php b/bookquiz/importodt.php new file mode 100644 index 0000000..8629a99 --- /dev/null +++ b/bookquiz/importodt.php @@ -0,0 +1,779 @@ +bookid; + if( $bookid == 0){ + error( get_string( 'bookquiz_not_select_book', 'game')); + } + + if ($form = data_submitted()) + { /// Filename + + if (empty($_FILES['newfile'])) + { // file was just uploaded + notify(get_string("uploadproblem") ); + } + + if ((!is_uploaded_file($_FILES['newfile']['tmp_name']) or $_FILES['newfile']['size'] == 0)) + { + notify(get_string("uploadnofilefound") ); + } else + { // Valid file is found + if ( readdata( $course->id, 'game', $dirtemp, $r_levels, $r_titles, $r_texts, $dirfordelete)) + { // first try to reall all of the data in + $subchapter = optional_param('subchapter', 0, PARAM_BOOL); + $overwrite = optional_param('overwrite', 0, PARAM_BOOL); + if( $overwrite){ + game_bookquiz_deletebook( $course->id, $bookid); + } + $pageobjects = extract_data( $course->id, 'game', $bookid, $dirtemp, $subchapter, $r_levels, $r_titles, $r_texts); // parse all the html files into objects + //clean_temp( $dirfordelete); // all done with files so dump em + + $objects = game_bookquiz_create_objects( $pageobjects, $bookid); // function to preps the data to be sent to DB + + if( !game_bookquiz_save_objects($objects)) + { // sends it to DB + error("could not save"); + } + }else + error('could not get data'); + + print_continue("$CFG->wwwroot/mod/game/view.php?id=$cm->id"); + print_footer($course); + exit; + } + } + + /// Print upload form + + print_heading_with_help( get_string( "bookquiz_import_odt", "game"), "importodt", "game"); + + print_simple_box_start( "center"); + ?> +
+ + + + + + + + + + + + +
+ : + + +
+ : + +
+
  + " /> +
+
+ dataroot."/temp/$modname"; + if (!file_exists( $newdir)) + mkdir( $newdir); + + $i = 1; + srand((double)microtime()*1000000); + while(true) + { + $r_basedir = "$modname/$i-".rand(0,10000); + $newdir = $CFG->dataroot.'/temp/'.$r_basedir; + if (!file_exists( $newdir)) + { + mkdir( $newdir); + $newdir .= '/'; + break; + } + $i++; + } + $dirfordelete = $r_basedir; + $r_basedir .= '/'; + + $zipfile = $_FILES["newfile"]["name"]; + $tempzipfile = $_FILES["newfile"]["tmp_name"]; + + // create our directory + $path_parts = pathinfo($zipfile); + $dirname = substr($zipfile, 0, strpos($zipfile, '.'.$path_parts['extension'])); // take off the extension + if (!file_exists($newdir.$dirname)){ + mkdir($newdir.$dirname); + } + + // move our uploaded file to temp/game + move_uploaded_file( $tempzipfile, $newdir.$zipfile); + + //if the file ends with .lnk then use .odt instead + if( substr( $zipfile, -4) == ".lnk") + $zipfile = substr( $zipfile, 0, -4).".odt"; + + // unzip it! + unzip_file ( $newdir.$zipfile, $newdir.$dirname, false); + + $r_basedir .= $dirname; // update the base + $newdir .= $dirname; + + // this is the file where we get the names of the files for the slides (in the correct order too) + $content = $newdir.'/content.xml'; + $data = file_get_contents( $content); + + $content = $newdir.'/styles.xml'; + if (file_exists( $content)){ + $datastyle = file_get_contents( $content); + }else + { + $datastyle = ''; + } + + oo_game_convert_ver2( $data, $datastyle, $r_levels, $r_titles, $r_texts); + + return true; +} + + + //////////////////////// + function oo_game_convert_ver2( $data, $datastyle, &$r_levels, &$r_titles, &$r_texts) + { + $r_levels = array(); + $r_titles = array(); + $r_texts = array(); + + // we have tables, encode it here so all ', '', $data); + $data = preg_replace('##es', "base64_encode('\\1')", $data); + } + + $styles = array(); + game_bookquiz_convert_ver2_computestyles( $datastyle, $styles, true); + game_bookquiz_convert_ver2_computestyles( $data, $styles, false); + + game_bookquiz_splitsections($data, $positions, $inputs, $titles, $titleframes, $texts);print_r($positions); + for( $i=0; $i < count( $positions); $i++) + { + preg_match_all( "#text:outline-level=\"([0-9]*)\"#es", $inputs[ $i], $matches); + $levels = $matches[ 1]; + if( count( $levels) > 0){ + $level = $levels[ 0]; + }else + { + $level = 0; + } + + $r_levels[] = $level; + $r_titles[] = strip_tags( $titles[ $i]); + + $textframe = game_bookquiz_convert($titleframes[ $i], $styles, $images); + $text = game_bookquiz_convert($texts[ $i], $styles, $images); + if( $textframe != ''){ + $text = $textframe.'
'.$text; + } + + echo "
".$titles[ $i]."
".$text."\r\n\r\n\r\n\r\n"; + + $r_texts[] = $text; + }print_r($r_texts); + } + +function extract_data( $courseid, $modname, $id, $basedir, $subchapter, $levels, $titles, $texts) +{ + global $CFG; + global $matches; + + $dirtemp = $CFG->dataroot.'/temp/'.$basedir; + + for($i=0; $i < count( $levels); $i++){ + echo $levels[ $i]." ".$titles[ $i]."
"; + } + + $extractedpages = array(); + + // directory for images + make_mod_upload_directory( $courseid); // make sure moddata is made + make_upload_directory( $courseid.'/moddata/'.$modname, false); + make_upload_directory( $courseid.'/moddata/'.$modname."/".$id, false); // we store our images in a subfolder in here + + $imagedir = $CFG->dataroot.'/'.$courseid.'/moddata/'.$modname."/".$id; + + if ($CFG->slasharguments) + $imagelink = $CFG->wwwroot.'/file.php/'.$courseid.'/moddata/'.$modname."/".$id; + else + $imagelink = $CFG->wwwroot.'/file.php?file=/'.$courseid.'/moddata/'.$modname."/".$id; + + // try to make a unique subfolder to store the images + $i = 1; + while(true) + { + $newdir = $imagedir.'/'.$i; + if (!file_exists( $newdir)) + { + // ok doesnt exist so make the directory and update our paths + mkdir( $newdir); + $imagedir = $newdir; + $imagelink = $imagelink.'/'.$i; + break; + } + $i++; + } + + for( $i=0; $i < count( $titles); $i++) + { + // start building our page + $page = new stdClass; + $page->title = $titles[ $i]; + $page->content = $texts[ $i]; + //$page->source = $path_parts['basename']; // need for book only + $page->subchapter = ( $levels[ $i] >= 2); + + //check if the nexts are subchapters + for( $j=$i+1; $j < count( $titles); $j++){ + if( $levels[ $j] > 2){ + $page->content .= '
'.$titles[ $j].'
'.$texts[ $j]; + $i = $j; + continue; + } + break; + } + + preg_match_all('#="Pictures/([a-z .A-Z_0-9]*)"#es', $page->content, $imgs); + + foreach ($imgs[1] as $img) + { + $src = $dirtemp.'/Pictures/'.$img; + $dest = $imagedir.'/'.$img; + rename( $src, $dest); + + $page->content = str_replace( "Pictures/$img", $imagelink."/".$img, $page->content); + } + + // add the page to the array; + $extractedpages[] = $page; + + } // end $pages foreach loop + + return $extractedpages; +} + +/** + Clean up the temp directory +*/ +function clean_temp( $base) +{ + global $CFG; + + // this function is broken, use it to clean up later + // should only clean up what we made as well because someone else could be importing ppt as well + $dir = $CFG->dataroot.'/temp/'.$base; + + remove_dir( $dir); +} + + +/** + Creates objects an chapter object that is to be inserted into the database +*/ + +function game_bookquiz_create_objects( $pageobjects, $bookid) +{ + $chapters = array(); + + $lastpagenum = get_field('book_chapters', 'MAX(pagenum) as num', 'bookid', $bookid); + + foreach ($pageobjects as $pageobject) + { + $chapter = new stdClass; + + // same for all chapters + $chapter->bookid = $bookid; + $chapter->pagenum = ++$lastpagenum; + $chapter->timecreated = time(); + $chapter->timemodified = time(); + $chapter->subchapter = 0; + + if ($pageobject->title == '') + $chapter->title = "Page $count"; // no title set so make a generic one + else + $chapter->title = addslashes($pageobject->title); + + $chapter->subchapter = $pageobject->subchapter; + + $content = str_replace("\n", '', $pageobject->content); + $content = str_replace("\r", '', $content); + $content = str_replace(' ', '', $content); // puts in returns? + $content = '

'.$content.'

'; + + $chapter->content = addslashes( $content); + + $chapters[] = $chapter; + } + + return $chapters; +} + +/** + Save the chapter objects to the database +*/ +function game_bookquiz_save_objects($chapters) +{ + // nothing fancy, just save them all in order + foreach ($chapters as $chapter) + { + if (!$newid=insert_record('book_chapters', $chapter)) { + error('Could not insert to table book_chapters'); + } + } + + return true; +} + +//splits the data to +function game_bookquiz_splitsections($data, &$positions, &$inputs, &$titles, &$titleframes, &$texts) +{ + preg_match_all('#(.*?)#es', $data, $matches, PREG_OFFSET_CAPTURE); + + $in = $matches[ 1] ; + $title = $matches[ 2]; + + $positions = array(); + $inputs = array(); + $titles = array(); + + $oldposition = 0; + $oldlen = 0; + for($i=0; $i < count( $in); $i++) + { + $inputs[] = $in[ $i][ 0]; + + $newposition = $in[ $i][ 1]; + $positions[] = $newposition; + + $titlenet = $title[ $i][ 0]; + $titleframe = ''; + + //frames inside header + preg_match_all('#(.*?)#es', $titlenet, $titlematches, PREG_OFFSET_CAPTURE); + $frames = $titlematches[ 2]; + if( count( $frames) > 0){ + for($j=0; $j < count( $frames); $j++) + { + $titleframe .= $frames[ $j][ 0]; + $titlenet = substr( $titlenet, $frames[ $j][ 1] + strlen( $frames[ $j][ 0]) + 13); + } + } + + $titles[] = $titlenet; + $titleframes[] = $titleframe; + + if( $i > 0){ + $texts[] = substr( $data, $oldposition+$oldlen, $newposition - $oldposition - $oldlen); + } + + $oldlen = strlen( $title[ $i][ 0]) + strlen( $in[ $i][ 0]) + 10; + $oldposition = $newposition; + + } + $newposition = strlen( $data); + $texts[] = substr( $data, $oldposition+$oldlen, $newposition - $oldposition - $oldlen); +} + + function game_bookquiz_convert( $data, $styles, &$images) + { + $images = array(); + + // get data + preg_match_all('#(.*?)#es', $data, $text); + $originals = $text[ 0]; + $names = $text[ 1]; + $texts = $text[ 2]; + + for( $i=0; $i < count( $texts); $i++) + { + $name = $names[ $i]; + $text = $texts[ $i]; + + //repairs draw:frame + $pattern = "##es"; + preg_match_all( $pattern, $text, $matches); + if( count( $matches[ 1]) ){ + $new = game_bookquiz_convert_image( $matches, $styles, $images); + $data = str_replace( $originals[ $i], $new, $data); + }else IF($name == 'RKRK') + { + $new = game_bookquiz_convert_RKRK( $text); + $data = str_replace( $originals[ $i], $new, $data); + }else + { + $new = '

'.game_bookquiz_convert_text( $text, $styles).'

'; + $data = str_replace( $originals[ $i], $new, $data); + } + } + + // repairs text:span text:style-name + preg_match_all( '#(.*?)#es', $data, $text); + $originals = $text[ 0]; + $names = $text[ 1]; + $texts = $text[ 2]; + for( $i=0; $i < count( $texts); $i++) + { + $name = $names[ $i]; + $text = $texts[ $i]; + + $pattern = "##es"; + preg_match_all( $pattern, $text, $matches); + if( count( $matches[ 1]) ){ + $new = game_bookquiz_convert_image( $matches, $styles, $images); + $data = str_replace( $originals[ $i], $new, $data); + }else IF($name == 'RKRK') + { + $new = game_bookquiz_convert_RKRK( $text); + $data = str_replace( $originals[ $i], $new, $data); + }else + { + $new = "'.game_bookquiz_convert_text( $text, $styles).''; + $data = str_replace( $originals[ $i], $new, $data); + } + } + + // repairs text:a + preg_match_all( '#(.*?)#es', $data, $text); + $originals = $text[ 0]; + $hrefs = $text[ 2]; + $texts = $text[ 3]; + for( $i=0; $i < count( $texts); $i++) + { + $href = $hrefs[ $i]; + $text = $texts[ $i]; + + $new = "$text"; + $data = str_replace( $originals[ $i], $new, $data); + } + + //repair text:list + preg_match_all( '#(.*?)#es', $data, $text); + $originals = $text[ 0]; + $names = $text[ 1]; + $texts = $text[ 2]; + + for( $i=0; $i < count( $texts); $i++) + { + $new = '
    '.$texts[ $i].'
'; + $data = str_replace( $originals[ $i], $new, $data); + + //I have to repair the listitems + preg_match_all( '#(.*?)#es', $data, $listitems); + $originallistitems = $listitems[ 0]; + $items = $listitems[ 1]; + for( $j=0; $j < count( $items); $j++){ + $new = '
  • '.$items[ $j]; + $data = str_replace( $originallistitems[ $j], $new, $data); + + } + } + + $data = str_replace( '', '
    ', $data); + + + + return $data; + } + + function game_bookquiz_convert_text( $text, $styles) + { + $pattern = "#(.*?)#es"; + preg_match_all( $pattern, $text, $matches); + + $originals = $matches[ 0]; + $names = $matches[ 1]; + $spantexts = $matches[ 2]; + + for( $i=0; $i < count( $names); $i++) + { + $name = $names[ $i]; + $style = $styles[ $name]; + + $new = "".$spantexts[ $i].""; + $text = str_replace( $originals[ $i], $new, $text); + } + + return $text; + } + + function game_bookquiz_convert_image( $matches, $xmlstyles, &$images) + { + $ret = ''; + + $styles = $matches[ 1]; + $pictures = $matches[ 3]; + + for( $j=0; $j < count( $pictures); $j++){ + $style = $styles[ $j]; + + $ret .= '
    '; + $images[] = $pictures[$j]; + } + + return $ret; + } + + function game_bookquiz_convert_RKRK( $text) + { + $table = base64_decode($text); + $table = stripslashes($table); + $table = strtr($table, array('' => '', '' => '', '' => '', '' => '', '' => '', '' => '', '>' => ">\n", '' => '')); + + //preg_match_all('#table:name="([a-z A-Z_0-9]*)" table:style-name="([a-z A-Z_0-9]*)">#es', $table, $repl); + preg_match_all('#table:name="(.*?)" table:style-name="(.*?)">#es', $table, $repl); + foreach($repl[0] as $val) + { + //$table = str_replace($val, '
    ', $table); + $table = str_replace($val, '', $table); + } + //preg_match_all('##es', $table, $repl); + preg_match_all('##es', $table, $repl); + foreach($repl[0] as $key => $val) + { + $table = str_replace($val, '', $table); + } + preg_match_all('##es', $table, $repl); + foreach($repl[0] as $val) + { + $table = str_replace($val, '', $table); + } + //preg_match_all('##es', $table, $repl); + preg_match_all('##es', $table, $repl); + foreach($repl[0] as $val) + { + $table = str_replace($val, '
    ', $table); + } + //maybe there are a lot of pictures inside a table + preg_match_all('#xlink:href="Pictures/([a-z.A-Z_0-9]*)"#es', $table, $repl); + foreach( $repl[ 1] as $picture) + { + $table = str_replace('', '', $table); + } + if( strpos( $table,"
    ") === false) + $table .= "
    "; + + $ret = '
    '.$table.'
    '; + + return $ret; + } + + function game_bookquiz_deletebook( $courseid, $bookid) + { + global $CFG; + + if( !delete_records( 'book_chapters', 'bookid', $bookid)){ + error( "Can't delete records from mdl_book_chapters bookid=$bookid"); + } + + remove_dir( "$CFG->dataroot/$courseid/moddata/game/book$bookid"); + + } + + function game_bookquiz_convert_ver2_computestyles( $data, &$styles, $isstyle) + { + preg_match_all('#(.*?)#es', $data, $style); + + $stylenames = $style[ 1]; + $styleinfos = $style[ 2]; + $styledatas = $style[ 3]; + for($i=0; $i < count( $stylenames); $i++){ + $name = $stylenames[ $i]; + + $change = false; + for(;;){ + $pos1 = strpos( $styledatas[ $i], 'style:parent-style-name'); + $pos2 = strpos( $styledatas[ $i], '/>'); + if( ($pos1 === false) or ($pos2 === false)){ + break; + } + if( $pos1 > $pos2){ + break; + } + //is a parent style + $s = substr( $styledatas[ $i], 0, $pos2+2); + game_bookquiz_convertstyle_parent( $s, $styles); + + $styledatas[ $i] = substr( $styledatas[ $i], $pos2 + 2); + $change = true; + } + if( $change){ + //Must to recompute name, styledatas, styleinfos + preg_match_all('#(.*?)#es', $data, $style); + $name = $style[ 1][ 0]; + $styleinfos[ $i] = $style[ 2][ 0]; + $styledatas[ $i] = $style[ 3][ 0]; + } + + $styles[ $name] = game_bookquiz_convertstyle( $styledatas[ $i], $styleinfos[ $i], $styles); + } + } + + function game_bookquiz_convertstyle_parent( $data, &$styles) + { + $styleitems = array(); + + preg_match_all( '#(.*?)style:name="(.*?)"(.*?)style:parent-style-name="(.*?)"(.*?)#es', $data, $infos); + $names = $infos[ 2]; + $parents = $infos[ 4]; + if( count( $parents)){ + if( array_key_exists( $parents[ 0], $styles)){ + //is a child style. Must to copy the properties of the parent style + $a = explode( ';', $styles[ $parents[ 0]]); + foreach( $a as $s){ + $pos = strpos( $s, ':'); + $key = substr( $s, 0, $pos); + $item = substr( $s, $pos + 1); + if( $item == ''){ + continue; + } + $styleitems[ $key] = $item; + } + } + $name = $names[ 0]; + } + + $style = ''; + foreach( $styleitems as $key => $item){ + $style .= ';'.$key.':'.$item; + } + $styles[ $name] = substr( $style, 1); + } + + function game_bookquiz_convertstyle( $data, $styleinfo, $styles) + { + $styleitems = array(); + + preg_match_all( '##es', $data, $infos); + $lines = $infos[ 1]; + if( count( $lines)){ + $line = $lines[ 0]; //print_object( $lines); + + if( $line != ''){ + game_bookquiz_convertstyle_paragraph( $line, $styleitems); + } + } + + preg_match_all( '##es', $data, $infos); + $lines = $infos[ 1]; + if( count( $lines)){ + $line = $lines[ 0]; + + if( $line != ''){ + game_bookquiz_convertstyle_textproperties( $line, $styleitems); + } + } + + if( count( $styleitems) == 0){ + return ''; + } + + $style = ''; + foreach( $styleitems as $key => $item){ + $style .= ';'.$key.':'.$item; + } + + return substr( $style, 1); + } + + function game_bookquiz_convertstyle_paragraph( $line, &$styleitems) + { + preg_match_all( '#(.*?)=(.*?) #es', $line.' ', $datas); + $data1 = $datas[ 1]; + $data2 = $datas[ 2]; + + $ret = ''; + for( $i=0; $i < count( $data1); $i++){ + $eq1 = $data1[ $i]; + $eq2 = $data2[ $i]; + + if( (substr( $eq2, 0, 1) == '"') and (substr( $eq2, -1, 1) == '"')){ + $eq2 = substr( $eq2, 1, -1); + } + + switch( $eq1){ + case 'fo:text-align': + $styleitems[ 'align'] = $eq2; + //print_object( $styleitems); + break; + case 'fo:background-color': + $styleitems[ 'background-color'] = $eq2; + break; + } + } + } + + function game_bookquiz_convertstyle_textproperties( $line, &$styleitems) + { + preg_match_all( '#(.*?)=(.*?) #es', $line.' ', $datas); + $data1 = $datas[ 1]; + $data2 = $datas[ 2]; + + $ret = ''; + for( $i=0; $i < count( $data1); $i++){ + $eq1 = $data1[ $i]; + $eq2 = $data2[ $i]; + + if( (substr( $eq2, 0, 1) == '"') and (substr( $eq2, -1, 1) == '"')){ + $eq2 = substr( $eq2, 1, -1); + } + + switch( $eq1){ + case 'fo:font-size': + case 'fo:color': + case 'fo:background-color': + case 'fo:font-style': + case 'fo:font-weight': + $styleitems[ substr( $eq1, 3)] = $eq2; + break; + case 'style_text_underline_style': + if( $eq2 == 'solid'){ + $styleitems[ 'text-decoration'] = 'underline'; + } + break; + } + } + } diff --git a/bookquiz/importppt.php b/bookquiz/importppt.php new file mode 100644 index 0000000..43f135e --- /dev/null +++ b/bookquiz/importppt.php @@ -0,0 +1,469 @@ +course)) { + error("Course is misconfigured"); + } + + // allows for adaption for multiple modules + if(! $modname = get_field('modules', 'name', 'id', $cm->module)) { + error("Could not find module name"); + } + + if (! $mod = get_record($modname, "id", $cm->instance)) { + error("Course module is incorrect"); + } + + require_login($course->id, false); + $context = get_context_instance(CONTEXT_MODULE, $cm->id); + require_capability('mod/lesson:edit', $context); + + $strimportppt = get_string("importppt", "lesson"); + $strlessons = get_string("modulenameplural", "lesson"); + + print_header_simple("$strimportppt", " $strimportppt", + "id\">$strlessons -> wwwroot/mod/$modname/view.php?id=$cm->id\">".format_string($mod->name,true)."-> $strimportppt"); + + if ($form = data_submitted()) { /// Filename + + if (empty($_FILES['newfile'])) { // file was just uploaded + notify(get_string("uploadproblem") ); + } + + if ((!is_uploaded_file($_FILES['newfile']['tmp_name']) or $_FILES['newfile']['size'] == 0)) { + notify(get_string("uploadnofilefound") ); + + } else { // Valid file is found + + if ($rawpages = readdata($_FILES, $course->id, $modname)) + { // first try to reall all of the data in + $pageobjects = extract_data($rawpages, $course->id, $mod->name, $modname); // parse all the html files into objects + clean_temp(); // all done with files so dump em + + $mod_create_objects = $modname.'_create_objects'; + $mod_save_objects = $modname.'_save_objects'; + + $objects = $mod_create_objects($pageobjects, $mod->id); // function to preps the data to be sent to DB + + if(! $mod_save_objects($objects, $mod->id, $pageid)) { // sends it to DB + error("could not save"); + } + } else { + error('could not get data'); + } + + echo "
    "; + print_continue("$CFG->wwwroot/mod/$modname/view.php?id=$cm->id"); + print_footer($course); + exit; + } + } + + /// Print upload form + + print_heading_with_help($strimportppt, "importppt", "lesson"); + + print_simple_box_start("center"); + echo "
    "; + echo "id\" />\n"; + echo "\n"; + echo ""; + + echo ""; + + echo "
    "; + print_string("upload"); + echo ":"; + echo ""; + echo "
     "; + echo ""; + echo "
    "; + echo "
    "; + print_simple_box_end(); + + print_footer($course); + +// START OF FUNCTIONS + +function readdata($file, $courseid, $modname) { +// this function expects a zip file to be uploaded. Then it parses +// outline.htm to determine the slide path. Then parses each +// slide to get data for the content + + global $CFG; + + // create an upload directory in temp + make_upload_directory('temp/'.$modname); + + $base = $CFG->dataroot."/temp/$modname/"; + + $zipfile = $_FILES["newfile"]["name"]; + $tempzipfile = $_FILES["newfile"]["tmp_name"]; + + // create our directory + $path_parts = pathinfo($zipfile); + $dirname = substr($zipfile, 0, strpos($zipfile, '.'.$path_parts['extension'])); // take off the extension + if (!file_exists($base.$dirname)) { + mkdir($base.$dirname); + } + + // move our uploaded file to temp/lesson + move_uploaded_file($tempzipfile, $base.$zipfile); + + // unzip it! + unzip_file($base.$zipfile, $base, false); + + $base = $base.$dirname; // update the base + + // this is the file where we get the names of the files for the slides (in the correct order too) + $outline = $base.'/outline.htm'; + + $pages = array(); + + if (file_exists($outline) and is_readable($outline)) { + $outlinecontents = file_get_contents($outline); + $filenames = array(); + preg_match_all("/javascript:GoToSld\('(.*)'\)/", $outlinecontents, $filenames); // this gets all of our files names + + // file $pages with the contents of all of the slides + foreach ($filenames[1] as $file) { + $path = $base.'/'.$file; + if (is_readable($path)) { + $pages[$path] = file_get_contents($path); + } else { + return false; + } + } + } else { + // cannot find the outline, so grab all files that start with slide + $dh = opendir($base); + while (false !== ($file = readdir($dh))) { // read throug the directory + if ('slide' == substr($file, 0, 5)) { // check for name (may want to check extension later) + $path = $base.'/'.$file; + if (is_readable($path)) { + $pages[$path] = file_get_contents($path); + } else { + return false; + } + } + } + + ksort($pages); // order them by file name + } + + if (empty($pages)) { + return false; + } + + return $pages; +} + +function extract_data($pages, $courseid, $lessonname, $modname) { + // this function attempts to extract the content out of the slides + // the slides are ugly broken xml. and the xml is broken... yeah... + + global $CFG; + global $matches; + + $extratedpages = array(); + + // directory for images + make_mod_upload_directory($courseid); // make sure moddata is made + make_upload_directory($courseid.'/moddata/'.$modname, false); // we store our images in a subfolder in here + + $imagedir = $CFG->dataroot.'/'.$courseid.'/moddata/'.$modname; + + if ($CFG->slasharguments) { + $imagelink = $CFG->wwwroot.'/file.php/'.$courseid.'/moddata/'.$modname; + } else { + $imagelink = $CFG->wwwroot.'/file.php?file=/'.$courseid.'/moddata/'.$modname; + } + + // try to make a unique subfolder to store the images + $lessonname = str_replace(' ', '_', $lessonname); // get rid of spaces + $i = 0; + while(true) { + if (!file_exists($imagedir.'/'.$lessonname.$i)) { + // ok doesnt exist so make the directory and update our paths + mkdir($imagedir.'/'.$lessonname.$i); + $imagedir = $imagedir.'/'.$lessonname.$i; + $imagelink = $imagelink.'/'.$lessonname.$i; + break; + } + $i++; + } + + foreach ($pages as $file => $content) { + // to make life easier on our preg_match_alls, we strip out all tags except + // for div and img (where our content is). We want div because sometimes we + // can identify the content in the div based on the div's class + + $tags = '
    '; // should also allow + $string = strip_tags($content,$tags); + //echo s($string); + + $matches = array(); + // this will look for a non nested tag that is closed + // want to allow (maybe more) tags but when we do that + // the preg_match messes up. + preg_match_all("/(<([\w]+)[^>]*>)([^<\\2>]*)(<\/\\2>)/", $string, $matches); + //(<([\w]+)[^>]*>)([^<\\2>]*)(<\/\\2>) original pattern + //(<(div+)[^>]*>)[^() work in progress + + $path_parts = pathinfo($file); + $file = substr($path_parts['basename'], 0, strpos($path_parts['basename'], '.')); // get rid of the extension + + $imgs = array(); + // this preg matches all images + preg_match_all("/]*(src\=\"(".$file."\_image[^>^\"]*)\"[^>]*)>/i", $string, $imgs); + + // start building our page + $page = new stdClass; + $page->title = ''; + $page->contents = array(); + $page->images = array(); + $page->source = $path_parts['basename']; // need for book only + + // this foreach keeps the style intact. Found it doesn't help much. But if you want back uncomment + // this foreach and uncomment the line with the comment imgstyle in it. Also need to comment out + // the $page->images[]... line in the next foreach + /*foreach ($imgs[1] as $img) { + $page->images[] = ''; + }*/ + foreach ($imgs[2] as $img) { + copy($path_parts['dirname'].'/'.$img, $imagedir.'/'.$img); + $page->images[] = ""; // comment out this line if you are using the above foreach loop + } + for($i = 0; $i < count($matches[1]); $i++) { // go through all of our div matches + + $class = isolate_class($matches[1][$i]); // first step in isolating the class + + // check for any static classes + switch ($class) { + case 'T': // class T is used for Titles + $page->title = $matches[3][$i]; + break; + case 'B': // I would guess that all bullet lists would start with B then go to B1, B2, etc + case 'B1': // B1-B4 are just insurance, should just hit B and all be taken care of + case 'B2': + case 'B3': + case 'B4': + $page->contents[] = build_list('
    ');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0)){s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;/* + * jQuery UI Selectable 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * ui.core.js + */ +(function(a){a.widget("ui.selectable",a.extend({},a.ui.mouse,{_init:function(){var b=this;this.element.addClass("ui-selectable");this.dragged=false;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]);c.each(function(){var d=a(this);var e=d.offset();a.data(this,"selectable-item",{element:this,$element:d,left:e.left,top:e.top,right:e.left+d.outerWidth(),bottom:e.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=c.addClass("ui-selectee");this._mouseInit();this.helper=a(document.createElement("div")).css({border:"1px dotted black"}).addClass("ui-selectable-helper")},destroy:function(){this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy()},_mouseStart:function(d){var b=this;this.opos=[d.pageX,d.pageY];if(this.options.disabled){return}var c=this.options;this.selectees=a(c.filter,this.element[0]);this._trigger("start",d);a(c.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:d.clientX,top:d.clientY,width:0,height:0});if(c.autoRefresh){this.refresh()}this.selectees.filter(".ui-selected").each(function(){var e=a.data(this,"selectable-item");e.startselected=true;if(!d.metaKey){e.$element.removeClass("ui-selected");e.selected=false;e.$element.addClass("ui-unselecting");e.unselecting=true;b._trigger("unselecting",d,{unselecting:e.element})}});a(d.target).parents().andSelf().each(function(){var e=a.data(this,"selectable-item");if(e){e.$element.removeClass("ui-unselecting").addClass("ui-selecting");e.unselecting=false;e.selecting=true;e.selected=true;b._trigger("selecting",d,{selecting:e.element});return false}})},_mouseDrag:function(i){var c=this;this.dragged=true;if(this.options.disabled){return}var e=this.options;var d=this.opos[0],h=this.opos[1],b=i.pageX,g=i.pageY;if(d>b){var f=b;b=d;d=f}if(h>g){var f=g;g=h;h=f}this.helper.css({left:d,top:h,width:b-d,height:g-h});this.selectees.each(function(){var j=a.data(this,"selectable-item");if(!j||j.element==c.element[0]){return}var k=false;if(e.tolerance=="touch"){k=(!(j.left>b||j.rightg||j.bottomd&&j.righth&&j.bottom=0;b--){this.items[b].item.removeData("sortable-item")}},_mouseCapture:function(e,f){if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(e);var d=null,c=this,b=a(e.target).parents().each(function(){if(a.data(this,"sortable-item")==c){d=a(this);return false}});if(a.data(e.target,"sortable-item")==c){d=a(e.target)}if(!d){return false}if(this.options.handle&&!f){var g=false;a(this.options.handle,d).find("*").andSelf().each(function(){if(this==e.target){g=true}});if(!g){return false}}this.currentItem=d;this._removeCurrentsFromItems();return true},_mouseStart:function(e,f,b){var g=this.options,c=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(e);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(e);this.originalPageX=e.pageX;this.originalPageY=e.pageY;if(g.cursorAt){this._adjustOffsetFromHelper(g.cursorAt)}this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(g.containment){this._setContainment()}if(g.cursor){if(a("body").css("cursor")){this._storedCursor=a("body").css("cursor")}a("body").css("cursor",g.cursor)}if(g.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",g.opacity)}if(g.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",g.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",e,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!b){for(var d=this.containers.length-1;d>=0;d--){this.containers[d]._trigger("activate",e,c._uiHash(this))}}if(a.ui.ddmanager){a.ui.ddmanager.current=this}if(a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,e)}this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(e);return true},_mouseDrag:function(f){this.position=this._generatePosition(f);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var g=this.options,b=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-f.pageY=0;d--){var e=this.items[d],c=e.item[0],h=this._intersectsWithPointer(e);if(!h){continue}if(c!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=c&&!a.ui.contains(this.placeholder[0],c)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],c):true)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(e)){this._rearrange(f,e)}else{break}this._trigger("change",f,this._uiHash());break}}this._contactContainers(f);if(a.ui.ddmanager){a.ui.ddmanager.drag(this,f)}this._trigger("sort",f,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(c,d){if(!c){return}if(a.ui.ddmanager&&!this.options.dropBehaviour){a.ui.ddmanager.drop(this,c)}if(this.options.revert){var b=this;var e=b.placeholder.offset();b.reverting=true;a(this.helper).animate({left:e.left-this.offset.parent.left-b.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-b.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){b._clear(c)})}else{this._clear(c,d)}return false},cancel:function(){var b=this;if(this.dragging){this._mouseUp();if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}for(var c=this.containers.length-1;c>=0;c--){this.containers[c]._trigger("deactivate",null,b._uiHash(this));if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",null,b._uiHash(this));this.containers[c].containerCache.over=0}}}if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){a(this.domPosition.prev).after(this.currentItem)}else{a(this.domPosition.parent).prepend(this.currentItem)}return true},serialize:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};a(b).each(function(){var e=(a(d.item||this).attr(d.attribute||"id")||"").match(d.expression||(/(.+)[-=_](.+)/));if(e){c.push((d.key||e[1]+"[]")+"="+(d.key&&d.expression?e[1]:e[2]))}});return c.join("&")},toArray:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};b.each(function(){c.push(a(d.item||this).attr(d.attribute||"id")||"")});return c},_intersectsWith:function(m){var e=this.positionAbs.left,d=e+this.helperProportions.width,k=this.positionAbs.top,j=k+this.helperProportions.height;var f=m.left,c=f+m.width,n=m.top,i=n+m.height;var o=this.offset.click.top,h=this.offset.click.left;var g=(k+o)>n&&(k+o)f&&(e+h)m[this.floating?"width":"height"])){return g}else{return(f0?"down":"up")},_getDragHorizontalDirection:function(){var b=this.positionAbs.left-this.lastPositionAbs.left;return b!=0&&(b>0?"right":"left")},refresh:function(b){this._refreshItems(b);this.refreshPositions()},_connectWith:function(){var b=this.options;return b.connectWith.constructor==String?[b.connectWith]:b.connectWith},_getItemsAsjQuery:function(b){var l=this;var g=[];var e=[];var h=this._connectWith();if(h&&b){for(var d=h.length-1;d>=0;d--){var k=a(h[d]);for(var c=k.length-1;c>=0;c--){var f=a.data(k[c],"sortable");if(f&&f!=this&&!f.options.disabled){e.push([a.isFunction(f.options.items)?f.options.items.call(f.element):a(f.options.items,f.element).not(".ui-sortable-helper"),f])}}}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper"),this]);for(var d=e.length-1;d>=0;d--){e[d][0].each(function(){g.push(this)})}return a(g)},_removeCurrentsFromItems:function(){var d=this.currentItem.find(":data(sortable-item)");for(var c=0;c=0;e--){var m=a(l[e]);for(var d=m.length-1;d>=0;d--){var g=a.data(m[d],"sortable");if(g&&g!=this&&!g.options.disabled){f.push([a.isFunction(g.options.items)?g.options.items.call(g.element[0],b,{item:this.currentItem}):a(g.options.items,g.element),g]);this.containers.push(g)}}}}for(var e=f.length-1;e>=0;e--){var k=f[e][1];var c=f[e][0];for(var d=0,n=c.length;d=0;d--){var e=this.items[d];if(e.instance!=this.currentContainer&&this.currentContainer&&e.item[0]!=this.currentItem[0]){continue}var c=this.options.toleranceElement?a(this.options.toleranceElement,e.item):e.item;if(!b){e.width=c.outerWidth();e.height=c.outerHeight()}var f=c.offset();e.left=f.left;e.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var d=this.containers.length-1;d>=0;d--){var f=this.containers[d].element.offset();this.containers[d].containerCache.left=f.left;this.containers[d].containerCache.top=f.top;this.containers[d].containerCache.width=this.containers[d].element.outerWidth();this.containers[d].containerCache.height=this.containers[d].element.outerHeight()}}},_createPlaceholder:function(d){var b=d||this,e=b.options;if(!e.placeholder||e.placeholder.constructor==String){var c=e.placeholder;e.placeholder={element:function(){var f=a(document.createElement(b.currentItem[0].nodeName)).addClass(c||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!c){f.style.visibility="hidden"}return f},update:function(f,g){if(c&&!e.forcePlaceholderSize){return}if(!g.height()){g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10))}if(!g.width()){g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=a(e.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);e.placeholder.update(b,b.placeholder)},_contactContainers:function(d){for(var c=this.containers.length-1;c>=0;c--){if(this._intersectsWith(this.containers[c].containerCache)){if(!this.containers[c].containerCache.over){if(this.currentContainer!=this.containers[c]){var h=10000;var g=null;var e=this.positionAbs[this.containers[c].floating?"left":"top"];for(var b=this.items.length-1;b>=0;b--){if(!a.ui.contains(this.containers[c].element[0],this.items[b].item[0])){continue}var f=this.items[b][this.containers[c].floating?"left":"top"];if(Math.abs(f-e)this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.topthis.containment[3])?g:(!(g-this.offset.click.topthis.containment[2])?f:(!(f-this.offset.click.left=0;c--){if(a.ui.contains(this.containers[c].element[0],this.currentItem[0])&&!e){f.push((function(g){return function(h){g._trigger("receive",h,this._uiHash(this))}}).call(this,this.containers[c]));f.push((function(g){return function(h){g._trigger("update",h,this._uiHash(this))}}).call(this,this.containers[c]))}}}for(var c=this.containers.length-1;c>=0;c--){if(!e){f.push((function(g){return function(h){g._trigger("deactivate",h,this._uiHash(this))}}).call(this,this.containers[c]))}if(this.containers[c].containerCache.over){f.push((function(g){return function(h){g._trigger("out",h,this._uiHash(this))}}).call(this,this.containers[c]));this.containers[c].containerCache.over=0}}if(this._storedCursor){a("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(var c=0;c *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1000}})})(jQuery);;/* + * jQuery UI Accordion 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Accordion + * + * Depends: + * ui.core.js + */ +(function(a){a.widget("ui.accordion",{_init:function(){var d=this.options,b=this;this.running=0;if(d.collapsible==a.ui.accordion.defaults.collapsible&&d.alwaysOpen!=a.ui.accordion.defaults.alwaysOpen){d.collapsible=!d.alwaysOpen}if(d.navigation){var c=this.element.find("a").filter(d.navigationFilter);if(c.length){if(c.filter(d.header).length){this.active=c}else{this.active=c.parent().parent().prev();c.addClass("ui-accordion-content-active")}}}this.element.addClass("ui-accordion ui-widget ui-helper-reset");if(this.element[0].nodeName=="UL"){this.element.children("li").addClass("ui-accordion-li-fix")}this.headers=this.element.find(d.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){a(this).removeClass("ui-state-focus")});this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");this.active=this._findActive(this.active||d.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");this.active.next().addClass("ui-accordion-content-active");a("").addClass("ui-icon "+d.icons.header).prependTo(this.headers);this.active.find(".ui-icon").toggleClass(d.icons.header).toggleClass(d.icons.headerSelected);if(a.browser.msie){this.element.find("a").css("zoom","1")}this.resize();this.element.attr("role","tablist");this.headers.attr("role","tab").bind("keydown",function(e){return b._keydown(e)}).next().attr("role","tabpanel");this.headers.not(this.active||"").attr("aria-expanded","false").attr("tabIndex","-1").next().hide();if(!this.active.length){this.headers.eq(0).attr("tabIndex","0")}else{this.active.attr("aria-expanded","true").attr("tabIndex","0")}if(!a.browser.safari){this.headers.find("a").attr("tabIndex","-1")}if(d.event){this.headers.bind((d.event)+".accordion",function(e){return b._clickHandler.call(b,e,this)})}},destroy:function(){var c=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role").unbind(".accordion").removeData("accordion");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabindex");this.headers.find("a").removeAttr("tabindex");this.headers.children(".ui-icon").remove();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");if(c.autoHeight||c.fillHeight){b.css("height","")}},_setData:function(b,c){if(b=="alwaysOpen"){b="collapsible";c=!c}a.widget.prototype._setData.apply(this,arguments)},_keydown:function(e){var g=this.options,f=a.ui.keyCode;if(g.disabled||e.altKey||e.ctrlKey){return}var d=this.headers.length;var b=this.headers.index(e.target);var c=false;switch(e.keyCode){case f.RIGHT:case f.DOWN:c=this.headers[(b+1)%d];break;case f.LEFT:case f.UP:c=this.headers[(b-1+d)%d];break;case f.SPACE:case f.ENTER:return this._clickHandler({target:e.target},e.target)}if(c){a(e.target).attr("tabIndex","-1");a(c).attr("tabIndex","0");c.focus();return false}return true},resize:function(){var e=this.options,d;if(e.fillSpace){if(a.browser.msie){var b=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}d=this.element.parent().height();if(a.browser.msie){this.element.parent().css("overflow",b)}this.headers.each(function(){d-=a(this).outerHeight()});var c=0;this.headers.next().each(function(){c=Math.max(c,a(this).innerHeight()-a(this).height())}).height(Math.max(0,d-c)).css("overflow","auto")}else{if(e.autoHeight){d=0;this.headers.next().each(function(){d=Math.max(d,a(this).outerHeight())}).height(d)}}},activate:function(b){var c=this._findActive(b)[0];this._clickHandler({target:c},c)},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===false?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,f){var d=this.options;if(d.disabled){return false}if(!b.target&&d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var h=this.active.next(),e={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:h},c=(this.active=a([]));this._toggle(c,h,e);return false}var g=a(b.currentTarget||f);var i=g[0]==this.active[0];if(this.running||(!d.collapsible&&i)){return false}this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");if(!i){g.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").find(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);g.next().addClass("ui-accordion-content-active")}var c=g.next(),h=this.active.next(),e={options:d,newHeader:i&&d.collapsible?a([]):g,oldHeader:this.active,newContent:i&&d.collapsible?a([]):c.find("> *"),oldContent:h.find("> *")},j=this.headers.index(this.active[0])>this.headers.index(g[0]);this.active=i?a([]):g;this._toggle(c,h,e,i,j);return false},_toggle:function(b,i,g,j,k){var d=this.options,m=this;this.toShow=b;this.toHide=i;this.data=g;var c=function(){if(!m){return}return m._completed.apply(m,arguments)};this._trigger("changestart",null,this.data);this.running=i.size()===0?b.size():i.size();if(d.animated){var f={};if(d.collapsible&&j){f={toShow:a([]),toHide:i,complete:c,down:k,autoHeight:d.autoHeight||d.fillSpace}}else{f={toShow:b,toHide:i,complete:c,down:k,autoHeight:d.autoHeight||d.fillSpace}}if(!d.proxied){d.proxied=d.animated}if(!d.proxiedDuration){d.proxiedDuration=d.duration}d.animated=a.isFunction(d.proxied)?d.proxied(f):d.proxied;d.duration=a.isFunction(d.proxiedDuration)?d.proxiedDuration(f):d.proxiedDuration;var l=a.ui.accordion.animations,e=d.duration,h=d.animated;if(!l[h]){l[h]=function(n){this.slide(n,{easing:h,duration:e||700})}}l[h](f)}else{if(d.collapsible&&j){b.toggle()}else{i.hide();b.show()}c(true)}i.prev().attr("aria-expanded","false").attr("tabIndex","-1").blur();b.prev().attr("aria-expanded","true").attr("tabIndex","0").focus()},_completed:function(b){var c=this.options;this.running=b?0:--this.running;if(this.running){return}if(c.clearStyle){this.toShow.add(this.toHide).css({height:"",overflow:""})}this._trigger("change",null,this.data)}});a.extend(a.ui.accordion,{version:"1.7.2",defaults:{active:null,alwaysOpen:true,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()==location.href.toLowerCase()}},animations:{slide:function(j,h){j=a.extend({easing:"swing",duration:300},j,h);if(!j.toHide.size()){j.toShow.animate({height:"show"},j);return}if(!j.toShow.size()){j.toHide.animate({height:"hide"},j);return}var c=j.toShow.css("overflow"),g,d={},f={},e=["height","paddingTop","paddingBottom"],b;var i=j.toShow;b=i[0].style.width;i.width(parseInt(i.parent().width(),10)-parseInt(i.css("paddingLeft"),10)-parseInt(i.css("paddingRight"),10)-(parseInt(i.css("borderLeftWidth"),10)||0)-(parseInt(i.css("borderRightWidth"),10)||0));a.each(e,function(k,m){f[m]="hide";var l=(""+a.css(j.toShow[0],m)).match(/^([\d+-.]+)(.*)$/);d[m]={value:l[1],unit:l[2]||"px"}});j.toShow.css({height:0,overflow:"hidden"}).show();j.toHide.filter(":hidden").each(j.complete).end().filter(":visible").animate(f,{step:function(k,l){if(l.prop=="height"){g=(l.now-l.start)/(l.end-l.start)}j.toShow[0].style[l.prop]=(g*d[l.prop].value)+d[l.prop].unit},duration:j.duration,easing:j.easing,complete:function(){if(!j.autoHeight){j.toShow.css("height","")}j.toShow.css("width",b);j.toShow.css({overflow:c});j.complete()}})},bounceslide:function(b){this.slide(b,{easing:b.down?"easeOutBounce":"swing",duration:b.down?1000:200})},easeslide:function(b){this.slide(b,{easing:"easeinout",duration:700})}}})})(jQuery);;/* + * jQuery UI Dialog 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * ui.core.js + * ui.draggable.js + * ui.resizable.js + */ +(function(c){var b={dragStart:"start.draggable",drag:"drag.draggable",dragStop:"stop.draggable",maxHeight:"maxHeight.resizable",minHeight:"minHeight.resizable",maxWidth:"maxWidth.resizable",minWidth:"minWidth.resizable",resizeStart:"start.resizable",resize:"drag.resizable",resizeStop:"stop.resizable"},a="ui-dialog ui-widget ui-widget-content ui-corner-all ";c.widget("ui.dialog",{_init:function(){this.originalTitle=this.element.attr("title");var l=this,m=this.options,j=m.title||this.originalTitle||" ",e=c.ui.dialog.getTitleId(this.element),k=(this.uiDialog=c("
    ")).appendTo(document.body).hide().addClass(a+m.dialogClass).css({position:"absolute",overflow:"hidden",zIndex:m.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(n){(m.closeOnEscape&&n.keyCode&&n.keyCode==c.ui.keyCode.ESCAPE&&l.close(n))}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(n){l.moveToTop(false,n)}),g=this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(k),f=(this.uiDialogTitlebar=c("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(k),i=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){i.addClass("ui-state-hover")},function(){i.removeClass("ui-state-hover")}).focus(function(){i.addClass("ui-state-focus")}).blur(function(){i.removeClass("ui-state-focus")}).mousedown(function(n){n.stopPropagation()}).click(function(n){l.close(n);return false}).appendTo(f),h=(this.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(m.closeText).appendTo(i),d=c("").addClass("ui-dialog-title").attr("id",e).html(j).prependTo(f);f.find("*").add(f).disableSelection();(m.draggable&&c.fn.draggable&&this._makeDraggable());(m.resizable&&c.fn.resizable&&this._makeResizable());this._createButtons(m.buttons);this._isOpen=false;(m.bgiframe&&c.fn.bgiframe&&k.bgiframe());(m.autoOpen&&this.open())},destroy:function(){(this.overlay&&this.overlay.destroy());this.uiDialog.hide();this.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");this.uiDialog.remove();(this.originalTitle&&this.element.attr("title",this.originalTitle))},close:function(f){var d=this;if(false===d._trigger("beforeclose",f)){return}(d.overlay&&d.overlay.destroy());d.uiDialog.unbind("keypress.ui-dialog");(d.options.hide?d.uiDialog.hide(d.options.hide,function(){d._trigger("close",f)}):d.uiDialog.hide()&&d._trigger("close",f));c.ui.dialog.overlay.resize();d._isOpen=false;if(d.options.modal){var e=0;c(".ui-dialog").each(function(){if(this!=d.uiDialog[0]){e=Math.max(e,c(this).css("z-index"))}});c.ui.dialog.maxZ=e}},isOpen:function(){return this._isOpen},moveToTop:function(f,e){if((this.options.modal&&!f)||(!this.options.stack&&!this.options.modal)){return this._trigger("focus",e)}if(this.options.zIndex>c.ui.dialog.maxZ){c.ui.dialog.maxZ=this.options.zIndex}(this.overlay&&this.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=++c.ui.dialog.maxZ));var d={scrollTop:this.element.attr("scrollTop"),scrollLeft:this.element.attr("scrollLeft")};this.uiDialog.css("z-index",++c.ui.dialog.maxZ);this.element.attr(d);this._trigger("focus",e)},open:function(){if(this._isOpen){return}var e=this.options,d=this.uiDialog;this.overlay=e.modal?new c.ui.dialog.overlay(this):null;(d.next().length&&d.appendTo("body"));this._size();this._position(e.position);d.show(e.show);this.moveToTop(true);(e.modal&&d.bind("keypress.ui-dialog",function(h){if(h.keyCode!=c.ui.keyCode.TAB){return}var g=c(":tabbable",this),i=g.filter(":first")[0],f=g.filter(":last")[0];if(h.target==f&&!h.shiftKey){setTimeout(function(){i.focus()},1)}else{if(h.target==i&&h.shiftKey){setTimeout(function(){f.focus()},1)}}}));c([]).add(d.find(".ui-dialog-content :tabbable:first")).add(d.find(".ui-dialog-buttonpane :tabbable:first")).add(d).filter(":first").focus();this._trigger("open");this._isOpen=true},_createButtons:function(g){var f=this,d=false,e=c("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");this.uiDialog.find(".ui-dialog-buttonpane").remove();(typeof g=="object"&&g!==null&&c.each(g,function(){return !(d=true)}));if(d){c.each(g,function(h,i){c('').addClass("ui-state-default ui-corner-all").text(h).click(function(){i.apply(f.element[0],arguments)}).hover(function(){c(this).addClass("ui-state-hover")},function(){c(this).removeClass("ui-state-hover")}).focus(function(){c(this).addClass("ui-state-focus")}).blur(function(){c(this).removeClass("ui-state-focus")}).appendTo(e)});e.appendTo(this.uiDialog)}},_makeDraggable:function(){var d=this,f=this.options,e;this.uiDialog.draggable({cancel:".ui-dialog-content",handle:".ui-dialog-titlebar",containment:"document",start:function(){e=f.height;c(this).height(c(this).height()).addClass("ui-dialog-dragging");(f.dragStart&&f.dragStart.apply(d.element[0],arguments))},drag:function(){(f.drag&&f.drag.apply(d.element[0],arguments))},stop:function(){c(this).removeClass("ui-dialog-dragging").height(e);(f.dragStop&&f.dragStop.apply(d.element[0],arguments));c.ui.dialog.overlay.resize()}})},_makeResizable:function(g){g=(g===undefined?this.options.resizable:g);var d=this,f=this.options,e=typeof g=="string"?g:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",alsoResize:this.element,maxWidth:f.maxWidth,maxHeight:f.maxHeight,minWidth:f.minWidth,minHeight:f.minHeight,start:function(){c(this).addClass("ui-dialog-resizing");(f.resizeStart&&f.resizeStart.apply(d.element[0],arguments))},resize:function(){(f.resize&&f.resize.apply(d.element[0],arguments))},handles:e,stop:function(){c(this).removeClass("ui-dialog-resizing");f.height=c(this).height();f.width=c(this).width();(f.resizeStop&&f.resizeStop.apply(d.element[0],arguments));c.ui.dialog.overlay.resize()}}).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_position:function(i){var e=c(window),f=c(document),g=f.scrollTop(),d=f.scrollLeft(),h=g;if(c.inArray(i,["center","top","right","bottom","left"])>=0){i=[i=="right"||i=="left"?i:"center",i=="top"||i=="bottom"?i:"middle"]}if(i.constructor!=Array){i=["center","middle"]}if(i[0].constructor==Number){d+=i[0]}else{switch(i[0]){case"left":d+=0;break;case"right":d+=e.width()-this.uiDialog.outerWidth();break;default:case"center":d+=(e.width()-this.uiDialog.outerWidth())/2}}if(i[1].constructor==Number){g+=i[1]}else{switch(i[1]){case"top":g+=0;break;case"bottom":g+=e.height()-this.uiDialog.outerHeight();break;default:case"middle":g+=(e.height()-this.uiDialog.outerHeight())/2}}g=Math.max(g,h);this.uiDialog.css({top:g,left:d})},_setData:function(e,f){(b[e]&&this.uiDialog.data(b[e],f));switch(e){case"buttons":this._createButtons(f);break;case"closeText":this.uiDialogTitlebarCloseText.text(f);break;case"dialogClass":this.uiDialog.removeClass(this.options.dialogClass).addClass(a+f);break;case"draggable":(f?this._makeDraggable():this.uiDialog.draggable("destroy"));break;case"height":this.uiDialog.height(f);break;case"position":this._position(f);break;case"resizable":var d=this.uiDialog,g=this.uiDialog.is(":data(resizable)");(g&&!f&&d.resizable("destroy"));(g&&typeof f=="string"&&d.resizable("option","handles",f));(g||this._makeResizable(f));break;case"title":c(".ui-dialog-title",this.uiDialogTitlebar).html(f||" ");break;case"width":this.uiDialog.width(f);break}c.widget.prototype._setData.apply(this,arguments)},_size:function(){var e=this.options;this.element.css({height:0,minHeight:0,width:"auto"});var d=this.uiDialog.css({height:"auto",width:e.width}).height();this.element.css({minHeight:Math.max(e.minHeight-d,0),height:e.height=="auto"?"auto":Math.max(e.height-d,0)})}});c.extend(c.ui.dialog,{version:"1.7.2",defaults:{autoOpen:true,bgiframe:false,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:"center",resizable:true,show:null,stack:true,title:"",width:300,zIndex:1000},getter:"isOpen",uuid:0,maxZ:0,getTitleId:function(d){return"ui-dialog-title-"+(d.attr("id")||++this.uuid)},overlay:function(d){this.$el=c.ui.dialog.overlay.create(d)}});c.extend(c.ui.dialog.overlay,{instances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(d){return d+".dialog-overlay"}).join(" "),create:function(e){if(this.instances.length===0){setTimeout(function(){if(c.ui.dialog.overlay.instances.length){c(document).bind(c.ui.dialog.overlay.events,function(f){var g=c(f.target).parents(".ui-dialog").css("zIndex")||0;return(g>c.ui.dialog.overlay.maxZ)})}},1);c(document).bind("keydown.dialog-overlay",function(f){(e.options.closeOnEscape&&f.keyCode&&f.keyCode==c.ui.keyCode.ESCAPE&&e.close(f))});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var d=c("
    ").appendTo(document.body).addClass("ui-widget-overlay").css({width:this.width(),height:this.height()});(e.options.bgiframe&&c.fn.bgiframe&&d.bgiframe());this.instances.push(d);return d},destroy:function(d){this.instances.splice(c.inArray(this.instances,d),1);if(this.instances.length===0){c([document,window]).unbind(".dialog-overlay")}d.remove();var e=0;c.each(this.instances,function(){e=Math.max(e,this.css("z-index"))});this.maxZ=e},height:function(){if(c.browser.msie&&c.browser.version<7){var e=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);var d=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);if(e
    ");if(!c.values){c.values=[this._valueMin(),this._valueMin()]}if(c.values.length&&c.values.length!=2){c.values=[c.values[0],c.values[0]]}}else{this.range=a("
    ")}this.range.appendTo(this.element).addClass("ui-slider-range");if(c.range=="min"||c.range=="max"){this.range.addClass("ui-slider-range-"+c.range)}this.range.addClass("ui-widget-header")}if(a(".ui-slider-handle",this.element).length==0){a('
    ').appendTo(this.element).addClass("ui-slider-handle")}if(c.values&&c.values.length){while(a(".ui-slider-handle",this.element).length').appendTo(this.element).addClass("ui-slider-handle")}}this.handles=a(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(d){d.preventDefault()}).hover(function(){if(!c.disabled){a(this).addClass("ui-state-hover")}},function(){a(this).removeClass("ui-state-hover")}).focus(function(){if(!c.disabled){a(".ui-slider .ui-state-focus").removeClass("ui-state-focus");a(this).addClass("ui-state-focus")}else{a(this).blur()}}).blur(function(){a(this).removeClass("ui-state-focus")});this.handles.each(function(d){a(this).data("index.ui-slider-handle",d)});this.handles.keydown(function(i){var f=true;var e=a(this).data("index.ui-slider-handle");if(b.options.disabled){return}switch(i.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:f=false;if(!b._keySliding){b._keySliding=true;a(this).addClass("ui-state-active");b._start(i,e)}break}var g,d,h=b._step();if(b.options.values&&b.options.values.length){g=d=b.values(e)}else{g=d=b.value()}switch(i.keyCode){case a.ui.keyCode.HOME:d=b._valueMin();break;case a.ui.keyCode.END:d=b._valueMax();break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(g==b._valueMax()){return}d=g+h;break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(g==b._valueMin()){return}d=g-h;break}b._slide(i,e,d);return f}).keyup(function(e){var d=a(this).data("index.ui-slider-handle");if(b._keySliding){b._stop(e,d);b._change(e,d);b._keySliding=false;a(this).removeClass("ui-state-active")}});this._refreshValue()},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy()},_mouseCapture:function(d){var e=this.options;if(e.disabled){return false}this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();var h={x:d.pageX,y:d.pageY};var j=this._normValueFromMouse(h);var c=this._valueMax()-this._valueMin()+1,f;var k=this,i;this.handles.each(function(l){var m=Math.abs(j-k.values(l));if(c>m){c=m;f=a(this);i=l}});if(e.range==true&&this.values(1)==e.min){f=a(this.handles[++i])}this._start(d,i);k._handleIndex=i;f.addClass("ui-state-active").focus();var g=f.offset();var b=!a(d.target).parents().andSelf().is(".ui-slider-handle");this._clickOffset=b?{left:0,top:0}:{left:d.pageX-g.left-(f.width()/2),top:d.pageY-g.top-(f.height()/2)-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};j=this._normValueFromMouse(h);this._slide(d,i,j);return true},_mouseStart:function(b){return true},_mouseDrag:function(d){var b={x:d.pageX,y:d.pageY};var c=this._normValueFromMouse(b);this._slide(d,this._handleIndex,c);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._handleIndex=null;this._clickOffset=null;return false},_detectOrientation:function(){this.orientation=this.options.orientation=="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(d){var c,h;if("horizontal"==this.orientation){c=this.elementSize.width;h=d.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{c=this.elementSize.height;h=d.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}var f=(h/c);if(f>1){f=1}if(f<0){f=0}if("vertical"==this.orientation){f=1-f}var e=this._valueMax()-this._valueMin(),i=f*e,b=i%this.options.step,g=this._valueMin()+i-b;if(b>(this.options.step/2)){g+=this.options.step}return parseFloat(g.toFixed(5))},_start:function(d,c){var b={handle:this.handles[c],value:this.value()};if(this.options.values&&this.options.values.length){b.value=this.values(c);b.values=this.values()}this._trigger("start",d,b)},_slide:function(f,e,d){var g=this.handles[e];if(this.options.values&&this.options.values.length){var b=this.values(e?0:1);if((this.options.values.length==2&&this.options.range===true)&&((e==0&&d>b)||(e==1&&d1){this.options.values[b]=e;this._refreshValue(c);if(!d){this._change(null,b)}}if(arguments.length){if(this.options.values&&this.options.values.length){return this._values(b)}else{return this.value()}}else{return this._values()}},_setData:function(b,d,c){a.widget.prototype._setData.apply(this,arguments);switch(b){case"disabled":if(d){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled")}else{this.handles.removeAttr("disabled")}case"orientation":this._detectOrientation();this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue(c);break;case"value":this._refreshValue(c);break}},_step:function(){var b=this.options.step;return b},_value:function(){var b=this.options.value;if(bthis._valueMax()){b=this._valueMax()}return b},_values:function(b){if(arguments.length){var c=this.options.values[b];if(cthis._valueMax()){c=this._valueMax()}return c}else{return this.options.values}},_valueMin:function(){var b=this.options.min;return b},_valueMax:function(){var b=this.options.max;return b},_refreshValue:function(c){var f=this.options.range,d=this.options,l=this;if(this.options.values&&this.options.values.length){var i,h;this.handles.each(function(p,n){var o=(l.values(p)-l._valueMin())/(l._valueMax()-l._valueMin())*100;var m={};m[l.orientation=="horizontal"?"left":"bottom"]=o+"%";a(this).stop(1,1)[c?"animate":"css"](m,d.animate);if(l.options.range===true){if(l.orientation=="horizontal"){(p==0)&&l.range.stop(1,1)[c?"animate":"css"]({left:o+"%"},d.animate);(p==1)&&l.range[c?"animate":"css"]({width:(o-lastValPercent)+"%"},{queue:false,duration:d.animate})}else{(p==0)&&l.range.stop(1,1)[c?"animate":"css"]({bottom:(o)+"%"},d.animate);(p==1)&&l.range[c?"animate":"css"]({height:(o-lastValPercent)+"%"},{queue:false,duration:d.animate})}}lastValPercent=o})}else{var j=this.value(),g=this._valueMin(),k=this._valueMax(),e=k!=g?(j-g)/(k-g)*100:0;var b={};b[l.orientation=="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[c?"animate":"css"](b,d.animate);(f=="min")&&(this.orientation=="horizontal")&&this.range.stop(1,1)[c?"animate":"css"]({width:e+"%"},d.animate);(f=="max")&&(this.orientation=="horizontal")&&this.range[c?"animate":"css"]({width:(100-e)+"%"},{queue:false,duration:d.animate});(f=="min")&&(this.orientation=="vertical")&&this.range.stop(1,1)[c?"animate":"css"]({height:e+"%"},d.animate);(f=="max")&&(this.orientation=="vertical")&&this.range[c?"animate":"css"]({height:(100-e)+"%"},{queue:false,duration:d.animate})}}}));a.extend(a.ui.slider,{getter:"value values",version:"1.7.2",eventPrefix:"slide",defaults:{animate:false,delay:0,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null}})})(jQuery);;/* + * jQuery UI Tabs 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * ui.core.js + */ +(function(a){a.widget("ui.tabs",{_init:function(){if(this.options.deselectable!==undefined){this.options.collapsible=this.options.deselectable}this._tabify(true)},_setData:function(b,c){if(b=="selected"){if(this.options.collapsible&&c==this.options.selected){return}this.select(c)}else{this.options[b]=c;if(b=="deselectable"){this.options.collapsible=c}this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+a.data(b)},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+a.data(this.list[0]));return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(c,b){return{tab:c,panel:b,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(n){this.list=this.element.children("ul:first");this.lis=a("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return a("a",this)[0]});this.panels=a([]);var p=this,d=this.options;var c=/^#.+/;this.anchors.each(function(r,o){var q=a(o).attr("href");var s=q.split("#")[0],u;if(s&&(s===location.toString().split("#")[0]||(u=a("base")[0])&&s===u.href)){q=o.hash;o.href=q}if(c.test(q)){p.panels=p.panels.add(p._sanitizeSelector(q))}else{if(q!="#"){a.data(o,"href.tabs",q);a.data(o,"load.tabs",q.replace(/#.*$/,""));var w=p._tabId(o);o.href="#"+w;var v=a("#"+w);if(!v.length){v=a(d.panelTemplate).attr("id",w).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(p.panels[r-1]||p.list);v.data("destroy.tabs",true)}p.panels=p.panels.add(v)}else{d.disabled.push(r)}}});if(n){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(d.selected===undefined){if(location.hash){this.anchors.each(function(q,o){if(o.hash==location.hash){d.selected=q;return false}})}if(typeof d.selected!="number"&&d.cookie){d.selected=parseInt(p._cookie(),10)}if(typeof d.selected!="number"&&this.lis.filter(".ui-tabs-selected").length){d.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}d.selected=d.selected||0}else{if(d.selected===null){d.selected=-1}}d.selected=((d.selected>=0&&this.anchors[d.selected])||d.selected<0)?d.selected:0;d.disabled=a.unique(d.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(q,o){return p.lis.index(q)}))).sort();if(a.inArray(d.selected,d.disabled)!=-1){d.disabled.splice(a.inArray(d.selected,d.disabled),1)}this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");if(d.selected>=0&&this.anchors.length){this.panels.eq(d.selected).removeClass("ui-tabs-hide");this.lis.eq(d.selected).addClass("ui-tabs-selected ui-state-active");p.element.queue("tabs",function(){p._trigger("show",null,p._ui(p.anchors[d.selected],p.panels[d.selected]))});this.load(d.selected)}a(window).bind("unload",function(){p.lis.add(p.anchors).unbind(".tabs");p.lis=p.anchors=p.panels=null})}else{d.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}this.element[d.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");if(d.cookie){this._cookie(d.selected,d.cookie)}for(var g=0,m;(m=this.lis[g]);g++){a(m)[a.inArray(g,d.disabled)!=-1&&!a(m).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled")}if(d.cache===false){this.anchors.removeData("cache.tabs")}this.lis.add(this.anchors).unbind(".tabs");if(d.event!="mouseover"){var f=function(o,i){if(i.is(":not(.ui-state-disabled)")){i.addClass("ui-state-"+o)}};var j=function(o,i){i.removeClass("ui-state-"+o)};this.lis.bind("mouseover.tabs",function(){f("hover",a(this))});this.lis.bind("mouseout.tabs",function(){j("hover",a(this))});this.anchors.bind("focus.tabs",function(){f("focus",a(this).closest("li"))});this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var b,h;if(d.fx){if(a.isArray(d.fx)){b=d.fx[0];h=d.fx[1]}else{b=h=d.fx}}function e(i,o){i.css({display:""});if(a.browser.msie&&o.opacity){i[0].style.removeAttribute("filter")}}var k=h?function(i,o){a(i).closest("li").removeClass("ui-state-default").addClass("ui-tabs-selected ui-state-active");o.hide().removeClass("ui-tabs-hide").animate(h,h.duration||"normal",function(){e(o,h);p._trigger("show",null,p._ui(i,o[0]))})}:function(i,o){a(i).closest("li").removeClass("ui-state-default").addClass("ui-tabs-selected ui-state-active");o.removeClass("ui-tabs-hide");p._trigger("show",null,p._ui(i,o[0]))};var l=b?function(o,i){i.animate(b,b.duration||"normal",function(){p.lis.removeClass("ui-tabs-selected ui-state-active").addClass("ui-state-default");i.addClass("ui-tabs-hide");e(i,b);p.element.dequeue("tabs")})}:function(o,i,q){p.lis.removeClass("ui-tabs-selected ui-state-active").addClass("ui-state-default");i.addClass("ui-tabs-hide");p.element.dequeue("tabs")};this.anchors.bind(d.event+".tabs",function(){var o=this,r=a(this).closest("li"),i=p.panels.filter(":not(.ui-tabs-hide)"),q=a(p._sanitizeSelector(this.hash));if((r.hasClass("ui-tabs-selected")&&!d.collapsible)||r.hasClass("ui-state-disabled")||r.hasClass("ui-state-processing")||p._trigger("select",null,p._ui(this,q[0]))===false){this.blur();return false}d.selected=p.anchors.index(this);p.abort();if(d.collapsible){if(r.hasClass("ui-tabs-selected")){d.selected=-1;if(d.cookie){p._cookie(d.selected,d.cookie)}p.element.queue("tabs",function(){l(o,i)}).dequeue("tabs");this.blur();return false}else{if(!i.length){if(d.cookie){p._cookie(d.selected,d.cookie)}p.element.queue("tabs",function(){k(o,q)});p.load(p.anchors.index(this));this.blur();return false}}}if(d.cookie){p._cookie(d.selected,d.cookie)}if(q.length){if(i.length){p.element.queue("tabs",function(){l(o,i)})}p.element.queue("tabs",function(){k(o,q)});p.load(p.anchors.index(this))}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(a.browser.msie){this.blur()}});this.anchors.bind("click.tabs",function(){return false})},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var c=a.data(this,"href.tabs");if(c){this.href=c}var d=a(this).unbind(".tabs");a.each(["href","load","cache"],function(e,f){d.removeData(f+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){if(a.data(this,"destroy.tabs")){a(this).remove()}else{a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}});if(b.cookie){this._cookie(null,b.cookie)}},add:function(e,d,c){if(c===undefined){c=this.anchors.length}var b=this,g=this.options,i=a(g.tabTemplate.replace(/#\{href\}/g,e).replace(/#\{label\}/g,d)),h=!e.indexOf("#")?e.replace("#",""):this._tabId(a("a",i)[0]);i.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var f=a("#"+h);if(!f.length){f=a(g.panelTemplate).attr("id",h).data("destroy.tabs",true)}f.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(c>=this.lis.length){i.appendTo(this.list);f.appendTo(this.list[0].parentNode)}else{i.insertBefore(this.lis[c]);f.insertBefore(this.panels[c])}g.disabled=a.map(g.disabled,function(k,j){return k>=c?++k:k});this._tabify();if(this.anchors.length==1){i.addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[0],b.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[c],this.panels[c]))},remove:function(b){var d=this.options,e=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();if(e.hasClass("ui-tabs-selected")&&this.anchors.length>1){this.select(b+(b+1=b?--g:g});this._tabify();this._trigger("remove",null,this._ui(e.find("a")[0],c[0]))},enable:function(b){var c=this.options;if(a.inArray(b,c.disabled)==-1){return}this.lis.eq(b).removeClass("ui-state-disabled");c.disabled=a.grep(c.disabled,function(e,d){return e!=b});this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b]))},disable:function(c){var b=this,d=this.options;if(c!=d.selected){this.lis.eq(c).addClass("ui-state-disabled");d.disabled.push(c);d.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}},select:function(b){if(typeof b=="string"){b=this.anchors.index(this.anchors.filter("[href$="+b+"]"))}else{if(b===null){b=-1}}if(b==-1&&this.options.collapsible){b=this.options.selected}this.anchors.eq(b).trigger(this.options.event+".tabs")},load:function(e){var c=this,g=this.options,b=this.anchors.eq(e)[0],d=a.data(b,"load.tabs");this.abort();if(!d||this.element.queue("tabs").length!==0&&a.data(b,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(e).addClass("ui-state-processing");if(g.spinner){var f=a("span",b);f.data("label.tabs",f.html()).html(g.spinner)}this.xhr=a.ajax(a.extend({},g.ajaxOptions,{url:d,success:function(i,h){a(c._sanitizeSelector(b.hash)).html(i);c._cleanup();if(g.cache){a.data(b,"cache.tabs",true)}c._trigger("load",null,c._ui(c.anchors[e],c.panels[e]));try{g.ajaxOptions.success(i,h)}catch(j){}c.element.dequeue("tabs")}}))},abort:function(){this.element.queue([]);this.panels.stop(false,true);if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup()},url:function(c,b){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",b)},length:function(){return this.anchors.length}});a.extend(a.ui.tabs,{version:"1.7.2",getter:"length",defaults:{ajaxOptions:null,cache:false,cookie:null,collapsible:false,disabled:[],event:"click",fx:null,idPrefix:"ui-tabs-",panelTemplate:"
    ",spinner:"Loading…",tabTemplate:'
  • #{label}
  • '}});a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(d,f){var b=this,g=this.options;var c=b._rotate||(b._rotate=function(h){clearTimeout(b.rotation);b.rotation=setTimeout(function(){var i=g.selected;b.select(++i')}$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",log:function(){if(this.debug){console.log.apply("",arguments)}},setDefaults:function(settings){extendRemove(this._defaults,settings||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase();var inline=(nodeName=="div"||nodeName=="span");if(!target.id){target.id="dp"+(++this.uuid)}var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{});if(nodeName=="input"){this._connectDatepicker(target,inst)}else{if(inline){this._inlineDatepicker(target,inst)}}},_newInst:function(target,inline){var id=target[0].id.replace(/([:\[\]\.])/g,"\\\\$1");return{id:id,input:target,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:inline,dpDiv:(!inline?this.dpDiv:$('
    '))}},_connectDatepicker:function(target,inst){var input=$(target);inst.append=$([]);inst.trigger=$([]);if(input.hasClass(this.markerClassName)){return}var appendText=this._get(inst,"appendText");var isRTL=this._get(inst,"isRTL");if(appendText){inst.append=$(''+appendText+"");input[isRTL?"before":"after"](inst.append)}var showOn=this._get(inst,"showOn");if(showOn=="focus"||showOn=="both"){input.focus(this._showDatepicker)}if(showOn=="button"||showOn=="both"){var buttonText=this._get(inst,"buttonText");var buttonImage=this._get(inst,"buttonImage");inst.trigger=$(this._get(inst,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText}):$('').addClass(this._triggerClass).html(buttonImage==""?buttonText:$("").attr({src:buttonImage,alt:buttonText,title:buttonText})));input[isRTL?"before":"after"](inst.trigger);inst.trigger.click(function(){if($.datepicker._datepickerShowing&&$.datepicker._lastInput==target){$.datepicker._hideDatepicker()}else{$.datepicker._showDatepicker(target)}return false})}input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst)},_inlineDatepicker:function(target,inst){var divSpan=$(target);if(divSpan.hasClass(this.markerClassName)){return}divSpan.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst);this._setDate(inst,this._getDefaultDate(inst));this._updateDatepicker(inst);this._updateAlternate(inst)},_dialogDatepicker:function(input,dateText,onSelect,settings,pos){var inst=this._dialogInst;if(!inst){var id="dp"+(++this.uuid);this._dialogInput=$('');this._dialogInput.keydown(this._doKeyDown);$("body").append(this._dialogInput);inst=this._dialogInst=this._newInst(this._dialogInput,false);inst.settings={};$.data(this._dialogInput[0],PROP_NAME,inst)}extendRemove(inst.settings,settings||{});this._dialogInput.val(dateText);this._pos=(pos?(pos.length?pos:[pos.pageX,pos.pageY]):null);if(!this._pos){var browserWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;var browserHeight=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;var scrollY=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[(browserWidth/2)-100+scrollX,(browserHeight/2)-150+scrollY]}this._dialogInput.css("left",this._pos[0]+"px").css("top",this._pos[1]+"px");inst.settings.onSelect=onSelect;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);if($.blockUI){$.blockUI(this.dpDiv)}$.data(this._dialogInput[0],PROP_NAME,inst);return this},_destroyDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();$.removeData(target,PROP_NAME);if(nodeName=="input"){inst.append.remove();inst.trigger.remove();$target.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress)}else{if(nodeName=="div"||nodeName=="span"){$target.removeClass(this.markerClassName).empty()}}},_enableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=false;inst.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().removeClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)})},_disableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=true;inst.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().addClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)});this._disabledInputs[this._disabledInputs.length]=target},_isDisabledDatepicker:function(target){if(!target){return false}for(var i=0;i-1)}},_showDatepicker:function(input){input=input.target||input;if(input.nodeName.toLowerCase()!="input"){input=$("input",input.parentNode)[0]}if($.datepicker._isDisabledDatepicker(input)||$.datepicker._lastInput==input){return}var inst=$.datepicker._getInst(input);var beforeShow=$.datepicker._get(inst,"beforeShow");extendRemove(inst.settings,(beforeShow?beforeShow.apply(input,[input,inst]):{}));$.datepicker._hideDatepicker(null,"");$.datepicker._lastInput=input;$.datepicker._setDateFromField(inst);if($.datepicker._inDialog){input.value=""}if(!$.datepicker._pos){$.datepicker._pos=$.datepicker._findPos(input);$.datepicker._pos[1]+=input.offsetHeight}var isFixed=false;$(input).parents().each(function(){isFixed|=$(this).css("position")=="fixed";return !isFixed});if(isFixed&&$.browser.opera){$.datepicker._pos[0]-=document.documentElement.scrollLeft;$.datepicker._pos[1]-=document.documentElement.scrollTop}var offset={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null;inst.rangeStart=null;inst.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});$.datepicker._updateDatepicker(inst);offset=$.datepicker._checkOffset(inst,offset,isFixed);inst.dpDiv.css({position:($.datepicker._inDialog&&$.blockUI?"static":(isFixed?"fixed":"absolute")),display:"none",left:offset.left+"px",top:offset.top+"px"});if(!inst.inline){var showAnim=$.datepicker._get(inst,"showAnim")||"show";var duration=$.datepicker._get(inst,"duration");var postProcess=function(){$.datepicker._datepickerShowing=true;if($.browser.msie&&parseInt($.browser.version,10)<7){$("iframe.ui-datepicker-cover").css({width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4})}};if($.effects&&$.effects[showAnim]){inst.dpDiv.show(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[showAnim](duration,postProcess)}if(duration==""){postProcess()}if(inst.input[0].type!="hidden"){inst.input[0].focus()}$.datepicker._curInst=inst}},_updateDatepicker:function(inst){var dims={width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4};var self=this;inst.dpDiv.empty().append(this._generateHTML(inst)).find("iframe.ui-datepicker-cover").css({width:dims.width,height:dims.height}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){$(this).removeClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).removeClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).removeClass("ui-datepicker-next-hover")}}).bind("mouseover",function(){if(!self._isDisabledDatepicker(inst.inline?inst.dpDiv.parent()[0]:inst.input[0])){$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");$(this).addClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).addClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).addClass("ui-datepicker-next-hover")}}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();var numMonths=this._getNumberOfMonths(inst);var cols=numMonths[1];var width=17;if(cols>1){inst.dpDiv.addClass("ui-datepicker-multi-"+cols).css("width",(width*cols)+"em")}else{inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("")}inst.dpDiv[(numMonths[0]!=1||numMonths[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");inst.dpDiv[(this._get(inst,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");if(inst.input&&inst.input[0].type!="hidden"&&inst==$.datepicker._curInst){$(inst.input[0]).focus()}},_checkOffset:function(inst,offset,isFixed){var dpWidth=inst.dpDiv.outerWidth();var dpHeight=inst.dpDiv.outerHeight();var inputWidth=inst.input?inst.input.outerWidth():0;var inputHeight=inst.input?inst.input.outerHeight():0;var viewWidth=(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)+$(document).scrollLeft();var viewHeight=(window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight)+$(document).scrollTop();offset.left-=(this._get(inst,"isRTL")?(dpWidth-inputWidth):0);offset.left-=(isFixed&&offset.left==inst.input.offset().left)?$(document).scrollLeft():0;offset.top-=(isFixed&&offset.top==(inst.input.offset().top+inputHeight))?$(document).scrollTop():0;offset.left-=(offset.left+dpWidth>viewWidth&&viewWidth>dpWidth)?Math.abs(offset.left+dpWidth-viewWidth):0;offset.top-=(offset.top+dpHeight>viewHeight&&viewHeight>dpHeight)?Math.abs(offset.top+dpHeight+inputHeight*2-viewHeight):0;return offset},_findPos:function(obj){while(obj&&(obj.type=="hidden"||obj.nodeType!=1)){obj=obj.nextSibling}var position=$(obj).offset();return[position.left,position.top]},_hideDatepicker:function(input,duration){var inst=this._curInst;if(!inst||(input&&inst!=$.data(input,PROP_NAME))){return}if(inst.stayOpen){this._selectDate("#"+inst.id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear))}inst.stayOpen=false;if(this._datepickerShowing){duration=(duration!=null?duration:this._get(inst,"duration"));var showAnim=this._get(inst,"showAnim");var postProcess=function(){$.datepicker._tidyDialog(inst)};if(duration!=""&&$.effects&&$.effects[showAnim]){inst.dpDiv.hide(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[(duration==""?"hide":(showAnim=="slideDown"?"slideUp":(showAnim=="fadeIn"?"fadeOut":"hide")))](duration,postProcess)}if(duration==""){this._tidyDialog(inst)}var onClose=this._get(inst,"onClose");if(onClose){onClose.apply((inst.input?inst.input[0]:null),[(inst.input?inst.input.val():""),inst])}this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if($.blockUI){$.unblockUI();$("body").append(this.dpDiv)}}this._inDialog=false}this._curInst=null},_tidyDialog:function(inst){inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(event){if(!$.datepicker._curInst){return}var $target=$(event.target);if(($target.parents("#"+$.datepicker._mainDivId).length==0)&&!$target.hasClass($.datepicker.markerClassName)&&!$target.hasClass($.datepicker._triggerClass)&&$.datepicker._datepickerShowing&&!($.datepicker._inDialog&&$.blockUI)){$.datepicker._hideDatepicker(null,"")}},_adjustDate:function(id,offset,period){var target=$(id);var inst=this._getInst(target[0]);if(this._isDisabledDatepicker(target[0])){return}this._adjustInstDate(inst,offset+(period=="M"?this._get(inst,"showCurrentAtPos"):0),period);this._updateDatepicker(inst)},_gotoToday:function(id){var target=$(id);var inst=this._getInst(target[0]);if(this._get(inst,"gotoCurrent")&&inst.currentDay){inst.selectedDay=inst.currentDay;inst.drawMonth=inst.selectedMonth=inst.currentMonth;inst.drawYear=inst.selectedYear=inst.currentYear}else{var date=new Date();inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear()}this._notifyChange(inst);this._adjustDate(target)},_selectMonthYear:function(id,select,period){var target=$(id);var inst=this._getInst(target[0]);inst._selectingMonthYear=false;inst["selected"+(period=="M"?"Month":"Year")]=inst["draw"+(period=="M"?"Month":"Year")]=parseInt(select.options[select.selectedIndex].value,10);this._notifyChange(inst);this._adjustDate(target)},_clickMonthYear:function(id){var target=$(id);var inst=this._getInst(target[0]);if(inst.input&&inst._selectingMonthYear&&!$.browser.msie){inst.input[0].focus()}inst._selectingMonthYear=!inst._selectingMonthYear},_selectDay:function(id,month,year,td){var target=$(id);if($(td).hasClass(this._unselectableClass)||this._isDisabledDatepicker(target[0])){return}var inst=this._getInst(target[0]);inst.selectedDay=inst.currentDay=$("a",td).html();inst.selectedMonth=inst.currentMonth=month;inst.selectedYear=inst.currentYear=year;if(inst.stayOpen){inst.endDay=inst.endMonth=inst.endYear=null}this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear));if(inst.stayOpen){inst.rangeStart=this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay));this._updateDatepicker(inst)}},_clearDate:function(id){var target=$(id);var inst=this._getInst(target[0]);inst.stayOpen=false;inst.endDay=inst.endMonth=inst.endYear=inst.rangeStart=null;this._selectDate(target,"")},_selectDate:function(id,dateStr){var target=$(id);var inst=this._getInst(target[0]);dateStr=(dateStr!=null?dateStr:this._formatDate(inst));if(inst.input){inst.input.val(dateStr)}this._updateAlternate(inst);var onSelect=this._get(inst,"onSelect");if(onSelect){onSelect.apply((inst.input?inst.input[0]:null),[dateStr,inst])}else{if(inst.input){inst.input.trigger("change")}}if(inst.inline){this._updateDatepicker(inst)}else{if(!inst.stayOpen){this._hideDatepicker(null,this._get(inst,"duration"));this._lastInput=inst.input[0];if(typeof(inst.input[0])!="object"){inst.input[0].focus()}this._lastInput=null}}},_updateAlternate:function(inst){var altField=this._get(inst,"altField");if(altField){var altFormat=this._get(inst,"altFormat")||this._get(inst,"dateFormat");var date=this._getDate(inst);dateStr=this.formatDate(altFormat,date,this._getFormatConfig(inst));$(altField).each(function(){$(this).val(dateStr)})}},noWeekends:function(date){var day=date.getDay();return[(day>0&&day<6),""]},iso8601Week:function(date){var checkDate=new Date(date.getFullYear(),date.getMonth(),date.getDate());var firstMon=new Date(checkDate.getFullYear(),1-1,4);var firstDay=firstMon.getDay()||7;firstMon.setDate(firstMon.getDate()+1-firstDay);if(firstDay<4&&checkDatenew Date(checkDate.getFullYear(),12-1,28)){firstDay=new Date(checkDate.getFullYear()+1,1-1,4).getDay()||7;if(firstDay>4&&(checkDate.getDay()||7)0&&iValue="0"&&value.charAt(iValue)<="9"){num=num*10+parseInt(value.charAt(iValue++),10);size--}if(size==origSize){throw"Missing number at position "+iValue}return num};var getName=function(match,shortNames,longNames){var names=(lookAhead(match)?longNames:shortNames);var size=0;for(var j=0;j0&&iValue-1){month=1;day=doy;do{var dim=this._getDaysInMonth(year,month-1);if(day<=dim){break}month++;day-=dim}while(true)}var date=this._daylightSavingAdjust(new Date(year,month-1,day));if(date.getFullYear()!=year||date.getMonth()+1!=month||date.getDate()!=day){throw"Invalid date"}return date},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TIMESTAMP:"@",W3C:"yy-mm-dd",formatDate:function(format,date,settings){if(!date){return""}var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var lookAhead=function(match){var matches=(iFormat+1=0;m--){doy+=this._getDaysInMonth(date.getFullYear(),m)}output+=formatNumber("o",doy,3);break;case"m":output+=formatNumber("m",date.getMonth()+1,2);break;case"M":output+=formatName("M",date.getMonth(),monthNamesShort,monthNames);break;case"y":output+=(lookAhead("y")?date.getFullYear():(date.getYear()%100<10?"0":"")+date.getYear()%100);break;case"@":output+=date.getTime();break;case"'":if(lookAhead("'")){output+="'"}else{literal=true}break;default:output+=format.charAt(iFormat)}}}}return output},_possibleChars:function(format){var chars="";var literal=false;for(var iFormat=0;iFormatmaxDate?maxDate:date);return date},_determineDate:function(date,defaultDate){var offsetNumeric=function(offset){var date=new Date();date.setDate(date.getDate()+offset);return date};var offsetString=function(offset,getDaysInMonth){var date=new Date();var year=date.getFullYear();var month=date.getMonth();var day=date.getDate();var pattern=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;var matches=pattern.exec(offset);while(matches){switch(matches[2]||"d"){case"d":case"D":day+=parseInt(matches[1],10);break;case"w":case"W":day+=parseInt(matches[1],10)*7;break;case"m":case"M":month+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break;case"y":case"Y":year+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break}matches=pattern.exec(offset)}return new Date(year,month,day)};date=(date==null?defaultDate:(typeof date=="string"?offsetString(date,this._getDaysInMonth):(typeof date=="number"?(isNaN(date)?defaultDate:offsetNumeric(date)):date)));date=(date&&date.toString()=="Invalid Date"?defaultDate:date);if(date){date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0)}return this._daylightSavingAdjust(date)},_daylightSavingAdjust:function(date){if(!date){return null}date.setHours(date.getHours()>12?date.getHours()+2:0);return date},_setDate:function(inst,date,endDate){var clear=!(date);var origMonth=inst.selectedMonth;var origYear=inst.selectedYear;date=this._determineDate(date,new Date());inst.selectedDay=inst.currentDay=date.getDate();inst.drawMonth=inst.selectedMonth=inst.currentMonth=date.getMonth();inst.drawYear=inst.selectedYear=inst.currentYear=date.getFullYear();if(origMonth!=inst.selectedMonth||origYear!=inst.selectedYear){this._notifyChange(inst)}this._adjustInstDate(inst);if(inst.input){inst.input.val(clear?"":this._formatDate(inst))}},_getDate:function(inst){var startDate=(!inst.currentYear||(inst.input&&inst.input.val()=="")?null:this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return startDate},_generateHTML:function(inst){var today=new Date();today=this._daylightSavingAdjust(new Date(today.getFullYear(),today.getMonth(),today.getDate()));var isRTL=this._get(inst,"isRTL");var showButtonPanel=this._get(inst,"showButtonPanel");var hideIfNoPrevNext=this._get(inst,"hideIfNoPrevNext");var navigationAsDateFormat=this._get(inst,"navigationAsDateFormat");var numMonths=this._getNumberOfMonths(inst);var showCurrentAtPos=this._get(inst,"showCurrentAtPos");var stepMonths=this._get(inst,"stepMonths");var stepBigMonths=this._get(inst,"stepBigMonths");var isMultiMonth=(numMonths[0]!=1||numMonths[1]!=1);var currentDate=this._daylightSavingAdjust((!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");var drawMonth=inst.drawMonth-showCurrentAtPos;var drawYear=inst.drawYear;if(drawMonth<0){drawMonth+=12;drawYear--}if(maxDate){var maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),maxDate.getMonth()-numMonths[1]+1,maxDate.getDate()));maxDraw=(minDate&&maxDrawmaxDraw){drawMonth--;if(drawMonth<0){drawMonth=11;drawYear--}}}inst.drawMonth=drawMonth;inst.drawYear=drawYear;var prevText=this._get(inst,"prevText");prevText=(!navigationAsDateFormat?prevText:this.formatDate(prevText,this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),this._getFormatConfig(inst)));var prev=(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?''+prevText+"":(hideIfNoPrevNext?"":''+prevText+""));var nextText=this._get(inst,"nextText");nextText=(!navigationAsDateFormat?nextText:this.formatDate(nextText,this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),this._getFormatConfig(inst)));var next=(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?''+nextText+"":(hideIfNoPrevNext?"":''+nextText+""));var currentText=this._get(inst,"currentText");var gotoDate=(this._get(inst,"gotoCurrent")&&inst.currentDay?currentDate:today);currentText=(!navigationAsDateFormat?currentText:this.formatDate(currentText,gotoDate,this._getFormatConfig(inst)));var controls=(!inst.inline?'":"");var buttonPanel=(showButtonPanel)?'
    '+(isRTL?controls:"")+(this._isInRange(inst,gotoDate)?'":"")+(isRTL?"":controls)+"
    ":"";var firstDay=parseInt(this._get(inst,"firstDay"),10);firstDay=(isNaN(firstDay)?0:firstDay);var dayNames=this._get(inst,"dayNames");var dayNamesShort=this._get(inst,"dayNamesShort");var dayNamesMin=this._get(inst,"dayNamesMin");var monthNames=this._get(inst,"monthNames");var monthNamesShort=this._get(inst,"monthNamesShort");var beforeShowDay=this._get(inst,"beforeShowDay");var showOtherMonths=this._get(inst,"showOtherMonths");var calculateWeek=this._get(inst,"calculateWeek")||this.iso8601Week;var endDate=inst.endDay?this._daylightSavingAdjust(new Date(inst.endYear,inst.endMonth,inst.endDay)):currentDate;var defaultDate=this._getDefaultDate(inst);var html="";for(var row=0;row'+(/all|left/.test(cornerClass)&&row==0?(isRTL?next:prev):"")+(/all|right/.test(cornerClass)&&row==0?(isRTL?prev:next):"")+this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,row>0||col>0,monthNames,monthNamesShort)+'';var thead="";for(var dow=0;dow<7;dow++){var day=(dow+firstDay)%7;thead+="=5?' class="ui-datepicker-week-end"':"")+'>'+dayNamesMin[day]+""}calender+=thead+"";var daysInMonth=this._getDaysInMonth(drawYear,drawMonth);if(drawYear==inst.selectedYear&&drawMonth==inst.selectedMonth){inst.selectedDay=Math.min(inst.selectedDay,daysInMonth)}var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;var numRows=(isMultiMonth?6:Math.ceil((leadDays+daysInMonth)/7));var printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays));for(var dRow=0;dRow";var tbody="";for(var dow=0;dow<7;dow++){var daySettings=(beforeShowDay?beforeShowDay.apply((inst.input?inst.input[0]:null),[printDate]):[true,""]);var otherMonth=(printDate.getMonth()!=drawMonth);var unselectable=otherMonth||!daySettings[0]||(minDate&&printDatemaxDate);tbody+='";printDate.setDate(printDate.getDate()+1);printDate=this._daylightSavingAdjust(printDate)}calender+=tbody+""}drawMonth++;if(drawMonth>11){drawMonth=0;drawYear++}calender+="
    =currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" "+this._currentClass:"")+(printDate.getTime()==today.getTime()?" ui-datepicker-today":""))+'"'+((!otherMonth||showOtherMonths)&&daySettings[2]?' title="'+daySettings[2]+'"':"")+(unselectable?"":" onclick=\"DP_jQuery.datepicker._selectDay('#"+inst.id+"',"+drawMonth+","+drawYear+', this);return false;"')+">"+(otherMonth?(showOtherMonths?printDate.getDate():" "):(unselectable?''+printDate.getDate()+"":'=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" ui-state-active":"")+'" href="#">'+printDate.getDate()+""))+"
    "+(isMultiMonth?""+((numMonths[0]>0&&col==numMonths[1]-1)?'
    ':""):"");group+=calender}html+=group}html+=buttonPanel+($.browser.msie&&parseInt($.browser.version,10)<7&&!inst.inline?'':"");inst._keyEvent=false;return html},_generateMonthYearHeader:function(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,secondary,monthNames,monthNamesShort){minDate=(inst.rangeStart&&minDate&&selectedDate "}else{var inMinYear=(minDate&&minDate.getFullYear()==drawYear);var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear);monthHtml+='"}if(!showMonthAfterYear){html+=monthHtml+((secondary||changeMonth||changeYear)&&(!(changeMonth&&changeYear))?" ":"")}if(secondary||!changeYear){html+=''+drawYear+""}else{var years=this._get(inst,"yearRange").split(":");var year=0;var endYear=0;if(years.length!=2){year=drawYear-10;endYear=drawYear+10}else{if(years[0].charAt(0)=="+"||years[0].charAt(0)=="-"){year=drawYear+parseInt(years[0],10);endYear=drawYear+parseInt(years[1],10)}else{year=parseInt(years[0],10);endYear=parseInt(years[1],10)}}year=(minDate?Math.max(year,minDate.getFullYear()):year);endYear=(maxDate?Math.min(endYear,maxDate.getFullYear()):endYear);html+='"}if(showMonthAfterYear){html+=(secondary||changeMonth||changeYear?" ":"")+monthHtml}html+="";return html},_adjustInstDate:function(inst,offset,period){var year=inst.drawYear+(period=="Y"?offset:0);var month=inst.drawMonth+(period=="M"?offset:0);var day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+(period=="D"?offset:0);var date=this._daylightSavingAdjust(new Date(year,month,day));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&datemaxDate?maxDate:date);inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();if(period=="M"||period=="Y"){this._notifyChange(inst)}},_notifyChange:function(inst){var onChange=this._get(inst,"onChangeMonthYear");if(onChange){onChange.apply((inst.input?inst.input[0]:null),[inst.selectedYear,inst.selectedMonth+1,inst])}},_getNumberOfMonths:function(inst){var numMonths=this._get(inst,"numberOfMonths");return(numMonths==null?[1,1]:(typeof numMonths=="number"?[1,numMonths]:numMonths))},_getMinMaxDate:function(inst,minMax,checkRange){var date=this._determineDate(this._get(inst,minMax+"Date"),null);return(!checkRange||!inst.rangeStart?date:(!date||inst.rangeStart>date?inst.rangeStart:date))},_getDaysInMonth:function(year,month){return 32-new Date(year,month,32).getDate()},_getFirstDayOfMonth:function(year,month){return new Date(year,month,1).getDay()},_canAdjustMonth:function(inst,offset,curYear,curMonth){var numMonths=this._getNumberOfMonths(inst);var date=this._daylightSavingAdjust(new Date(curYear,curMonth+(offset<0?offset:numMonths[1]),1));if(offset<0){date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()))}return this._isInRange(inst,date)},_isInRange:function(inst,date){var newMinDate=(!inst.rangeStart?null:this._daylightSavingAdjust(new Date(inst.selectedYear,inst.selectedMonth,inst.selectedDay)));newMinDate=(newMinDate&&inst.rangeStart=minDate)&&(!maxDate||date<=maxDate))},_getFormatConfig:function(inst){var shortYearCutoff=this._get(inst,"shortYearCutoff");shortYearCutoff=(typeof shortYearCutoff!="string"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst,"dayNamesShort"),dayNames:this._get(inst,"dayNames"),monthNamesShort:this._get(inst,"monthNamesShort"),monthNames:this._get(inst,"monthNames")}},_formatDate:function(inst,day,month,year){if(!day){inst.currentDay=inst.selectedDay;inst.currentMonth=inst.selectedMonth;inst.currentYear=inst.selectedYear}var date=(day?(typeof day=="object"?day:this._daylightSavingAdjust(new Date(year,month,day))):this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return this.formatDate(this._get(inst,"dateFormat"),date,this._getFormatConfig(inst))}});function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null||props[name]==undefined){target[name]=props[name]}}return target}function isArray(a){return(a&&(($.browser.safari&&typeof a=="object"&&a.length)||(a.constructor&&a.constructor.toString().match(/\Array\(\)/))))}$.fn.datepicker=function(options){if(!$.datepicker.initialized){$(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv);$.datepicker.initialized=true}var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"&&(options=="isDisabled"||options=="getDate")){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}if(options=="option"&&arguments.length==2&&typeof arguments[1]=="string"){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}return this.each(function(){typeof options=="string"?$.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this].concat(otherArgs)):$.datepicker._attachDatepicker(this,options)})};$.datepicker=new Datepicker();$.datepicker.initialized=false;$.datepicker.uuid=new Date().getTime();$.datepicker.version="1.7.2";window.DP_jQuery=$})(jQuery);;/* + * jQuery UI Progressbar 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * ui.core.js + */ +(function(a){a.widget("ui.progressbar",{_init:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=a('
    ').appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow").removeData("progressbar").unbind(".progressbar");this.valueDiv.remove();a.widget.prototype.destroy.apply(this,arguments)},value:function(b){if(b===undefined){return this._value()}this._setData("value",b);return this},_setData:function(b,c){switch(b){case"value":this.options.value=c;this._refreshValue();this._trigger("change",null,{});break}a.widget.prototype._setData.apply(this,arguments)},_value:function(){var b=this.options.value;if(bthis._valueMax()){b=this._valueMax()}return b},_valueMin:function(){var b=0;return b},_valueMax:function(){var b=100;return b},_refreshValue:function(){var b=this.value();this.valueDiv[b==this._valueMax()?"addClass":"removeClass"]("ui-corner-right");this.valueDiv.width(b+"%");this.element.attr("aria-valuenow",b)}});a.extend(a.ui.progressbar,{version:"1.7.2",defaults:{value:0}})})(jQuery);;/* + * jQuery UI Effects 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(var f=0;f');var j=f.parent();if(f.css("position")=="static"){j.css({position:"relative"});f.css({position:"relative"})}else{var i=f.css("top");if(isNaN(parseInt(i,10))){i="auto"}var h=f.css("left");if(isNaN(parseInt(h,10))){h="auto"}j.css({position:f.css("position"),top:i,left:h,zIndex:f.css("z-index")}).show();f.css({position:"relative",top:0,left:0})}j.css(g);return j},removeWrapper:function(f){if(f.parent().is(".ui-effects-wrapper")){return f.parent().replaceWith(f)}return f},setTransition:function(g,i,f,h){h=h||{};d.each(i,function(k,j){unit=g.cssUnit(j);if(unit[0]>0){h[j]=unit[0]*f+unit[1]}});return h},animateClass:function(h,i,k,j){var f=(typeof k=="function"?k:(j?j:null));var g=(typeof k=="string"?k:null);return this.each(function(){var q={};var o=d(this);var p=o.attr("style")||"";if(typeof p=="object"){p=p.cssText}if(h.toggle){o.hasClass(h.toggle)?h.remove=h.toggle:h.add=h.toggle}var l=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.addClass(h.add)}if(h.remove){o.removeClass(h.remove)}var m=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.removeClass(h.add)}if(h.remove){o.addClass(h.remove)}for(var r in m){if(typeof m[r]!="function"&&m[r]&&r.indexOf("Moz")==-1&&r.indexOf("length")==-1&&m[r]!=l[r]&&(r.match(/color/i)||(!r.match(/color/i)&&!isNaN(parseInt(m[r],10))))&&(l.position!="static"||(l.position=="static"&&!r.match(/left|top|bottom|right/)))){q[r]=m[r]}}o.animate(q,i,g,function(){if(typeof d(this).attr("style")=="object"){d(this).attr("style")["cssText"]="";d(this).attr("style")["cssText"]=p}else{d(this).attr("style",p)}if(h.add){d(this).addClass(h.add)}if(h.remove){d(this).removeClass(h.remove)}if(f){f.apply(this,arguments)}})})}};function c(g,f){var i=g[1]&&g[1].constructor==Object?g[1]:{};if(f){i.mode=f}var h=g[1]&&g[1].constructor!=Object?g[1]:(i.duration?i.duration:g[2]);h=d.fx.off?0:typeof h==="number"?h:d.fx.speeds[h]||d.fx.speeds._default;var j=i.callback||(d.isFunction(g[1])&&g[1])||(d.isFunction(g[2])&&g[2])||(d.isFunction(g[3])&&g[3]);return[g[0],i,h,j]}d.fn.extend({_show:d.fn.show,_hide:d.fn.hide,__toggle:d.fn.toggle,_addClass:d.fn.addClass,_removeClass:d.fn.removeClass,_toggleClass:d.fn.toggleClass,effect:function(g,f,h,i){return d.effects[g]?d.effects[g].call(this,{method:g,options:f||{},duration:h,callback:i}):null},show:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._show.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"show"))}},hide:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._hide.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"hide"))}},toggle:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))||(d.isFunction(arguments[0])||typeof arguments[0]=="boolean")){return this.__toggle.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"toggle"))}},addClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{add:g},f,i,h]):this._addClass(g)},removeClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{remove:g},f,i,h]):this._removeClass(g)},toggleClass:function(g,f,i,h){return((typeof f!=="boolean")&&f)?d.effects.animateClass.apply(this,[{toggle:g},f,i,h]):this._toggleClass(g,f)},morph:function(f,h,g,j,i){return d.effects.animateClass.apply(this,[{add:h,remove:f},g,j,i])},switchClass:function(){return this.morph.apply(this,arguments)},cssUnit:function(f){var g=this.css(f),h=[];d.each(["em","px","%","pt"],function(j,k){if(g.indexOf(k)>0){h=[parseFloat(g),k]}});return h}});d.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(g,f){d.fx.step[f]=function(h){if(h.state==0){h.start=e(h.elem,f);h.end=b(h.end)}h.elem.style[f]="rgb("+[Math.max(Math.min(parseInt((h.pos*(h.end[0]-h.start[0]))+h.start[0],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[1]-h.start[1]))+h.start[1],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[2]-h.start[2]))+h.start[2],10),255),0)].join(",")+")"}});function b(g){var f;if(g&&g.constructor==Array&&g.length==3){return g}if(f=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(g)){return[parseInt(f[1],10),parseInt(f[2],10),parseInt(f[3],10)]}if(f=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(g)){return[parseFloat(f[1])*2.55,parseFloat(f[2])*2.55,parseFloat(f[3])*2.55]}if(f=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(g)){return[parseInt(f[1],16),parseInt(f[2],16),parseInt(f[3],16)]}if(f=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(g)){return[parseInt(f[1]+f[1],16),parseInt(f[2]+f[2],16),parseInt(f[3]+f[3],16)]}if(f=/rgba\(0, 0, 0, 0\)/.exec(g)){return a.transparent}return a[d.trim(g).toLowerCase()]}function e(h,f){var g;do{g=d.curCSS(h,f);if(g!=""&&g!="transparent"||d.nodeName(h,"body")){break}f="backgroundColor"}while(h=h.parentNode);return b(g)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};d.easing.jswing=d.easing.swing;d.extend(d.easing,{def:"easeOutQuad",swing:function(g,h,f,j,i){return d.easing[d.easing.def](g,h,f,j,i)},easeInQuad:function(g,h,f,j,i){return j*(h/=i)*h+f},easeOutQuad:function(g,h,f,j,i){return -j*(h/=i)*(h-2)+f},easeInOutQuad:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h+f}return -j/2*((--h)*(h-2)-1)+f},easeInCubic:function(g,h,f,j,i){return j*(h/=i)*h*h+f},easeOutCubic:function(g,h,f,j,i){return j*((h=h/i-1)*h*h+1)+f},easeInOutCubic:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h+f}return j/2*((h-=2)*h*h+2)+f},easeInQuart:function(g,h,f,j,i){return j*(h/=i)*h*h*h+f},easeOutQuart:function(g,h,f,j,i){return -j*((h=h/i-1)*h*h*h-1)+f},easeInOutQuart:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h+f}return -j/2*((h-=2)*h*h*h-2)+f},easeInQuint:function(g,h,f,j,i){return j*(h/=i)*h*h*h*h+f},easeOutQuint:function(g,h,f,j,i){return j*((h=h/i-1)*h*h*h*h+1)+f},easeInOutQuint:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h*h+f}return j/2*((h-=2)*h*h*h*h+2)+f},easeInSine:function(g,h,f,j,i){return -j*Math.cos(h/i*(Math.PI/2))+j+f},easeOutSine:function(g,h,f,j,i){return j*Math.sin(h/i*(Math.PI/2))+f},easeInOutSine:function(g,h,f,j,i){return -j/2*(Math.cos(Math.PI*h/i)-1)+f},easeInExpo:function(g,h,f,j,i){return(h==0)?f:j*Math.pow(2,10*(h/i-1))+f},easeOutExpo:function(g,h,f,j,i){return(h==i)?f+j:j*(-Math.pow(2,-10*h/i)+1)+f},easeInOutExpo:function(g,h,f,j,i){if(h==0){return f}if(h==i){return f+j}if((h/=i/2)<1){return j/2*Math.pow(2,10*(h-1))+f}return j/2*(-Math.pow(2,-10*--h)+2)+f},easeInCirc:function(g,h,f,j,i){return -j*(Math.sqrt(1-(h/=i)*h)-1)+f},easeOutCirc:function(g,h,f,j,i){return j*Math.sqrt(1-(h=h/i-1)*h)+f},easeInOutCirc:function(g,h,f,j,i){if((h/=i/2)<1){return -j/2*(Math.sqrt(1-h*h)-1)+f}return j/2*(Math.sqrt(1-(h-=2)*h)+1)+f},easeInElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l)==1){return f+m}if(!k){k=l*0.3}if(h").css({position:"absolute",visibility:"visible",left:-d*(g/e),top:-f*(c/k)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/e,height:c/k,left:l.left+d*(g/e)+(b.options.mode=="show"?(d-Math.floor(e/2))*(g/e):0),top:l.top+f*(c/k)+(b.options.mode=="show"?(f-Math.floor(k/2))*(c/k):0),opacity:b.options.mode=="show"?0:1}).animate({left:l.left+d*(g/e)+(b.options.mode=="show"?0:(d-Math.floor(e/2))*(g/e)),top:l.top+f*(c/k)+(b.options.mode=="show"?0:(f-Math.floor(k/2))*(c/k)),opacity:b.options.mode=="show"?1:0},b.duration||500)}}setTimeout(function(){b.options.mode=="show"?h.css({visibility:"visible"}):h.css({visibility:"visible"}).hide();if(b.callback){b.callback.apply(h[0])}h.dequeue();a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/* + * jQuery UI Effects Fold 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * effects.core.js + */ +(function(a){a.effects.fold=function(b){return this.queue(function(){var e=a(this),k=["position","top","left"];var h=a.effects.setMode(e,b.options.mode||"hide");var o=b.options.size||15;var n=!(!b.options.horizFirst);var g=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(e,k);e.show();var d=a.effects.createWrapper(e).css({overflow:"hidden"});var i=((h=="show")!=n);var f=i?["width","height"]:["height","width"];var c=i?[d.width(),d.height()]:[d.height(),d.width()];var j=/([0-9]+)%/.exec(o);if(j){o=parseInt(j[1],10)/100*c[h=="hide"?0:1]}if(h=="show"){d.css(n?{height:0,width:o}:{height:o,width:0})}var m={},l={};m[f[0]]=h=="show"?c[0]:o;l[f[1]]=h=="show"?c[1]:0;d.animate(m,g,b.options.easing).animate(l,g,b.options.easing,function(){if(h=="hide"){e.hide()}a.effects.restore(e,k);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(e[0],arguments)}e.dequeue()})})}})(jQuery);;/* + * jQuery UI Effects Highlight 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * effects.core.js + */ +(function(a){a.effects.highlight=function(b){return this.queue(function(){var e=a(this),d=["backgroundImage","backgroundColor","opacity"];var h=a.effects.setMode(e,b.options.mode||"show");var c=b.options.color||"#ffff99";var g=e.css("backgroundColor");a.effects.save(e,d);e.show();e.css({backgroundImage:"none",backgroundColor:c});var f={backgroundColor:g};if(h=="hide"){f.opacity=0}e.animate(f,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(h=="hide"){e.hide()}a.effects.restore(e,d);if(h=="show"&&a.browser.msie){this.style.removeAttribute("filter")}if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;/* + * jQuery UI Effects Pulsate 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * effects.core.js + */ +(function(a){a.effects.pulsate=function(b){return this.queue(function(){var d=a(this);var g=a.effects.setMode(d,b.options.mode||"show");var f=b.options.times||5;var e=b.duration?b.duration/2:a.fx.speeds._default/2;if(g=="hide"){f--}if(d.is(":hidden")){d.css("opacity",0);d.show();d.animate({opacity:1},e,b.options.easing);f=f-2}for(var c=0;c').appendTo(document.body).addClass(b.options.className).css({top:d.top,left:d.left,height:f.innerHeight(),width:f.innerWidth(),position:"absolute"}).animate(g,b.duration,b.options.easing,function(){c.remove();(b.callback&&b.callback.apply(f[0],arguments));f.dequeue()})})}})(jQuery);; \ No newline at end of file diff --git a/export/html/snakes/js/snakes-mod.js b/export/html/snakes/js/snakes-mod.js new file mode 100644 index 0000000..2d54238 --- /dev/null +++ b/export/html/snakes/js/snakes-mod.js @@ -0,0 +1,473 @@ +/*This code was originally based on code by +Husain Limdiyawala(MSc IT DA-IICT)*/ + + + +$(document).ready(function () { + + +}); + + +//Global Variables +var totblocks=0; +var data=""; +var currentblock=0; +var position=0; +var lastposition = new Array(); +var randomno=0; +var tots= new Array(); +var l=0; +var srcsnake=new Array(4); +var destsnake=new Array(4); + +var ladsrc = new Array(3); +var laddest = new Array(3); +var quest = new Array(); //available questions along with multiple answers +var COR_answered = new Array(); //record all questions (along with answers) the user responded CORRECTLY +var WRO_answered = new Array(); //record all questions (along with answers) the user responded WRONGLY + + + +//var door = new Array(1) + +var user = new Array(); + +//var pythons = new Array(1); + +//Constract table with questions and answers and pick question to display + +quest[0]="Spell 1"; +quest[1]="one"; +quest[2]="two"; +quest[3]="three"; +quest[4]="Spell 2"; +quest[5]="two"; +quest[6]="three"; +quest[7]="four"; +quest[8]="Spell 3"; +quest[9]="three"; +quest[10]="two"; +quest[11]="four"; +quest[12]="Spell 4"; +quest[13]="four"; +quest[14]="three"; +quest[15]="one"; +z=0; +for (z=0;quest[z]!=null;z++); +allQuest=z/4; + + +function selectQuest(all) +{ +pickOne = Math.floor((Math.random() * all)); +return pickOne; +} + + + + +//The Below Function will hide all the snakes + +function hideAll() +{ + document.getElementById("img1").style.display = "none"; + document.getElementById("img2").style.display = "none"; + document.getElementById("img3").style.display = "none"; + document.getElementById("img4").style.display = "none"; + + document.getElementById("lad1").style.display = "none"; + document.getElementById("lad2").style.display = "none"; + document.getElementById("lad3").style.display = "none"; +} + + +//The Below Function will Render The Main Board + +function paintBoard(a) +{ + totblocks = (a*a); + if((a*a) % 2 == 0) + { + currentblock = (a*a) - a + 1; + for(j=0;j<(a/2);j++) + { + + for(i=0;i" + currentblock + ""; + currentblock++; + } + currentblock -= (a+1); + + for(i=0;i" + currentblock + ""; + currentblock--; + } + currentblock -= (a-1); + } + } + else + { + + currentblock = (a*a); + for(j=0;j<(a/2);j++) + { + + + for(i=0;i" + currentblock + ""; + currentblock--; + } + + currentblock -= (a-1); + + if(currentblock < 2) + break; + + for(i=0;i" + currentblock + ""; + currentblock++; + } + currentblock -= (a+1); + } + } + document.getElementById("cont").style.width = (a*52+52) + "px" + + + document.getElementById("cont").innerHTML = data; + $("#cont").slideDown("slow"); + $("#cont").effect("shake",3000); + $("img:hidden").fadeIn(5000); + + if(a == 6) + { + + + registerSnake(158,196,"img1",14,3,0); + registerSnake(62,183,"img2",27,24,1); + registerSnake(175,18,"img3",18,4,2); + registerSnake(10,45,"img4",32,23,3); + + registerLadder(27,132,"lad1",28,34,0); + registerLadder(90,22,"lad2",19,30,1); + registerLadder(179,137,"lad3",2,16,2); + + //registerDoor("5",5,0); + //registerDoor("21",21,1) + + //registerPython("15",15,0) + } + + + else if(a == 8) + { + + + registerSnake(300,380,"img1",44,29,0); + registerSnake(180,550,"img2",51,46,1); + registerSnake(290,50,"img3",41,40,2); + registerSnake(500,280,"img4",27,22,3); + + registerLadder(350,515,"lad1",19,35,0); + registerLadder(180,230,"lad2",43,54,1); + registerLadder(80,350,"lad3",53,60,2); + + //registerDoor("14",14,0); + //registerDoor("26",26,1) + + //registerPython("32",32,0) + } + + +} + +//The below Function will simulate throwing of a dice + +function throwDice(i) +{ + + randomno = Math.floor((Math.random() * 6)) + 1; + document.getElementById("diceimg").src = "images/dice_" + randomno + ".PNG"; + document.getElementById("diceimg").style.display = "block"; + if(lastposition[i]>0) + { + document.getElementById(lastposition[i]).style.background = "url(images/square52.png)"; + + } + tots[i] += randomno; + + if(totblocks - tots[i] >= 0) + { + + lastposition[i] = tots[i]; + document.getElementById(tots[i]).style.background = "url(images/pawn1.png)"; + } + else + { + + tots[i] -= randomno; + document.getElementById(tots[i]).style.background = "url(images/pawn1.png)"; + } + +} + +//The below Function Checks The Snake Biting for a user + +function snakescheck(k) +{ + i=0; + + for(i=0;i<=srcsnake.length;i++) + { + + if(srcsnake[i] == tots[k]) + { + alert("Ωχ! Σε τσίμπησε φίδι στο τετράγωνο " + srcsnake[i] + " και θα πρέπει να γυρίσεις στο τετράγωνο " + destsnake[i] + ", εκτός κι αν απαντήσεις σωστά στην ερώτηση που ακολουθεί."); + document.getElementById(destsnake[i]).style.background = "url(images/pawn1.png)"; + document.getElementById(tots[k]).style.background = "url(images/square52.png)"; + lastposition[k] = destsnake[i]; + tots[k] = destsnake[i]; + break; + } + } + + if(!checkWin(k)) + alert("???d?se?!S???a??t???a!"); +} + +//The below function checks the ladders for a user + + function laddercheck(k) +{ + i=0; + + for(i=0;i<=ladsrc.length;i++) + { + + if(ladsrc[i] == tots[k]) + { + alert("Υπάρχει μια σκάλα στο τετράγωνο " + ladsrc[i] + " και θα σας οδηγήσει κατευθείαν στο τετράγωνο " + laddest[i] +"αν απαντήσεις σωστά στην ερώτηση που ακολουθεί."); + document.getElementById(laddest[i]).style.background = "url(images/pawn1.png)"; + document.getElementById(tots[k]).style.background = "url(images/square52.png)"; + lastposition[k] = laddest[i]; + tots[k] = laddest[i]; + break; + } + } + if(!checkWin(k)) + alert("You have won!"); +} + +//The below function checks the existence of doors + +/*function doorcheck(k) +{ + i=0; + + for(i=0;i<=door.length;i++) + { + + if(door[i] == tots[k]) + { + + + var randomdoor = Math.floor((Math.random() * totblocks)) + 1; + alert("Magic Door Entered!! You are redirected to " + randomdoor); + document.getElementById(randomdoor).style.background = "url(images/pawn.png) #000000"; + document.getElementById(tots[k]).style.background = "url(images/door.png) #000000"; + lastposition[k] = randomdoor; + tots[k] = randomdoor; + + } + } + if(!checkWin(k)) + alert("You Have Won!!"); +} */ + +//The below Function checks for pythons + +function pythoncheck(k) +{ + i=0; + + for(i=0;i
  • brisketai sto tetragwno " + tots[l] + "
  • "; +// + Question(); + document.getElementById("status").innerHTML = "
    • O Paiktis " + (l+1) + "
    • vrisketai sto tetragwno " + tots[l] + "
    "; + } + else + document.getElementById("status").innerHTML = "
    • Molis exases...
    "; + + if(l == lastposition.length-1) + l = 0; + else + l++; + + +} + +//The below function regulates the play + +function doit(i) +{ + + throwDice(i); + + if(checkWin(i)) + { + + //doorcheck(i); + snakescheck(i); + laddercheck(i); + //pythoncheck(i); + } + else + alert("ÏëïêëÞñùóåò ôçí ðßóôá, óõã÷áñçôÞñéá!!!"); +} + +//The below function checks whether the player has won or not + +function checkWin(i) +{ + if(tots[i] == totblocks) + return false; + else + return true; + +} + +//The below function will disable both the combobox + +function disableField() +{ + document.getElementById("players").disabled = "disabled"; + document.getElementById("boardtype").disabled = "disabled"; + +} + +function Question() +{ + picked=selectQuest(allQuest); + alert("Randomly selected number:" +picked); + Q1=prompt(quest[picked*4],"Απάντηση"); + if (Q1==quest[picked*4+1]) + { + alert("Σωστά!") + doit(l); + + COR_answered.concat(quest.splice(picked*4,4)); + } + else + { + alert("Η απάντηση δεν ήταν σωστή. Χάνεις τη σειρά σου για αυτό το γύρο!") + //document.getElementById("playbtn").disabled = "disabled"; + WRO_answered.concat(quest.splice(picked*4,4)); + } + //remove question and answers from available questions - (thus not allowing to have a Repeated question) ---XOXOXO + allQuest--; + } \ No newline at end of file diff --git a/export/html/snakes/js/subModal.js b/export/html/snakes/js/subModal.js new file mode 100644 index 0000000..28de858 --- /dev/null +++ b/export/html/snakes/js/subModal.js @@ -0,0 +1,295 @@ +var gPopupMask = null; +var gPopupContainer = null; +var gPopFrame = null; +var gReturnFunc; +var gPopupIsShown = false; +var gDefaultPage = "/loading.html"; +var gHideSelects = false; +var gReturnVal = null; + +var gTabIndexes = new Array(); +// Pre-defined list of tags we want to disable/enable tabbing into +var gTabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","IFRAME"); + +// If using Mozilla or Firefox, use Tab-key trap. +if (!document.all) { + document.onkeypress = keyDownHandler; +} + +/** + * Initializes popup code on load. + */ +function initPopUp() { + // Add the HTML to the body + theBody = document.getElementsByTagName('BODY')[0]; + popmask = document.createElement('div'); + popmask.id = 'popupMask'; + popcont = document.createElement('div'); + popcont.id = 'popupContainer'; + popcont.innerHTML = '' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '' + + '
    ' + + '
    ' + + '' + + '
    '; + theBody.appendChild(popmask); + theBody.appendChild(popcont); + + gPopupMask = document.getElementById("popupMask"); + gPopupContainer = document.getElementById("popupContainer"); + gPopFrame = document.getElementById("popupFrame"); + + // check to see if this is IE version 6 or lower. hide select boxes if so + // maybe they'll fix this in version 7? + var brsVersion = parseInt(window.navigator.appVersion.charAt(0), 10); + if (brsVersion <= 6 && window.navigator.userAgent.indexOf("MSIE") > -1) { + gHideSelects = true; + } + + // Add onclick handlers to 'a' elements of class submodal or submodal-width-height + var elms = document.getElementsByTagName('a'); + for (i = 0; i < elms.length; i++) { + if (elms[i].className.indexOf("submodal") == 0) { + // var onclick = 'function (){showPopWin(\''+elms[i].href+'\','+width+', '+height+', null);return false;};'; + // elms[i].onclick = eval(onclick); + elms[i].onclick = function(){ + // default width and height + var width = 400; + var height = 200; + // Parse out optional width and height from className + params = this.className.split('-'); + if (params.length == 3) { + width = parseInt(params[1]); + height = parseInt(params[2]); + } + showPopWin(this.href,width,height,null); return false; + } + } + } +} +addEvent(window, "load", initPopUp); + + /** + * @argument width - int in pixels + * @argument height - int in pixels + * @argument url - url to display + * @argument returnFunc - function to call when returning true from the window. + * @argument showCloseBox - show the close box - default true + */ +function showPopWin(url, width, height, returnFunc, showCloseBox) { + // show or hide the window close widget + if (showCloseBox == null || showCloseBox == true) { + document.getElementById("popCloseBox").style.display = "block"; + } else { + document.getElementById("popCloseBox").style.display = "none"; + } + gPopupIsShown = true; + disableTabIndexes(); + gPopupMask.style.display = "block"; + gPopupContainer.style.display = "block"; + // calculate where to place the window on screen + centerPopWin(width, height); + + var titleBarHeight = parseInt(document.getElementById("popupTitleBar").offsetHeight, 10); + + + gPopupContainer.style.width = width + "px"; + gPopupContainer.style.height = (height+titleBarHeight) + "px"; + + setMaskSize(); + + // need to set the width of the iframe to the title bar width because of the dropshadow + // some oddness was occuring and causing the frame to poke outside the border in IE6 + gPopFrame.style.width = parseInt(document.getElementById("popupTitleBar").offsetWidth, 10) + "px"; + gPopFrame.style.height = (height) + "px"; + + // set the url + gPopFrame.src = url; + + gReturnFunc = returnFunc; + // for IE + if (gHideSelects == true) { + hideSelectBoxes(); + } + + window.setTimeout("setPopTitle();", 600); +} + +// +var gi = 0; +function centerPopWin(width, height) { + if (gPopupIsShown == true) { + if (width == null || isNaN(width)) { + width = gPopupContainer.offsetWidth; + } + if (height == null) { + height = gPopupContainer.offsetHeight; + } + + //var theBody = document.documentElement; + var theBody = document.getElementsByTagName("BODY")[0]; + //theBody.style.overflow = "hidden"; + var scTop = parseInt(getScrollTop(),10); + var scLeft = parseInt(theBody.scrollLeft,10); + + setMaskSize(); + + //window.status = gPopupMask.style.top + " " + gPopupMask.style.left + " " + gi++; + + var titleBarHeight = parseInt(document.getElementById("popupTitleBar").offsetHeight, 10); + + var fullHeight = getViewportHeight(); + var fullWidth = getViewportWidth(); + + gPopupContainer.style.top = (scTop + ((fullHeight - (height+titleBarHeight)) / 2)) + "px"; + gPopupContainer.style.left = (scLeft + ((fullWidth - width) / 2)) + "px"; + //alert(fullWidth + " " + width + " " + gPopupContainer.style.left); + } +} +addEvent(window, "resize", centerPopWin); +addEvent(window, "scroll", centerPopWin); +window.onscroll = centerPopWin; + + +/** + * Sets the size of the popup mask. + * + */ +function setMaskSize() { + var theBody = document.getElementsByTagName("BODY")[0]; + + var fullHeight = getViewportHeight(); + var fullWidth = getViewportWidth(); + + // Determine what's bigger, scrollHeight or fullHeight / width + if (fullHeight > theBody.scrollHeight) { + popHeight = fullHeight; + } else { + popHeight = theBody.scrollHeight; + } + + if (fullWidth > theBody.scrollWidth) { + popWidth = fullWidth; + } else { + popWidth = theBody.scrollWidth; + } + + gPopupMask.style.height = popHeight + "px"; + gPopupMask.style.width = popWidth + "px"; +} + +/** + * @argument callReturnFunc - bool - determines if we call the return function specified + * @argument returnVal - anything - return value + */ +function hidePopWin(callReturnFunc) { + gPopupIsShown = false; + var theBody = document.getElementsByTagName("BODY")[0]; + theBody.style.overflow = ""; + restoreTabIndexes(); + if (gPopupMask == null) { + return; + } + gPopupMask.style.display = "none"; + gPopupContainer.style.display = "none"; + if (callReturnFunc == true && gReturnFunc != null) { + // Set the return code to run in a timeout. + // Was having issues using with an Ajax.Request(); + gReturnVal = window.frames["popupFrame"].returnVal; + window.setTimeout('gReturnFunc(gReturnVal);', 1); + } + gPopFrame.src = gDefaultPage; + // display all select boxes + if (gHideSelects == true) { + displaySelectBoxes(); + } +} + +/** + * Sets the popup title based on the title of the html document it contains. + * Uses a timeout to keep checking until the title is valid. + */ +function setPopTitle() { + return; + if (window.frames["popupFrame"].document.title == null) { + window.setTimeout("setPopTitle();", 10); + } else { + document.getElementById("popupTitle").innerHTML = window.frames["popupFrame"].document.title; + } +} + +// Tab key trap. iff popup is shown and key was [TAB], suppress it. +// @argument e - event - keyboard event that caused this function to be called. +function keyDownHandler(e) { + if (gPopupIsShown && e.keyCode == 9) return false; +} + +// For IE. Go through predefined tags and disable tabbing into them. +function disableTabIndexes() { + if (document.all) { + var i = 0; + for (var j = 0; j < gTabbableTags.length; j++) { + var tagElements = document.getElementsByTagName(gTabbableTags[j]); + for (var k = 0 ; k < tagElements.length; k++) { + gTabIndexes[i] = tagElements[k].tabIndex; + tagElements[k].tabIndex="-1"; + i++; + } + } + } +} + +function returnRefresh() +{ + //alert("I am active!"); + window.location.reload(); +} + +// For IE. Restore tab-indexes. +function restoreTabIndexes() { + if (document.all) { + var i = 0; + for (var j = 0; j < gTabbableTags.length; j++) { + var tagElements = document.getElementsByTagName(gTabbableTags[j]); + for (var k = 0 ; k < tagElements.length; k++) { + tagElements[k].tabIndex = gTabIndexes[i]; + tagElements[k].tabEnabled = true; + i++; + } + } + } +} + + +/** + * Hides all drop down form select boxes on the screen so they do not appear above the mask layer. + * IE has a problem with wanted select form tags to always be the topmost z-index or layer + * + * Thanks for the code Scott! + */ +function hideSelectBoxes() { + var x = document.getElementsByTagName("SELECT"); + + for (i=0;x && i < x.length; i++) { + x[i].style.visibility = "hidden"; + } +} + +/** + * Makes all drop down form select boxes on the screen visible so they do not + * reappear after the dialog is closed. + * + * IE has a problem with wanting select form tags to always be the + * topmost z-index or layer. + */ +function displaySelectBoxes() { + var x = document.getElementsByTagName("SELECT"); + + for (i=0;x && i < x.length; i++){ + x[i].style.visibility = "visible"; + } +} \ No newline at end of file diff --git a/export/html/snakes/maskBG.png b/export/html/snakes/maskBG.png new file mode 100644 index 0000000000000000000000000000000000000000..b89babc2f12a93b80cd1e3e1166d741a477a4229 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4v7|ftIx;YR|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dax?djqeQgJIOB_Y8hS%JyGP=M1- fG{{}ip@ETMa}q<9(n~jWpfUzeS3j3^P6 + + + + + + + + + +

    !

    .

    % , .

    ;

    + + + diff --git a/export/javame/hangman/simple/KeyCanvas.class b/export/javame/hangman/simple/KeyCanvas.class new file mode 100755 index 0000000000000000000000000000000000000000..7f1cc9cc6ce1bffdcd1db5f720e9e7e05673ca6f GIT binary patch literal 11726 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 -1 && readChar != '\n') { + + // Append the read character to the string. Some operating systems + // such as Microsoft Windows prepend newline character ('\n') with + // carriage return ('\r'). This is part of the newline character and + // therefore an exception that should not be appended to the string. + if (readChar != '\r') { + string.append( (char )readChar); + } + + // Read the next character + readChar = reader.read(); + } + return string.toString(); + } + + private void LoadLocales() throws IOException{ + m_hashLocales = new Hashtable(); + + Class c = this.getClass(); + InputStream is = c.getResourceAsStream( "hangman/language.txt"); + InputStreamReader reader = new InputStreamReader( is, "UTF-8"); + String line = null; + String key, data; + + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader)) != null) { + int pos = line.indexOf( "="); + if( pos >= 0){ + key = line.substring( 0, pos); + data = line.substring( pos+1); + m_hashLocales.put(key, data); + } + } + reader.close(); + } + + protected boolean SetCurrentWord( String line) throws IOException{ + + int pos=line.indexOf( '='); + if( pos == -1){ + return false; + } + m_answer = line.substring( 0, pos); + m_question = line.substring( pos+1); + + return true; + } + + protected int SelectWord( String fname) throws IOException{ + Class c = this.getClass(); + InputStream is = c.getResourceAsStream( fname); + InputStreamReader reader = new InputStreamReader( is, "UTF-8"); + String line = null; + int count=0; + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader)) != null) { + // Append the read line to the main form with a linefeed ('\n') + count = count + 1; + } + reader.close(); + + //select randomly one word + Random r = new Random(); + int curline = r.nextInt(); + curline = curline % count; + if( curline < 0) + curline = curline + count; + + InputStreamReader reader2 = new InputStreamReader( + getClass().getResourceAsStream(fname), "UTF-8"); + int i = 0; + + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader2)) != null) { + if( i == curline){ + line = decrypt( line); + SetCurrentWord( line); + return 1; + } + i = i + 1; + } + reader.close(); + + return 0; + } + + + public void paint(Graphics g) { + switch( m_state){ + case 0: + try { + paint_state_start(g); + } catch (IOException ex) { + ex.printStackTrace(); + } + break; + case 1: + try { + paint_state_play( g); + } catch (StringIndexOutOfBoundsException ex) { + ex.printStackTrace(); + } + break; + case 2: + try { + paint_state_nextword(g); + } catch (IOException ex) { + ex.printStackTrace(); + } + break; + case 3: + paint_state_lose( g); + break; + case 4: + try { + paint_state_win(g); + } catch (IOException ex) { + ex.printStackTrace(); + } + break; + } + } + +private void paint_state_start(Graphics g) throws IOException{ + + m_init_letters = getlocale( "keyboardletters"); + m_init_allletters = m_init_letters; + + String sRemove = "1234567890:#"; + for(int i=0; i < sRemove.length(); i++){ + for(;;){ + int pos = m_init_allletters.indexOf( sRemove.charAt(i)); + if( pos < 0) + break; + m_init_allletters = m_init_allletters.substring( 0, pos) + m_init_allletters.substring( pos+1); + } + } + + m_state = 2; + paint_state_nextword( g); +} + +private void paint_state_nextword(Graphics g) throws IOException{ + m_letters = m_init_letters; + m_allletters = m_init_allletters; + + SelectWord( m_filewords); + + m_lastletter = ""; + int len = m_answer.length(); + m_guess = ""; + m_wrong = ""; + for(int i=0; i < len; i++){ + m_guess = m_guess + "-"; + } + m_wrongletters = 0; + + m_state = 1; //play + paint_state_play( g); +} + +private void paint_state_win(Graphics g) throws IOException{ + m_count_games++; + m_count_wins++; + + m_state = 2; + paint_state_nextword( g); +} + +private void paint_state_lose(Graphics g){ + m_count_games++; + + //clear the screen + g.setColor(255,255,255); + g.fillRect(0, 0, getWidth(), getHeight()); + //set color to black + g.setColor(0,0,0); + //get the font height + + int y=10; + + int iHeight=g.getFont().getHeight(); + + String s = m_answer; + + if( m_wrong.length() > 0){ + s = s + " (" + m_wrong + ")"; + } + + s = s + " [" + String.valueOf( m_count_wins) + "/" + String.valueOf( m_count_games) + "]"; + + y = drawtextmultiline( g, s, 0, y); + + y = drawtextmultiline( g, m_question, 0, y+iHeight); + + m_state = 2; +} + +private void paint_state_play(Graphics g){ + + //clear the screen + g.setColor(255,255,255); + g.fillRect(0, 0, getWidth(), getHeight()); + //set color to black + g.setColor(0,0,0); + //get the font height + + int y=0; + Font font = g.getFont(); + + int iHeight=g.getFont().getHeight(); + + String s = m_guess; + if( m_wrong.compareTo( "") != 0){ + s = s + " (" + m_wrong + ")"; + } + + s = s + " (" + String.valueOf( m_count_wins) + "/" + String.valueOf( m_count_games) + ")"; + + y = drawtextmultiline( g, s, 0, y); + + int x = getWidth() - 3 * font.charWidth( '-'); + y = drawtextmultiline( g, mMessage, x, y) + iHeight; + + y = drawtextmultiline( g, m_question, 0, y) + iHeight; + + Image im = null; + try { + String filename = "/hangman/hangman_" + String.valueOf(m_wrongletters) + ".jpg"; + im = Image.createImage( filename); + } catch (IOException ex) { + ex.printStackTrace(); + } + + int xMul = (100 * getWidth()) / im.getWidth(); + int yMul = (100 * (getHeight() - y)) / im.getHeight(); + + if( yMul < xMul){ + xMul = yMul; + } + int cx = (xMul * im.getWidth()) / 100; + int cy = (yMul * im.getHeight()) / 100; + Image resize = resizeImage( im, cx, cy); + + g.drawImage(resize, 0, y, Graphics.LEFT | Graphics.TOP); + } + + protected int drawtextmultiline(Graphics g, String text, int x, int y){ + Font font = g.getFont(); + int fontHeight = font.getHeight(); + //change string to char data + char[] data = new char[text.length()]; + text.getChars(0, text.length(), data, 0); + int width = getWidth(); + int lineWidth = 0; + int charWidth = 0; + int xStart = x; + char ch; + for(int ccnt=0; ccnt < data.length; ccnt++) + { + ch = data[ccnt]; + //measure the char to draw + charWidth = font.charWidth(ch); + lineWidth = lineWidth + charWidth; + //see if a new line is needed + if (lineWidth > width) + { + y = y + fontHeight; + lineWidth = 0; + x = xStart; + } + //draw the char + g.drawChar(ch, x, y, + Graphics.TOP|Graphics.LEFT); + x = x + charWidth; + } + + return y; + } + + protected void keyPressed(int keyCode) { + char number; + + if( m_state == 2){ + repaint(); + return; + } + + if( (keyCode >= 49) && (keyCode <= 57)){ + String numbers = "123456789"; + number = numbers.charAt(keyCode - 49); + + int pos = m_letters.indexOf( number + ":"); + String letters = ""; + + String letters2 = m_letters.substring( pos+2); + + if( pos >= 0){ + pos = letters2.indexOf( '#'); + if( pos >= 0){ + letters = letters2.substring( 0, pos); + //Compute the letters that correspond to the key pressed + + if( m_lastletter.compareTo( "") != 0){ + pos = letters.indexOf( m_lastletter); + + if( pos >= 0){ + pos = pos + 1; + if( pos >= letters.length()){ + pos = 0; + } + }else{ + //different key + pos = 0; + } + }else{ + pos = 0; + } + if( (pos < letters.length()) && (pos >= 0)){ + m_lastletter = letters.substring( pos, pos+1); + mMessage = m_lastletter; + repaint(); + } + return; + } + } + + repaint(); + return; + } + + int gameAction = getGameAction(keyCode); + switch (gameAction) { + case FIRE: + OnFire(); + break; + + default: + mMessage = String.valueOf( keyCode); + break; + } + } + + protected void OnFire() { + int pos = m_guess.indexOf( m_lastletter); + if( pos >= 0){ + //Already used + return; + } + + char ch = m_lastletter.charAt( 0); + pos = m_answer.indexOf( ch); + if( pos >= 0){ + //correct letter + //Maybe there are many letters + for(pos=0; pos < m_guess.length();pos++){ + if( m_answer.charAt( pos) == ch){ + m_guess = m_guess.substring( 0, pos) + m_lastletter + m_guess.substring( pos+1); + } + } + + pos = m_allletters.indexOf( m_lastletter); + if( pos >= 0){ + m_allletters = m_allletters.substring( 0, pos) + "." + m_allletters.substring( pos+1); + } + + remove_lastletter_from_keyboard(); + + if( m_guess.indexOf( '-') < 0){ + m_state = 4; //state=win; + } + + repaint(); + return; + } + + pos = m_allletters.indexOf( m_lastletter); + if( pos < 0){ + return; + } + + //wrong letter + m_wrongletters = m_wrongletters + 1; + + pos = m_allletters.indexOf( m_lastletter); + if( pos >= 0){ + m_allletters = m_allletters.substring( 0, pos) + "." + m_allletters.substring( pos+1); + m_wrong = m_wrong + m_lastletter; + } + + remove_lastletter_from_keyboard(); + + if( m_wrongletters >= 6){ + m_state = 3; //state=lose + } + repaint(); + } + + private void remove_lastletter_from_keyboard(){ + int pos = m_letters.indexOf( m_lastletter); + + if( pos >= 0){ + m_letters = m_letters.substring( 0, pos) + m_letters.substring( pos+1); + } + } + + private Image resizeImage(Image src, int cx, int cy) { + int srcWidth = src.getWidth(); + int srcHeight = src.getHeight(); + Image tmp = Image.createImage(cx, srcHeight); + Graphics g = tmp.getGraphics(); + int ratio = (srcWidth << 16) / cx; + int pos = ratio/2; + + //Horizontal Resize + + for (int x = 0; x < cx; x++) { + g.setClip(x, 0, 1, srcHeight); + g.drawImage(src, x - (pos >> 16), 0, Graphics.LEFT | Graphics.TOP); + pos += ratio; + } + + Image resizedImage = Image.createImage(cx, cy); + g = resizedImage.getGraphics(); + ratio = (srcHeight << 16) / cy; + pos = ratio/2; + + //Vertical resize + + for (int y = 0; y < cy; y++) { + g.setClip(0, y, cx, 1); + g.drawImage(tmp, 0, y - (pos >> 16), Graphics.LEFT | Graphics.TOP); + pos += ratio; + } + return resizedImage; + + }//resize image +} \ No newline at end of file diff --git a/export/javame/hangman/simple/hangman-1.class b/export/javame/hangman/simple/hangman-1.class new file mode 100755 index 0000000000000000000000000000000000000000..4526be0ef1f47af1acc7bc1616a118eb0edad8bf GIT binary patch literal 718 zcmah{T~8B16g|@xwp|ucKo9|`wVGNIR}$VzOiYQ1y3q#+@6+AU4%yC{-6^p@%fyew z2Y-M+ig0FG)R)FhX6~K4=bkzD-uZp`^A~^+k9{m)yM+dJeC*Gz0o4Gh@ff>X?8dZM1zM5cK{ao}LLbhFPKnRw8ZGyXj=4@>4lV8Ci|8 zSf*z(*X~>e8}1qbkmj{9Dj%k@C=?@0H>BMIUc4M<6G}*4##U!W;B7BDmlyJLIMH#Q zsYJVQn8wLehr?^=U_Rnl7oSo&b20`_vS2x#`S2S;0x9gteBi&l0{%%h&13aSyW)eY ziO-zu06sbaJTyH#3eZJ|t*rpv1A*HP6sBx@_OEJJSMhNY zCbRm(>{t~x&t@t?oAX{^#}~O)oeJ6(-vdzN^0DNmLGO^~GSdG6(ck}u+Lscu%-!Vz zTe!tND19F*WOI{T!+OQ=hPKXFv;P&f@2LOH_ex>Ll15ehsWT?$L z4QAqf9SQVQ_octrkp8kjE{bIse`q!ZEOjU_TKy^yWLXF0wJ#qJJ=KhLVDdywU^>}5 zEH|_l2CAmbR=MugTDrWVqh?(mnOcUlDO-_BNS&IB;xIT$7Ma415#87Fy})ndWu4qR z0?tOz3O%)|jd(ZJw_vom=tDn6e^N&k=^scM81A6aWk*d~3Y}UM0GZZ&Uxk&rj3N~o zrl&R*T|C2c8!uce;iZdLcr9S3IDxz&zhbhXYjqWu*Vk4!vE9v3`|(CBy>FYL^o-)d zMNf^xsSX_18pT73R9p!fJc(LWN3o(*f%(GCZN8GcY-)AVd#M(iyQkvxgalSQ@?Ube zT)bIA%EME3jQUm>DxWPWc4WPzBe@(#aW3iHx@=+`z5E8uli^|UoH-689|vy*=kD24 zh-1E38045uf`holcekB@Aq;aRFmeI@L9#B!W<>Q2*7hm7s^5`YpF2T!=?vLza@r@z z&HhAB=>*O(!4@1=H!xFX0y&ODjE*pVhdZMrzs<-!JjNKNkxwM#ncq*;DEBN=Fco9r z2~l^+`-ag6-0Op7qqiHvW;%(vuoH+N<+ -1 && readChar != '\n') { + + // Append the read character to the string. Some operating systems + // such as Microsoft Windows prepend newline character ('\n') with + // carriage return ('\r'). This is part of the newline character and + // therefore an exception that should not be appended to the string. + if (readChar != '\r') { + string.append( (char )readChar); + } + + // Read the next character + readChar = reader.read(); + } + return string.toString(); + } + + private void LoadLocales() throws IOException{ + m_hashLocales = new Hashtable(); + + Class c = this.getClass(); + InputStream is = c.getResourceAsStream( "hangman/language.txt"); + InputStreamReader reader = new InputStreamReader( is, "UTF-8"); + String line = null; + String key, data; + + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader)) != null) { + int pos = line.indexOf( "="); + if( pos >= 0){ + key = line.substring( 0, pos); + data = line.substring( pos+1); + m_hashLocales.put(key, data); + } + } + reader.close(); + } + + protected boolean SetCurrentWord( String line) throws IOException{ + + int pos=line.indexOf( '='); + if( pos == -1){ + return false; + } + m_answer = line.substring( 0, pos); + m_question = line.substring( pos+1); + + return true; + } + + protected int SelectWord( String fname) throws IOException{ + Class c = this.getClass(); + InputStream is = c.getResourceAsStream( fname); + InputStreamReader reader = new InputStreamReader( is, "UTF-8"); + String line = null; + int count=0; + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader)) != null) { + // Append the read line to the main form with a linefeed ('\n') + count = count + 1; + } + reader.close(); + + //select randomly one word + Random r = new Random(); + int curline = r.nextInt(); + curline = curline % count; + if( curline < 0) + curline = curline + count; + + InputStreamReader reader2 = new InputStreamReader( + getClass().getResourceAsStream(fname), "UTF-8"); + int i = 0; + + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader2)) != null) { + if( i == curline){ + line = decrypt( line); + SetCurrentWord( line); + return 1; + } + i = i + 1; + } + reader.close(); + + return 0; + } + + + public void paint(Graphics g) { + switch( m_state){ + case 0: + try { + paint_state_start(g); + } catch (IOException ex) { + ex.printStackTrace(); + } + break; + case 1: + try { + paint_state_play( g); + } catch (StringIndexOutOfBoundsException ex) { + ex.printStackTrace(); + } + break; + case 2: + try { + paint_state_nextword(g); + } catch (IOException ex) { + ex.printStackTrace(); + } + break; + case 3: + paint_state_lose( g); + break; + case 4: + try { + paint_state_win(g); + } catch (IOException ex) { + ex.printStackTrace(); + } + break; + } + } + +private void paint_state_start(Graphics g) throws IOException{ + + m_init_letters = getlocale( "keyboardletters"); + m_init_allletters = m_init_letters; + + String sRemove = "1234567890:#"; + for(int i=0; i < sRemove.length(); i++){ + for(;;){ + int pos = m_init_allletters.indexOf( sRemove.charAt(i)); + if( pos < 0) + break; + m_init_allletters = m_init_allletters.substring( 0, pos) + m_init_allletters.substring( pos+1); + } + } + + m_state = 2; + paint_state_nextword( g); +} + +private void paint_state_nextword(Graphics g) throws IOException{ + m_letters = m_init_letters; + m_allletters = m_init_allletters; + + SelectWord( m_filewords); + + m_lastletter = ""; + int len = m_answer.length(); + m_guess = ""; + m_wrong = ""; + for(int i=0; i < len; i++){ + m_guess = m_guess + "-"; + } + m_wrongletters = 0; + + m_state = 1; //play + paint_state_play( g); +} + +private void paint_state_win(Graphics g) throws IOException{ + m_count_games++; + m_count_wins++; + + m_state = 2; + paint_state_nextword( g); +} + +private void paint_state_lose(Graphics g){ + m_count_games++; + + //clear the screen + g.setColor(255,255,255); + g.fillRect(0, 0, getWidth(), getHeight()); + //set color to black + g.setColor(0,0,0); + //get the font height + + int y=10; + + int iHeight=g.getFont().getHeight(); + + String s = m_answer; + + if( m_wrong.length() > 0){ + s = s + " (" + m_wrong + ")"; + } + + s = s + " [" + String.valueOf( m_count_wins) + "/" + String.valueOf( m_count_games) + "]"; + + y = drawtextmultiline( g, s, 0, y); + + y = drawtextmultiline( g, m_question, 0, y+iHeight); + + m_state = 2; +} + +private void paint_state_play(Graphics g){ + + //clear the screen + g.setColor(255,255,255); + g.fillRect(0, 0, getWidth(), getHeight()); + //set color to black + g.setColor(0,0,0); + //get the font height + + int y=0; + Font font = g.getFont(); + + int iHeight=g.getFont().getHeight(); + + String s = m_guess; + if( m_wrong.compareTo( "") != 0){ + s = s + " (" + m_wrong + ")"; + } + + s = s + " (" + String.valueOf( m_count_wins) + "/" + String.valueOf( m_count_games) + ")"; + + y = drawtextmultiline( g, s, 0, y); + + int x = getWidth() - 3 * font.charWidth( '-'); + y = drawtextmultiline( g, mMessage, x, y) + iHeight; + + y = drawtextmultiline( g, m_question, 0, y) + iHeight; + + Image im = null; + try { + String filename = "/hangman/hangman_" + String.valueOf(m_wrongletters) + ".jpg"; + im = Image.createImage( filename); + } catch (IOException ex) { + ex.printStackTrace(); + } + + int xMul = (100 * getWidth()) / im.getWidth(); + int yMul = (100 * (getHeight() - y)) / im.getHeight(); + + if( yMul < xMul){ + xMul = yMul; + } + int cx = (xMul * im.getWidth()) / 100; + int cy = (yMul * im.getHeight()) / 100; + Image resize = resizeImage( im, cx, cy); + + g.drawImage(resize, 0, y, Graphics.LEFT | Graphics.TOP); + } + + protected int drawtextmultiline(Graphics g, String text, int x, int y){ + Font font = g.getFont(); + int fontHeight = font.getHeight(); + //change string to char data + char[] data = new char[text.length()]; + text.getChars(0, text.length(), data, 0); + int width = getWidth(); + int lineWidth = 0; + int charWidth = 0; + int xStart = x; + char ch; + for(int ccnt=0; ccnt < data.length; ccnt++) + { + ch = data[ccnt]; + //measure the char to draw + charWidth = font.charWidth(ch); + lineWidth = lineWidth + charWidth; + //see if a new line is needed + if (lineWidth > width) + { + y = y + fontHeight; + lineWidth = 0; + x = xStart; + } + //draw the char + g.drawChar(ch, x, y, + Graphics.TOP|Graphics.LEFT); + x = x + charWidth; + } + + return y; + } + + protected void keyPressed(int keyCode) { + char number; + + if( m_state == 2){ + repaint(); + return; + } + + if( (keyCode >= 49) && (keyCode <= 57)){ + String numbers = "123456789"; + number = numbers.charAt(keyCode - 49); + + int pos = m_letters.indexOf( number + ":"); + String letters = ""; + + String letters2 = m_letters.substring( pos+2); + + if( pos >= 0){ + pos = letters2.indexOf( '#'); + if( pos >= 0){ + letters = letters2.substring( 0, pos); + //Compute the letters that correspond to the key pressed + + if( m_lastletter.compareTo( "") != 0){ + pos = letters.indexOf( m_lastletter); + + if( pos >= 0){ + pos = pos + 1; + if( pos >= letters.length()){ + pos = 0; + } + }else{ + //different key + pos = 0; + } + }else{ + pos = 0; + } + if( (pos < letters.length()) && (pos >= 0)){ + m_lastletter = letters.substring( pos, pos+1); + mMessage = m_lastletter; + repaint(); + } + return; + } + } + + repaint(); + return; + } + + int gameAction = getGameAction(keyCode); + switch (gameAction) { + case FIRE: + OnFire(); + break; + + default: + mMessage = String.valueOf( keyCode); + break; + } + } + + protected void OnFire() { + int pos = m_guess.indexOf( m_lastletter); + if( pos >= 0){ + //Already used + return; + } + + char ch = m_lastletter.charAt( 0); + pos = m_answer.indexOf( ch); + if( pos >= 0){ + //correct letter + //Maybe there are many letters + for(pos=0; pos < m_guess.length();pos++){ + if( m_answer.charAt( pos) == ch){ + m_guess = m_guess.substring( 0, pos) + m_lastletter + m_guess.substring( pos+1); + } + } + + pos = m_allletters.indexOf( m_lastletter); + if( pos >= 0){ + m_allletters = m_allletters.substring( 0, pos) + "." + m_allletters.substring( pos+1); + } + + remove_lastletter_from_keyboard(); + + if( m_guess.indexOf( '-') < 0){ + m_state = 4; //state=win; + } + + repaint(); + return; + } + + pos = m_allletters.indexOf( m_lastletter); + if( pos < 0){ + return; + } + + //wrong letter + m_wrongletters = m_wrongletters + 1; + + pos = m_allletters.indexOf( m_lastletter); + if( pos >= 0){ + m_allletters = m_allletters.substring( 0, pos) + "." + m_allletters.substring( pos+1); + m_wrong = m_wrong + m_lastletter; + } + + remove_lastletter_from_keyboard(); + + if( m_wrongletters >= 6){ + m_state = 3; //state=lose + } + repaint(); + } + + private void remove_lastletter_from_keyboard(){ + int pos = m_letters.indexOf( m_lastletter); + + if( pos >= 0){ + m_letters = m_letters.substring( 0, pos) + m_letters.substring( pos+1); + } + } + + private Image resizeImage(Image src, int cx, int cy) { + int srcWidth = src.getWidth(); + int srcHeight = src.getHeight(); + Image tmp = Image.createImage(cx, srcHeight); + Graphics g = tmp.getGraphics(); + int ratio = (srcWidth << 16) / cx; + int pos = ratio/2; + + //Horizontal Resize + + for (int x = 0; x < cx; x++) { + g.setClip(x, 0, 1, srcHeight); + g.drawImage(src, x - (pos >> 16), 0, Graphics.LEFT | Graphics.TOP); + pos += ratio; + } + + Image resizedImage = Image.createImage(cx, cy); + g = resizedImage.getGraphics(); + ratio = (srcHeight << 16) / cy; + pos = ratio/2; + + //Vertical resize + + for (int y = 0; y < cy; y++) { + g.setClip(0, y, cx, 1); + g.drawImage(tmp, 0, y - (pos >> 16), Graphics.LEFT | Graphics.TOP); + pos += ratio; + } + return resizedImage; + + }//resize image +} diff --git a/export/javame/hangman/simple/lang/el_utf8/language.txt b/export/javame/hangman/simple/lang/el_utf8/language.txt new file mode 100644 index 0000000..dc2fc15 --- /dev/null +++ b/export/javame/hangman/simple/lang/el_utf8/language.txt @@ -0,0 +1,3 @@ +encoding=el_utf8 +exit=Έξοδος +keyboardletters=2:ΑΒΓ#3:ΔΕΖ#4:ΗΘΙ#5:ΚΛΜ#6:ΝΞΟ#7:ΠΡΣ#8:ΤΥΦ#9:ΧΨΩ# diff --git a/export/javame/hangman/simple/lang/en_utf8/language.txt b/export/javame/hangman/simple/lang/en_utf8/language.txt new file mode 100644 index 0000000..b91ae1c --- /dev/null +++ b/export/javame/hangman/simple/lang/en_utf8/language.txt @@ -0,0 +1,4 @@ +encoding=en_utf8 +exit=Exit +keyboardletters=2:ABC#3:DEF#4:GHI#5:JKL#6:MNO#7:PQRS#8:TUV#9:WXYZ# + diff --git a/export/javame/hangman/simple/lang/es_utf8/language.txt b/export/javame/hangman/simple/lang/es_utf8/language.txt new file mode 100644 index 0000000..64ad1d1 --- /dev/null +++ b/export/javame/hangman/simple/lang/es_utf8/language.txt @@ -0,0 +1,4 @@ +encoding=es_utf8 +exit=Salir +keyboardletters=2:ABC2ÁªÀÇ#3:DEF3ÉÈ#4:GHI4ÍÌ#5:JKL5#6:MNÑO6ÓÒº#7:PQRS7#8:TUV8ÚÜÙ#9:WXYZ9# + diff --git a/export/javame/hangmanp/simple/hangmanp-1.class b/export/javame/hangmanp/simple/hangmanp-1.class new file mode 100644 index 0000000000000000000000000000000000000000..15484b5eb6179a3c4467f2ea86f3ec6d21780a39 GIT binary patch literal 724 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 literal 0 HcmV?d00001 diff --git a/export/javame/hangmanp/simple/keycanvasp.java b/export/javame/hangmanp/simple/keycanvasp.java new file mode 100644 index 0000000..06009b7 --- /dev/null +++ b/export/javame/hangmanp/simple/keycanvasp.java @@ -0,0 +1,570 @@ +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import javax.microedition.lcdui.Image; +import javax.microedition.lcdui.Canvas; +import javax.microedition.lcdui.Command; +import javax.microedition.lcdui.Font; +import javax.microedition.lcdui.Graphics; +import java.util.Hashtable; +import java.util.Random; + +class keycanvasp extends Canvas { + //private Font mFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_MEDIUM); + + private String mMessage = ""; + + private String m_letters; + private String m_lastletter; + + private String m_dirphoto; + //read from photo.txt + private String m_file; + private String m_answer; + private String m_info; + + //private String m_question; + private String m_allletters; + private String m_guess; + private String m_wrong; + private int m_wrongletters; + private int m_state=0; + //0=start 1=play 2=next word 3=lose 4=win + private String m_init_letters; + private String m_init_allletters; + private int m_count_games=0; + private int m_count_wins=0; + public Hashtable m_hashLocales; + private int m_keysize = 0; + private int [] m_key; + + public keycanvasp() throws IOException { + m_state = 0; + + m_key = new int[ m_keysize+1]; + m_key[ 0] = 0; + + SelectFileWords(); + LoadLocales(); + + addCommand(new Command( getlocale( "exit"), Command.EXIT, 0)); + } + + private String decrypt( String s){ + String ret=""; + + if( m_keysize <=0 ){ + return s; + } + + int len=s.length(); + for(int i=0; i < len; i+=m_keysize){ + for(int j=0; j < m_keysize; j++){ + int pos=i + m_key[ j]; + if( pos < len){ + ret = ret + s.charAt( pos); + } + } + } + + return ret; + } + + private String getlocale( String key){ + return (String)m_hashLocales.get( key); + } + + private void SelectFileWords() throws IOException{ + Class c = this.getClass(); + InputStream is = c.getResourceAsStream( "hangmanp/hangmanp.txt"); + InputStreamReader reader = new InputStreamReader( is, "UTF-8"); + + String line = null; + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader)) != null) { + int pos = line.indexOf( "="); + if( pos >= 0){ + m_dirphoto = "/hangmanp/" + line.substring( 0, pos); + } + break; + } + reader.close(); + } + + private String readLine(InputStreamReader reader) throws IOException { + // Test whether the end of file has been reached. If so, return null. + int readChar = reader.read(); + if (readChar <= -1) { + return null; + } + StringBuffer string = new StringBuffer(); + // Read until end of file or new line + while (readChar > -1 && readChar != '\n') { + + // Append the read character to the string. Some operating systems + // such as Microsoft Windows prepend newline character ('\n') with + // carriage return ('\r'). This is part of the newline character and + // therefore an exception that should not be appended to the string. + if (readChar != '\r') { + string.append( (char )readChar); + } + + // Read the next character + readChar = reader.read(); + } + return string.toString(); + } + + private void LoadLocales() throws IOException{ + m_hashLocales = new Hashtable(); + + Class c = this.getClass(); + InputStream is = c.getResourceAsStream( "hangmanp/language.txt"); + InputStreamReader reader = new InputStreamReader( is, "UTF-8"); + String line = null; + String key, data; + + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader)) != null) { + int pos = line.indexOf( "="); + if( pos >= 0){ + key = line.substring( 0, pos); + data = line.substring( pos+1); + m_hashLocales.put(key, data); + } + } + reader.close(); + } + + protected boolean SetCurrentWord( String line) throws IOException{ + + int pos=line.indexOf( '='); + if( pos == -1){ + return false; + } + m_file = line.substring( 0, pos); + m_answer = line.substring( pos+1); + + pos=m_answer.indexOf( ','); + if( pos == -1){ + m_info = ""; + }else + { + m_info = line.substring( pos+1); + m_answer = line.substring( 0, pos); + } + + return true; + } + + protected int SelectWord( String fname) throws IOException{ + Class c = this.getClass(); + InputStream is = c.getResourceAsStream( fname); + + if( is == null) + is = c.getResourceAsStream( fname); + + if( is == null) + { + fname = "/hangmanp/01/photo.txt"; + is = c.getResourceAsStream( fname); + } + + InputStreamReader reader = new InputStreamReader( is, "UTF-8"); + String line = null; + int count=0; + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader)) != null) { + // Append the read line to the main form with a linefeed ('\n') + count = count + 1; + } + reader.close(); + + //select randomly one word + Random r = new Random(); + int curline = r.nextInt(); + curline = curline % count; + if( curline < 0) + curline = curline + count; + + is = c.getResourceAsStream( fname); + InputStreamReader reader2 = new InputStreamReader( is, "UTF-8"); + int i = 0; + + // Read a single line from the file. null represents the EOF. + while ((line = readLine(reader2)) != null) { + if( i == curline){ + line = decrypt( line); + SetCurrentWord( line); + return 1; + } + i = i + 1; + } + reader.close(); + + return 0; + } + + + public void paint(Graphics g) { + switch( m_state){ + case 0: + try { + paint_state_start(g); + } catch (IOException ex) { + ex.printStackTrace(); + } + break; + case 1: + try { + paint_state_play( g); + } catch (StringIndexOutOfBoundsException ex) { + ex.printStackTrace(); + } + break; + case 2: + try { + paint_state_nextword(g); + } catch (IOException ex) { + ex.printStackTrace(); + } + break; + case 3: + paint_state_lose( g); + break; + case 4: + try { + paint_state_win(g); + } catch (IOException ex) { + ex.printStackTrace(); + } + break; + } + } + +private void paint_state_start(Graphics g) throws IOException{ + + m_init_letters = getlocale( "keyboardletters"); + m_init_allletters = m_init_letters; + + String sRemove = "1234567890:#"; + for(int i=0; i < sRemove.length(); i++){ + for(;;){ + int pos = m_init_allletters.indexOf( sRemove.charAt(i)); + if( pos < 0) + break; + m_init_allletters = m_init_allletters.substring( 0, pos) + m_init_allletters.substring( pos+1); + } + } + + m_state = 2; + paint_state_nextword( g); +} + +private void paint_state_nextword(Graphics g) throws IOException{ + m_letters = m_init_letters; + m_allletters = m_init_allletters; + + SelectWord( m_dirphoto + "/photo.txt"); + + m_lastletter = ""; + int len = m_answer.length(); + m_guess = ""; + m_wrong = ""; + for(int i=0; i < len; i++){ + m_guess = m_guess + "-"; + } + m_wrongletters = 0; + + m_state = 1; //play + paint_state_play( g); +} + +private void paint_state_win(Graphics g) throws IOException{ + m_count_games++; + m_count_wins++; + + m_state = 2; + paint_state_nextword( g); +} + +private void paint_state_lose(Graphics g){ + m_count_games++; + + //clear the screen + g.setColor(255,255,255); + g.fillRect(0, 0, getWidth(), getHeight()); + //set color to black + g.setColor(0,0,0); + //get the font height + + int y=10; + + int iHeight=g.getFont().getHeight(); + + String s = m_answer; + + if( m_wrong.length() > 0){ + s = s + " (" + m_wrong + ")"; + } + + s = s + " [" + String.valueOf( m_count_wins) + "/" + String.valueOf( m_count_games) + "]"; + + y = drawtextmultiline( g, s, 0, y); + + y = drawtextmultiline( g, m_info, 0, y+iHeight); + + m_state = 2; +} + +private void paint_state_play(Graphics g){ + + //clear the screen + g.setColor(255,255,255); + g.fillRect(0, 0, getWidth(), getHeight()); + //set color to black + g.setColor(0,0,0); + //get the font height + + int y=0; + Font font = g.getFont(); + + int iHeight=g.getFont().getHeight(); + + String s = m_guess; + if( m_wrong.compareTo( "") != 0){ + s = s + " (" + m_wrong + ")"; + } + + s = s + " (" + String.valueOf( m_count_wins) + "/" + String.valueOf( m_count_games) + ")"; + + y = drawtextmultiline( g, s, 0, y); + + int x = getWidth() - 3 * font.charWidth( '-'); + y = drawtextmultiline( g, mMessage, x, y) + iHeight; + + y = drawtextmultiline( g, m_info, 0, y) + iHeight; + + Image im = null; + try { + String filename = m_dirphoto + "/" + m_file; + im = Image.createImage( filename); + } catch (IOException ex) { + ex.printStackTrace(); + } + + if( im == null) + { + try { + String filename = "/hangmanp/01/"; + filename = filename + m_file; + im = Image.createImage(filename); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + int xMul = (100 * getWidth()) / im.getWidth(); + int yMul = (100 * (getHeight() - y)) / im.getHeight(); + + if( yMul < xMul){ + xMul = yMul; + } + int cx = (xMul * im.getWidth()) / 100; + int cy = (yMul * im.getHeight()) / 100; + Image resize = resizeImage( im, cx, cy); + + g.drawImage(resize, 0, y, Graphics.LEFT | Graphics.TOP); + } + + protected int drawtextmultiline(Graphics g, String text, int x, int y){ + Font font = g.getFont(); + int fontHeight = font.getHeight(); + //change string to char data + char[] data = new char[text.length()]; + text.getChars(0, text.length(), data, 0); + int width = getWidth(); + int lineWidth = 0; + int charWidth = 0; + int xStart = x; + char ch; + for(int ccnt=0; ccnt < data.length; ccnt++) + { + ch = data[ccnt]; + //measure the char to draw + charWidth = font.charWidth(ch); + lineWidth = lineWidth + charWidth; + //see if a new line is needed + if (lineWidth > width) + { + y = y + fontHeight; + lineWidth = 0; + x = xStart; + } + //draw the char + g.drawChar(ch, x, y, + Graphics.TOP|Graphics.LEFT); + x = x + charWidth; + } + + return y; + } + + protected void keyPressed(int keyCode) { + char number; + + if( m_state == 2){ + repaint(); + return; + } + + if( (keyCode >= 49) && (keyCode <= 57)){ + String numbers = "123456789"; + number = numbers.charAt(keyCode - 49); + + int pos = m_letters.indexOf( number + ":"); + String letters = ""; + + String letters2 = m_letters.substring( pos+2); + + if( pos >= 0){ + pos = letters2.indexOf( '#'); + if( pos >= 0){ + letters = letters2.substring( 0, pos); + //Compute the letters that correspond to the key pressed + + if( m_lastletter.compareTo( "") != 0){ + pos = letters.indexOf( m_lastletter); + + if( pos >= 0){ + pos = pos + 1; + if( pos >= letters.length()){ + pos = 0; + } + }else{ + //different key + pos = 0; + } + }else{ + pos = 0; + } + if( (pos < letters.length()) && (pos >= 0)){ + m_lastletter = letters.substring( pos, pos+1); + mMessage = m_lastletter; + repaint(); + } + return; + } + } + + repaint(); + return; + } + + int gameAction = getGameAction(keyCode); + switch (gameAction) { + case FIRE: + OnFire(); + break; + + default: + mMessage = String.valueOf( keyCode); + break; + } + } + + protected void OnFire() { + int pos = m_guess.indexOf( m_lastletter); + if( pos >= 0){ + //Already used + return; + } + + char ch = m_lastletter.charAt( 0); + pos = m_answer.indexOf( ch); + if( pos >= 0){ + //correct letter + //Maybe there are many letters + for(pos=0; pos < m_guess.length();pos++){ + if( m_answer.charAt( pos) == ch){ + m_guess = m_guess.substring( 0, pos) + m_lastletter + m_guess.substring( pos+1); + } + } + + pos = m_allletters.indexOf( m_lastletter); + if( pos >= 0){ + m_allletters = m_allletters.substring( 0, pos) + "." + m_allletters.substring( pos+1); + } + + remove_lastletter_from_keyboard(); + + if( m_guess.indexOf( '-') < 0){ + m_state = 4; //state=win; + } + + repaint(); + return; + } + + pos = m_allletters.indexOf( m_lastletter); + if( pos < 0){ + return; + } + + //wrong letter + m_wrongletters = m_wrongletters + 1; + + pos = m_allletters.indexOf( m_lastletter); + if( pos >= 0){ + m_allletters = m_allletters.substring( 0, pos) + "." + m_allletters.substring( pos+1); + m_wrong = m_wrong + m_lastletter; + } + + remove_lastletter_from_keyboard(); + + if( m_wrongletters >= 6){ + m_state = 3; //state=lose + } + repaint(); + } + + private void remove_lastletter_from_keyboard(){ + int pos = m_letters.indexOf( m_lastletter); + + if( pos >= 0){ + m_letters = m_letters.substring( 0, pos) + m_letters.substring( pos+1); + } + } + + private Image resizeImage(Image src, int cx, int cy) { + int srcWidth = src.getWidth(); + int srcHeight = src.getHeight(); + Image tmp = Image.createImage(cx, srcHeight); + Graphics g = tmp.getGraphics(); + int ratio = (srcWidth << 16) / cx; + int pos = ratio/2; + + //Horizontal Resize + + for (int x = 0; x < cx; x++) { + g.setClip(x, 0, 1, srcHeight); + g.drawImage(src, x - (pos >> 16), 0, Graphics.LEFT | Graphics.TOP); + pos += ratio; + } + + Image resizedImage = Image.createImage(cx, cy); + g = resizedImage.getGraphics(); + ratio = (srcHeight << 16) / cy; + pos = ratio/2; + + //Vertical resize + + for (int y = 0; y < cy; y++) { + g.setClip(0, y, cx, 1); + g.drawImage(tmp, 0, y - (pos >> 16), Graphics.LEFT | Graphics.TOP); + pos += ratio; + } + return resizedImage; + + }//resize image +} \ No newline at end of file diff --git a/export/javame/hangmanp/simple/lang/el_utf8/language.txt b/export/javame/hangmanp/simple/lang/el_utf8/language.txt new file mode 100644 index 0000000..dc2fc15 --- /dev/null +++ b/export/javame/hangmanp/simple/lang/el_utf8/language.txt @@ -0,0 +1,3 @@ +encoding=el_utf8 +exit=Έξοδος +keyboardletters=2:ΑΒΓ#3:ΔΕΖ#4:ΗΘΙ#5:ΚΛΜ#6:ΝΞΟ#7:ΠΡΣ#8:ΤΥΦ#9:ΧΨΩ# diff --git a/export/javame/hangmanp/simple/lang/en_utf8/language.txt b/export/javame/hangmanp/simple/lang/en_utf8/language.txt new file mode 100644 index 0000000..b91ae1c --- /dev/null +++ b/export/javame/hangmanp/simple/lang/en_utf8/language.txt @@ -0,0 +1,4 @@ +encoding=en_utf8 +exit=Exit +keyboardletters=2:ABC#3:DEF#4:GHI#5:JKL#6:MNO#7:PQRS#8:TUV#9:WXYZ# + diff --git a/export/javame/hangmanp/simple/lang/es_utf8/language.txt b/export/javame/hangmanp/simple/lang/es_utf8/language.txt new file mode 100644 index 0000000..64ad1d1 --- /dev/null +++ b/export/javame/hangmanp/simple/lang/es_utf8/language.txt @@ -0,0 +1,4 @@ +encoding=es_utf8 +exit=Salir +keyboardletters=2:ABC2ÁªÀÇ#3:DEF3ÉÈ#4:GHI4ÍÌ#5:JKL5#6:MNÑO6ÓÒº#7:PQRS7#8:TUV8ÚÜÙ#9:WXYZ9# + diff --git a/exporthtml.php b/exporthtml.php new file mode 100644 index 0000000..c0e7084 --- /dev/null +++ b/exporthtml.php @@ -0,0 +1,256 @@ +gamekind == 'cross'){ + $destdir = "{$CFG->dataroot}/{$game->course}/export"; + if( !file_exists( $destdir)){ + mkdir( $destdir); + } + game_OnExportHTML_cross( $game, $html, $destdir); + return; + } + + $destdir = game_export_createtempdir(); + + switch( $game->gamekind){ + case 'hangman': + game_OnExportHTML_hangman( $game, $html, $destdir); + break; + case 'millionaire': + game_OnExportHTML_millionaire( $game, $html, $destdir); + break; + case 'snakes': + game_OnExportHTML_snakes( $game, $html, $destdir); + break; + } + + remove_dir( $destdir); + } + + function game_OnExportHTML_cross( $game, $html, $destdir){ + + global $CFG; + + if( $html->filename == ''){ + $html->filename = 'cross'; + } + + $filename = $html->filename . '.htm'; + + require( "cross/play.php"); + $attempt = game_getattempt( $game, $crossrec); + if( $crossrec == false){ + game_cross_new( $game, $game->id, $crossm); + $attempt = game_getattempt( $game, $crossrec); + } + + $ret = game_export_printheader( $html->title); + + echo "$ret
    "; + + ob_start(); + + game_cross_play( 0, $game, $attempt, $crossrec, '', true, false, false, false, $html->checkbutton, true, $html->printbutton, false); + + $output_string = ob_get_contents(); + ob_end_clean(); + + $course = get_record_select( 'course', "id={$game->course}"); + + $filename = $html->filename . '.htm'; + + file_put_contents( $destdir.'/'.$filename, $ret . "\r\n" . $output_string); + game_send_stored_file($destdir.'/'.$filename); + } + + function game_export_printheader( $title, $showbody=true) + { + $ret = ''."\n"; + $ret .= ''."\n"; + $ret .= "\n"; + $ret .= ''."\n"; + $ret .= ''."\n"; + $ret .= "$title\n"; + $ret .= "\n"; + if( $showbody) + $ret .= ""; + + return $ret; + } + + function game_OnExportHTML_hangman( $game, $html, $destdir){ + + global $CFG; + + if( $html->filename == ''){ + $html->filename = 'hangman'; + } + + if( $game->param10 <= 0) + $game->param10 = 6; + + $filename = $html->filename . '.htm'; + + $ret = game_export_printheader( $html->title, false); + $ret .= "\r\r"; + + $export_attachment = ( $html->type == 'hangmanp'); + $map = game_exmportjavame_getanswers( $game, $export_attachment); + if( $map == false){ + error( 'No Questions'); + } + + ob_start(); + + //Here is the code of hangman + require( "exporthtml_hangman.php"); + + $output_string = ob_get_contents(); + ob_end_clean(); + + $courseid = $game->course; + $course = get_record_select( 'course', "id=$courseid"); + + $filename = $html->filename . '.htm'; + + file_put_contents( $destdir.'/'.$filename, $ret . "\r\n" . $output_string); + + if( $html->type != 'hangmanp') + { + //Not copy the standard pictures when we use the "Hangman with pictures" + $src = $CFG->dirroot.'/mod/game/hangman/1'; + game_copyfiles( $src, $destdir); + } + + $filezip = game_create_zip( $destdir, $courseid, $html->filename.'.zip'); + game_send_stored_file($filezip); + } + + + function game_OnExportHTML_millionaire( $game, $html, $destdir){ + + global $CFG; + + if( $html->filename == ''){ + $html->filename = 'millionaire'; + } + + $filename = $html->filename . '.htm'; + + $ret = game_export_printheader( $html->title, false); + $ret .= "\r\r"; + + $questions = game_millionaire_html_getquestions( $game, $maxquestions, $countofquestions); + ob_start(); + + game_millionaire_html_print( $game, $questions, $maxquestions); + + //End of millionaire code + $output_string = ob_get_contents(); + ob_end_clean(); + + $courseid = $game->course; + $course = get_record_select( 'course', "id=$courseid"); + + $filename = $html->filename . '.htm'; + + file_put_contents( $destdir.'/'.$filename, $ret . "\r\n" . $output_string); + + //Copy the standard pictures of Millionaire + $src = $CFG->dirroot.'/mod/game/millionaire/1'; + game_copyfiles( $src, $destdir); + + $filezip = game_create_zip( $destdir, $courseid, $html->filename.'.zip'); + game_send_stored_file($filezip); + } + + function game_OnExportHTML_snakes( $game, $html, $destdir){ + + global $CFG; + + if( $html->filename == ''){ + $html->filename = 'snakes'; + } + + $filename = $html->filename . '.htm'; + + $ret = ''; + + $board = get_record_select( 'game_snakes_database', 'id='.$game->param3); + + if( ($game->sourcemodule == 'quiz') or ($game->sourcemodule == 'question')) + $questionsM = game_millionaire_html_getquestions( $game, $maxquestions, $countofquestionsM, $retfeedback); + else + { + $questionsM = array(); + $countofquestionsM = 0; + $retfeedback = ''; + } + $questionsS = game_exmportjavame_getanswers( $game, false); + + ob_start(); + + //Here is the code of hangman + require( "exporthtml_snakes.php"); + + $output_string = ob_get_contents(); + ob_end_clean(); + + $courseid = $game->course; + $course = get_record_select( 'course', "id=$courseid"); + + $filename = $html->filename . '.htm'; + + file_put_contents( $destdir.'/'.$filename, $ret . "\r\n" . $output_string); + + $src = $CFG->dirroot.'/mod/game/export/html/snakes'; + game_copyfiles( $src, $destdir); + + mkdir( $destdir .'/css'); + $src = $CFG->dirroot.'/mod/game/export/html/snakes/css'; + game_copyfiles( $src, $destdir.'/css'); + + mkdir( $destdir .'/js'); + $src = $CFG->dirroot.'/mod/game/export/html/snakes/js'; + game_copyfiles( $src, $destdir.'/js'); + + mkdir( $destdir .'/images'); + $src = $CFG->dirroot.'/mod/game/snakes/1'; + game_copyfiles( $src, $destdir.'/images'); + copy( $CFG->dirroot.'/mod/game/snakes/boards/'.$board->fileboard, $destdir.'/images/'.$board->fileboard); + + $filezip = game_create_zip( $destdir, $courseid, $html->filename.'.zip'); + game_send_stored_file($filezip); + } + + function game_copyfiles( $src, $destdir) + { + $handle = opendir( $src); + while (($item = readdir($handle)) !== false) + { + if( $item == '.' or $item == '..') + continue; + + if( strpos( $item, '.') === false) + continue; + + if(is_dir($src.'/'.$item)) + continue; + + copy( $src.'/'.$item, $destdir.'/'.$item); + } + closedir($handle); + } + diff --git a/exporthtml_hangman.php b/exporthtml_hangman.php new file mode 100644 index 0000000..f80b058 --- /dev/null +++ b/exporthtml_hangman.php @@ -0,0 +1,361 @@ + + + + +
    +<?php print_string('hangman', 'game') ?> +
    +
    +
    +
    +
    + + + diff --git a/exporthtml_millionaire.php b/exporthtml_millionaire.php new file mode 100644 index 0000000..3b2d553 --- /dev/null +++ b/exporthtml_millionaire.php @@ -0,0 +1,521 @@ +sourcemodule != 'quiz') and ($game->sourcemodule != 'question')){ + error( get_string('millionaire_sourcemodule_must_quiz_question', 'game')); + } + + if( $game->sourcemodule == 'quiz'){ + if( $game->quizid == 0){ + error( get_string( 'must_select_quiz', 'game')); + } + $select = "qtype='multichoice' AND quiz='$game->quizid' ". + " AND qqi.question=q.id"; + $table = "question q,{$CFG->prefix}quiz_question_instances qqi"; + }else + { + if( $game->questioncategoryid == 0){ + error( get_string( 'must_select_questioncategory', 'game')); + } + + //include subcategories + $select = 'category='.$game->questioncategoryid; + if( $game->subcategories){ + $cats = question_categorylist( $game->questioncategoryid); + if( strpos( $cats, ',') > 0){ + $select = 'category in ('.$cats.')'; + } + } + $select .= " AND qtype='multichoice'"; + + $table = "question q"; + } + $select .= " AND q.hidden=0"; + + $recs = get_records_select( $table, $select, '', "q.id as id, q.questiontext"); + $ret = ''; + $retfeedback = ''; + foreach( $recs as $rec){ + $recs2 = get_records_select( 'question_answers', "question=$rec->id", 'fraction DESC', 'id,answer,feedback'); + $line = $rec->questiontext; + $linefeedback = ''; + foreach( $recs2 as $rec2) + { + $line .= '#'.str_replace( array( '"', '#'), array( "'", ' '), $rec2->answer); + $linefeedback .= '#'.str_replace( array( '"', '#'), array( "'", ' '), $rec2->feedback); + } + if( $ret != '') + $ret .= ",\r"; + $ret .= '"'.base64_encode( $line).'"'; + + if( $retfeedback != '') + $retfeedback .= ",\r"; + $retfeedback .= '"'.base64_encode( $linefeedback).'"'; + + if( count( $recs2) > $max) + $max = count( $recs2); + $countofquestions++; + } + + return $ret; +} + +function game_millionaire_html_print( $game, $questions, $maxquestions) +{ + $color1 = 'black'; + $color2 = 'DarkOrange'; + $colorback="white"; + $stylequestion = "background:$colorback;color:$color1"; + $stylequestionselected = "background:$colorback;color:$color2"; +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +substr( $letters, $i-1, 1); + echo "\n"; + echo "\n"; + echo "\n"; + if( $i == 1) + { + echo "\n"; + } + echo "\n"; +} +?> + + + +
    >              >        
    +  +  +  +  + style='background:#408080'>      15      150000
    14 800000
    13 400000
    aa
    12 200000
    11 10000
    10 5000
    9 4000
    8 2000
    7 1500
    6 1000
    5 500
    4 400
    3 300
    2 200
    1 100
         
    "; + echo ""; + echo "  
         
    + + + + + + + + + +<?php echo $html->title;?> + + + + + + + + + + + + + + + + + + + diff --git a/exportjavame.php b/exportjavame.php new file mode 100644 index 0000000..5a545a7 --- /dev/null +++ b/exportjavame.php @@ -0,0 +1,325 @@ +course; + $course = get_record_select( 'course', "id=$courseid"); + + $destdir = game_export_createtempdir(); + + if( $javame->type == 'hangmanp'){ + $destmobiledir = 'hangmanp'; + }else{ + $destmobiledir = 'hangman'; + } + $src = $CFG->dirroot.'/mod/game/export/javame/'.$destmobiledir.'/simple'; + + if( $javame->filename == ''){ + $javame->filename = 'moodle'.$destmobiledir; + } + + $handle = opendir( $src); + while (false!==($item = readdir($handle))) { + if($item != '.' && $item != '..') { + if(!is_dir($src.'/'.$item)) { + $itemdest = $item; + + if( substr( $item, -5) == '.java'){ + continue; //don't copy the java source code files + } + + if( substr( $itemdest, -8) == '-1.class'){ + $itemdest = substr( $itemdest, 0, -8).'$1.class'; + } + + copy( $src.'/'.$item, $destdir.'/'.$itemdest); + } + } + } + + mkdir( $destdir.'/META-INF'); + + game_exportjavame_exportdata( $src, $destmobiledir, $destdir, $game, $javame->maxpicturewidth, $javame->maxpictureheight); + + game_create_manifest_mf( $destdir.'/META-INF', $javame, $destmobiledir); + + $filejar = game_create_jar( $destdir, $course, $javame); + if( $filejar == ''){ + $filezip = game_create_zip( $destdir, $course->id, $javame->filename.'.zip'); + }else{ + $filezip = ''; + } + + if( $destdir != ''){ + remove_dir( $destdir); + } + + if( $filezip != ''){ + echo "unzip the $filezip in a directory and when you are in this directory use the command
    jar cvfm {$javame->filename}.jar META-INF/MANIFEST.MF
    to produce the jar files

    "; + } + + $file = ($filejar != '' ? $filejar : $filezip); + $fullfile = "{$CFG->dataroot}/$courseid/export/$file"; + game_send_stored_file( $fullfile); + } + + function game_exportjavame_exportdata( $src, $destmobiledir, $destdir, $game, $maxwidth, $maxheight){ + global $CFG; + + mkdir( $destdir.'/'.$destmobiledir); + + $handle = opendir( $src); + while (false!==($item = readdir($handle))) { + if($item != '.' && $item != '..') { + if(!is_dir($src.'/'.$item)) { + if( substr( $item, -4) == '.jpg'){ + copy( $src.'/'.$item, $destdir."/$destmobiledir/".$item); + } + } + } + } + + $lang = $game->language; + if( $lang == '') + $lang = current_language(); + copy( $src. '/lang/'.$lang.'/language.txt', $destdir."/$destmobiledir/language.txt"); + + $export_attachment = ( $destmobiledir == 'hangmanp'); + + $map = game_exmportjavame_getanswers( $game, $export_attachment); + if( $map == false){ + error( 'No Questions'); + } + + if( $destmobiledir == 'hangmanp'){ + game_exportjavame_exportdata_hangmanp( $src, $destmobiledir, $destdir, $game, $map, $maxwidth, $maxheight); + return; + } + + $fp = fopen( $destdir."/$destmobiledir/hangman.txt","w"); + fputs( $fp, "1.txt=$destmobiledir\r\n"); + fclose( $fp); + + $fp = fopen( $destdir."/$destmobiledir/1.txt","w"); + foreach( $map as $line){ + $s = game_upper( $line->answer) . '=' . $line->question; + fputs( $fp, "$s\r\n"); + } + fclose( $fp); + } + + function game_exportjavame_exportdata_hangmanp( $src, $destmobiledir, $destdir, $game, $map, $maxwidth, $maxheight) + { + global $CFG; + + $fp = fopen( $destdir."/$destmobiledir/$destmobiledir.txt","w"); + fputs( $fp, "01=01\r\n"); + fclose( $fp); + + $destdirphoto = $destdir.'/'.$destmobiledir.'/01'; + mkdir( $destdirphoto); + + $fp = fopen( $destdirphoto.'/photo.txt',"w"); + foreach( $map as $line){ + + $file = $line->attachment; + $pos = strrpos( $file, '.'); + if( $pos != false){ + $file = $line->id.substr( $file, $pos); + $src = $CFG->dataroot.'/'.$game->course.'/moddata/'.$line->attachment; + game_export_javame_smartcopyimage( $src, $destdirphoto.'/'.$file, $maxwidth, $maxheight); + + $s = $file . '=' . game_upper( $line->answer); + fputs( $fp, "$s\r\n"); + } + } + fclose( $fp); + } + + function game_exmportjavame_getanswers( $game, $export_attachment){ + $map = array(); + + switch( $game->sourcemodule){ + case 'question': + return game_exmportjavame_getanswers_question( $game); + case 'glossary': + return game_exmportjavame_getanswers_glossary( $game, $export_attachment); + case 'quiz': + return game_exmportjavame_getanswers_quiz( $game); + } + + return false; + } + + function game_exmportjavame_getanswers_question( $game){ + $select = 'hidden = 0 AND category='.$game->questioncategoryid; + + $select .= game_showanswers_appendselect( $game); + + return game_exmportjavame_getanswers_question_select( $game, 'question', $select, '*', 'questiontext', false, $game->course); + } + + function game_exmportjavame_getanswers_quiz( $game) + { + global $CFG; + + $select = "quiz='$game->quizid' ". + " AND {$CFG->prefix}quiz_question_instances.question={$CFG->prefix}question.id". + " AND {$CFG->prefix}question.hidden=0". + game_showanswers_appendselect( $game); + $table = "question,{$CFG->prefix}quiz_question_instances"; + + return game_exmportjavame_getanswers_question_select( $game, $table, $select, "{$CFG->prefix}question.*", 'category,questiontext', true, $game->course); + } + + function game_exmportjavame_getanswers_question_select( $game, $table, $select, $fields='*', $courseid=0) + { + global $CFG; + + if( ($questions = get_records_select( $table, $select, '', $fields)) === false){ + return; + } + $src = $CFG->dirroot.'/mod/game/export/javame/hangman/simple'; + + $line = 0; + $map = array(); + + foreach( $questions as $question){ + unset( $ret); + $ret->qtype = $question->qtype; + $ret->question = $question->questiontext; + + switch( $question->qtype){ + case 'shortanswer': + $recs = get_records_select( 'question_answers', "question=$question->id", 'fraction DESC', 'id,answer,feedback'); + foreach( $recs as $rec) + { + $ret->answer = $rec->answer; + $ret->feedback = $rec->feedback; + $map[] = $ret; + break; + } + break; + default: + break; + } + } + + return $map; + } + + function game_exmportjavame_getanswers_glossary( $game, $export_attachment) + { + global $CFG; + + $table = 'glossary_entries ge'; + $select = "glossaryid={$game->glossaryid}"; + if( $game->glossarycategoryid){ + $select .= " AND gec.entryid = ge.id ". + " AND gec.categoryid = {$game->glossarycategoryid}"; + $table .= ",{$CFG->prefix}glossary_entries_categories gec"; + } + + if( $export_attachment){ + $select .= " AND attachment <> ''"; + } + + $fields = 'ge.id,definition,concept'; + if( $export_attachment){ + $fields .= ',attachment'; + } + if( ($questions = get_records_select( $table, $select, 'definition', $fields)) === false){ + return false; + } + + $map = array(); + foreach( $questions as $question){ + unset( $ret); + $ret->id = $question->id; + $ret->qtype = 'shortanswer'; + $ret->question = strip_tags( $question->definition); + $ret->answer = $question->concept; + $ret->feedback = ''; + + if( $export_attachment){ + if( $question->attachment != ''){ + $ret->attachment = "glossary/{$game->glossaryid}/$question->id/$question->attachment"; + }else{ + $ret->attachment = ''; + } + } + + $map[] = $ret; + } + + return $map; + } + + function game_create_manifest_mf( $dir, $javame, $destmobiledir){ + + $fp = fopen( $dir.'/MANIFEST.MF',"w"); + fputs( $fp, "Manifest-Version: 1.0\r\n"); + fputs( $fp, "Ant-Version: Apache Ant 1.7.0\r\n"); + fputs( $fp, "Created-By: {$javame->createdby}\r\n"); + fputs( $fp, "MIDlet-1: MoodleHangman,,$destmobiledir\r\n"); + fputs( $fp, "MIDlet-Vendor: {$javame->vendor}\r\n"); + fputs( $fp, "MIDlet-Name: {$javame->vendor}\r\n"); + fputs( $fp, "MIDlet-Description: {$javame->description}\r\n"); + fputs( $fp, "MIDlet-Version: {$javame->version}\r\n"); + fputs( $fp, "MicroEdition-Configuration: CLDC-1.0\r\n"); + fputs( $fp, "MicroEdition-Profile: MIDP-1.0\r\n"); + + fclose( $fp); + } + + function game_create_jar( $srcdir, $course, $javame){ + global $CFG; + + $dir = $CFG->dataroot . '/' . $course->id; + $filejar = $dir . "/export/{$javame->filename}.jar"; + if (!file_exists( $dir)){ + mkdir( $dir); + } + + if (!file_exists( $dir.'/export')){ + mkdir( $dir.'/export'); + } + + if (file_exists( $filejar)){ + unlink( $filejar); + } + + $cmd = "cd $srcdir;jar cvfm $filejar META-INF/MANIFEST.MF *"; + exec( $cmd); + + return (file_exists( $filejar) ? "{$javame->filename}.jar" : ''); + } + + +function game_showanswers_appendselect( $form) +{ + switch( $form->gamekind){ + case 'hangman': + case 'cross': + case 'crypto': + return " AND qtype='shortanswer'"; + case 'millionaire': + return " AND qtype = 'multichoice'"; + case 'sudoku': + case 'bookquiz': + case 'snakes': + return " AND qtype in ('shortanswer', 'truefalse', 'multichoice')"; + } + + return ''; +} + +?> diff --git a/hangman/1/hangman_0.jpg b/hangman/1/hangman_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..913e724e111212b5632f135037841dbf4d350709 GIT binary patch literal 3241 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 literal 0 HcmV?d00001 diff --git a/hangman/1/hangman_1.jpg b/hangman/1/hangman_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa33443531f5115494038cb60726261a92498a7e GIT binary patch literal 3649 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 IhVa0@0QqyfTmS$7 literal 0 HcmV?d00001 diff --git a/hangman/1/hangman_2.jpg b/hangman/1/hangman_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9c3122d5e8d442ec2a8b69f61d6b2cbd0691a1c GIT binary patch literal 3932 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 literal 0 HcmV?d00001 diff --git a/hangman/1/hangman_3.jpg b/hangman/1/hangman_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..354231c7bdf83c360c683a8ea9e1c26c07fa9106 GIT binary patch literal 4176 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 literal 0 HcmV?d00001 diff --git a/hangman/1/hangman_5.jpg b/hangman/1/hangman_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31418ca55df276d57d0ee04ccf02aca60cfac598 GIT binary patch literal 4500 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 literal 0 HcmV?d00001 diff --git a/hangman/1/hangman_6.jpg b/hangman/1/hangman_6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c42dd239de7837074837836e0c2a7bc05e11e80 GIT binary patch literal 4646 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 literal 0 HcmV?d00001 diff --git a/hangman/play.php b/hangman/play.php new file mode 100644 index 0000000..59f1f5b --- /dev/null +++ b/hangman/play.php @@ -0,0 +1,449 @@ +finishedword != 0)){ + //finish with one word and continue to another + if( !set_field( 'game_hangman', 'finishedword', 0, 'id', $hangman->id)){ + error( "game_hangman_continue: Can't update game_hangman"); + } + } + else{ + return game_hangman_play( $id, $game, $attempt, $hangman); + } + } + + $updatehangman = (($attempt != false) and ($hangman != false)); + + $textlib = textlib_get_instance(); + + //new game + + //I try 10 times to find a new question + $found = false; + $min_num = 0; + $unchanged = 0; + for($i=1; $i <= 10; $i++){ + //Check the repetitions later + $rec = game_question_shortanswer($game, $game->param7, false); + if($rec === false){ + continue; + } + + $answer = game_upper($rec->answertext, $game->language); + + $answer2 = $answer; + if( $game->param7){ + //Have to delete space + $answer2 = str_replace(' ', '', $answer2); + } + if( $game->param8){ + //Have to delete - + $answer2 = str_replace('-', '', $answer2); + } + if( $game->language == ''){ + $game->language = game_detectlanguage($answer2); + } + $allletters = game_getallletters($answer2, $game->language); + if($allletters == ''){ + continue; + } + + if($game->param7){ + $allletters .= '_'; + } + if($game->param8){ + $allletters .= '-'; + } + + if($game->param7 == false){ + //I don't allow spaces + if(strpos($answer, " ")){ + continue; + } + } + + $copy = false; + $select2 = "gameid=$game->id AND userid='$USER->id' AND questionid='$rec->questionid' AND glossaryentryid='$rec->glossaryentryid'"; + if(($rec2 = get_record_select('game_repetitions', $select2, 'id,repetitions r')) != false){ + if( ($rec2->r < $min_num) or ($min_num == 0)){ + $min_num = $rec2->r; + $copy = true; + } + } + else{ + $min_num = 0; + $copy = true; + } + + if($copy){ + $found = true; + + $min->questionid = $rec->questionid; + $min->glossaryentryid = $rec->glossaryentryid; + $min->attachment = $rec->attachment; + $min->questiontext = $rec->questiontext; + $min->answerid = $rec->answerid; + $min->answer = $answer; + $min->language = $game->language; + + if($min_num == 0) + break; //We found an unused word + }else + $unchanged++; + + if( $unchanged > 2){ + if( $found) + break; + } + } + + if( $found == false){ + error( get_string( 'no_words', 'game')); + } + + //Found one word for hangman + if( $attempt == false){ + $attempt = game_addattempt( $game); + } + + if( !set_field( 'game_attempts', 'language', $min->language, 'id', $attempt->id)){ + error( "game_cross_play: Can't set language"); + } + + $_GET['newletter'] = ''; + + $query->attemptid = $attempt->id; + $query->gameid = $game->id; + $query->userid = $USER->id; + $query->sourcemodule = $game->sourcemodule; + $query->questionid = $min->questionid; + $query->glossaryentryid = $min->glossaryentryid; + $query->attachment = $min->attachment; + $query->questiontext = addslashes( $min->questiontext); + $query->score = 0; + $query->timelastattempt = time(); + $query->answertext = $min->answer; + $query->answerid = $min->answerid; + if(!($query->id = insert_record('game_queries', $query))){ + print_object($query); + error("game_hangman_continue: Can't insert to table game_queries"); + } + + $newrec->id = $attempt->id; + $newrec->queryid = $query->id; + if($updatehangman == false){ + $newrec->maxtries = $game->param4; + if($newrec->maxtries == 0){ + $newrec->maxtries = 1; + } + $newrec->finishedword = 0; + $newrec->corrects = 0; + } + + $newrec->allletters = $allletters; + + $letters = ''; + if($game->param1){ + $letters .= $textlib->substr($min->answer, 0, 1); + } + if($game->param2){ + $letters .= $textlib->substr($min->answer, -1, 1); + } + $newrec->letters = $letters; + + if($updatehangman == false){ + if(!game_insert_record('game_hangman', $newrec)){ + error( 'game_hangman_continue: error inserting in game_hangman'); + } + } + else{ + if(!update_record( 'game_hangman', $newrec)){ + error( 'game_hangman_continue: error updating in game_hangman'); + } + $newrec = get_record_select( 'game_hangman', "id=$newrec->id"); + } + + game_update_repetitions($game->id, $USER->id, $query->questionid, $query->glossaryentryid); + + game_hangman_play($id, $game, $attempt, $newrec); +} + +function game_hangman_onfinishgame($game, $attempt, $hangman){ + $score = $hangman->corrects / $hangman->maxtries; + + game_updateattempts($game, $attempt, $score, true); + + if(!set_field('game_hangman', 'finishedword', 0, 'id', $hangman->id)){ + error("game_hangman_onfinishgame: Can't update game_hangman"); + } +} + +function game_hangman_play($id, $game, $attempt, $hangman, $onlyshow=false, $showsolution=false) +{ + global $CFG; + + $query = get_record( 'game_queries', 'id', $hangman->queryid); + + game_compute_reserve_print( $attempt, $wordrtl, $reverseprint); + + if( $game->toptext != ''){ + echo $game->toptext.'
    '; + } + $max=$game->param10; // maximum number of wrong + if( $max <= 0) + $max = 6; + hangman_showpage($done, $correct, $wrong, $max, $word_line, $word_line2, $links, $game, $attempt, $hangman, $query, $onlyshow, $showsolution); + + if(!$done){ + if ($wrong > $max){ + $wrong = $max; + } + if( $game->param3 == 0){ + $game->param3 = 1; + } + echo "\r\n
    wwwroot.'/mod/game/hangman/'.$game->param3.'/hangman_'.$wrong.'.jpg"'; + $message = sprintf( get_string( 'hangman_wrongnum', 'game'), $wrong, $max); + echo ' ALIGN="MIDDLE" BORDER="0" HEIGHT="100" alt="'.$message.'"/>'; + + if ($wrong >= $max){ + //This word is incorrect. If reach the max number of word I have to finish else continue with next word + hangman_oninncorrect( $id, $word_line, $query->answertext, $game, $attempt, $hangman); + $query->percent = 0; + } + else{ + $i = $max-$wrong; + if( $i > 1) + echo ' '.get_string( 'hangman_restletters_many', 'game', $i); + else + echo ' '.get_string( 'hangman_restletters_one', 'game'); + if( $reverseprint){ + echo ''; + } + echo "
    \n$word_line\r\n"; + if( $word_line2 != ''){ + echo "
    \n$word_line2\r\n"; + } + if( $reverseprint){ + echo "
    "; + } + if( $hangman->finishedword == false){ + echo "


    ".get_string('hangman_letters', 'game').$links."\r\n"; + } + } + } + else{ + //This word is correct. If reach the max number of word I have to finish else continue with next word + hangman_oncorrect($id, $word_line, $game, $attempt, $hangman, $query); + $query->percent = 1; + } + echo "

    ".get_string('grade', 'game').' : '.round($query->percent * 100).' %'; + if( $hangman->maxtries > 1){ + echo '

    '.get_string('hangman_gradeinstance', 'game').' : '.round($hangman->corrects / $hangman->maxtries * 100).' %'; + } + + if( $game->bottomtext != ''){ + echo '

    '.$game->bottomtext; + } +} +function hangman_showpage(&$done, &$correct, &$wrong, $max, &$word_line, &$word_line2, &$links, $game, &$attempt, &$hangman, &$query, $onlyshow, $showsolution){ + global $USER, $CFG; + + $word = $query->answertext; + + $textlib = textlib_get_instance(); + + $newletter = optional_param('newletter', PARAM_TEXT); + + if($newletter == '_'){ + $newletter = ' '; + } + + $letters = $hangman->letters; + if($newletter != NULL) + { + if($textlib->strpos($letters,$newletter) === false){ + $letters .= $newletter; + } + } + + $links=""; + + $alpha = $hangman->allletters; + $wrong = 0; + + if($game->param5){ + $s = trim( game_filtertext($query->questiontext, $game->course)); + if($s != '.' and $s <> ''){ + echo "
    ".$s.''; + } + if($query->attachment != ''){ + $file = "{$CFG->wwwroot}/file.php/$game->course/moddata/$query->attachment"; + echo ""; + } + echo "

    "; + } + + $word_line = $word_line2 = ""; + + $len = $textlib->strlen( $word); + + $done = 1; + $answer = ''; + for ($x=0; $x < $len; $x++){ + $char = $textlib->substr($word, $x, 1); + + if( $showsolution){ + $word_line2 .= ($char == " " ? '  ' : $char); + $done = 0; + } + + if ( $textlib->strpos($letters, $char) === false){ + $word_line.="_ \r\n"; + $done = 0; + $answer .= '_'; + }else{ + $word_line .= ($char == " " ? '  ' : $char); + $answer .= $char; + } + } + + $correct = 0; + + $len_alpha = $textlib->strlen($alpha); + $fontsize = 5; + + for ($c=0; $c < $len_alpha; $c++){ + $char = $textlib->substr($alpha, $c, 1); + + if ( $textlib->strpos($letters, $char) === false){ + //User didn't select this character + $param_id = optional_param('id', 0, PARAM_INT); + $params = 'id='.$param_id.'&newletter='.urlencode( $char); + if( $onlyshow or $showsolution){ + $links .= $char; + } + else{ + $links .= "$char\r\n"; + } + continue; + } + + if ($textlib->strpos($word, $char) === false){ + $links .= "\r\n$char "; + $wrong++; + } + else{ + $links .= "\r\n$char "; + $correct++; + } + } + + $finishedword = ($done or $wrong >= $max); + $finished = false; + + $updrec->id = $hangman->id; + $updrec->letters = $letters; + if($finishedword){ + if($hangman->finishedword == 0){ + //only one time per word increace the variable try + $hangman->try = $hangman->try + 1; + if($hangman->try > $hangman->maxtries){ + $finished = true; + } + if( $done){ + $hangman->corrects = $hangman->corrects + 1; + $updrec->corrects = $hangman->corrects; + } + } + $updrec->try = $hangman->try; + $updrec->finishedword = 1; + } + + $query->percent = ($correct -$wrong/$max) / $textlib->strlen( $word); + if( $query->percent < 0){ + $query->percent = 0; + } + + if($onlyshow or $showsolution){ + return; + } + + if(!update_record( 'game_hangman', $updrec)){ + error("hangman_showpage: Can't update game_hangman id=$updrec->id"); + } + + if($done){ + $score = 1; + } + else if($wrong >= $max){ + $score = 0; + } + else{ + $score = -1; + } + + game_updateattempts($game, $attempt, $score, $finished); + game_update_queries($game, $attempt, $query, $score, $answer); +} + +//This word is correct. If reach the max number of word I have to finish else continue with next word +function hangman_oncorrect($id, $word_line, $game, $attempt, $hangman, $query){ + echo "

    \n$word_line\r\n"; + + echo '


    '.get_string('win', 'game').'

    '; + if( $query->answerid){ + $feedback = get_field('question_answers', 'feedback', 'id', $query->answerid); + if($feedback != ''){ + echo "$feedback
    "; + } + } + + game_hangman_show_nextword($id, $game, $attempt, $hangman); +} + +function hangman_oninncorrect($id, $word_line, $word, $game, $attempt, $hangman){ + $textlib = textlib_get_instance(); + + echo "\r\n

    \n$word_line\r\n"; + + echo '


    '.get_string('hangman_loose', 'game').'

    '; + + if($game->param6){ + //show the correct answer + if( $textlib->strpos($word, ' ') != false) + echo '
    '.get_string('hangman_correct_phrase', 'game'); + else + echo '
    '.get_string('hangman_correct_word', 'game'); + + echo ''.$word."

    \r\n"; + } + + game_hangman_show_nextword($id, $game, $attempt, $hangman, true); +} + +function game_hangman_show_nextword($id, $game, $attempt, $hangman){ + global $CFG; + + echo '
    '; + if(($hangman->try < $hangman->maxtries) or ($hangman->maxtries == 0)){ + //continue to next word + $params = "id=$id&action2=nextword\">".get_string('nextword', 'game').'        '; + echo "wwwroot/mod/game/attempt.php?$params"; + } + else{ + game_hangman_onfinishgame($game, $attempt, $hangman); + echo "wwwroot/mod/game/attempt.php?id=$id\">".get_string('nextgame', 'game').'         '; + } + + if (!$cm = get_record("course_modules", "id", $id)){ + error("Course Module ID was incorrect id=$id"); + } + + echo "wwwroot/course/view.php?id=$cm->course\">".get_string('finish', 'game').' '; +} + +?> diff --git a/header.php b/header.php new file mode 100644 index 0000000..dd1f4ed --- /dev/null +++ b/header.php @@ -0,0 +1,57 @@ +course)) { + print_error("Course is misconfigured id=$cm->course"); + } + + if (! $game = get_record("game", "id", $cm->instance)) { + print_error("Game id is incorrect (id=$cm->instance)"); + } + } else { + if (! $game = get_record("game", "id", $q)) { + print_error("Game module is incorrect (id=$q)"); + } + if (! $course = get_record("course", "id", $game->course)) { + print_error("Course is misconfigured (id=$game->course)"); + } + if (! $cm = get_coursemodule_from_instance("game", $game->id, $course->id)) { + print_error("Course Module ID was incorrect"); + } + } + + require_login($course->id); + + add_to_log($course->id, "game", "view", "view.php?id=$cm->id", $game->name); + +/// Print the page header + + $strgames = get_string("modulenameplural", "game"); + $strgame = get_string("modulename", "game"); + + $cm->modname = 'game'; + $cm->name = $game->name; + + if( function_exists( 'build_navigation')){ + $navigation = build_navigation('', $cm); + print_header("$course->shortname: $game->name", "$course->shortname: $game->name", $navigation, + "", "", true, update_module_button($cm->id, $course->id, $strgame), + navmenu($course, $cm)); + }else{ + if ($course->category) { + $navigation = "wwwroot}/course/view.php?id=$course->id\">$course->shortname ->"; + } else { + $navigation = ''; + } + print_header("$course->shortname: $game->name", "$course->fullname", + "$navigation id>$strgames -> $game->name", + "", "", true, update_module_button($cm->id, $course->id, $strgame), + navmenu($course, $cm)); + } diff --git a/hiddenpicture/numbers.png b/hiddenpicture/numbers.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab28f6f1ffa3645abfabcd8a9d04c6c57dfe16f GIT binary patch literal 6574 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 WFNFGWF1T|7k(XAH`YvJe@&5q-O2fDS literal 0 HcmV?d00001 diff --git a/hiddenpicture/picture.php b/hiddenpicture/picture.php new file mode 100644 index 0000000..509d5c0 --- /dev/null +++ b/hiddenpicture/picture.php @@ -0,0 +1,127 @@ +wwwroot; + ImageString ($img_handle, 3, 10, 9, $id.' '.$attemptid, $color); + + $colortext = imagecolorallocate( $img_handle, 100, 100, 100); //Text + + $width = $size[ 0]; + $height = $size[ 1]; + $pos = 0; + + $font = 1; + + for($y = 0; $y < $rows; $y++){ + for( $x=0; $x < $cols; $x++){ + $pos++; + if( !array_key_exists( $pos, $found)){ + $x1 = $x * $width / $cols; + $y1 = $y * $height / $rows; + imagefilledrectangle( $img_handle, $x1, $y1, $x1 + $width / $cols, $y1 + $height / $rows, $color); + + if( array_key_exists( $pos, $cells)){ + shownumber( $img_handle, $img_numbers, $pos, $x1 , $y1, $width / $cols, $height / $rows, $size_numbers); + } + } + } + } + + switch( $mime){ + case 'image/png': + ImagePng ($img_handle); + break; + case 'image/jpeg': + ImageJpeg ($img_handle); + break; + case 'image/gif': + ImageGif ($img_handle); + break; + default: + die('Aknown mime type $mime'); + return false; + } + + ImageDestroy ($img_handle); +} + +function shownumber( $img_handle, $img_numbers, $number, $x1 , $y1, $width, $height, $size_numbers){ + if( $number < 10){ + $width_number = $size_numbers[ 0] / 10; + $dstX = $x1 + $width / 3; + $dstY = $y1 + $height / 3; + $srcX = $number * $size_numbers[ 0] / 10; + $srcW = $size_numbers[ 0]/10; + $srcH = $size_numbers[ 1]; + $dstW = $width / 10; + $dstH = $dstW * $srcH / $srcW; + imagecopyresized( $img_handle, $img_numbers, $dstX, $dstY, $srcX, 0, $dstW, $dstH, $srcW, $srcH); + }else + { + $number1 = floor( $number / 10); + $number2 = $number % 10; + shownumber( $img_handle, $img_numbers, $number1, $x1-$width/20, $y1, $width, $height, $size_numbers); + shownumber( $img_handle, $img_numbers, $number2, $x1+$width/20, $y1, $width, $height, $size_numbers); + } +} + + + +?> diff --git a/hiddenpicture/play.php b/hiddenpicture/play.php new file mode 100644 index 0000000..c0e3e26 --- /dev/null +++ b/hiddenpicture/play.php @@ -0,0 +1,447 @@ +param1; + $rows = $game->param2; + if( $cols == 0){ + error( get_string( 'hiddenpicture_nocols', 'game')); + } + if( $rows == 0){ + error( get_string( 'hiddenpicture_norows', 'game')); + } + + //new attempt + $n = $game->param1 * $game->param2; + $recs = game_questions_selectrandom( $game, CONST_GAME_TRIES_REPETITION*$n); + $selected_recs = game_select_from_repetitions( $game, $recs, $n); + + $newrec = game_hiddenpicture_selectglossaryentry( $game, $attempt); + + if( $recs === false){ + error( get_string( 'no_questions', 'game')); + } + + $positions = array(); + $pos=1; + for($col=0; $col < $cols; $col++){ + for( $row=0; $row < $rows; $row++){ + $positions[] = $pos++; + } + } + $i = 0; + $field = ($game->sourcemodule == 'glossary' ? 'glossaryentryid' : 'questionid'); + foreach( $recs as $rec) + { + if( !array_key_exists( $rec->$field, $selected_recs)) + continue; + + unset( $query); + $query->attemptid = $newrec->id; + $query->gameid = $game->id; + $query->userid = $USER->id; + + $pos = array_rand( $positions); + $query->col = $positions[ $pos]; + unset( $positions[ $pos]); + + $query->sourcemodule = $game->sourcemodule; + $query->questionid = $rec->questionid; + $query->glossaryentryid = $rec->glossaryentryid; + $query->score = 0; + if( ($query->id = insert_record( "game_queries", $query)) == 0){ + error( 'error inserting in game_queries'); + } + game_update_repetitions($game->id, $USER->id, $query->questionid, $query->glossaryentryid); + } + + //The score is zero + game_updateattempts( $game, $attempt, 0, 0); + + game_hiddenpicture_play( $id, $game, $attempt, $newrec); +} + +//Create the game_hiddenpicture record +function game_hiddenpicture_selectglossaryentry( $game, $attempt){ + global $CFG, $USER; + + srand( (double)microtime()*1000000); + + if( $game->glossaryid2 == 0){ + error( get_string( 'must_select_glossary', 'game')); + } + $select = "ge.glossaryid={$game->glossaryid2}"; + $table = 'glossary_entries ge'; + if( $game->glossarycategoryid2){ + $table .= ",{$CFG->prefix}glossary_entries_categories gec"; + $select .= " AND gec.entryid = ge.id AND gec.categoryid = {$game->glossarycategoryid2}"; + } + if( $game->param7 == 0){ + //Allow spaces + $select .= " AND concept NOT LIKE '% %'"; + } + + $select .= " AND attachment LIKE '%.%'"; + if( ($recs=get_records_select( $table, $select, '', 'ge.id,attachment')) == false){ + $a->name = "'".get_field_select('glossary', 'name', "id=$game->glossaryid2")."'"; + error( get_string( 'hiddenpicture_nomainquestion', 'game', $a)); + return false; + } + $ids = array(); + foreach( $recs as $rec){ + $s = strtoupper( $rec->attachment); + $s = substr( $s, -4); + if( $s == '.GIF' or $s == '.JPG' or $s == '.PNG'){ + $ids[] = $rec->id; + } + } + if( count( $ids) == 0){ + $a->name = "'".get_field_select('glossary', 'name', "id=$game->glossaryid2")."'"; + error( get_string( 'hiddenpicture_nomainquestion', 'game', $a)); + return false; + } + + //Have to select randomly one glossaryentry + shuffle( $ids); + $min_num = 0; + for($i=0;$ir < $min_num) or ($min_num == 0)){ + $min_num = $rec2->r; + $glossaryentryid = $tempid; + } + } + else{ + $glossaryentryid = $tempid; + break; + } + } + + $sql = 'SELECT id, concept as answertext, definition as questiontext, id as glossaryentryid, 0 as questionid, glossaryid, attachment'. + " FROM {$CFG->prefix}glossary_entries WHERE id = $glossaryentryid"; + if( ($rec = get_record_sql( $sql)) == false) + return false; + + $query->attemptid = $attempt->id; + $query->gameid = $game->id; + $query->userid = $USER->id; + + $query->col = 0; + $query->sourcemodule = 'glossary'; + $query->questionid = 0; + $query->glossaryentryid = $rec->glossaryentryid; + $query->attachment = str_replace( "\\", '/', $CFG->dataroot)."/{$game->course}/moddata/glossary/{$game->glossaryid2}/{$query->glossaryentryid}/{$rec->attachment}"; + $query->questiontext = $rec->questiontext; + $query->answertext = $rec->answertext; + $query->score = 0; + if( ($query->id = insert_record( "game_queries", $query)) == 0){ + error( 'error inserting in game_queries'); + } + $newrec->id = $attempt->id; + if( !game_insert_record( 'game_hiddenpicture', $newrec)){ + error( 'error inserting in game_hiddenpicture'); + } + + game_update_repetitions($game->id, $USER->id, $query->questionid, $query->glossaryentryid); + + return $newrec; +} + +function game_hiddenpicture_play( $id, $game, $attempt, $hiddenpicture, $showsolution=false) +{ + if( $game->toptext != ''){ + echo $game->toptext.'
    '; + } + + //Show picture + $offsetquestions = game_sudoku_compute_offsetquestions( $game->sourcemodule, $attempt, $numbers, $correctquestions); + unset( $offsetquestions[ 0]); + + game_hiddenpicture_showhiddenpicture( $id, $game, $attempt, $hiddenpicture, $showsolution, $offsetquestions, $correctquestions, $id, $attempt, $showsolution); + + //Show questions + $onlyshow = false; + $showsolution = false; + + switch( $game->sourcemodule) + { + case 'quiz': + case 'question': + game_sudoku_showquestions_quiz( $id, $game, $attempt, $hiddenpicture, $offsetquestions, $numbers, $correctquestions, $onlyshow, $showsolution); + break; + case 'glossary': + game_sudoku_showquestions_glossary( $id, $game, $attempt, $hiddenpicture, $offsetquestions, $numbers, $correctquestions, $onlyshow, $showsolution); + break; + } + + if( $game->bottomtext != ''){ + echo '

    '.$game->bottomtext; + } +} + +function game_hidden_picture_computescore( $game, $hiddenpicture){ + $correct = $hiddenpicture->correct; + if( $hiddenpicture->found){ + $correct++; + } + $remaining = $game->param1 * $game->param2 - $hiddenpicture->correct; + $div2 = $correct + $hiddenpicture->wrong + $remaining; + if( $hiddenpicture->found){ + $percent = ($correct + $remaining) / $div2; + }else{ + $percent = $correct / $div2; + } + + return $percent; +} + +function game_hiddenpicture_showhiddenpicture( $id, $game, $attempt, $hiddenpicture, $showsolution, $offsetquestions, $correctquestions){ + global $CFG; + + $foundcells=''; + foreach( $correctquestions as $key => $val){ + $foundcells .= ','.$key; + } + $cells=''; + foreach( $offsetquestions as $key => $val){ + if( $key != 0){ + $cells .= ','.$key; + } + } + + $query = get_record_select( 'game_queries', "attemptid=$hiddenpicture->id AND col=0", 'id,glossaryentryid,attachment,questiontext'); + + //Grade + echo "
    ".get_string( 'grade', 'game').' : '.round( $attempt->score * 100).' %'; + + game_hiddenpicture_showquestion_glossary( $id, $query); + + $cells = substr( $cells, 1); + $foundcells = substr( $foundcells, 1); + game_showpicture( $id, $game, $attempt, $query, $cells, $foundcells, true); +} + +function game_hiddenpicture_showquestion_glossary( $id, $query) +{ + global $CFG; + + $entry = get_record( 'glossary_entries', 'id', $query->glossaryentryid); + + /// Start the form + echo '
    '; + echo "
    wwwroot}/mod/game/attempt.php\" onclick=\"this.autocomplete='off'\">\n"; + echo "
    \n"; + + // Add a hidden field with the queryid + echo '\n"; + echo ''; + echo '\n"; + + // Add a hidden field with glossaryentryid + echo '\n"; + + echo game_filtertext( $entry->definition, 0).'
    '; + + echo get_string( 'answer').': '; + echo "
    "; + + echo "

    \n"; +} + +function game_hiddenpicture_check_questions( $id, $game, &$attempt, &$hiddenpicture, $finishattempt) +{ + global $QTYPES, $CFG; + + $responses = data_submitted(); + + $offsetquestions = game_sudoku_compute_offsetquestions( $game->sourcemodule, $attempt, $numbers, $correctquestions); + + $questionlist = game_sudoku_getquestionlist( $offsetquestions); + + $questions = game_sudoku_getquestions( $questionlist); + + $actions = question_extract_responses($questions, $responses, QUESTION_EVENTSUBMIT); + + $correct = $wrong = 0; + foreach($questions as $question) { + if( !array_key_exists( $question->id, $actions)){ + //no answered + continue; + } + unset( $state); + unset( $cmoptions); + $question->maxgrade = 100; + $state->responses = $actions[ $question->id]->responses; + $state->event = QUESTION_EVENTGRADE; + + $cmoptions = array(); + $QTYPES[$question->qtype]->grade_responses( $question, $state, $cmoptions); + + unset( $query); + + $select = "attemptid=$attempt->id"; + $select .= " AND questionid=$question->id"; + if( ($query->id = get_field_select( 'game_queries', 'id', $select)) == 0){ + die("problem game_hiddenpicture_check_questions (select=$select)"); + continue; + } + + $answertext = $state->responses[ '']; + if( $answertext != ''){ + $grade = $state->raw_grade; + if( $grade < 50){ + //wrong answer + game_update_queries( $game, $attempt, $query, $grade/100, $answertext); + $wrong++; + }else{ + //correct answer + game_update_queries( $game, $attempt, $query, 1, $answertext); + $correct++; + } + } + } + + $hiddenpicture->correct += $correct; + $hiddenpicture->wrong += $wrong; + + if( !update_record( 'game_hiddenpicture', $hiddenpicture)){ + error( 'game_hiddenpicture_check_questions: error updating in game_hiddenpicture'); + } + + $attempt->score = game_hidden_picture_computescore( $game, $hiddenpicture); + if( !update_record( 'game_attempts', $attempt)){ + error( 'game_hiddenpicture_check_questions: error updating in game_attempt'); + } + + game_sudoku_check_last( $id, $game, $attempt, $hiddenpicture, $finishattempt); +} + +function game_hiddenpicture_check_mainquestion( $id, $game, &$attempt, &$hiddenpicture, $finishattempt) +{ + global $QTYPES, $CFG; + + $responses = data_submitted(); + + $glossaryentryid = $responses->glossaryentryid; + $queryid = $responses->queryid; + + // Load the glossary entry + if (!($entry = get_record_select( 'glossary_entries', "id=$glossaryentryid"))) { + error(get_string('noglossaryentriesfound', 'game')); + } + $answer = $responses->answer; + $correct = false; + if( $answer != ''){ + if( game_upper( $entry->concept) == game_upper( $answer)){ + $correct = true; + } + } + + // Load the query + if (!($query = get_record_select( 'game_queries', "id=$queryid"))) { + error("The query $queryid not found"); + } + + game_update_queries( $game, $attempt, $query, $correct, $answer); + + if( $correct){ + $hiddenpicture->found = 1; + }else{ + $hiddenpicture->wrong++; + } + if( !update_record( 'game_hiddenpicture', $hiddenpicture)){ + error( 'game_hiddenpicture_check_mainquestion: error updating in game_hiddenpicture'); + } + + $score = game_hidden_picture_computescore( $game, $hiddenpicture); + game_updateattempts( $game, $attempt, $score, $correct); + + if( $correct == false){ + game_hiddenpicture_play( $id, $game, $attempt, $hiddenpicture); + return; + } + + //Finish the game + $query = get_record_select( 'game_queries', "attemptid=$hiddenpicture->id AND col=0", 'id,glossaryentryid,attachment,questiontext'); + game_showpicture( $id, $game, $attempt, $query, '', '', false); + echo '


    '.get_string( 'win', 'game').'

    '; + global $CFG; + + echo '
    '; + + echo "wwwroot/mod/game/attempt.php?id=$id\">"; + echo get_string( 'nextgame', 'game').'        '; + + if (! $cm = get_record("course_modules", "id", $id)) { + error("Course Module ID was incorrect id=$id"); + } + + echo "wwwroot/course/view.php?id=$cm->course\">".get_string( 'finish', 'game').' '; +} + +function game_showpicture( $id, $game, $attempt, $query, $cells, $foundcells, $usemap) +{ + global $CFG; + + $filename = $query->attachment; + $filenamenumbers = str_replace( "\\", '/', $CFG->dirroot)."/mod/game/hiddenpicture/numbers.png"; + if( $usemap){ + $cols = $game->param1; + $rows = $game->param2; + }else{ + $cols = $rows = 0; + } + $params = "id=$id&id2=$attempt->id&f=$foundcells&cols=$cols&rows=$rows&cells=$cells&p=$filename&n=$filenamenumbers"; + $imagesrc = "hiddenpicture/picture.php?$params"; + + $size = getimagesize ($filename); + if( $game->param4 > 10){ + $width = $game->param4; + $height = $size[ 1] * $width / $size[ 0]; + }else if( $game->param5 > 10){ + $height = $game->param5; + $width = $size[ 0] * $height / $size[ 1]; + }else + { + $width = $size[ 0]; + $height = $size[ 1]; + } + + echo "\r\n"; + + if( $usemap){ + echo "\r\n"; + $pos=0; + for($row=0; $row < $rows; $row++){ + for( $col=0; $col < $cols; $col++){ + $pos++; + $x1 = $col * $width / $cols; + $y1 = $row * $height / $rows; + $x2 = $x1 + $width / $cols; + $y2 = $y1 + $height / $rows; + $q = "a$pos"; + echo "\"$pos\"\r\n"; + } + } + echo ""; + } +} diff --git a/icon.gif b/icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..d46ec2cbe4ee1cc2666556ff7ef1a41d6ea2d5d1 GIT binary patch literal 7074 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 literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 0000000..5eb738d --- /dev/null +++ b/index.php @@ -0,0 +1,164 @@ +id); + + add_to_log($course->id, "game", "view all", "index.php?id=$course->id", ""); + + +/// Get all required strings game + + $strgames = get_string("modulenameplural", "game"); + $strgame = get_string("modulename", "game"); + + +/// Print the header + + if ($course->category) { + $navigation = "id\">$course->shortname ->"; + } else { + $navigation = ''; + } + + $navlinks = array(); + $navlinks[] = array('name' => $strgames, 'link' => "index.php?id=$course->id", 'type' => 'activity'); + + if( function_exists( 'build_navigation')){ + $navigation = build_navigation( $navlinks); + + print_header( $course->shortname, $course->shortname, $navigation); + }else{ + if ($course->category) { + $navigation = "id\">$course->shortname ->"; + } else { + $navigation = ''; + } + print_header("$course->shortname: $strgames", "$course->fullname", "$navigation $strgames", "", "", true, "", navmenu($course)); + } + +/// Get all the appropriate data + + if (! $games = get_all_instances_in_course("game", $course)) { + notice("There are no games", "../../course/view.php?id=$course->id"); + die; + } + +/// Print the list of instances (your module will probably extend this) + + $timenow = time(); + $strname = get_string("name"); + $strweek = get_string("week"); + $strtopic = get_string("topic"); + + if ($course->format == "weeks") { + $headings = array ($strweek, $strname); + $align = array ("center", "left"); + } else if ($course->format == "topics") { + $headings = array ($strtopic, $strname); + $align = array ("center", "left", "left", "left"); + } else { + $headings = array ($strname); + $align = array ("left", "left", "left"); + } + + $showing = ''; // default + + if (has_capability('mod/game:viewreports', $coursecontext)) { + array_push($headings, get_string('attempts', 'game')); + array_push($align, 'left'); + $showing = 'stats'; + } else if (has_any_capability(array('mod/game:reviewmyattempts', 'mod/game:attempt'), $coursecontext)) { + array_push($headings, get_string('bestgrade', 'quiz')); + array_push($align, 'left'); + $showing = 'scores'; // default + } + + $table->head = $headings; + $table->align = $align; + + /// Populate the table with the list of instances. + $currentsection = ''; + foreach ($games as $game) { + $cm = get_coursemodule_from_instance('game', $game->id); + $context = get_context_instance(CONTEXT_MODULE, $cm->id); + $data = array(); + + // Section number if necessary. + $strsection = ''; + if ($game->section != $currentsection) { + if ($game->section) { + $strsection = $game->section; + } + + $currentsection = $game->section; + } + $data[] = $strsection; + + // Link to the instance. + $class = ''; + if (!$game->visible) { + $class = ' class="dimmed"'; + } + $link = "coursemodule\">" . format_string($game->name, true) . ''; + + $data[] = $link; + + if ($showing == 'stats') { + // The $game objects returned by get_all_instances_in_course have the necessary $cm + // fields set to make the following call work. + $attemptcount = game_num_attempt_summary($game, $game); + if ($attemptcount) { + $data[] = "coursemodule\">$attemptcount"; + } else { + $data[] = ''; + } + } else if ($showing == 'scores') { + + // Grade and feedback. + $bestscore = game_get_best_score($game, $USER->id); + $attempts = game_get_user_attempts($game->id, $USER->id, 'all'); + list($someoptions, $alloptions) = game_get_combined_reviewoptions($game, $attempts, $context); + + $grade = ''; + $feedback = ''; + if ($game->grade && !is_null($bestscore)) { + if ($alloptions->scores) { + $bestgrade = round( $bestscore * $game->grade / 100, $game->decimalpoints); + $grade = "$bestgrade / $game->grade"; + } + }else if( $bestscore != 0){ + $grade = round( 100 * $bestscore, $game->decimalpoints).' %'; + } + $data[] = $grade; + } + + $table->data[] = $data; + } + + echo "
    "; + + print_table($table); + +/// Finish the page + + print_footer($course); + +?> diff --git a/lang/ca_utf8/game.php b/lang/ca_utf8/game.php new file mode 100644 index 0000000..51034ea --- /dev/null +++ b/lang/ca_utf8/game.php @@ -0,0 +1,295 @@ +¡Benvingut!

    Fes clic en una paraula per començar.

    '; +$string[ 'finish'] = 'Fi del joc'; +$string[ 'letter'] = 'lletra'; +$string[ 'letters'] = 'lletres'; +$string[ 'nextgame'] = 'Següent joc'; +$string[ 'no_words'] = 'Cap paraula trobada'; +$string[ 'print'] = 'Imprimir'; + +//db/access.php +$string[ 'game:attempt'] = 'Juga el joc'; +$string[ 'game:deleteattempts'] = 'Esborrar intents'; +$string[ 'game:manage'] = 'Administrar'; +$string[ 'game:reviewmyattempts'] = 'Revisar els meus intents'; +$string[ 'game:view'] = 'Veure'; +$string[ 'game:viewreports'] = 'Veure informes'; + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'La frase correcta era: '; +$string[ 'hangman_correct_word'] = 'La paraula correcta era: '; +$string[ 'hangman_gradeinstance'] = 'Nivell en el joc complet'; +$string[ 'hangman_letters'] = 'Lletres: '; +$string[ 'hangman_restletters_many'] = 'Vd. té $a intents'; +$string[ 'hangman_restletters_one'] = 'Vd. té ÚNICAMENT 1 intent'; +$string[ 'hangman_wrongnum'] = 'Dolentes: %%d de %%d'; +$string[ 'nextword'] = 'Següent paraula'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Qualificació de la pregunta principal'; +$string[ 'hiddenpicture_nocols'] = 'Cal especificar el nombre de fileres horitzontals'; +$string[ 'hiddenpicture_nomainquestion'] = 'No hi ha entrades en el glossari $a->name amb una imatge annexada'; +$string[ 'hiddenpicture_norows'] = 'Cal especificar el nombre de columnes verticals'; +$string[ 'must_select_glossary'] = 'Vd ha de seleccionar un glossari'; +$string[ 'noglossaryentriesfound'] = 'No hi ha entrades de glossari'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Cal seleccionar una categoria de preguntes'; +$string[ 'millionaire_must_select_quiz'] = 'Cal seleccionar un qüestionari'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Mostrar tots els intents'; +$string[ 'allstudents'] = 'Mostrar tots $a'; +$string[ 'attemptsonly'] = 'Mostrar únicament estudiants amb intents'; +$string[ 'deleteattemptcheck'] = 'Està absolutament segur de voler esborrar completament aquests intents?'; +$string[ 'displayoptions'] = 'Mostrar opcions'; +$string[ 'downloadods'] = 'Descarregar en format ODS'; +$string[ 'feedback'] = 'Retroalimentació'; +$string[ 'noattemptsonly'] = 'Mostrar $a únicament sense intents'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring ha fet $a->attemptnum intents'; +$string[ 'overview'] = 'Llistat'; +$string[ 'pagesize'] = 'Preguntes per pàgina:'; +$string[ 'selectall'] = 'Seleccionar tots'; +$string[ 'selectnone'] = 'Desmarcar tots'; +$string[ 'showdetailedmarks'] = 'Mostrar detalls de marca'; +$string[ 'startedon'] = 'Començà en'; +$string[ 'timecompleted'] = 'Completat'; +$string[ 'timetaken'] = 'Temps utilitzat'; +$string[ 'unfinished'] = 'obert'; +$string[ 'withselected'] = 'Amb seleccionats'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Nombre de sudokus que seran creats'; +$string[ 'sudoku_create_start'] = 'Començar creant sudokus'; +$string[ 'sudoku_creating'] = 'Creant $a sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Fi del joc de sudoku'; +$string[ 'sudoku_guessnumber'] = 'Endevini el nombre correcte'; +$string[ 'sudoku_noentriesfound'] = 'Cap paraula trobada al glossari'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Jocs'; + +//export.php +$string[ 'export'] = 'Exporta a mòbil'; +$string[ 'html_hascheckbutton'] = 'Botó de prova:'; +$string[ 'html_hasprintbutton'] = 'Botó impresió:'; +$string[ 'html_title'] = 'Títol d\'html:'; +$string[ 'javame_createdby'] = 'Creat per:'; +$string[ 'javame_description'] = 'Descripció:'; +$string[ 'javame_filename'] = 'Nom de l\'arxiu:'; +$string[ 'javame_icon'] = 'Icona:'; +$string[ 'javame_maxpictureheight'] = 'Alçada màxima de la imatge:'; +$string[ 'javame_maxpicturewidth'] = 'Amplada màxima de la imatge:'; +$string[ 'javame_name'] = 'Nom:'; +$string[ 'javame_type'] = 'Tipus:'; +$string[ 'javame_vendor'] = 'Venedor:'; +$string[ 'javame_version'] = 'Versió'; +$string[ 'only_teachers'] = 'Només el professor pot veure aquesta pàgina'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Fí del joc'; +$string[ 'html_hangman_new'] = 'Nou'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Ajut del públic'; +$string[ 'millionaire_info_people'] = 'La gent diu'; +$string[ 'millionaire_info_telephone'] = 'Jo penso que la resposta correcta és'; +$string[ 'millionaire_info_wrong_answer'] = 'La seva resposta és incorrecta
    La resposta correcta és:'; +$string[ 'millionaire_quit'] = 'Sortir'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Pel millonari la font és $a o preguntes i no'; +$string[ 'millionaire_telephone'] = 'Trucada telefònica'; +$string[ 'must_select_questioncategory'] = 'Cal seleccionar una categoria de preguntes'; +$string[ 'must_select_quiz'] = 'Cal seleccionar un qüestionari'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Punts'; + +//header.php +$string[ 'modulename'] = 'Joc'; + +//index.php +$string[ 'attempts'] = 'Intents'; + +//lib.php +$string[ 'attempt'] = 'Intent $a'; +$string[ 'game_bookquiz'] = 'Llibre amb preguntes'; +$string[ 'game_cross'] = 'Mots encreuats'; +$string[ 'game_cryptex'] = 'Sopa de Lletres'; +$string[ 'game_hangman'] = 'Penjat'; +$string[ 'game_hiddenpicture'] = 'Imatge amagada'; +$string[ 'game_millionaire'] = 'Millionari'; +$string[ 'game_snakes'] = 'Serps i Escales'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'No s\'ha fet cap intent en aquest qüestionari'; +$string[ 'percent'] = 'Percentatge'; + +//locallib.php +$string[ 'attemptfirst'] = 'Primer intent'; +$string[ 'attemptlast'] = 'Darrer intent'; +$string[ 'gradeaverage'] = 'Nota promig'; +$string[ 'gradehighest'] = 'Nota més alta'; + +//mod.html +$string[ 'bottomtext'] = 'Text al final'; +$string[ 'cross_layout'] = 'Disseny'; +$string[ 'cross_layout0'] = 'Frases a la part inferior dels mots encreuats'; +$string[ 'cross_layout1'] = 'Frases a la part dreta dels mots encreuats'; +$string[ 'cross_maxcols'] = 'Nombre màxim de columnes dels mots encreuats'; +$string[ 'cross_maxwords'] = 'Màxim nombre de paraules dels mots encreuats'; +$string[ 'cryptex_maxcols'] = 'Máxim nombre de columnes/fileres en la Sopa de Lletres'; +$string[ 'cryptex_maxtries'] = 'Nombre màxim d\'intents'; +$string[ 'cryptex_maxwords'] = 'Màxim nombre de paraules en Sopa de Lletres'; +$string[ 'grademethod'] = 'Mètode de qüalificació'; +$string[ 'hangman_allowspaces'] = 'Permetre espais en les paraules'; +$string[ 'hangman_allowsub'] = 'Permetre símbols en las paraules'; +$string[ 'hangman_imageset'] = 'Seleccioni les imatges pel penjat'; +$string[ 'hangman_language'] = 'Idioma de les paraules'; +$string[ 'hangman_maxtries'] = 'Nombre de paraules per joc'; +$string[ 'hangman_showcorrectanswer'] = 'Mostrar la resposta correcta després del final'; +$string[ 'hangman_showfirst'] = 'Mostrar la primera lletra del penjat'; +$string[ 'hangman_showlast'] = 'Mostrar la darrera lletra del penjat'; +$string[ 'hangman_showquestion'] = '¿ Mostrar les preguntes ?'; +$string[ 'hiddenpicture_across'] = 'Caselles horizontals'; +$string[ 'hiddenpicture_down'] = 'Caselles verticals'; +$string[ 'hiddenpicture_height'] = 'Establir l\'alçada de la imatge en'; +$string[ 'hiddenpicture_pictureglossary'] = 'El glossari per la qüestió principal'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'La categoría de glossari per la qüestió principal'; +$string[ 'hiddenpicture_width'] = 'Establir l\'amplada de la imatge en'; +$string[ 'millionaire_background'] = 'Color de fons'; +$string[ 'millionaire_shuffle'] = 'Barrejar preguntes'; +$string[ 'selectgame'] = 'Seleccionar joc'; +$string[ 'snakes_background'] = 'Fons'; +$string[ 'sourcemodule'] = 'Font de preguntes'; +$string[ 'sourcemodule_book'] = 'Seleccioni un llibre'; +$string[ 'sourcemodule_glossary'] = 'Seleccioni un glossari'; +$string[ 'sourcemodule_glossarycategory'] = 'Seleccioni una categoria del glossario.'; +$string[ 'sourcemodule_include_subcategories'] = 'Incloure subcategories'; +$string[ 'sourcemodule_question'] = 'Preguntes'; +$string[ 'sourcemodule_questioncategory'] = 'Seleccioni una categoria de preguntas'; +$string[ 'sourcemodule_quiz'] = 'Seleccioni un qüestionari'; +$string[ 'sudoku_maxquestions'] = 'Máxim nombre de preguntes'; +$string[ 'toptext'] = 'Text de la part superior'; + +//mod_form.php +$string[ 'cross_options'] = 'Opcions dels Mots encreuats'; +$string[ 'cryptex_options'] = 'Opcions del Criptograma'; +$string[ 'hangman_options'] = 'Opcions del Penjat'; +$string[ 'headerfooter_options'] = 'caOpcions de Capçalera/Peu de pàgina'; +$string[ 'hiddenpicture_options'] = '\'Imatge Amagada\' opcions'; +$string[ 'millionaire_options'] = 'Opcions del Millionari'; +$string[ 'snakes_board'] = 'Tauler'; +$string[ 'snakes_cols'] = 'Columnes'; +$string[ 'snakes_footerx'] = 'Espai inferior esquerre'; +$string[ 'snakes_footery'] = 'Espai inferior dret'; +$string[ 'snakes_headerx'] = 'Espai superior esquerre'; +$string[ 'snakes_headery'] = 'Espai superior dret'; +$string[ 'snakes_options'] = '\'Serps i Escales\' opcions'; +$string[ 'snakes_rows'] = 'Fileres'; +$string[ 'sudoku_options'] = 'Opcions del Sudoku'; +$string[ 'userdefined'] = 'Definit per l\'usuari'; + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'IP de l\'estudiant'; +$string[ 'preview'] = 'Visualitzar'; +$string[ 'showsolution'] = 'solució'; +$string[ 'timefinish'] = 'Fi del joc'; +$string[ 'timelastattempt'] = 'Darrer intent'; +$string[ 'timestart'] = 'Començament'; + +//review.php +$string[ 'completedon'] = 'Completat en'; +$string[ 'outof'] = '$a->grade de un màxim de $a->maxgrade'; +$string[ 'review'] = 'Revisar'; +$string[ 'reviewofattempt'] = 'Revisar intents $a'; +$string[ 'startagain'] = 'Començar de nou'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Esborrar estadístiques'; +$string[ 'computerepetitions'] = 'Recalcular estadístiques'; +$string[ 'feedbacks'] = 'Missatges de resposta correcta'; +$string[ 'repetitions'] = 'Repeticions'; + +//tabs.php +$string[ 'export_to_html'] = 'Exportar a HTML'; +$string[ 'export_to_javame'] = 'Exportar a Javame'; +$string[ 'info'] = 'Info'; +$string[ 'results'] = 'Resultats'; +$string[ 'showanswers'] = 'Mostrar respostes'; +$string[ 'showattempts'] = 'Mostrar els intents'; + +//view.php +$string[ 'attemptgamenow'] = 'Intentar jugar ara'; +$string[ 'continueattemptgame'] = 'Continueu un intent previ de joc'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Marques'; +$string[ 'nomoreattempts'] = 'No es permeten més intents'; +$string[ 'reattemptgame'] = 'Joc de reintent'; +$string[ 'yourfinalgradeis'] = 'La seva nota fina en aquest joc és $a.'; + +//Untranslated +//cross/play.php $string[ 'win'] = 'Congratulations !!!!'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/de_utf8/game.php b/lang/de_utf8/game.php new file mode 100644 index 0000000..e1b3f77 --- /dev/null +++ b/lang/de_utf8/game.php @@ -0,0 +1,294 @@ +Willkommen!

    Klicken Sie auf ein Wort um zu beginnen.

    '; +$string[ 'finish'] = 'Spiel beenden'; +$string[ 'letter'] = 'Buchstabe'; +$string[ 'letters'] = 'Buchstaben'; +$string[ 'nextgame'] = 'Neues Spiel'; +$string[ 'no_words'] = 'Keine Wörter gefunden!'; +$string[ 'print'] = 'Drucken'; +$string[ 'win'] = 'Glückwunsch !!!'; + +//db/access.php +$string[ 'game:attempt'] = 'Spiel starten'; +$string[ 'game:deleteattempts'] = 'Versuche löschen'; +$string[ 'game:grade'] = 'Spiele manuell bewerten'; +$string[ 'game:manage'] = 'Verwalten'; +$string[ 'game:preview'] = 'Vorschau der Spiele'; +$string[ 'game:reviewmyattempts'] = 'Meine Versuche wiederholen'; +$string[ 'game:view'] = 'ansehen'; +$string[ 'game:viewreports'] = 'Berichte ansehen'; + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Der richtige Satz war: '; +$string[ 'hangman_correct_word'] = 'Das richtige Wort war: '; +$string[ 'hangman_gradeinstance'] = 'Bewertung des gesamten Spiels'; +$string[ 'hangman_letters'] = 'Buchstaben: '; +$string[ 'hangman_restletters_many'] = 'Sie haben $a Versuche'; +$string[ 'hangman_restletters_one'] = 'Sie haben ONLY 1 Versuche'; +$string[ 'hangman_wrongnum'] = 'Falsch: %%d von %%d'; +$string[ 'nextword'] = 'nächstes Wort'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Meine Antwort bewerten'; +$string[ 'hiddenpicture_nocols'] = 'Die Anzahl der horizontalen Spalten muss angegeben werden'; +$string[ 'hiddenpicture_nomainquestion'] = 'Es gibt keine Wörterbucheinträge im Wörterbuch $a->name mit angefügtem Bild'; +$string[ 'hiddenpicture_norows'] = 'Die Anzahl der vertikalen Spalten muss angegeben werden.'; +$string[ 'must_select_glossary'] = 'Wähle ein Glossar'; +$string[ 'no_questions'] = "Es sind keine Fragen vorhanden"; +$string[ 'noglossaryentriesfound'] = 'Keine Wörterbucheinträge gefunden'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Sie müssen eine Kategorie wählen'; +$string[ 'millionaire_must_select_quiz'] = 'Sie müssen ein Quiz wählen'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Alle Versuche anzeigen'; +$string[ 'allstudents'] = 'Zeige alle $a'; +$string[ 'attemptsonly'] = 'Nur Teilnehmer mit Versuchen anzeigen'; +$string[ 'deleteattemptcheck'] = 'Sind Sie sicher, dass Sie diese(n) Versuch(e) löschen wollen?'; +$string[ 'displayoptions'] = 'Anzeige-Optionen'; +$string[ 'downloadods'] = 'Herunterladen im ODS format'; +$string[ 'feedback'] = 'Rückmeldung'; +$string[ 'noattemptsonly'] = 'Nur $a ohne Versuche anzeigen'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring absolvierte(n) {$a->attemptnum} Versuch(e)'; +$string[ 'overview'] = 'Übersicht'; +$string[ 'pagesize'] = 'Fragen je Seite:'; +$string[ 'selectall'] = 'Alle auswählen'; +$string[ 'selectnone'] = 'Alle abwählen'; +$string[ 'showdetailedmarks'] = 'Bewertungsdetails anzeigen'; +$string[ 'startedon'] = 'Gestartet am'; +$string[ 'timecompleted'] = 'Abgeschlossen'; +$string[ 'timetaken'] = 'Zeitaufwand'; +$string[ 'unfinished'] = 'offen'; +$string[ 'withselected'] = 'ausgewählte'; + +//snakes/play.php +$string[ 'snakes_dice'] = 'Würfle, $a Augen.'; +$string[ 'snakes_player'] = 'Spieler, Position: $a.'; + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Anzahl der Sudokus, die erstellt werden'; +$string[ 'sudoku_create_start'] = 'Beginne mit dem Erstellen'; +$string[ 'sudoku_creating'] = 'Erstelle $a Sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Ende des Sudoku Spiels'; +$string[ 'sudoku_guessnumber'] = 'Die richtige Nummer erraten'; +$string[ 'sudoku_noentriesfound'] = 'Keine Wörter im Wörterbuch gefunden!'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Spiele'; + +//export.php +$string[ 'export'] = 'Export'; +$string[ 'html_hascheckbutton'] = 'Prüftaste:'; +$string[ 'html_hasprintbutton'] = 'Drucktaste:'; +$string[ 'html_title'] = 'Titel der html-Datei (Browser-Titelzeile):'; +$string[ 'javame_createdby'] = 'Erstellt von:'; +$string[ 'javame_description'] = 'Beschreibung:'; +$string[ 'javame_filename'] = 'Dateiname:'; +$string[ 'javame_icon'] = 'Icon:'; +$string[ 'javame_maxpictureheight'] = 'Größte Bildhöhe:'; +$string[ 'javame_maxpicturewidth'] = 'Größte Bildbreite:'; +$string[ 'javame_name'] = 'Name:'; +$string[ 'javame_type'] = 'Typ:'; +$string[ 'javame_vendor'] = 'Anbieter:'; +$string[ 'javame_version'] = 'Version:'; +$string[ 'only_teachers'] = 'Nur Lehrende können diese Seite sehen'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Sie haben verloren!'; +$string[ 'html_hangman_new'] = 'Neu'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Publikums-Joker'; +$string[ 'millionaire_info_people'] = 'Ergebnis'; +$string[ 'millionaire_info_telephone'] = 'Ich glaube, die richtige Antwort ist'; +$string[ 'millionaire_info_wrong_answer'] = 'Ihre Antwort ist falsch!
    Die richtige Antwort ist:'; +$string[ 'millionaire_quit'] = 'Spiel beenden'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Für Wer wird Millionär: die Quelle der Fragen muss {$a} oder Fragen sein, und nicht'; +$string[ 'millionaire_telephone'] = 'Telefon-Joker'; +$string[ 'must_select_questioncategory'] = 'Sie müssen eine Fragenkategorie wählen!'; +$string[ 'must_select_quiz'] = 'Sie müssen einen Test auswählen'; + +//exporthtml_snakes.php +$string[ 'html_snakes_check'] = 'Wähle'; +$string[ 'html_snakes_correct'] = 'Richtig!'; +$string[ 'html_snakes_no_selection'] = 'Bitte wählen Sie etwas aus'; +$string[ 'html_snakes_wrong'] = "Ihre Antwort ist falsch. Sie bleiben auf dem gleichen Feld."; +$string[ 'score'] = 'Bewertung'; + +//header.php +$string[ 'modulename'] = 'Spiel'; + +//index.php +$string[ 'attempts'] = 'Versuche'; + +//lib.php +$string[ 'attempt'] = 'Versuch $a'; +$string[ 'game_bookquiz'] = 'Buch mit Fragen'; +$string[ 'game_cross'] = 'Kreuzworträtsel'; +$string[ 'game_cryptex'] = 'Suchrätsel'; +$string[ 'game_hangman'] = 'Galgenmännchen'; +$string[ 'game_hiddenpicture'] = 'Verstecktes Bild'; +$string[ 'game_millionaire'] = 'Wer wird Millionär'; +$string[ 'game_snakes'] = 'Schlangen und Leitern'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Für dieses Spiel wurden keine Versuche gemacht'; +$string[ 'percent'] = 'Prozent'; +$string[ 'reset_game_all'] = 'Versuche aller Spiele löschen'; +$string[ 'reset_game_deleted_course'] = 'Versuche gelöschter Kurse löschen'; + +//locallib.php +$string[ 'attemptfirst'] = 'Erster Versuch'; +$string[ 'attemptlast'] = 'Letzter Versuch'; +$string[ 'gradeaverage'] = 'Durchschnittsbewertung'; +$string[ 'gradehighest'] = 'Höchste Bewertung'; + +//mod.html +$string[ 'bottomtext'] = 'Text am Ende der Seite'; +$string[ 'cross_layout'] = 'Layout'; +$string[ 'cross_layout0'] = 'Sätze auf der Unterseite des Kreuzes'; +$string[ 'cross_layout1'] = 'Sätze rechts des Kreuzes'; +$string[ 'cross_maxcols'] = 'Höchstzahl an Zeilen des Kreuzworträtsels'; +$string[ 'cross_maxwords'] = 'Höchstzahl von Wörtern des Kreuzworträtsels'; +$string[ 'cryptex_maxcols'] = 'Höchstzahl an Zeilen des Rätsels'; +$string[ 'cryptex_maxtries'] = 'Maximale Versuche'; +$string[ 'cryptex_maxwords'] = 'Höchstzahl von Wörtern des Rätsels'; +$string[ 'grademethod'] = 'Bewertungsmethode'; +$string[ 'hangman_allowspaces'] = 'Wortzwischenräume erlauben'; +$string[ 'hangman_allowsub'] = 'Symbol in Wörtern erlauben'; +$string[ 'hangman_imageset'] = 'Das Bild des Spiels wählen'; +$string[ 'hangman_language'] = 'Wortsprache'; +$string[ 'hangman_maxtries'] = 'Wörterzahl pro Spiel'; +$string[ 'hangman_showcorrectanswer'] = 'Die richtige Anwort erscheint am Ende des Spiels'; +$string[ 'hangman_showfirst'] = 'Ersten Buchstaben des Wortes zeigen'; +$string[ 'hangman_showlast'] = 'Letzten Buchstaben des Wortes zeigen'; +$string[ 'hangman_showquestion'] = 'Fragen zeigen?'; +$string[ 'hiddenpicture_across'] = 'Horizontale Zellen'; +$string[ 'hiddenpicture_down'] = 'Vertikale Zellen'; +$string[ 'hiddenpicture_height'] = 'Höhe des Bildes'; +$string[ 'hiddenpicture_pictureglossary'] = 'Wörterbuch für Hauptfrage und Bild'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'Die Kategorie des Glossars für die Haupt-Frage'; +$string[ 'hiddenpicture_width'] = 'Breite des Bildes'; +$string[ 'millionaire_background'] = 'Hintergrundfarbe'; +$string[ 'millionaire_shuffle'] = 'Zufallsfragen'; +$string[ 'selectgame'] = 'Wähle ein Spiel'; +$string[ 'snakes_background'] = 'Hintergrund'; +$string[ 'sourcemodule'] = 'Fragen-Quelle'; +$string[ 'sourcemodule_book'] = 'Ein Buch wählen'; +$string[ 'sourcemodule_glossary'] = 'Wörtebuch wählen'; +$string[ 'sourcemodule_glossarycategory'] = 'Wörtebuch-Kategorie wählen!'; +$string[ 'sourcemodule_include_subcategories'] = 'Unterkategorien einschließen'; +$string[ 'sourcemodule_question'] = 'Fragen'; +$string[ 'sourcemodule_questioncategory'] = 'Fragenkategorie wählen'; +$string[ 'sourcemodule_quiz'] = 'Quiz wählen'; +$string[ 'sudoku_maxquestions'] = 'Maximale Anzahl von Fragen erreicht'; +$string[ 'toptext'] = 'Text oben'; + +//mod_form.php +$string[ 'cross_options'] = 'Kreuzworträtsel-Optionen'; +$string[ 'cryptex_options'] = 'Rätsel-Optionen'; +$string[ 'hangman_maximum_number_of_errors'] = 'Maximale Anzahl von Versuchen (Bilder mit Namensschema hangman_0.jpg, hangman_1.jpg, ...)'; +$string[ 'hangman_options'] = 'Galgenmännchen-Optionen'; +$string[ 'headerfooter_options'] = 'Kopfzeile/Fußzeile Optionen'; +$string[ 'hiddenpicture_options'] = '\'Verstecktes Bild\' Optionen'; +$string[ 'millionaire_options'] = 'Millionär-Optionen'; +$string[ 'snakes_board'] = 'Spielbrett'; +$string[ 'snakes_cols'] = 'Spalten'; +$string[ 'snakes_file'] = 'Datei für Hintergrund'; +$string[ 'snakes_footerx'] = 'Raum unten links'; +$string[ 'snakes_footery'] = 'Raum unten rechts'; +$string[ 'snakes_headerx'] = 'Raum nach links oben'; +$string[ 'snakes_headery'] = 'Raum nach links unten'; +$string[ 'snakes_options'] = '\'Schlangen und Leitern\' Optionen'; +$string[ 'snakes_rows'] = 'Reihen'; +$string[ 'sudoku_options'] = 'Sudoku-Optionen'; +$string[ 'userdefined'] = 'benutzerdefiniert'; + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'Benutzer IP'; +$string[ 'preview'] = 'Vorschau'; +$string[ 'showsolution'] = 'Lösung'; +$string[ 'timefinish'] = 'Spiel beendet'; +$string[ 'timelastattempt'] = 'Letzter Versuch'; +$string[ 'timestart'] = 'Start'; + +//review.php +$string[ 'completedon'] = 'Beendet am'; +$string[ 'outof'] = '$a->grade von maximal $a->maxgrade'; +$string[ 'review'] = 'Überprüfung'; +$string[ 'reviewofattempt'] = 'Überprüfung eines Versuchs $a'; +$string[ 'startagain'] = 'Neu starten'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Statistiken löschen'; +$string[ 'computerepetitions'] = 'Statistiken neu berechnen'; +$string[ 'feedbacks'] = 'Meldungen bei korrekter Antwort'; +$string[ 'repetitions'] = 'Wiederholungen'; + +//tabs.php +$string[ 'export_to_html'] = 'Export nach HTML'; +$string[ 'export_to_javame'] = 'Export nach Javame'; +$string[ 'info'] = 'Info'; +$string[ 'results'] = 'Ergebnisse'; +$string[ 'showanswers'] = 'Antworten zeigen'; +$string[ 'showattempts'] = 'Versuche anzeigen'; + +//view.php +$string[ 'attemptgamenow'] = 'Jetzt Spiel starten'; +$string[ 'continueattemptgame'] = 'Einen früheren Versuch des Spiels fortführen'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Markierungen'; +$string[ 'nomoreattempts'] = 'Es sind keine weiteren Versuche mehr erlaubt'; +$string[ 'reattemptgame'] = 'Spiel nochmals probieren'; +$string[ 'yourfinalgradeis'] = 'Ihre Endbewertung für dieses Spiel ist $a.'; + +//Untranslated +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/el_utf8/game.php b/lang/el_utf8/game.php new file mode 100644 index 0000000..1f599b2 --- /dev/null +++ b/lang/el_utf8/game.php @@ -0,0 +1,300 @@ +Καλωσήρθατε!

    Κάντε κλικ σε μία λέξη για να ξεκινήσετε.

    '; +$string[ 'finish'] = 'Τέλος παιχνιδιού'; +$string[ 'letter'] = 'γράμμα'; +$string[ 'letters'] = 'γράμματα'; +$string[ 'nextgame'] = 'Νέο παιχνίδι'; +$string[ 'no_words'] = 'Δεν βρέθηκε καμία λέξη'; +$string[ 'print'] = 'Εκτύπωση'; +$string[ 'win'] = 'Συγχαρητήρια !!!'; + +//db/access.php +$string[ 'game:attempt'] = 'Παίξιμο παιχνιδιών'; +$string[ 'game:deleteattempts'] = 'Διαγραφή προσπαθειών του παιχνιδιού'; +$string[ 'game:grade'] = 'Χειροκίνηση βαθμολόγηση των παιχνιδιών'; +$string[ 'game:manage'] = 'Διαχείριση των παιχνιδιών'; +$string[ 'game:preview'] = 'Προεπισκόπηση των παιχνιδιών'; +$string[ 'game:reviewmyattempts'] = 'Ανασκόπηση των δικών σου προσπαθειών'; +$string[ 'game:view'] = 'Εμφάνιση πληροφοριών του παιχνιδιού'; +$string[ 'game:viewreports'] = 'Εμφάνιση των αναφορών του παιχνιδιού'; + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Η σωστή φράση ήταν: '; +$string[ 'hangman_correct_word'] = 'Η σωστή λέξη ήταν: '; +$string[ 'hangman_gradeinstance'] = 'Βαθμολογία σε όλο το παιχνίδι'; +$string[ 'hangman_letters'] = 'Γράμματα : '; +$string[ 'hangman_restletters_many'] = 'Έχετε $a προσπάθειες ακόμη'; +$string[ 'hangman_restletters_one'] = 'Έχετε ακόμη ΜΟΝΟ 1 προσπάθεια'; +$string[ 'hangman_wrongnum'] = 'Λανθασμένα: %%d out of %%d'; +$string[ 'nextword'] = 'Επόμενη λέξη'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = "Βαθμολόγησε την κυρίως ερώτηση"; +$string[ 'hiddenpicture_nocols'] = 'Πρέπει να ορίσετε τον αριθμό των κελιών οριζόντια'; +$string[ 'hiddenpicture_nomainquestion'] = 'Δεν υπάρχει καμία εγγραφή στο λεξικό $a->name που να περιλαμβάνει και εικόνα'; +$string[ 'hiddenpicture_norows'] = 'Πρέπει να ορίσετε τον αριθμό των κελιών κατακόρυφα'; +$string[ 'must_select_glossary'] = 'Πρέπει να επιλέξετε οπωσδήποτε ένα λεξιλόγιο'; +$string[ 'no_questions'] = 'Δεν βρέθηκαν ερωτήσεις'; +$string[ 'noglossaryentriesfound'] = 'Δεν βρέθηκαν λέξεις στο λεξικό'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Πρέπει οπωσδήποτε να διαλέξετε μία κατηγορία ερωτήσεων'; +$string[ 'millionaire_must_select_quiz'] = 'Πρέπει οπωσδήποτε να διαλέξετε ένα Κουίζ'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Δείξε όλες τις προσπάθειες'; +$string[ 'allstudents'] = 'Δείξε όλα $a'; +$string[ 'attemptsonly'] = 'Δείξε μόνο τους μαθητές που έχουν προσπαθήσει'; +$string[ 'deleteattemptcheck'] = 'Are you absolutely sure you want to completely delete these attempts?'; +$string[ 'displayoptions'] = 'Εμφάνιση παραμέτρων'; +$string[ 'downloadods'] = 'Αποθήκευση σε μορφή ODS'; +$string[ 'feedback'] = 'Απάντηση'; +$string[ 'noattemptsonly'] = 'Εμφάνιση $a που δεν έχουν καθόλου προσπάθειες'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring έκαναν $a->attemptnum προσπάθειες'; +$string[ 'overview'] = 'Σύνοψη'; +$string[ 'pagesize'] = 'Ερωτήσεις ανά σελίδα:'; +$string[ 'selectall'] = 'Επιλογή όλων'; +$string[ 'selectnone'] = 'Αποεπιλογή όλων'; +$string[ 'showdetailedmarks'] = 'Λεπτομέρειες ερωτήσεων'; +$string[ 'startedon'] = 'Ξεκίνησε στις'; +$string[ 'timecompleted'] = 'Συμπληρωμένο'; +$string[ 'timetaken'] = 'Χρόνος που χρειάστηκε'; +$string[ 'unfinished'] = 'Ατελείωτο'; +$string[ 'withselected'] = 'Με τα επιλεγμένα'; + +//snakes/play.php +$string[ 'snakes_dice'] = 'Το ζάρι έφερε $a.'; +$string[ 'snakes_player'] = 'Η τρέχουσα θέση του παίχτη είναι: $a.'; + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Αριθμός από sudoku που θα δημιουργηθούν'; +$string[ 'sudoku_create_start'] = 'Έναρξη δημιουργίας sudoku'; +$string[ 'sudoku_creating'] = 'Δημιουργήθηκε $a sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Τέλος παιχνιδιού'; +$string[ 'sudoku_guessnumber'] = 'Μαντέψτε το νούμερο'; +$string[ 'sudoku_noentriesfound'] = 'Δεν βρέθηκαν λέξεις στο λεξικό'; + +//attempt.php +$string[ 'gameclosed'] = 'Το παιχνίδι έκλεισε στις {$a}'; +$string[ 'gamenotavailable'] = 'Το παιχνίδι δε θα είναι διαθέσιμο μέχρι: {$a}'; + +//backuplib.php +$string[ 'modulenameplural'] = 'Παιχνίδια'; + +//export.php +$string[ 'export'] = 'Εξαγωγή'; +$string[ 'html_hascheckbutton'] = 'Να έχει κουμπί ελέγχου σωστής απάντησης:'; +$string[ 'html_hasprintbutton'] = 'Να έχει κουμπί εκτύπωσης:'; +$string[ 'html_title'] = 'Τίτλος της ιστοσελίδας:'; +$string[ 'javame_createdby'] = 'Δημιουργήθηκε από:'; +$string[ 'javame_description'] = 'Περιγραφή:'; +$string[ 'javame_filename'] = 'Όνομα αρχείου:'; +$string[ 'javame_icon'] = 'Εικονίδιο:'; +$string[ 'javame_maxpictureheight'] = 'Μέγιστο ύψος εικόνας:'; +$string[ 'javame_maxpicturewidth'] = 'Μέγιστο πλάτος εικόνας:'; +$string[ 'javame_name'] = 'Όνομα:'; +$string[ 'javame_type'] = 'Τύπος:'; +$string[ 'javame_vendor'] = 'Vendor:'; +$string[ 'javame_version'] = 'Έκδοση:'; +$string[ 'only_teachers'] = 'Μόνο teacher μπορούν να δουν αυτή τη σελίδα'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Τέλος παιχνιδιού'; +$string[ 'html_hangman_new'] = 'Νέα'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Βοήθεια του κοινού'; +$string[ 'millionaire_info_people'] = 'Το κοινό λέει'; +$string[ 'millionaire_info_telephone'] = 'Νομίζω ότι σωστή απάντηση είναι η'; +$string[ 'millionaire_info_wrong_answer'] = 'Η απάντησή σας είναι λάθος
    Η σωστή απάντηση είναι η :'; +$string[ 'millionaire_quit'] = 'Έξοδος'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Για τον εκατομμυριούχο η πηγή των ερωτήσεων έπρεπε να είναι $a ή Ερωτήσεις και όχι'; +$string[ 'millionaire_telephone'] = 'Βοήθεια του τηλεφώνου'; +$string[ 'must_select_questioncategory'] = 'Πρέπει να επιλέξετε οπωσδήποτε μία κατηγορία ερωτήσεων'; +$string[ 'must_select_quiz'] = 'Πρέπει να επιλέξετε ένα κουίζ'; + +//exporthtml_snakes.php +$string[ 'html_snakes_check'] = 'Έλεγχος'; +$string[ 'html_snakes_correct'] = 'Πολύ σωστά!'; +$string[ 'html_snakes_no_selection'] = 'Δεν επιλέξατε κάτι!'; +$string[ 'html_snakes_wrong'] = "Η απάντησή σου ήταν λάθος. Παραμένεις στη θέση σου."; +$string[ 'score'] = 'Βαθμολογία'; + +//header.php +$string[ 'modulename'] = 'Παιχνίδι'; + +//index.php +$string[ 'attempts'] = 'Προσπάθειες'; + +//lib.php +$string[ 'attempt'] = 'Προσπάθεια $a'; +$string[ 'game_bookquiz'] = 'Βιβλίο με ερωτήσεις'; +$string[ 'game_contest'] = 'Διαγωνισμός'; +$string[ 'game_cross'] = 'Σταυρόλεξο'; +$string[ 'game_cryptex'] = 'Κρυπτόλεξο'; +$string[ 'game_hangman'] = 'Κρεμάλα'; +$string[ 'game_hiddenpicture'] = "Η κρυμμένη εικόνα"; +$string[ 'game_millionaire'] = 'Εκατομμυριούχος'; +$string[ 'game_snakes'] = 'Φιδάκι'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Καμιά προσπάθεια δεν έγινε σε αυτό το παιχνίδι'; +$string[ 'percent'] = 'Ποσοστό'; +$string[ 'reset_game_all'] = 'Διαγραφή προσπαθειών από όλα τα παιχνίδια'; +$string[ 'reset_game_deleted_course'] = 'Διαγραφή προσπαθειών από όλα τα διαγραμμένα μαθήματα'; + +//locallib.php +$string[ 'attemptfirst'] = 'Πρώτη προσπάθεια'; +$string[ 'attemptlast'] = 'Τελευταία προσπάθεια'; +$string[ 'convertfrom'] = 'ΆΈΉΊΌΎΏ'; +$string[ 'convertto'] = 'ΑΕΗΙΟΥΩ'; +$string[ 'gradeaverage'] = 'Μέσος βαθμός'; +$string[ 'gradehighest'] = 'Ο υψηλότερος βαθμός'; + +//mod.html +$string[ 'bottomtext'] = 'Κείμενο στο κάτω μέρος της σελίδας'; +$string[ 'cross_layout'] = 'Τρόπος εμφάνισης'; +$string[ 'cross_layout0'] = 'Οι ορισμοί κάτω από το σταυρόλεξο'; +$string[ 'cross_layout1'] = 'Οι ορισμοί στα δεξιά του σταυρολέξου'; +$string[ 'cross_maxcols'] = 'Μέγιστος αριθμός γραμμών/στηλών στο σταυρόλεξο'; +$string[ 'cross_maxwords'] = 'Μέγιστος αριθμός λέξεων στο σταυρόλεξο'; +$string[ 'cryptex_maxcols'] = 'Μέγιστος αριθμός γραμμών/στηλών στο κρυπτόλεξο'; +$string[ 'cryptex_maxtries'] = 'Μέγιστος αριθμός προσπαθειών'; +$string[ 'cryptex_maxwords'] = 'Μέγιστος αριθμός λέξεων στο κρυπτόλεξο'; +$string[ 'grademethod'] = 'Μέθοδος βαθμολόγησης'; +$string[ 'hangman_allowspaces'] = 'Να επιτρέπονται τα κενά στις λέξεις'; +$string[ 'hangman_allowsub'] = 'Nα επιτρέπεται το σύμβολο - στις λέξεις'; +$string[ 'hangman_imageset'] = 'Διαλέξτε συλλογή φωτογραφιών'; +$string[ 'hangman_language'] = 'Γλώσσα στην οποία είναι οι λέξεις'; +$string[ 'hangman_maxtries'] = 'Αριθμός λέξεων ανά παιχνίδι'; +$string[ 'hangman_showcorrectanswer'] = 'Να εμφανίζει τη σωστή απάντηση μετά το τέλος του παιχνιδιού ;'; +$string[ 'hangman_showfirst'] = 'Να εμφανίζει το πρώτο γράμμα της λέξης'; +$string[ 'hangman_showlast'] = 'Να εμφανίζει το τελευταίο γράμμα της λέξης'; +$string[ 'hangman_showquestion'] = 'Να εμφανίζει τις ερωτήσεις ;'; +$string[ 'hiddenpicture_across'] = "Αριθμός κελιών οριζόντια"; +$string[ 'hiddenpicture_down'] = "Αριθμός κελιών κατακόρυφα"; +$string[ 'hiddenpicture_height'] = 'Ορισμός ύψους εικόνας'; +$string[ 'hiddenpicture_pictureglossary'] = 'Το λεξικό για την κυρίως ερώτηση'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'Η κατηγορία λεξικού για την κυρίως ερώτηση'; +$string[ 'hiddenpicture_width'] = 'Ορισμός πλάτους εικόνας'; +$string[ 'millionaire_background'] = 'Χρώμα φόντου'; +$string[ 'millionaire_shuffle'] = 'Ανακάτεμα ερωτήσεων'; +$string[ 'selectgame'] = 'Διαλέξτε παιχνίδι'; +$string[ 'snakes_background'] = 'Πίστα'; +$string[ 'sourcemodule'] = 'Πηγή ερωτήσεων'; +$string[ 'sourcemodule_book'] = 'Διαλέξτε βιβλίο'; +$string[ 'sourcemodule_glossary'] = 'Διαλέξτε λεξικό'; +$string[ 'sourcemodule_glossarycategory'] = 'Διαλέξτε κατηγορία λεξικού'; +$string[ 'sourcemodule_include_subcategories'] = 'Να συμπεριλαμβάνονται οι υποκατηγορίες'; +$string[ 'sourcemodule_question'] = 'Ερωτήσεις'; +$string[ 'sourcemodule_questioncategory'] = 'Διαλέξτε κατηγορία ερωτήσεων'; +$string[ 'sourcemodule_quiz'] = 'Διαλέξτε κουίζ'; +$string[ 'sudoku_maxquestions'] = 'Μέγιστος αριθμός ερωτήσεων'; +$string[ 'toptext'] = 'Κείμενο στο πάνω μέρος της σελίδας'; + +//mod_form.php +$string[ 'contest_has_notes'] = 'Επιτρέπονται σημειώσεις'; +$string[ 'contest_options'] = 'Παράμετροι διαγωνισμού'; +$string[ 'cross_options'] = 'Παράμετροι Σταυρολέξου'; +$string[ 'cryptex_options'] = 'Παράμετροι κρυπτόλεξου'; +$string[ 'gameclose'] = 'Κλείσιμο του παιχνιδιού'; +$string[ 'gameopen'] = 'Άνοιγμα του παιχνιδιού'; +$string[ 'hangman_maximum_number_of_errors'] = 'Μέγιστος αριθμός λάθος γραμμάτων (πρέπει να υπάρχουν τα αντίστοιχα αρχεία με όνομα hangman_0.jpg, hangman_1.jpg, ...)'; +$string[ 'hangman_options'] = 'Παράμετροι Κρεμάλας'; +$string[ 'headerfooter_options'] = 'Παράμετροι κεφαλίδας/υποσελίδου'; +$string[ 'hiddenpicture_options'] = 'Παράμετροι Κρυμμένης Εικόνας'; +$string[ 'millionaire_options'] = 'Παράμετροι Εκατομμυριούχου'; +$string[ 'snakes_board'] = 'Πίστα'; +$string[ 'snakes_cols'] = 'Cols'; +$string[ 'snakes_file'] = 'File for background'; +$string[ 'snakes_footerx'] = 'Space at bootom left'; +$string[ 'snakes_footery'] = 'Space at bottom right'; +$string[ 'snakes_headerx'] = 'Space at up left'; +$string[ 'snakes_headery'] = 'Space at up right'; +$string[ 'snakes_options'] = 'Παράμετροι για το Φιδάκι'; +$string[ 'snakes_rows'] = 'Rows'; +$string[ 'sudoku_options'] = 'Παράμετροι Sudoku'; +$string[ 'userdefined'] = "Πίστα ορισμένη από το χρήστη"; + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%H:%%M'; +$string[ 'lastip'] = 'IP σπουδαστή'; +$string[ 'preview'] = 'Προεπισκόπηση'; +$string[ 'showsolution'] = 'Λύση'; +$string[ 'timefinish'] = 'Τέλος παιχνιδιού'; +$string[ 'timelastattempt'] = 'Τελευταία προσπάθεια'; +$string[ 'timestart'] = 'Έναρξη'; + +//review.php +$string[ 'completedon'] = 'Ολοκληρώθηκε στις'; +$string[ 'outof'] = '$a->grade από μέγιστο $a->maxgrade'; +$string[ 'review'] = 'Επανεξέταση'; +$string[ 'reviewofattempt'] = 'Επανεξέταση της προσπάθειας $a'; +$string[ 'startagain'] = 'Προσπάθεια ξανά'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Μηδενισμός στατιστικών'; +$string[ 'computerepetitions'] = 'Επαναϋπολογισμός στατιστικών'; +$string[ 'feedbacks'] = 'Μήνυμα σωστής απάντησης'; +$string[ 'repetitions'] = 'Επαναλήψεις'; + +//tabs.php +$string[ 'export_to_html'] = 'Εξαγωγή σε HTML'; +$string[ 'export_to_javame'] = 'Εξαγωγή σε JavaMe για κινητά τηλέφωνα'; +$string[ 'info'] = 'Πληροφορίες'; +$string[ 'results'] = 'Αποτελέσματα'; +$string[ 'showanswers'] = 'Εμφάνιση απαντήσεων'; +$string[ 'showattempts'] = 'Εμφάνιση προσπαθειών'; + +//view.php +$string[ 'attemptgamenow'] = 'Προσπάθεια παιχνιδιού τώρα'; +$string[ 'contest_not_solved'] = 'Δεν λύθηκαν ακόμη'; +$string[ 'contest_solved'] = 'Λύθηκαν'; +$string[ 'contest_top'] = 'Ψηλότερη βαθμολογία'; +$string[ 'continueattemptgame'] = 'Συνέχιση του παιχνιδιού'; +$string[ 'gamecloses'] = 'Το παιχνίδι θα ανοίξει'; +$string[ 'gameopens'] = 'Το παιχνίδι θα κλείσει'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Βαθμοί'; +$string[ 'nomoreattempts'] = 'Δεν επιτρέπονται άλλες προσπάθειες'; +$string[ 'reattemptgame'] = 'Προσπάθεια παιχνιδιού ξανά'; +$string[ 'yourfinalgradeis'] = 'Ο τελικός σου βαθμός γι\' αυτό το παιχνίδι είναι $a'; diff --git a/lang/en_utf8/game.php b/lang/en_utf8/game.php new file mode 100644 index 0000000..b936239 --- /dev/null +++ b/lang/en_utf8/game.php @@ -0,0 +1,300 @@ +Welcome!

    Click on a word to begin.

    '; +$string[ 'finish'] = 'End of game'; +$string[ 'letter'] = 'letter'; +$string[ 'letters'] = 'letters'; +$string[ 'nextgame'] = 'New game'; +$string[ 'no_words'] = 'There are no words'; +$string[ 'print'] = 'Print'; +$string[ 'win'] = 'Congratulations !!!!'; + +//db/access.php +$string[ 'game:attempt'] = 'Play games'; +$string[ 'game:deleteattempts'] = 'Delete attempts'; +$string[ 'game:grade'] = 'Grade games manually'; +$string[ 'game:manage'] = 'Manage'; +$string[ 'game:preview'] = 'Preview Games'; +$string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +$string[ 'game:view'] = 'View game information'; +$string[ 'game:viewreports'] = 'View game reports'; + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'The correct phrase was: '; +$string[ 'hangman_correct_word'] = 'The correct word was: '; +$string[ 'hangman_gradeinstance'] = 'Overall Grade'; +$string[ 'hangman_letters'] = 'Letters: '; +$string[ 'hangman_restletters_many'] = 'You have $a tries'; +$string[ 'hangman_restletters_one'] = 'You have ONLY 1 try'; +$string[ 'hangman_wrongnum'] = 'Wrong: %%d out of %%d'; +$string[ 'nextword'] = 'Next word'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Grade main answer'; +$string[ 'hiddenpicture_nocols'] = 'Please specify the number of horizontal columns'; +$string[ 'hiddenpicture_nomainquestion'] = 'There are no glossary entries in glossary $a->name with an attached picture'; +$string[ 'hiddenpicture_norows'] = 'Please specify the number of vertical columns'; +$string[ 'must_select_glossary'] = 'You must select a glossary'; +$string[ 'no_questions'] = "There are no questions"; +$string[ 'noglossaryentriesfound'] = 'No glossary entries found'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'You must select one question category'; +$string[ 'millionaire_must_select_quiz'] = 'You must select one quiz'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Show all tries'; +$string[ 'allstudents'] = 'Show all $a'; +$string[ 'attemptsonly'] = 'Show only students with attempts'; +$string[ 'deleteattemptcheck'] = 'Are you absolutely sure you want to completely delete these attempts?'; +$string[ 'displayoptions'] = 'Display options'; +$string[ 'downloadods'] = 'Download in ODS format'; +$string[ 'feedback'] = 'Feedback'; +$string[ 'noattemptsonly'] = 'Show $a with no attempts only'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring have made $a->attemptnum attempts'; +$string[ 'overview'] = 'Overview'; +$string[ 'pagesize'] = 'Questions per page:'; +$string[ 'selectall'] = 'Select all'; +$string[ 'selectnone'] = 'Deselect all'; +$string[ 'showdetailedmarks'] = 'Show mark details'; +$string[ 'startedon'] = 'Started on'; +$string[ 'timecompleted'] = 'Completed'; +$string[ 'timetaken'] = 'Time taken'; +$string[ 'unfinished'] = 'open'; +$string[ 'withselected'] = 'With selected'; + +//snakes/play.php +$string[ 'snakes_dice'] = 'Dice, $a spots.'; +$string[ 'snakes_player'] = 'Player, position: $a.'; + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Number of sudokus that will be created'; +$string[ 'sudoku_create_start'] = 'Start creating sudokus'; +$string[ 'sudoku_creating'] = 'Creating $a sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'End of sudoku game'; +$string[ 'sudoku_guessnumber'] = 'Guess the correct number'; +$string[ 'sudoku_noentriesfound'] = 'No words found in glossary'; + +//attempt.php +$string[ 'gameclosed'] = 'This game closed on {$a}'; +$string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; + +//backuplib.php +$string[ 'modulenameplural'] = 'Games'; + +//export.php +$string[ 'export'] = 'Export'; +$string[ 'html_hascheckbutton'] = 'Include check button:'; +$string[ 'html_hasprintbutton'] = 'Include print button:'; +$string[ 'html_title'] = 'Title of html:'; +$string[ 'javame_createdby'] = 'Created by:'; +$string[ 'javame_description'] = 'Description:'; +$string[ 'javame_filename'] = 'Filename:'; +$string[ 'javame_icon'] = 'Icon:'; +$string[ 'javame_maxpictureheight'] = 'Max picture height:'; +$string[ 'javame_maxpicturewidth'] = 'Max picture width:'; +$string[ 'javame_name'] = 'Name:'; +$string[ 'javame_type'] = 'Type:'; +$string[ 'javame_vendor'] = 'Vendor:'; +$string[ 'javame_version'] = 'Version:'; +$string[ 'only_teachers'] = 'Only teacher can see this page'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Game over'; +$string[ 'html_hangman_new'] = 'New'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Ask the audience'; +$string[ 'millionaire_info_people'] = 'Audience says'; +$string[ 'millionaire_info_telephone'] = 'I think the correct answer is '; +$string[ 'millionaire_info_wrong_answer'] = 'Your answer is wrong
    The right answer is:'; +$string[ 'millionaire_quit'] = 'Quit'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'For the millionaire the source must be $a or questions and not'; +$string[ 'millionaire_telephone'] = 'Call a friend'; +$string[ 'must_select_questioncategory'] = 'You must select a question category'; +$string[ 'must_select_quiz'] = 'You must select a quiz'; + +//exporthtml_snakes.php +$string[ 'html_snakes_check'] = 'Check'; +$string[ 'html_snakes_correct'] = 'Correct!'; +$string[ 'html_snakes_no_selection'] = 'Have to select something!'; +$string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +$string[ 'score'] = 'Score'; + +//header.php +$string[ 'modulename'] = 'Game'; + +//index.php +$string[ 'attempts'] = 'Attempts'; + +//lib.php +$string[ 'attempt'] = 'Attempt $a'; +$string[ 'game_bookquiz'] = 'Book with questions'; +$string[ 'game_contest'] = 'Contest'; +$string[ 'game_cross'] = 'Crossword'; +$string[ 'game_cryptex'] = 'Cryptex'; +$string[ 'game_hangman'] = 'Hang man'; +$string[ 'game_hiddenpicture'] = 'Hidden Picture'; +$string[ 'game_millionaire'] = 'Millionaire'; +$string[ 'game_snakes'] = 'Snakes and Ladders'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'No attempts have been made on this game'; +$string[ 'percent'] = 'Percent'; +$string[ 'reset_game_all'] = 'Delete tries from all games'; +$string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; + +//locallib.php +$string[ 'attemptfirst'] = 'First attempt'; +$string[ 'attemptlast'] = 'Last attempt'; +$string[ 'convertfrom'] = ''; //Special convertation to capital letters. It is needed for some languages +$string[ 'convertto'] = ''; //Special convertation to capital letters. It is needed for some languages +$string[ 'gradeaverage'] = 'Average grade'; +$string[ 'gradehighest'] = 'Highest grade'; + +//mod.html +$string[ 'bottomtext'] = 'Text at the bottom'; +$string[ 'cross_layout'] = 'Layout'; +$string[ 'cross_layout0'] = 'Phrases on the bottom of puzzle'; +$string[ 'cross_layout1'] = 'Phrases on the right of puzzle'; +$string[ 'cross_maxcols'] = 'Maximum number of columns'; +$string[ 'cross_maxwords'] = 'Maximum number of words'; +$string[ 'cryptex_maxcols'] = 'Maximum number of columns/rows in cryptex'; +$string[ 'cryptex_maxtries'] = 'Maximum tries'; +$string[ 'cryptex_maxwords'] = 'Maximum number of words in cryptex'; +$string[ 'grademethod'] = 'Grading method'; +$string[ 'hangman_allowspaces'] = 'Allow spaces in words'; +$string[ 'hangman_allowsub'] = 'Allow the symbol - in words'; +$string[ 'hangman_imageset'] = 'Select hangman image'; +$string[ 'hangman_language'] = 'Language'; +$string[ 'hangman_maxtries'] = 'Number of words per game'; +$string[ 'hangman_showcorrectanswer'] = 'Show the correct answer after the end'; +$string[ 'hangman_showfirst'] = 'Show first letter of hangman'; +$string[ 'hangman_showlast'] = 'Show last letter of hangman'; +$string[ 'hangman_showquestion'] = 'Show the questions ?'; +$string[ 'hiddenpicture_across'] = 'Cells horizontal'; +$string[ 'hiddenpicture_down'] = 'Cells down'; +$string[ 'hiddenpicture_height'] = 'Set height of picture to'; +$string[ 'hiddenpicture_pictureglossary'] = 'Source glossary for main question and picture'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'Glossary category for main question'; +$string[ 'hiddenpicture_width'] = 'Set width of picture to'; +$string[ 'millionaire_background'] = 'Background color'; +$string[ 'millionaire_shuffle'] = 'Randomize questions'; +$string[ 'selectgame'] = 'Select game'; +$string[ 'snakes_background'] = 'Background'; +$string[ 'sourcemodule'] = 'Question Source'; +$string[ 'sourcemodule_book'] = 'Select a book'; +$string[ 'sourcemodule_glossary'] = 'Select glossary'; +$string[ 'sourcemodule_glossarycategory'] = 'Select glossary category'; +$string[ 'sourcemodule_include_subcategories'] = 'Include subcategories'; +$string[ 'sourcemodule_question'] = 'Questions'; +$string[ 'sourcemodule_questioncategory'] = 'Select question category'; +$string[ 'sourcemodule_quiz'] = 'Select quiz'; +$string[ 'sudoku_maxquestions'] = 'Maximum number of questions'; +$string[ 'toptext'] = 'Text at the top'; + +//mod_form.php +$string[ 'contest_has_notes'] = 'Has notes'; +$string[ 'contest_options'] = 'Contest options'; +$string[ 'cross_options'] = 'Crossword options'; +$string[ 'cryptex_options'] = 'Cryptex options'; +$string[ 'gameclose'] = 'Close the game'; +$string[ 'gameopen'] = 'Open the game'; +$string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +$string[ 'hangman_options'] = 'Hangman options'; +$string[ 'headerfooter_options'] = 'Header/Footer options'; +$string[ 'hiddenpicture_options'] = '\'Hidden Picture\' options'; +$string[ 'millionaire_options'] = 'Millionaire options'; +$string[ 'snakes_board'] = 'Board'; +$string[ 'snakes_cols'] = 'Cols'; +$string[ 'snakes_file'] = 'File for background'; +$string[ 'snakes_footerx'] = 'Space at bootom left'; +$string[ 'snakes_footery'] = 'Space at bottom right'; +$string[ 'snakes_headerx'] = 'Space at up left'; +$string[ 'snakes_headery'] = 'Space at up right'; +$string[ 'snakes_options'] = '\'Snakes and Ladders\' options'; +$string[ 'snakes_rows'] = 'Rows'; +$string[ 'sudoku_options'] = 'Sudoku options'; +$string[ 'userdefined'] = "User defined "; + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'IP student'; +$string[ 'preview'] = 'Preview'; +$string[ 'showsolution'] = 'Solution'; +$string[ 'timefinish'] = 'End of game'; +$string[ 'timelastattempt'] = 'Last attempt'; +$string[ 'timestart'] = 'Start'; + +//review.php +$string[ 'completedon'] = 'Completed on'; +$string[ 'outof'] = '$a->grade out of a maximum of $a->maxgrade'; +$string[ 'review'] = 'Review'; +$string[ 'reviewofattempt'] = 'Review of Attempt $a'; +$string[ 'startagain'] = 'Start again'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Clear statistics'; +$string[ 'computerepetitions'] = 'Compute statistics again'; +$string[ 'feedbacks'] = 'Messages correct answer'; +$string[ 'repetitions'] = 'Repetitions'; + +//tabs.php +$string[ 'export_to_html'] = 'Export to HTML'; +$string[ 'export_to_javame'] = 'Export to Javame'; +$string[ 'info'] = 'Info'; +$string[ 'results'] = 'Results'; +$string[ 'showanswers'] = 'Show answers'; +$string[ 'showattempts'] = 'Show attempts'; + +//view.php +$string[ 'attemptgamenow'] = 'Attempt game now'; +$string[ 'contest_not_solved'] = 'Not solved yet'; +$string[ 'contest_solved'] = 'Solved'; +$string[ 'contest_top'] = 'Top grades'; +$string[ 'continueattemptgame'] = 'Continue a previous attempt'; +$string[ 'gamecloses'] = 'Game closes'; +$string[ 'gameopens'] = 'Game opens'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Marks'; +$string[ 'nomoreattempts'] = 'No more attempts are allowed'; +$string[ 'reattemptgame'] = 'Re-attempt game'; +$string[ 'yourfinalgradeis'] = 'Your final grade for this game is $a.'; diff --git a/lang/en_utf8/help/game/timeopen.html b/lang/en_utf8/help/game/timeopen.html new file mode 100644 index 0000000..5a1ee59 --- /dev/null +++ b/lang/en_utf8/help/game/timeopen.html @@ -0,0 +1,5 @@ +

    Opening and closing the game

    + +

    You can specify times when the game is accessible for people to make attempts.

    + +

    Before the opening time, and after the closing time, the game will be unavailable.

    diff --git a/lang/es_utf8/game.php b/lang/es_utf8/game.php new file mode 100644 index 0000000..1eb2c9f --- /dev/null +++ b/lang/es_utf8/game.php @@ -0,0 +1,295 @@ +¡Bienvenido!

    Haga clic en una palabra para comenzar.

    '; +$string[ 'finish'] = 'Fin del juego'; +$string[ 'letter'] = 'letra'; +$string[ 'letters'] = 'letras'; +$string[ 'nextgame'] = 'Siguiente juego'; +$string[ 'no_words'] = 'Ninguna palabra encontrada'; +$string[ 'print'] = 'Imprimir'; +$string[ 'win'] = '¡¡¡ Felicitaciones !!!'; + +//db/access.php +$string[ 'game:attempt'] = 'Juega el juego'; +$string[ 'game:deleteattempts'] = 'Borrar intentos'; +$string[ 'game:manage'] = 'Administrar'; +$string[ 'game:reviewmyattempts'] = 'Revisar mis intentos'; +$string[ 'game:view'] = 'Ver'; +$string[ 'game:viewreports'] = 'Ver reportes'; + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'La frase correcta fué: '; +$string[ 'hangman_correct_word'] = 'La palabra correcta fué: '; +$string[ 'hangman_gradeinstance'] = 'Nivel en el juego completo'; +$string[ 'hangman_letters'] = 'Letras: '; +$string[ 'hangman_restletters_many'] = 'Ud. tiene $a intentos'; +$string[ 'hangman_restletters_one'] = 'Ud. tienen ÚNICAMENTE 1 intento'; +$string[ 'hangman_wrongnum'] = 'Malas: %%d de %%d'; +$string[ 'nextword'] = 'Siguiente palabra'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Calificación de la pregunta principal'; +$string[ 'hiddenpicture_nocols'] = 'Tiene que especificar el número de filas horizontales'; +$string[ 'hiddenpicture_nomainquestion'] = 'No hay entradas en el glosario glosario $a->name con una imagen adjunta'; +$string[ 'hiddenpicture_norows'] = 'Tiene que especificar el número de columnas verticales'; +$string[ 'must_select_glossary'] = 'Ud debe seleccionar un glosario'; +$string[ 'noglossaryentriesfound'] = 'No se han encontrado entradas de glosario'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Usted debe seleccionar una categoría de preguntas'; +$string[ 'millionaire_must_select_quiz'] = 'Usted debe seleccionar un cuestionario'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Mostrar todos los intentos'; +$string[ 'allstudents'] = 'Mostrar todos $a'; +$string[ 'attemptsonly'] = 'Mostrar únicamente estudiantes con intentos'; +$string[ 'deleteattemptcheck'] = 'Esta absolútamente seguro de querer borrar completamente estos intentos?'; +$string[ 'displayoptions'] = 'Mostrar opciones'; +$string[ 'downloadods'] = 'Descargar en formato ODS'; +$string[ 'feedback'] = 'Retroalimentación'; +$string[ 'noattemptsonly'] = 'Mostrar $a unicamente sin intentos'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring ha hecho $a->attemptnum intentos'; +$string[ 'overview'] = 'Listado'; +$string[ 'pagesize'] = 'Preguntas por página:'; +$string[ 'selectall'] = 'Seleccione todos'; +$string[ 'selectnone'] = 'Des-marcar todos'; +$string[ 'showdetailedmarks'] = 'Mostrar detalles de marca'; +$string[ 'startedon'] = 'Comenzó en'; +$string[ 'timecompleted'] = 'Completado'; +$string[ 'timetaken'] = 'Tiempo utilizado'; +$string[ 'unfinished'] = 'abierto'; +$string[ 'withselected'] = 'Con seleccionados'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Número de sudokus que serán creados'; +$string[ 'sudoku_create_start'] = 'Comenzar creando sudokus'; +$string[ 'sudoku_creating'] = 'Creando $a sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Fin del juego de sudoku'; +$string[ 'sudoku_guessnumber'] = 'Adivine el número correcto'; +$string[ 'sudoku_noentriesfound'] = 'Ninguna palabra encontrada en el glosario'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Juegos'; + +//export.php +$string[ 'export'] = 'Exporta a móvil'; +$string[ 'html_hascheckbutton'] = 'Botón de prueba:'; +$string[ 'html_hasprintbutton'] = 'Botón de impresión:'; +$string[ 'html_title'] = 'Título de html:'; +$string[ 'javame_createdby'] = 'Creado por:'; +$string[ 'javame_description'] = 'Descripción:'; +$string[ 'javame_filename'] = 'Nombe del archivo:'; +$string[ 'javame_icon'] = 'Icono:'; +$string[ 'javame_maxpictureheight'] = 'Altura máxima de la imagen:'; +$string[ 'javame_maxpicturewidth'] = 'Anchura máxima de la imagen:'; +$string[ 'javame_name'] = 'Nombre:'; +$string[ 'javame_type'] = 'Tipo:'; +$string[ 'javame_vendor'] = 'Vendedor:'; +$string[ 'javame_version'] = 'Versión'; +$string[ 'only_teachers'] = 'Sólo el profesor puede ver esta página'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Fin del juego'; +$string[ 'html_hangman_new'] = 'Nuevo'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Ayuda del público'; +$string[ 'millionaire_info_people'] = 'La gente dice'; +$string[ 'millionaire_info_telephone'] = 'Yo pienso que la respuesta correcta es'; +$string[ 'millionaire_info_wrong_answer'] = 'Su respuesta es incorrecta
    La respuesta correcta es:'; +$string[ 'millionaire_quit'] = 'Salir'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Para millonario la fuente debe ser $a o preguntas y no'; +$string[ 'millionaire_telephone'] = 'Llamada telefónica'; +$string[ 'must_select_questioncategory'] = 'Ud debe seleccionar una categoría de preguntas'; +$string[ 'must_select_quiz'] = 'Ud debe seleccionar un cuestionario'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Puntaje'; + +//header.php +$string[ 'modulename'] = 'Juego'; + +//index.php +$string[ 'attempts'] = 'Intentos'; + +//lib.php +$string[ 'attempt'] = 'Intento $a'; +$string[ 'game_bookquiz'] = 'Libro con preguntas'; +$string[ 'game_cross'] = 'Crucigrama'; +$string[ 'game_cryptex'] = 'Sopa de Letras'; +$string[ 'game_hangman'] = 'Ahorcado'; +$string[ 'game_hiddenpicture'] = 'Imagen oculta'; +$string[ 'game_millionaire'] = 'Millonario'; +$string[ 'game_snakes'] = 'Serpientes y Escaleras'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Ningún intento ha sido hecho en este cuestionario'; +$string[ 'percent'] = 'Porcentaje'; + +//locallib.php +$string[ 'attemptfirst'] = 'Primer intento'; +$string[ 'attemptlast'] = 'Último intento'; +$string[ 'gradeaverage'] = 'Nota promedio'; +$string[ 'gradehighest'] = 'Nota más alta'; + +//mod.html +$string[ 'bottomtext'] = 'Texto al final'; +$string[ 'cross_layout'] = 'Diseño'; +$string[ 'cross_layout0'] = 'Frases en la parte inferior del crucigrama'; +$string[ 'cross_layout1'] = 'Frases en la parte derecha del crucigrama'; +$string[ 'cross_maxcols'] = 'Número máximo de columnas del crucigrama'; +$string[ 'cross_maxwords'] = 'Máximo número de palabras del crucigrama'; +$string[ 'cryptex_maxcols'] = 'Máximo número de columnas/filas en Sopa de Letras'; +$string[ 'cryptex_maxtries'] = 'Número máximo de intentos'; +$string[ 'cryptex_maxwords'] = 'Máximo número de palabras en Sopa de Letras'; +$string[ 'grademethod'] = 'Método de calificación'; +$string[ 'hangman_allowspaces'] = 'Permitir espacios en las palabras'; +$string[ 'hangman_allowsub'] = 'Permitir símbolos en las palabras'; +$string[ 'hangman_imageset'] = 'Seleccione las imágenes para el ahorcado'; +$string[ 'hangman_language'] = 'Idioma de las palabras'; +$string[ 'hangman_maxtries'] = 'Número de palabras por juego'; +$string[ 'hangman_showcorrectanswer'] = 'Mostrar la respuesta correcta después del final'; +$string[ 'hangman_showfirst'] = 'Mostrar la primera letra de ahorcado'; +$string[ 'hangman_showlast'] = 'Mostrar la última letra del ahorcado'; +$string[ 'hangman_showquestion'] = '¿ Mostrar las preguntas ?'; +$string[ 'hiddenpicture_across'] = 'Celdas horizontales'; +$string[ 'hiddenpicture_down'] = 'Celdas verticales'; +$string[ 'hiddenpicture_height'] = 'Establecer la altura de la imagen en'; +$string[ 'hiddenpicture_pictureglossary'] = 'El glosario para la cuestión principal'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'La categoría de glosario para la cuestión principal'; +$string[ 'hiddenpicture_width'] = 'Establecer el ancho de la imagen en'; +$string[ 'millionaire_background'] = 'Color de fondo'; +$string[ 'millionaire_shuffle'] = 'Mezclar preguntas'; +$string[ 'selectgame'] = 'Seleccionar juego'; +$string[ 'snakes_background'] = 'Fondo'; +$string[ 'sourcemodule'] = 'Fuente de preguntas'; +$string[ 'sourcemodule_book'] = 'Seleccione un libro'; +$string[ 'sourcemodule_glossary'] = 'Seleccione un glosario'; +$string[ 'sourcemodule_glossarycategory'] = 'Seleccione una categoría del glosario.'; +$string[ 'sourcemodule_include_subcategories'] = 'Include subcategories'; +$string[ 'sourcemodule_question'] = 'Preguntas'; +$string[ 'sourcemodule_questioncategory'] = 'Seleccione una categoría de preguntas'; +$string[ 'sourcemodule_quiz'] = 'Seleccione un cuestionario'; +$string[ 'sudoku_maxquestions'] = 'Máximo número de preguntas'; +$string[ 'toptext'] = 'Texto de la parte superior'; + +//mod_form.php +$string[ 'cross_options'] = 'Opciones del Crucigrama'; +$string[ 'cryptex_options'] = 'Opciones del Criptograma'; +$string[ 'hangman_options'] = 'Opciones del Ahorcado'; +$string[ 'headerfooter_options'] = 'Opciones de Encabezado/Pie de página'; +$string[ 'hiddenpicture_options'] = '\'Imagen Oculta\' opciones'; +$string[ 'millionaire_options'] = 'Opciones del Millonario'; +$string[ 'snakes_board'] = 'Tablero'; +$string[ 'snakes_cols'] = 'Columnas'; +$string[ 'snakes_footerx'] = 'Espacio inferior izquierdo'; +$string[ 'snakes_footery'] = 'Espacio inferior derecho'; +$string[ 'snakes_headerx'] = 'Espacio superior izquierdo'; +$string[ 'snakes_headery'] = 'Espacio superior derecho'; +$string[ 'snakes_options'] = '\'Serpientes y Escaleras\' opciones'; +$string[ 'snakes_rows'] = 'Filas'; +$string[ 'sudoku_options'] = 'Opciones del Sudoku'; +$string[ 'userdefined'] = 'Definido por el usuario'; + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'IP del estudiante'; +$string[ 'preview'] = 'Visualizar'; +$string[ 'showsolution'] = 'solución'; +$string[ 'timefinish'] = 'Fin del juego'; +$string[ 'timelastattempt'] = 'Último intento'; +$string[ 'timestart'] = 'Comienzo'; + +//review.php +$string[ 'completedon'] = 'Completado en'; +$string[ 'outof'] = '$a->grade out of a maximum of $a->maxgrade'; +$string[ 'review'] = 'Revisar'; +$string[ 'reviewofattempt'] = 'Revisar intentos $a'; +$string[ 'startagain'] = 'Comenzar de nuevo'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Borrar estadísticas'; +$string[ 'computerepetitions'] = 'Recalcular estadísticas'; +$string[ 'feedbacks'] = 'Mensajes de respuesta correcta'; +$string[ 'repetitions'] = 'Repeticiones'; + +//tabs.php +$string[ 'export_to_html'] = 'Exportar a HTML'; +$string[ 'export_to_javame'] = 'Exportar a Javame'; +$string[ 'info'] = 'Info'; +$string[ 'results'] = 'Resultados'; +$string[ 'showanswers'] = 'Mostrar respuestas'; +$string[ 'showattempts'] = 'Mostrar los intentos'; + +//view.php +$string[ 'attemptgamenow'] = 'Intente jugar ahora'; +$string[ 'continueattemptgame'] = 'Continue un intento previo de juego'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Marcas'; +$string[ 'nomoreattempts'] = 'No se permiten más intentos'; +$string[ 'reattemptgame'] = 'Juego de reintento'; +$string[ 'yourfinalgradeis'] = 'Su nota final en este juego es $a.'; + +//Untranslated +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/eu_utf8/game.php b/lang/eu_utf8/game.php new file mode 100644 index 0000000..4ce242f --- /dev/null +++ b/lang/eu_utf8/game.php @@ -0,0 +1,294 @@ +Ongi etorri!

    Hasteko hitz batean klik egin.

    '; +$string[ 'finish'] = 'Jolasa bukatu da'; +$string[ 'letter'] = 'letra'; +$string[ 'letters'] = 'letrak'; +$string[ 'nextgame'] = 'Hurrengo jolasa'; +$string[ 'no_words'] = 'Ez da hitzik aurkitu'; +$string[ 'print'] = 'Imprimatu'; +$string[ 'win'] = 'Zorionak!!!'; + +//db/access.php +$string[ 'game:grade'] = 'Jolasak eskuz baloratu'; +$string[ 'game:preview'] = 'Jolasak aurreikusi'; + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Hauxe da esaldi zuzena: '; +$string[ 'hangman_correct_word'] = 'Hauxe da hitz zuzena: '; +$string[ 'hangman_gradeinstance'] = 'Maila jolas osoan'; +$string[ 'hangman_letters'] = 'Letrak: '; +$string[ 'hangman_restletters_many'] = '$a saiakera dituzu'; +$string[ 'hangman_restletters_one'] = 'Saiakera bakarra daukazu'; +$string[ 'hangman_wrongnum'] = 'Desegokiak: %%d %%d(e)tik'; +$string[ 'nextword'] = 'Hurrengo hitza'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Galdera nagusiaren erantzuna ebaluatu'; +$string[ 'hiddenpicture_nocols'] = 'Lerro horizontalen kopurua zehaztu behar duzu'; +$string[ 'hiddenpicture_nomainquestion'] = '$a->name glosategian ez dago irudia duen hitzik'; +$string[ 'hiddenpicture_norows'] = 'Zutabeen kopurua zehaztu behar duzu'; +$string[ 'must_select_glossary'] = 'Glosategia aukeratu behar duzu'; +$string[ 'no_questions'] = "Ez dago galderarik"; +$string[ 'noglossaryentriesfound'] = 'Ez da glosategi-sarrerarik aurkitu'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Galdera-kategoria aukeratu behar duzu'; +$string[ 'millionaire_must_select_quiz'] = 'Galdetegi bat aukeratu beharko'; + +//report/overview/report.php +$string[ 'allattempts'] = 'saiakera guztiak erakutsi'; +$string[ 'allstudents'] = '$a guztiak erakutsi'; +$string[ 'attemptsonly'] = 'Saiatu diren ikasleak soilik erakutsi'; +$string[ 'deleteattemptcheck'] = 'Saiakera hauek guztiak ezabatu nahi dituzula ziur al zaude?'; +$string[ 'displayoptions'] = 'Aukerak erakutsi'; +$string[ 'downloadods'] = 'ODS formatuan behera kargatu'; +$string[ 'feedback'] = 'Feedback'; +$string[ 'noattemptsonly'] = '$a saiakerarik gabekoak soilik erakutsi'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring $a->attemptnum saiakeren egilea da'; +$string[ 'overview'] = 'zerrenda'; +$string[ 'pagesize'] = 'Galderak orriko:'; +$string[ 'selectall'] = 'Denak aukeratu'; +$string[ 'selectnone'] = 'Ezein ez aukeratu'; +$string[ 'showdetailedmarks'] = 'Marka-zehaztapenak erakutsi'; +$string[ 'startedon'] = 'Noiz hasia'; +$string[ 'timecompleted'] = 'Osaturik'; +$string[ 'timetaken'] = 'Erabilitako denbora'; +$string[ 'unfinished'] = 'irekia'; +$string[ 'withselected'] = 'Aukeratutakoekin'; + +//snakes/play.php +$string[ 'snakes_dice'] = 'Dadoak, $a puntuak.'; +$string[ 'snakes_player'] = 'Jokalaria, kokapena: $a.'; + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Sortuko den sudoku-kopurua'; +$string[ 'sudoku_create_start'] = 'Sudokuak sortzen hasi'; +$string[ 'sudoku_creating'] = '$a sudokua sortzen'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Sudokua bukatu da'; +$string[ 'sudoku_guessnumber'] = 'Zenbaki zuzena asmatu'; +$string[ 'sudoku_noentriesfound'] = 'Glosategian ez da hitzik aurkitu'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Jolasak'; + +//export.php +$string[ 'export'] = 'Esportatu'; +$string[ 'html_hascheckbutton'] = 'Saiakera-botoia:'; +$string[ 'html_hasprintbutton'] = 'Imprimatzeko botoia:'; +$string[ 'html_title'] = 'Html izenburua:'; +$string[ 'javame_createdby'] = 'Egilea:'; +$string[ 'javame_description'] = 'Deskribapena:'; +$string[ 'javame_filename'] = 'Fitxategia:'; +$string[ 'javame_icon'] = 'Ikurra:'; +$string[ 'javame_maxpictureheight'] = 'Irudiaren gehienezko altuera:'; +$string[ 'javame_maxpicturewidth'] = 'Irudiaren gehienezko zabalera:'; +$string[ 'javame_name'] = 'Izena:'; +$string[ 'javame_type'] = 'Mota:'; +$string[ 'javame_vendor'] = 'Vendor:'; +$string[ 'javame_version'] = 'Bertsioa:'; +$string[ 'only_teachers'] = 'Horri hau irakasleak bakarrik ikus dezake'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Jolasa bukatu da'; +$string[ 'html_hangman_new'] = 'Berria'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Publikoaren laguntza'; +$string[ 'millionaire_info_people'] = 'Jendeak zera dio: '; +$string[ 'millionaire_info_telephone'] = 'Nire ustez, erantzun zuzena hau da: '; +$string[ 'millionaire_info_wrong_answer'] = 'Erantzun zuzena ezkerraldean markatuta dago.
    Zure erantzun hau desegokia da:'; +$string[ 'millionaire_quit'] = 'Irten'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Aberatsa jolaserako iturria $a edo galderak izango dira eta ez'; +$string[ 'millionaire_telephone'] = 'Telefono-deia'; +$string[ 'must_select_questioncategory'] = 'Galdera-kategoria bat aukeratu behar duzu'; +$string[ 'must_select_quiz'] = 'Galdetegi bat aukeratu behar duzu'; + +//exporthtml_snakes.php +$string[ 'html_snakes_check'] = 'Konprobatu'; +$string[ 'html_snakes_correct'] = 'Ongi!'; +$string[ 'html_snakes_no_selection'] = 'Zerbait aukeratu behar duzu!'; +$string[ 'html_snakes_wrong'] = "Zure erantzuna ez da zuzena. Leku berean geratu behar duzu."; +$string[ 'score'] = 'Puntuazioak'; + +//header.php +$string[ 'modulename'] = 'Jolasa'; + +//index.php +$string[ 'attempts'] = 'Saiakerak'; + +//lib.php +$string[ 'attempt'] = '$a saiakera'; +$string[ 'game_bookquiz'] = 'Galdera-,liburua'; +$string[ 'game_cross'] = 'Gurutzegrama'; +$string[ 'game_cryptex'] = 'Hitz Zopa'; +$string[ 'game_hangman'] = 'Urkatua'; +$string[ 'game_hiddenpicture'] = 'Irudi izkutua'; +$string[ 'game_millionaire'] = 'Aberatsa'; +$string[ 'game_snakes'] = 'Sugeak eta eskailerak'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Galdetegi honetan ez da saiakerarik egin'; +$string[ 'percent'] = 'Portzentaia'; + +//locallib.php +$string[ 'attemptfirst'] = 'Lehen saiakera'; +$string[ 'attemptlast'] = 'Azken saiakera'; +$string[ 'gradeaverage'] = 'Batezbesteko emaitza'; +$string[ 'gradehighest'] = 'Emaitza altuena'; + +//mod.html +$string[ 'bottomtext'] = 'Bukaerako testua'; +$string[ 'cross_layout'] = 'Kokapena'; +$string[ 'cross_layout0'] = 'Definizioak behealdean'; +$string[ 'cross_layout1'] = 'Definizioak eskuin aldean'; +$string[ 'cross_maxcols'] = 'Gurutzegramaren gehienezko zutabe-kopurua'; +$string[ 'cross_maxwords'] = 'Gurutzegramaren gehienezko hitz-kopurua'; +$string[ 'cryptex_maxcols'] = 'Zutabe/lerroen gehienezko kopurua Hitz Zopan'; +$string[ 'cryptex_maxtries'] = 'Saiakeren gehinezko kopurua'; +$string[ 'cryptex_maxwords'] = 'Gehienezko hitz-kopurua Hitz Zopan'; +$string[ 'grademethod'] = 'Kalifikazio-metodoa'; +$string[ 'hangman_allowspaces'] = 'Hitzen arteko hutsuneak onartu'; +$string[ 'hangman_allowsub'] = 'Baimendu sinboloak - hitzetan'; +$string[ 'hangman_imageset'] = 'Urkatuarentzako irudiak aukeratu'; +$string[ 'hangman_language'] = 'Hitzen hizkuntza'; +$string[ 'hangman_maxtries'] = 'Hitz-kopurua jolaseko'; +$string[ 'hangman_showcorrectanswer'] = 'Bukatutakoan hitza erakutsi'; +$string[ 'hangman_showfirst'] = 'Urkatuaren lehenengo letra erakutsi'; +$string[ 'hangman_showlast'] = 'Urkatuaren azken letra erakutsi'; +$string[ 'hangman_showquestion'] = 'Galderak erakutsi?'; +$string[ 'hiddenpicture_across'] = 'Laukitxo horizontalen kopurua'; +$string[ 'hiddenpicture_down'] = 'Laukitxo bertikalen kopurua'; +$string[ 'hiddenpicture_height'] = 'Irudiaren altuera neurri honetara egokitu: '; +$string[ 'hiddenpicture_pictureglossary'] = 'Galdera nagusiaren glosategia'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'Galdera nagusiaren glosategiko kategoria'; +$string[ 'hiddenpicture_width'] = 'Irudiaren zabalera neurri honetara egokitu: '; +$string[ 'millionaire_background'] = 'Hondoko kolorea'; +$string[ 'millionaire_shuffle'] = 'Galderak nahastu'; +$string[ 'selectgame'] = 'Jolasa aukeratu'; +$string[ 'snakes_background'] = 'Hondoa'; +$string[ 'sourcemodule'] = 'Galdera-iturria'; +$string[ 'sourcemodule_book'] = 'Liburu bat aukeratu'; +$string[ 'sourcemodule_glossary'] = 'Glosategia aukeratu'; +$string[ 'sourcemodule_glossarycategory'] = 'Glosategiaren kategoria bat aukeratu.'; +$string[ 'sourcemodule_include_subcategories'] = 'Azpikategoriak sartu'; +$string[ 'sourcemodule_question'] = 'Galderak'; +$string[ 'sourcemodule_questioncategory'] = 'Galdera-kategoria bat aukeratu'; +$string[ 'sourcemodule_quiz'] = 'Galdetegia aukeratu'; +$string[ 'sudoku_maxquestions'] = 'Gehienezko galdera-kopurua'; +$string[ 'toptext'] = 'Goialdeko testua'; + +//mod_form.php +$string[ 'cross_options'] = 'Gurutzegramaren aukerak'; +$string[ 'cryptex_options'] = 'Hitz Zoparen aukerak'; +$string[ 'hangman_options'] = 'Urkatuaren aukerak'; +$string[ 'headerfooter_options'] = 'Goialde/Behealdeko aukerak'; +$string[ 'hiddenpicture_options'] = '\'Irudi Izkutuaren\' aukerak'; +$string[ 'millionaire_options'] = 'Aberatsaren aukerak'; +$string[ 'snakes_board'] = 'Taula'; +$string[ 'snakes_file'] = 'Hondorako fitxategia'; +$string[ 'snakes_options'] = '\'Sugeak eta Eskailerak\' aukerak'; +$string[ 'sudoku_options'] = 'Sudokuren aukerak'; + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'Ikaslearen IPa'; +$string[ 'preview'] = 'Aurreikusi'; +$string[ 'showsolution'] = 'soluzioa'; +$string[ 'timefinish'] = 'Jolasa bukatu da'; +$string[ 'timelastattempt'] = 'Azken saiakera'; +$string[ 'timestart'] = 'Hasiera'; + +//review.php +$string[ 'completedon'] = 'Osatua'; +$string[ 'outof'] = '$a->grade emaitza $a->maxgrade gehienezko puntuaziotik'; +$string[ 'review'] = 'Berriro aztertu'; +$string[ 'reviewofattempt'] = '$a saiakerak berrikusi'; +$string[ 'startagain'] = 'Berriz hasi'; + +//showanswers.php +$string[ 'feedbacks'] = 'Erantzun zuzeneko mezuak'; + +//tabs.php +$string[ 'export_to_html'] = 'HTMLera esportatu'; +$string[ 'export_to_javame'] = 'Javame-ra esportatu'; +$string[ 'info'] = 'Info'; +$string[ 'results'] = 'Emaitza'; +$string[ 'showanswers'] = 'Erantzunak erakutsi'; +$string[ 'showattempts'] = 'Saiakerak erakutsi'; + +//view.php +$string[ 'attemptgamenow'] = 'Orain jolasten saiatu'; +$string[ 'continueattemptgame'] = 'Aurreko jolas-saiakerarekin jarraitu'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Markak'; +$string[ 'nomoreattempts'] = 'Ez duzu saiakera gehiago egiteko baimenik'; +$string[ 'reattemptgame'] = 'Saiakera berriko jolasa'; +$string[ 'yourfinalgradeis'] = 'Jolas honetarako zure azken nota hauxe da: $a.'; + +//Untranslated +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//showanswers.php $string[ 'clearrepetitions'] = 'Clear statistics'; +//showanswers.php $string[ 'computerepetitions'] = 'Compute statistics again'; +//showanswers.php $string[ 'repetitions'] = 'Repetitions'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/fr_utf8/game.php b/lang/fr_utf8/game.php new file mode 100644 index 0000000..3f551bc --- /dev/null +++ b/lang/fr_utf8/game.php @@ -0,0 +1,293 @@ +Bienvenue !

    Cliquez sur un mot pour commencer.

    '; +$string[ 'finish'] = 'Fin du jeu'; +$string[ 'letter'] = 'lettre'; +$string[ 'letters'] = 'lettres'; +$string[ 'nextgame'] = 'Nouveau jeu'; +$string[ 'no_words'] = 'Pas de mots'; +$string[ 'win'] = 'Bravo !!!'; + +//db/access.php + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'La phrase correcte était : '; +$string[ 'hangman_correct_word'] = 'Le mot correct était : '; +$string[ 'hangman_gradeinstance'] = 'Note pour tout l\'ensemble'; +$string[ 'hangman_letters'] = 'Lettres : '; +$string[ 'hangman_restletters_many'] = 'Vous avez effectué $a tentatives'; +$string[ 'hangman_restletters_one'] = 'Vous n\'avez SEULEMENT QU\'UNE tentative'; +$string[ 'hangman_wrongnum'] = 'Non : %%d en dehors de %%d'; +$string[ 'nextword'] = 'Mot suivant'; + +//hiddenpicture/play.php +$string[ 'must_select_glossary'] = 'Vous devez choisir un glossaire'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Vous devez choisir une catégorie de questions'; +$string[ 'millionaire_must_select_quiz'] = 'Vous devez choisir un test'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Toutes les tentatives'; +$string[ 'allstudents'] = 'Tous les étudiants $a'; +$string[ 'attemptsonly'] = 'Ne montrer que les étudiants qui ont tenté'; +$string[ 'deleteattemptcheck'] = 'Etes-vous sûr(e) de vouloir complètement effacer ces tentatives ?'; +$string[ 'displayoptions'] = 'Montrer les options'; +$string[ 'downloadods'] = 'Télécharger au format ODS'; +$string[ 'feedback'] = 'Rapports'; +$string[ 'noattemptsonly'] = 'Montrer $a sans tentatives'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring ont effectué $a->attemptnum tentative(s)'; +$string[ 'overview'] = 'Vue d\'ensemble'; +$string[ 'pagesize'] = 'Questions par page :'; +$string[ 'selectall'] = 'Choisir tout'; +$string[ 'selectnone'] = 'Déselectionner tout'; +$string[ 'showdetailedmarks'] = 'Montrer les marques de détail'; +$string[ 'startedon'] = 'Démarré le'; +$string[ 'timecompleted'] = 'Terminé'; +$string[ 'timetaken'] = 'Temps consomé'; +$string[ 'unfinished'] = 'ouvert'; +$string[ 'withselected'] = 'Avec les éléments sélectionnés'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Nombre de sudokus a créer'; +$string[ 'sudoku_create_start'] = 'Création des sudokus...'; +$string[ 'sudoku_creating'] = 'Créer $a sudoku(s)'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Fin du sudoku'; +$string[ 'sudoku_guessnumber'] = 'Devniez le nombre suivant'; +$string[ 'sudoku_noentriesfound'] = 'Aucun mot dans le glossaire'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Jeux'; + +//export.php +$string[ 'only_teachers'] = 'Seuls les enseignants peuvent voir cette page'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Jeu terminé'; + +//exporthtml_millionaire.php +$string[ 'millionaire_info_people'] = 'Les gens disent'; +$string[ 'millionaire_info_telephone'] = 'I think that the correct answer is '; +$string[ 'millionaire_info_wrong_answer'] = 'Vous avez donné une mauvaise réponse
    La réponse correcte est :'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Pour le jeu du millionaire, la source doit être $a ou questions et non '; +$string[ 'must_select_questioncategory'] = 'Vous devez choisir une catégorie de questions'; +$string[ 'must_select_quiz'] = 'Vous devez choisir un test'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Score'; + +//header.php +$string[ 'modulename'] = 'Jeu'; + +//index.php +$string[ 'attempts'] = 'Tentatives'; + +//lib.php +$string[ 'attempt'] = 'Tentative $a'; +$string[ 'game_bookquiz'] = 'Livre de questions'; +$string[ 'game_cross'] = 'Mot-croisé'; +$string[ 'game_cryptex'] = 'Cryptex'; +$string[ 'game_hangman'] = 'Pendu'; +$string[ 'game_millionaire'] = 'Millionaire'; +$string[ 'game_snakes'] = 'Serpent et échelles'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Aucune tentative sur ce test'; + +//locallib.php +$string[ 'attemptfirst'] = 'Première tentative'; +$string[ 'attemptlast'] = 'Dernière tentative'; +$string[ 'gradeaverage'] = 'Note moyenne'; +$string[ 'gradehighest'] = 'Note maximale'; + +//mod.html +$string[ 'bottomtext'] = 'Texte au bas'; +$string[ 'cross_maxcols'] = 'Nombre maximum de colonnes du mot-croisé'; +$string[ 'cross_maxwords'] = 'Nombre de mots maximum du mot-croisé'; +$string[ 'cryptex_maxcols'] = 'Nombre maximum de col./lignes du cryptex'; +$string[ 'cryptex_maxwords'] = 'Nombre maximum de mots du cryptex'; +$string[ 'grademethod'] = 'Méthode de notation'; +$string[ 'hangman_imageset'] = 'Choisissez les images du pendu'; +$string[ 'hangman_maxtries'] = 'Nombre de mots par jeu'; +$string[ 'hangman_showcorrectanswer'] = 'Montrer la réponse correcte après la fin du jeu'; +$string[ 'hangman_showfirst'] = 'Montrer la première lettre du pendu'; +$string[ 'hangman_showlast'] = 'Montrer la dernière lettre du pendu'; +$string[ 'hangman_showquestion'] = 'Montrer les questions ?'; +$string[ 'selectgame'] = 'Sélectionner le jeu'; +$string[ 'snakes_background'] = 'Arrière-plan'; +$string[ 'sourcemodule'] = 'Source des questions'; +$string[ 'sourcemodule_book'] = 'Choisissez un livre'; +$string[ 'sourcemodule_glossary'] = 'Choisissez un glossaire'; +$string[ 'sourcemodule_glossarycategory'] = 'Choisissez une catégorie ou un glossaire'; +$string[ 'sourcemodule_question'] = 'Questions'; +$string[ 'sourcemodule_questioncategory'] = 'Choisissez une catégorie de questions'; +$string[ 'sourcemodule_quiz'] = 'Choisissez un test'; +$string[ 'sudoku_maxquestions'] = 'Nombre maximum de questions'; + +//mod_form.php + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'IP de l\'étudiant'; +$string[ 'preview'] = 'Prévisualisation'; +$string[ 'showsolution'] = 'solution'; +$string[ 'timefinish'] = 'Fin du jeu'; +$string[ 'timelastattempt'] = 'Dernière tentative'; +$string[ 'timestart'] = 'Démarrer'; + +//review.php +$string[ 'completedon'] = 'Terminé le'; +$string[ 'outof'] = '$a->grade hors de la plage maximum de $a->maxgrade'; +$string[ 'review'] = 'Revue'; +$string[ 'reviewofattempt'] = 'Revue de la tentative $a'; +$string[ 'startagain'] = 'Démarrer à nouveau'; + +//showanswers.php +$string[ 'feedbacks'] = 'Messages pour réponses correctes'; + +//tabs.php +$string[ 'info'] = 'Info'; +$string[ 'results'] = 'Resultats'; +$string[ 'showanswers'] = 'Montrer les réponses'; + +//view.php +$string[ 'attemptgamenow'] = 'Jouer maintenant'; +$string[ 'continueattemptgame'] = 'Continuer une tentative précédente du jeu'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Marques'; +$string[ 'nomoreattempts'] = 'Vous avez épuisé vos tentatives'; +$string[ 'reattemptgame'] = 'Tenter à nouveau'; +$string[ 'yourfinalgradeis'] = 'Votre note finale pour ce jeu est $a.'; + +//Untranslated +//cross/play.php $string[ 'print'] = 'Print'; +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'hiddenpicture_mainsubmit'] = 'Grade main answer'; +//hiddenpicture/play.php $string[ 'hiddenpicture_nocols'] = 'Please specify the number of horizontal columns'; +//hiddenpicture/play.php $string[ 'hiddenpicture_nomainquestion'] = 'There are no glossary entries in glossary $a->name with an attached picture'; +//hiddenpicture/play.php $string[ 'hiddenpicture_norows'] = 'Please specify the number of vertical columns'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//hiddenpicture/play.php $string[ 'noglossaryentriesfound'] = 'No glossary entries found'; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//export.php $string[ 'export'] = 'Export'; +//export.php $string[ 'html_hascheckbutton'] = 'Include check button:'; +//export.php $string[ 'html_hasprintbutton'] = 'Include print button:'; +//export.php $string[ 'html_title'] = 'Title of html:'; +//export.php $string[ 'javame_createdby'] = 'Created by:'; +//export.php $string[ 'javame_description'] = 'Description:'; +//export.php $string[ 'javame_filename'] = 'Filename:'; +//export.php $string[ 'javame_icon'] = 'Icon:'; +//export.php $string[ 'javame_maxpictureheight'] = 'Max picture height:'; +//export.php $string[ 'javame_maxpicturewidth'] = 'Max picture width:'; +//export.php $string[ 'javame_name'] = 'Name:'; +//export.php $string[ 'javame_type'] = 'Type:'; +//export.php $string[ 'javame_vendor'] = 'Vendor:'; +//export.php $string[ 'javame_version'] = 'Version:'; +//exporthtml_hangman.php $string[ 'html_hangman_new'] = 'New'; +//exporthtml_millionaire.php $string[ 'millionaire_helppeople'] = 'Ask the audience'; +//exporthtml_millionaire.php $string[ 'millionaire_quit'] = 'Quit'; +//exporthtml_millionaire.php $string[ 'millionaire_telephone'] = 'Call a friend'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'game_hiddenpicture'] = 'Hidden Picture'; +//lib.php $string[ 'percent'] = 'Percent'; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod.html $string[ 'cross_layout'] = 'Layout'; +//mod.html $string[ 'cross_layout0'] = 'Phrases on the bottom of puzzle'; +//mod.html $string[ 'cross_layout1'] = 'Phrases on the right of puzzle'; +//mod.html $string[ 'cryptex_maxtries'] = 'Maximum tries'; +//mod.html $string[ 'hangman_allowspaces'] = 'Allow spaces in words'; +//mod.html $string[ 'hangman_allowsub'] = 'Allow the symbol - in words'; +//mod.html $string[ 'hangman_language'] = 'Language'; +//mod.html $string[ 'hiddenpicture_across'] = 'Cells horizontal'; +//mod.html $string[ 'hiddenpicture_down'] = 'Cells down'; +//mod.html $string[ 'hiddenpicture_height'] = 'Set height of picture to'; +//mod.html $string[ 'hiddenpicture_pictureglossary'] = 'Source glossary for main question and picture'; +//mod.html $string[ 'hiddenpicture_pictureglossarycategories'] = 'Glossary category for main question'; +//mod.html $string[ 'hiddenpicture_width'] = 'Set width of picture to'; +//mod.html $string[ 'millionaire_background'] = 'Background color'; +//mod.html $string[ 'millionaire_shuffle'] = 'Randomize questions'; +//mod.html $string[ 'sourcemodule_include_subcategories'] = 'Include subcategories'; +//mod.html $string[ 'toptext'] = 'Text at the top'; +//mod_form.php $string[ 'cross_options'] = 'Crossword options'; +//mod_form.php $string[ 'cryptex_options'] = 'Cryptex options'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'hangman_options'] = 'Hangman options'; +//mod_form.php $string[ 'headerfooter_options'] = 'Header/Footer options'; +//mod_form.php $string[ 'hiddenpicture_options'] = '\'Hidden Picture\' options'; +//mod_form.php $string[ 'millionaire_options'] = 'Millionaire options'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_options'] = '\'Snakes and Ladders\' options'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'sudoku_options'] = 'Sudoku options'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//showanswers.php $string[ 'clearrepetitions'] = 'Clear statistics'; +//showanswers.php $string[ 'computerepetitions'] = 'Compute statistics again'; +//showanswers.php $string[ 'repetitions'] = 'Repetitions'; +//tabs.php $string[ 'export_to_html'] = 'Export to HTML'; +//tabs.php $string[ 'export_to_javame'] = 'Export to Javame'; +//tabs.php $string[ 'showattempts'] = 'Show attempts'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/he_utf8/game.php b/lang/he_utf8/game.php new file mode 100644 index 0000000..462b87c --- /dev/null +++ b/lang/he_utf8/game.php @@ -0,0 +1,294 @@ +ברוכים הבאים!

    לחצו על המשבצת הראשונה של המילה בה אתם מעונינים להתחיל.

    '; +$string[ 'finish'] = 'המשחק הסתיים'; +$string[ 'letter'] = 'אות'; +$string[ 'letters'] = 'אותיות'; +$string[ 'nextgame'] = 'משחק חדש'; +$string[ 'no_words'] = 'לא נמצאו מילים'; +$string[ 'print'] = 'הדפסה'; +$string[ 'win'] = 'כל הכבוד !!!'; + +//db/access.php + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'המשפט הנכון הוא: '; +$string[ 'hangman_correct_word'] = 'המילה הנכונה היא: '; +$string[ 'hangman_gradeinstance'] = 'הציון הכללי במשחק'; +$string[ 'hangman_letters'] = 'אותיות: '; +$string[ 'hangman_restletters_many'] = 'יש לכם $a נסיונות'; +$string[ 'hangman_restletters_one'] = 'יש לכם ניסיון אחד בלבד'; +$string[ 'hangman_wrongnum'] = 'טעויות: %%d מתוך %%d'; +$string[ 'nextword'] = 'מילה חדשה'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'בדיקת התשובה לשאלה הראשית'; +$string[ 'hiddenpicture_nomainquestion'] = 'לא נמצאו מונחים באגרון $a->name אשר צורפו אליהם תמונה.
    אנא בחרו ארגון אחר, בו לכל מונח מצורפת תמונה'; +$string[ 'must_select_glossary'] = 'יש לבחור אגרון'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'יש לבחור סיווג שאלות אחד '; +$string[ 'millionaire_must_select_quiz'] = 'יש לבחור מבחן אחד'; + +//report/overview/report.php +$string[ 'allattempts'] = 'הציגו את כל הניסיונות'; +$string[ 'allstudents'] = 'הציגו את כל $a'; +$string[ 'attemptsonly'] = 'הציגו רק תלמידים עם ניסיונות'; +$string[ 'deleteattemptcheck'] = 'האם אתם בטוחים שאתם מעוניינים למחוק את התשובות המסומנות?'; +$string[ 'displayoptions'] = 'תצוגת מאפיינים'; +$string[ 'downloadods'] = 'הורידו גליון אלקטרוני בתצורת ODF'; +$string[ 'feedback'] = 'משוב'; +$string[ 'noattemptsonly'] = 'הציגו $a שטרם ענו, בלבד'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring ביצעו $a->attemptnum נסיונות'; +$string[ 'overview'] = 'תצוגה כללית'; +$string[ 'pagesize'] = 'מספר השאלות בדף:'; +$string[ 'selectall'] = 'בחירה כוללת'; +$string[ 'selectnone'] = 'ביטול סימון כולל'; +$string[ 'showdetailedmarks'] = 'הציגו פירוט עבור המסומנים'; +$string[ 'startedon'] = 'זמן תחילה'; +$string[ 'timecompleted'] = 'הושלם'; +$string[ 'timetaken'] = 'זמן המשחק'; +$string[ 'unfinished'] = 'פתוח'; +$string[ 'withselected'] = 'עם התשובות המסומנות'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'מספר לוחות סודוקו העומדים להיווצר'; +$string[ 'sudoku_create_start'] = 'התחלת יצירת לוחות סודוקו'; +$string[ 'sudoku_creating'] = 'מייצר $a לוחות סודוקו'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'סיום משחק סודוקו'; +$string[ 'sudoku_guessnumber'] = 'נחשו את המספר הנכון'; +$string[ 'sudoku_noentriesfound'] = 'לא נמצאו מילים באגרון'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'משחקים'; + +//export.php +$string[ 'export'] = 'Export'; +$string[ 'html_hascheckbutton'] = 'קיים כפתור אישור:'; +$string[ 'html_hasprintbutton'] = 'קיים כפתור הדפסה:'; +$string[ 'html_title'] = 'כותרת מעוצבת:'; +$string[ 'only_teachers'] = 'רק מורה יכול לראות דף זה'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'המשחק הסתיים'; + +//exporthtml_millionaire.php +$string[ 'millionaire_info_people'] = 'אנשים אומרים'; +$string[ 'millionaire_info_telephone'] = 'אני חושב/ת שהתשובה הנכונה היא '; +$string[ 'millionaire_info_wrong_answer'] = 'תשובתכם שגוייה
    התשובה הנכונה היא:'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'עבור משחק המיליונר מקור השאלות צריך להיות $a או שאלות ולא'; +$string[ 'must_select_questioncategory'] = 'יש לבחור סיווג לשאלות'; +$string[ 'must_select_quiz'] = 'יש לבחור תשבץ'; + +//exporthtml_snakes.php +$string[ 'score'] = 'ניקוד'; + +//header.php +$string[ 'modulename'] = 'משחק'; + +//index.php +$string[ 'attempts'] = 'נסיונות'; + +//lib.php +$string[ 'attempt'] = 'ניסיון $a'; +$string[ 'game_bookquiz'] = 'ספר עם שאלות'; +$string[ 'game_cross'] = 'תשבץ'; +$string[ 'game_hangman'] = 'הצילו את האיש התלוי'; +$string[ 'game_hiddenpicture'] = 'תמונה נסתרת'; +$string[ 'game_millionaire'] = 'מי רוצה להיות מיליונר'; +$string[ 'game_snakes'] = 'סולמות ונחשים'; +$string[ 'game_sudoku'] = 'סודוקו'; +$string[ 'noattempts'] = 'לא נעשו נסיונות לפתור תשבץ זה'; +$string[ 'percent'] = 'אחוז'; + +//locallib.php +$string[ 'attemptfirst'] = 'ניסיון ראשון'; +$string[ 'attemptlast'] = 'ניסיון אחרון'; +$string[ 'gradeaverage'] = 'ציון ממוצע'; +$string[ 'gradehighest'] = 'הציון הגובה ביותר'; + +//mod.html +$string[ 'bottomtext'] = 'המלל בתחתית'; +$string[ 'cross_layout'] = 'מבנה תצורה'; +$string[ 'cross_layout0'] = 'המשפט יופיע תחת התשבץ'; +$string[ 'cross_layout1'] = 'המשפט יופיע מימין לתשבץ'; +$string[ 'cross_maxcols'] = 'מספר עמודות מירבי בתשבץ'; +$string[ 'cross_maxwords'] = 'מספר מילים מירבי בתשבץ'; +$string[ 'cryptex_maxcols'] = 'מספר העמודות/שורות במשחק cryptex'; +$string[ 'cryptex_maxwords'] = 'מספר המילים במשחק cryptex'; +$string[ 'grademethod'] = 'שיטת מתן ציונים'; +$string[ 'hangman_allowspaces'] = 'אפשרות לרווחים במילים'; +$string[ 'hangman_allowsub'] = 'אפשרות לתו - במילים'; +$string[ 'hangman_imageset'] = 'בחרו תמונה למשחק האיש התלוי'; +$string[ 'hangman_language'] = 'שפת המילים'; +$string[ 'hangman_maxtries'] = 'מספר מילים בכל משחק'; +$string[ 'hangman_showcorrectanswer'] = 'הצגת התשובה הנכונה בסוף כל משחק'; +$string[ 'hangman_showfirst'] = 'הצגת האות הראשונה במשחק האיש התלוי'; +$string[ 'hangman_showlast'] = 'הצגת האות האחרונה במשחק האיש התלוי'; +$string[ 'hangman_showquestion'] = 'להציג את השאלות ?'; +$string[ 'hiddenpicture_across'] = 'תאים אופקיים'; +$string[ 'hiddenpicture_down'] = 'תאים אנחיים'; +$string[ 'hiddenpicture_height'] = 'קבעו גובה תמונה ל'; +$string[ 'hiddenpicture_pictureglossary'] = 'האגרון לשאלה הראשית ולתמונות'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'הסיווג באגרון של השאלה הראשית'; +$string[ 'hiddenpicture_width'] = 'קבעו רוחב תמונה ל'; +$string[ 'snakes_background'] = 'רקע'; +$string[ 'sourcemodule'] = 'מקור השאלות'; +$string[ 'sourcemodule_book'] = 'בחרו ספר'; +$string[ 'sourcemodule_glossary'] = 'בחרו אגרון'; +$string[ 'sourcemodule_glossarycategory'] = 'בחרו סיווג עבור אגרון'; +$string[ 'sourcemodule_question'] = 'שאלות'; +$string[ 'sourcemodule_questioncategory'] = 'בחרו סיווג לשאלות'; +$string[ 'sourcemodule_quiz'] = 'בחרו מבחן'; +$string[ 'sudoku_maxquestions'] = 'מספר שאלות מירבי'; + +//mod_form.php + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'כתובת ה IP של התלמיד'; +$string[ 'preview'] = 'תצוגה מקדימה'; +$string[ 'showsolution'] = 'פתרון'; +$string[ 'timefinish'] = 'המשחק הסתיים'; +$string[ 'timelastattempt'] = 'ניסיון אחרון'; +$string[ 'timestart'] = 'התחלה'; + +//review.php +$string[ 'completedon'] = 'הסתיים בתאריך'; +$string[ 'outof'] = '$a->grade מתוך הציון המירבי : $a->maxgrade'; +$string[ 'review'] = 'בדיקה'; +$string[ 'reviewofattempt'] = 'בדיקת ניסיון $a'; +$string[ 'startagain'] = 'התחילו משחק זה מההתחלה'; + +//showanswers.php +$string[ 'feedbacks'] = 'ההודעה במצב של תשובה נכונה'; + +//tabs.php +$string[ 'info'] = 'מידע'; +$string[ 'results'] = 'תוצאות'; +$string[ 'showanswers'] = 'הצגת תשובות'; + +//view.php +$string[ 'attemptgamenow'] = 'שחקו עכשיו'; +$string[ 'continueattemptgame'] = 'המשיכו ניסיון משחק קודם שלכם'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'ציונים'; +$string[ 'nomoreattempts'] = 'אין אפשרות לנסיונות נוספים'; +$string[ 'reattemptgame'] = 'שחקו שוב'; +$string[ 'yourfinalgradeis'] = 'הציון הסופי שלכם למשחק זה הוא $a.'; + +//Untranslated +//bookquiz/play.php $string[ 'sudoku_submit'] = 'Grade answers'; +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'hiddenpicture_nocols'] = 'Please specify the number of horizontal columns'; +//hiddenpicture/play.php $string[ 'hiddenpicture_norows'] = 'Please specify the number of vertical columns'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//hiddenpicture/play.php $string[ 'noglossaryentriesfound'] = 'No glossary entries found'; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//export.php $string[ 'javame_createdby'] = 'Created by:'; +//export.php $string[ 'javame_description'] = 'Description:'; +//export.php $string[ 'javame_filename'] = 'Filename:'; +//export.php $string[ 'javame_icon'] = 'Icon:'; +//export.php $string[ 'javame_maxpictureheight'] = 'Max picture height:'; +//export.php $string[ 'javame_maxpicturewidth'] = 'Max picture width:'; +//export.php $string[ 'javame_name'] = 'Name:'; +//export.php $string[ 'javame_type'] = 'Type:'; +//export.php $string[ 'javame_vendor'] = 'Vendor:'; +//export.php $string[ 'javame_version'] = 'Version:'; +//exporthtml_hangman.php $string[ 'html_hangman_new'] = 'New'; +//exporthtml_millionaire.php $string[ 'millionaire_helppeople'] = 'Ask the audience'; +//exporthtml_millionaire.php $string[ 'millionaire_quit'] = 'Quit'; +//exporthtml_millionaire.php $string[ 'millionaire_telephone'] = 'Call a friend'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'game_cryptex'] = 'Cryptex'; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod.html $string[ 'cryptex_maxtries'] = 'Maximum tries'; +//mod.html $string[ 'millionaire_background'] = 'Background color'; +//mod.html $string[ 'millionaire_shuffle'] = 'Randomize questions'; +//mod.html $string[ 'selectgame'] = 'Select game'; +//mod.html $string[ 'sourcemodule_include_subcategories'] = 'Include subcategories'; +//mod.html $string[ 'toptext'] = 'Text at the top'; +//mod_form.php $string[ 'cross_options'] = 'Crossword options'; +//mod_form.php $string[ 'cryptex_options'] = 'Cryptex options'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'hangman_options'] = 'Hangman options'; +//mod_form.php $string[ 'headerfooter_options'] = 'Header/Footer options'; +//mod_form.php $string[ 'hiddenpicture_options'] = '\'Hidden Picture\' options'; +//mod_form.php $string[ 'millionaire_options'] = 'Millionaire options'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_options'] = '\'Snakes and Ladders\' options'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'sudoku_options'] = 'Sudoku options'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//showanswers.php $string[ 'clearrepetitions'] = 'Clear statistics'; +//showanswers.php $string[ 'computerepetitions'] = 'Compute statistics again'; +//showanswers.php $string[ 'repetitions'] = 'Repetitions'; +//tabs.php $string[ 'export_to_html'] = 'Export to HTML'; +//tabs.php $string[ 'export_to_javame'] = 'Export to Javame'; +//tabs.php $string[ 'showattempts'] = 'Show attempts'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/hr_utf8/game.php b/lang/hr_utf8/game.php new file mode 100644 index 0000000..e1d906c --- /dev/null +++ b/lang/hr_utf8/game.php @@ -0,0 +1,296 @@ +Dobrodošli!

    Za početak igre odaberite riječ.

    '; +$string[ 'finish'] = 'Kraj igre'; +$string[ 'letter'] = 'slovo'; +$string[ 'letters'] = 'slova'; +$string[ 'nextgame'] = 'Nova igra'; +$string[ 'no_words'] = 'Riječi nisu pronađene'; +$string[ 'print'] = 'Ispiši'; +$string[ 'win'] = 'Čestitamo !!!'; + +//db/access.php + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Tražena fraza je: '; +$string[ 'hangman_correct_word'] = 'Tražena riječ je: '; +$string[ 'hangman_gradeinstance'] = 'Ocjena u cijeloj igri'; +$string[ 'hangman_letters'] = 'Slova: '; +$string[ 'hangman_restletters_many'] = 'Imate još $a pokušaja'; +$string[ 'hangman_restletters_one'] = 'Imate još SAMO 1 pokušaj'; +$string[ 'hangman_wrongnum'] = 'Krivo: %%d od %%d'; +$string[ 'nextword'] = 'Sljedeća riječ'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Ocjeni glavni odgovor'; +$string[ 'hiddenpicture_nocols'] = 'Treba zadati broj stupaca vodoravno'; +$string[ 'hiddenpicture_nomainquestion'] = 'Nije pronađen ni jedan zapis u rječniku $a->name sa pridruženom slikom'; +$string[ 'hiddenpicture_norows'] = 'Treba zadati broj stupaca okomito'; +$string[ 'must_select_glossary'] = 'Morate odabrati rječnik'; +$string[ 'noglossaryentriesfound'] = 'U rječniku nije pronađen ni jedan pojam'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Morate odabrati kategoriju pitanja'; +$string[ 'millionaire_must_select_quiz'] = 'Morate odabrati tip igre'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Prikaži sve pokušaje'; +$string[ 'allstudents'] = 'Prikaži sve $a'; +$string[ 'attemptsonly'] = 'Prikaži samo studente sa pokušajima'; +$string[ 'deleteattemptcheck'] = 'Dali ste sigurni da želite nepovratno obrisati ove pokušaje?'; +$string[ 'displayoptions'] = 'Postavke prikaza'; +$string[ 'downloadods'] = 'Preuzmi u ODS formatu'; +$string[ 'feedback'] = 'Povratna informacija'; +$string[ 'noattemptsonly'] = 'Prikaži samo $a bez pokušaja'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring su imali $a->attemptnum pokušaja'; +$string[ 'overview'] = 'Pregled'; +$string[ 'pagesize'] = 'Pitanja po stranici:'; +$string[ 'selectall'] = 'Označi sve'; +$string[ 'selectnone'] = 'Odznači sve'; +$string[ 'showdetailedmarks'] = 'Prikaži detalje ocjena'; +$string[ 'startedon'] = 'Započeto'; +$string[ 'timecompleted'] = 'Završeno'; +$string[ 'timetaken'] = 'Proteklo vrijeme'; +$string[ 'unfinished'] = 'nije završeno'; +$string[ 'withselected'] = 'Sa odabranim'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Broju sudoku zadataka koji će se napraviti'; +$string[ 'sudoku_create_start'] = 'Započni pravljenje sudou zadataka'; +$string[ 'sudoku_creating'] = 'Pravim $a sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Kraj igre'; +$string[ 'sudoku_guessnumber'] = 'Pogodite točan broj'; +$string[ 'sudoku_noentriesfound'] = 'U rječniku nije pronađena ni jedna riječ'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Igre'; + +//export.php +$string[ 'export'] = 'Izvoz'; +$string[ 'html_hascheckbutton'] = 'Sadrži tipku za provjeru:'; +$string[ 'html_hasprintbutton'] = 'Sadrži tipku za ispis:'; +$string[ 'html_title'] = 'Naslov stranice:'; +$string[ 'javame_createdby'] = 'Autor:'; +$string[ 'javame_description'] = 'Opis:'; +$string[ 'javame_filename'] = 'Ime datoteke:'; +$string[ 'javame_icon'] = 'Ikona:'; +$string[ 'javame_maxpictureheight'] = 'Maksimalna visina slike:'; +$string[ 'javame_maxpicturewidth'] = 'Maksimalna širina slike:'; +$string[ 'javame_name'] = 'Ime:'; +$string[ 'javame_type'] = 'Tip:'; +$string[ 'javame_vendor'] = 'Prodavač:'; +$string[ 'javame_version'] = 'Verzija:'; +$string[ 'only_teachers'] = 'Samo učitelj može vidjeti ovu stranicu'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Kraj igre'; +$string[ 'html_hangman_new'] = 'Nova igra'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Pitaj publiku'; +$string[ 'millionaire_info_people'] = 'Publika kaže'; +$string[ 'millionaire_info_telephone'] = 'Mislim da je točan odgovor '; +$string[ 'millionaire_info_wrong_answer'] = 'Vaš odgovor je pogrešan
    Točan odgovor je:'; +$string[ 'millionaire_quit'] = 'Kraj'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Za Milijunaša izvor mora biti $a ili pitanja i ne'; +$string[ 'millionaire_telephone'] = 'Pomoć zovi'; +$string[ 'must_select_questioncategory'] = 'Morate odabrati kategoriju pitanja'; +$string[ 'must_select_quiz'] = 'Morate odabrati igru'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Rezultat'; + +//header.php +$string[ 'modulename'] = 'Igre'; + +//index.php +$string[ 'attempts'] = 'Pokušaji'; + +//lib.php +$string[ 'attempt'] = 'Pokušaj $a'; +$string[ 'game_bookquiz'] = 'Knjiga sa pitanjima'; +$string[ 'game_cross'] = 'Križaljka'; +$string[ 'game_cryptex'] = 'Cryptex'; +$string[ 'game_hangman'] = 'Vješalo'; +$string[ 'game_hiddenpicture'] = 'Skrivena slika'; +$string[ 'game_millionaire'] = 'Milijunaš'; +$string[ 'game_snakes'] = 'Zmije i Ljestve'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Ovu igru nitko još nije pokušao igrati'; +$string[ 'percent'] = 'Postotak'; + +//locallib.php +$string[ 'attemptfirst'] = 'Prvi pokušaj'; +$string[ 'attemptlast'] = 'Zadnji pokušaj'; +$string[ 'convertfrom'] = ''; //Special convertation to capital letters +$string[ 'convertto'] = ''; //It is needed for some languages +$string[ 'gradeaverage'] = 'Prosječna ocjena'; +$string[ 'gradehighest'] = 'Najveća ocjena'; + +//mod.html +$string[ 'bottomtext'] = 'Tekst na dnu'; +$string[ 'cross_layout'] = 'Raspored'; +$string[ 'cross_layout0'] = 'Fraze ispod križaljke'; +$string[ 'cross_layout1'] = 'Fraze desno od križaljke'; +$string[ 'cross_maxcols'] = 'Maksimaln broj stupaca u križaljci'; +$string[ 'cross_maxwords'] = 'Maksimalan broj riječi u križaljci'; +$string[ 'cryptex_maxcols'] = 'Maksimalan broj stupaca/redova cryptexa'; +$string[ 'cryptex_maxtries'] = 'Maksimalan broj pokušaja'; +$string[ 'cryptex_maxwords'] = 'Maksimalan broj riječi cryptexa'; +$string[ 'grademethod'] = 'Metoda ocjenjivanja'; +$string[ 'hangman_allowspaces'] = 'Dozvoli razmake u riječima'; +$string[ 'hangman_allowsub'] = 'Dozvoli znak - u riječima'; +$string[ 'hangman_imageset'] = 'Odaberite sliku vješala'; +$string[ 'hangman_language'] = 'Jezik riječi'; +$string[ 'hangman_maxtries'] = 'Broj riječi po igri'; +$string[ 'hangman_showcorrectanswer'] = 'Prikaži ispravan odgovor nakon završetka'; +$string[ 'hangman_showfirst'] = 'Prikaži prvo slovo vješala'; +$string[ 'hangman_showlast'] = 'Prikaži zadnje slovo vješala'; +$string[ 'hangman_showquestion'] = 'Prikaži pitanje?'; +$string[ 'hiddenpicture_across'] = 'Ćelije vodoravno'; +$string[ 'hiddenpicture_down'] = 'Ćelije okomito'; +$string[ 'hiddenpicture_height'] = 'Postavi visinu slike na'; +$string[ 'hiddenpicture_pictureglossary'] = 'Rječnik za glavno pitanje i sliku'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'Kategorija rječnika za glavno pitanje'; +$string[ 'hiddenpicture_width'] = 'Postavi širinu slike na'; +$string[ 'millionaire_background'] = 'Boja pozadine'; +$string[ 'millionaire_shuffle'] = 'Izmješaj pitanja'; +$string[ 'snakes_background'] = 'Pozadina'; +$string[ 'sourcemodule'] = 'Izvor pitanja'; +$string[ 'sourcemodule_book'] = 'Odaberite knjigu'; +$string[ 'sourcemodule_glossary'] = 'Odaberite rječnik'; +$string[ 'sourcemodule_glossarycategory'] = 'Odaberite kategoriju rječnika'; +$string[ 'sourcemodule_include_subcategories'] = 'Uključi podkategorije'; +$string[ 'sourcemodule_question'] = 'Pitanja'; +$string[ 'sourcemodule_questioncategory'] = 'Kategorija pitanja'; +$string[ 'sourcemodule_quiz'] = 'Odaberite igru'; +$string[ 'sudoku_maxquestions'] = 'Maksimalan broj pitanja'; +$string[ 'toptext'] = 'Tekst na vrhu'; + +//mod_form.php +$string[ 'cross_options'] = 'Postavke križaljke'; +$string[ 'cryptex_options'] = 'Cryptex postavke'; +$string[ 'hangman_options'] = 'Postavke vješala'; +$string[ 'headerfooter_options'] = 'Postavke zaglavlja/podnožja'; +$string[ 'hiddenpicture_options'] = 'Postavke skrivene slike'; +$string[ 'millionaire_options'] = 'Postavke Milijunaša'; +$string[ 'snakes_options'] = 'Postavke \'Zmije i ljestve\''; +$string[ 'sudoku_options'] = 'Sudoku postavke'; + +//preview.php +$string[ 'formatdatetime'] = '%%d.%%m.%%Y %%I:%%M'; +$string[ 'lastip'] = 'Adresa računala'; +$string[ 'preview'] = 'Pregled'; +$string[ 'showsolution'] = 'Rješenje'; +$string[ 'timefinish'] = 'Kraj igre'; +$string[ 'timelastattempt'] = 'Posljednji pokušaj'; +$string[ 'timestart'] = 'Početak'; + +//review.php +$string[ 'completedon'] = 'Završeno'; +$string[ 'outof'] = '$a->grade od maksimalno $a->maxgrade'; +$string[ 'review'] = 'Pregled'; +$string[ 'reviewofattempt'] = 'Pregled pokušaja $a'; +$string[ 'startagain'] = 'Ponovo igraj'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Obriši statistiku'; +$string[ 'computerepetitions'] = 'Ponovo izračunaj statistiku'; +$string[ 'feedbacks'] = 'Poruke ispravnih odgovora'; +$string[ 'repetitions'] = 'Ponavljanja'; + +//tabs.php +$string[ 'export_to_html'] = 'Izvoz u HTML'; +$string[ 'export_to_javame'] = 'Izvoz u Javame'; +$string[ 'info'] = 'Informacije'; +$string[ 'results'] = 'Rezultati'; +$string[ 'showanswers'] = 'Prikaži odgovore'; +$string[ 'showattempts'] = 'Prikaži pokušaje'; + +//view.php +$string[ 'attemptgamenow'] = 'Pokušaj ponovo'; +$string[ 'continueattemptgame'] = 'Nastavi sa prethodnim pokušajem ove igre'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Oznake'; +$string[ 'nomoreattempts'] = 'Novi pokušaji nisu dozvoljeni'; +$string[ 'reattemptgame'] = 'Ponovni pokušaj igre'; +$string[ 'yourfinalgradeis'] = 'Vaša konačna ocjena za ovu igru je $a.'; + +//Untranslated +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod.html $string[ 'selectgame'] = 'Select game'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/it_utf8/game.php b/lang/it_utf8/game.php new file mode 100644 index 0000000..9e59771 --- /dev/null +++ b/lang/it_utf8/game.php @@ -0,0 +1,295 @@ +benvenuti!

    clicca una parola per cominciare .

    '; +$string[ 'finish'] = 'fine del gioco'; +$string[ 'letter'] = 'lettera'; +$string[ 'letters'] = 'lettere'; +$string[ 'nextgame'] = 'nuovo gioco'; +$string[ 'no_words'] = 'una o più parole non sono state trovate'; +$string[ 'print'] = 'stampa'; +$string[ 'win'] = 'congratulazioni!!!'; + +//db/access.php + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'la frase giusta era: '; +$string[ 'hangman_correct_word'] = 'la parola giusta era: '; +$string[ 'hangman_gradeinstance'] = 'punti a tutto il gioco '; +$string[ 'hangman_letters'] = ' lettere : '; +$string[ 'hangman_restletters_many'] = 'avete ancora $a delle opportunità'; +$string[ 'hangman_restletters_one'] = 'avetesolo una opportunità'; +$string[ 'hangman_wrongnum'] = 'Sbagliato: %%d out of %%d'; +$string[ 'nextword'] = 'parola prossima'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Valuta la risposta relativa alla figura nascosta'; +$string[ 'hiddenpicture_nocols'] = 'dovete definire il numero di righe orizzontali'; +$string[ 'hiddenpicture_nomainquestion'] = 'non c’è voce di glossario che $a->name contenga una figura'; +$string[ 'hiddenpicture_norows'] = 'dovete definire il numero di colonne verticali'; +$string[ 'must_select_glossary'] = 'dovete scegliere un glossario'; +$string[ 'noglossaryentriesfound'] = 'Non sono state trovate voci di glossario'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Dovrete scegliere una categoria di domande'; +$string[ 'millionaire_must_select_quiz'] = 'dovrete scegliere un quiz'; + +//report/overview/report.php +$string[ 'allattempts'] = 'mostra tutti i tentativi'; +$string[ 'allstudents'] = 'mostra tutti $a'; +$string[ 'attemptsonly'] = 'indica solo gli studenti che hanno svolto tentativi'; +$string[ 'deleteattemptcheck'] = 'Sei sicbookquiz_emptyuro che tu vuoi eliminare completamente questi tentativi?'; +$string[ 'displayoptions'] = 'mostrare i fattori'; +$string[ 'downloadods'] = 'salvare in formato ODS'; +$string[ 'feedback'] = 'risposta'; +$string[ 'noattemptsonly'] = 'mostra solo $a che non presentano tentativi'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring Hanno fatto $a->attemptnum tentativi'; +$string[ 'overview'] = 'sommario'; +$string[ 'pagesize'] = 'domande per pagina:'; +$string[ 'selectall'] = 'seleziona tutti'; +$string[ 'selectnone'] = 'deseleziona tutti'; +$string[ 'showdetailedmarks'] = 'mostra i dettagli delle valutazioni'; +$string[ 'startedon'] = 'inziato alle'; +$string[ 'timecompleted'] = ' completo'; +$string[ 'timetaken'] = 'tempo impiegato'; +$string[ 'unfinished'] = 'non concluso'; +$string[ 'withselected'] = 'con i file selezionati'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'numero di Sudoku che saranno creati'; +$string[ 'sudoku_create_start'] = 'inizia a creare i sudoku'; +$string[ 'sudoku_creating'] = 'creazione del $a sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'fine del gioco'; +$string[ 'sudoku_guessnumber'] = 'indovina il numero corretto'; +$string[ 'sudoku_noentriesfound'] = 'non si sono trovate parole nel glossario'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'giochi'; + +//export.php +$string[ 'export'] = 'esporta'; +$string[ 'html_hascheckbutton'] = 'Includi il comando per controllare la risposta:'; +$string[ 'html_hasprintbutton'] = 'ilcludi il comando di stampa:'; +$string[ 'html_title'] = 'titolo della pagina:'; +$string[ 'javame_createdby'] = 'creato da:'; +$string[ 'javame_description'] = ' descrizione:'; +$string[ 'javame_filename'] = 'nome del file:'; +$string[ 'javame_icon'] = 'icona:'; +$string[ 'javame_maxpictureheight'] = 'massima altezza della figura:'; +$string[ 'javame_maxpicturewidth'] = 'massima larghezza della figura:'; +$string[ 'javame_name'] = 'nome:'; +$string[ 'javame_type'] = 'Tipo:'; +$string[ 'javame_vendor'] = 'Vendor:'; +$string[ 'javame_version'] = 'versione:'; +$string[ 'only_teachers'] = 'solo gli insegnanti possono vedere questa pagina'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'fine del gioco'; +$string[ 'html_hangman_new'] = 'nuovo'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'chiedi al pubblico'; +$string[ 'millionaire_info_people'] = 'il pubblico dice che'; +$string[ 'millionaire_info_telephone'] = 'ritengo che la giusta risposta sia la…'; +$string[ 'millionaire_info_wrong_answer'] = 'la tua risposta è sbagliata
    La risposta corretta è :'; +$string[ 'millionaire_quit'] = 'esci'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'peri il gioco del milionario, la fonte dovrebbe essere $a o Domande e non …'; +$string[ 'millionaire_telephone'] = 'chiedi aiuto a casa'; +$string[ 'must_select_questioncategory'] = ' dovete scegliere una categoria di domande'; +$string[ 'must_select_quiz'] = 'dovete scegliere un quiz'; + +//exporthtml_snakes.php +$string[ 'score'] = 'punti'; + +//header.php +$string[ 'modulename'] = 'gioco'; + +//index.php +$string[ 'attempts'] = 'prove'; + +//lib.php +$string[ 'attempt'] = ' tentativo $a'; +$string[ 'game_bookquiz'] = 'libro con le domande'; +$string[ 'game_cross'] = 'cruciverba'; +$string[ 'game_cryptex'] = 'criptoverba'; +$string[ 'game_hangman'] = 'gioco dell\'impiccato'; +$string[ 'game_hiddenpicture'] = 'la pittura nascosta '; +$string[ 'game_millionaire'] = 'gioco del milionario'; +$string[ 'game_snakes'] = 'serpentino'; +$string[ 'game_sudoku'] = 'sudoku'; +$string[ 'noattempts'] = 'nessun tentativo è stato fatto in questo gioco'; +$string[ 'percent'] = 'percentuale'; + +//locallib.php +$string[ 'attemptfirst'] = 'primo tentativo'; +$string[ 'attemptlast'] = 'ultimo tentativo'; +$string[ 'gradeaverage'] = 'media dei voti'; +$string[ 'gradehighest'] = 'il voto più alto'; + +//mod.html +$string[ 'bottomtext'] = 'testo sul fondo della pagina'; +$string[ 'cross_layout'] = 'schema del cruciverba'; +$string[ 'cross_layout0'] = 'definizioni sotto il cruciverba'; +$string[ 'cross_layout1'] = 'definizioni a destra del cruciverba'; +$string[ 'cross_maxcols'] = 'Massimo numero di linee / colonne nel cruciverba'; +$string[ 'cross_maxwords'] = 'Massimo numero di parole nel cruciverba'; +$string[ 'cryptex_maxcols'] = 'Massimo numero di line / colone nel criptoverba'; +$string[ 'cryptex_maxtries'] = 'massimo numero di tentativi'; +$string[ 'cryptex_maxwords'] = 'Massimo numero di parole nel criptoverba'; +$string[ 'grademethod'] = 'metodo di valutazione'; +$string[ 'hangman_allowspaces'] = 'consenti spazi vuoti fra le parole'; +$string[ 'hangman_allowsub'] = 'consenti il simbolo – nelle parole'; +$string[ 'hangman_imageset'] = 'scegliete compilazione di fotografie'; +$string[ 'hangman_language'] = 'lingua delle parole'; +$string[ 'hangman_maxtries'] = 'numero di parole per gioco'; +$string[ 'hangman_showcorrectanswer'] = 'mostra la risposta esatta dopo la fine del gioco'; +$string[ 'hangman_showfirst'] = 'mostra la prima lettera della parola'; +$string[ 'hangman_showlast'] = 'mostra l\'ultima lettera della parola'; +$string[ 'hangman_showquestion'] = 'mostra le domande ;'; +$string[ 'hiddenpicture_across'] = 'numero di caselle orizzontali'; +$string[ 'hiddenpicture_down'] = 'numero di caselle vertcali'; +$string[ 'hiddenpicture_height'] = 'dimensione della altezza della figura'; +$string[ 'hiddenpicture_pictureglossary'] = 'glossario di riferimento per la figura nascosta e relativa domanda'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'glossario di riferimento per le varie domande'; +$string[ 'hiddenpicture_width'] = 'dimensioni della larghezza della figura'; +$string[ 'millionaire_background'] = 'colore di sfondo'; +$string[ 'millionaire_shuffle'] = 'sorteggia l\'ordine delle domande'; +$string[ 'selectgame'] = 'seleziona il gioco ι'; +$string[ 'snakes_background'] = 'livello'; +$string[ 'sourcemodule'] = 'sorgente delle domande'; +$string[ 'sourcemodule_book'] = 'scegli un libro '; +$string[ 'sourcemodule_glossary'] = 'scegli un glossario'; +$string[ 'sourcemodule_glossarycategory'] = 'scegli una categoria di glossari'; +$string[ 'sourcemodule_include_subcategories'] = 'includere le sotto-categorie'; +$string[ 'sourcemodule_question'] = 'domande'; +$string[ 'sourcemodule_questioncategory'] = 'seleziona una categoria di domande'; +$string[ 'sourcemodule_quiz'] = 'seleziona un quiz'; +$string[ 'sudoku_maxquestions'] = 'Massimo numero di domande'; +$string[ 'toptext'] = 'testo in cima'; + +//mod_form.php +$string[ 'cross_options'] = 'opzioni di incrocio'; +$string[ 'cryptex_options'] = 'opzioni nel criptoverba'; +$string[ 'hangman_options'] = 'opzioni del gioco dell\'impiccato'; +$string[ 'headerfooter_options'] = 'opzioni nell\'header e footer'; +$string[ 'hiddenpicture_options'] = 'opzioni della figura nascosta'; +$string[ 'millionaire_options'] = 'opzioni del gioco del milionario'; +$string[ 'snakes_options'] = 'opzioni del gioco delle serpentine'; +$string[ 'sudoku_options'] = 'opzioni del gioco del Sudoku'; + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%H:%%M'; +$string[ 'lastip'] = 'IP dello studente'; +$string[ 'preview'] = 'anteprima'; +$string[ 'showsolution'] = 'soluzione'; +$string[ 'timefinish'] = 'fine del gioco'; +$string[ 'timelastattempt'] = 'ultima prova'; +$string[ 'timestart'] = 'inizio'; + +//review.php +$string[ 'completedon'] = 'Completato alle'; +$string[ 'outof'] = '$a->voto su un massimo di $a->maxgrade'; +$string[ 'review'] = 'mostra'; +$string[ 'reviewofattempt'] = ';mostra il tentativo $a'; +$string[ 'startagain'] = 'ricomincia'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Clear statistics'; +$string[ 'computerepetitions'] = 'ricalcola le statistiche'; +$string[ 'feedbacks'] = 'messaggio della risposta corretta'; +$string[ 'repetitions'] = 'ripetizioni'; + +//tabs.php +$string[ 'export_to_html'] = 'esporta come HTML'; +$string[ 'export_to_javame'] = 'esporta come JAVAME per celle'; +$string[ 'info'] = ' informazioni'; +$string[ 'results'] = 'risultati'; +$string[ 'showanswers'] = 'mostra le risposte'; +$string[ 'showattempts'] = 'mostra i tentativi'; + +//view.php +$string[ 'attemptgamenow'] = 'vuoi fare l\'esercizio ora?'; +$string[ 'continueattemptgame'] = 'continua un precedente tentativo'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'voti'; +$string[ 'nomoreattempts'] = 'non sono permessi altri tentativi'; +$string[ 'reattemptgame'] = 'nuovo tentativo nel gioco'; +$string[ 'yourfinalgradeis'] = 'La tua valutazione finale per questo gioco è $a'; + +//Untranslated +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/lt_utf8/game.php b/lang/lt_utf8/game.php new file mode 100644 index 0000000..e1e6db8 --- /dev/null +++ b/lang/lt_utf8/game.php @@ -0,0 +1,304 @@ +Sveiki!

    Norėdami pradėti, paspauskite bet kurį kryžiažodžio langelį. Atsiradusiame lauke įveskite savo atsakymą.

    '; // '

    Welcome!

    Click on a word to begin.

    '; +$string[ 'finish'] = 'Žaidimo pabaiga'; // 'End of game'; +$string[ 'letter'] = 'raidė'; // 'letter'; +$string[ 'letters'] = 'raidės'; // 'letters'; +$string[ 'nextgame'] = 'Naujas žaidimas'; // 'New game'; +$string[ 'no_words'] = 'Nėra žodžių'; // 'There are no words'; +$string[ 'print'] = 'Spausdinti'; // 'Print'; +$string[ 'win'] = 'Sveikiname !!!'; // 'Congratulations !!!'; + +//db/access.php +$string[ 'game:attempt'] = 'Pradėti žaidimą'; // 'Play game'; +$string[ 'game:deleteattempts'] = 'Ištrinti bandymus'; // 'Delete attempts'; +$string[ 'game:grade'] = 'Rašyti žaidimų įvertinimus'; // 'Grade games manually'; +$string[ 'game:manage'] = 'Tvarkyti'; // 'Manage'; +$string[ 'game:preview'] = 'Peržiūrėti žaidimus'; // 'Preview Games'; +$string[ 'game:reviewmyattempts'] = 'Peržiūrėti bandymus'; // 'reviewmyattempts'; +$string[ 'game:view'] = 'žiūrėti'; // 'view'; +$string[ 'game:viewreports'] = 'Peržiūrėti ataskaitas'; // 'viewreports'; + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Teisinga frazė buvo: '; // 'The correct phrase was: '; +$string[ 'hangman_correct_word'] = 'Teisingas žodis buvo: '; // 'The correct word was: '; +$string[ 'hangman_gradeinstance'] = 'Viso žaidimo įvertinimas'; // 'Grade in whole game'; +$string[ 'hangman_letters'] = 'Raidės: '; // 'Letters: '; +$string[ 'hangman_restletters_many'] = 'Jums liko {$a} bandymai'; // 'You have {$a} tries'; +$string[ 'hangman_restletters_one'] = 'Jums liko TIK 1 - PASKUTINIS bandymas'; // 'You have ONLY 1 try'; +$string[ 'hangman_wrongnum'] = 'Neteisingai: %d iš %d'; // 'Wrong: %d out of %d'; +$string[ 'nextword'] = 'Sekantis žodis'; // 'Next word'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Vertinti pagrindinį atsakymą'; // 'Grade main answer'; +$string[ 'hiddenpicture_nocols'] = 'Reikia nurodyti stulpelių skaičių'; // 'Have to specify the number of cols horizontaly'; +$string[ 'hiddenpicture_nomainquestion'] = 'Žodyne {$a->name} nėra įrašo su pridėta nuotrauka'; // 'There are no glossary entries on glossary {$a->name} with an attached picture'; +$string[ 'hiddenpicture_norows'] = 'Reikia nurodyti eilučių skaičių'; // 'Have to specify the number of cols verticaly'; +$string[ 'must_select_glossary'] = 'Privalote parinkti žodyną'; // 'You must select a glossary'; +$string[ 'no_questions'] = "Nėra klausimų"; // "There are no questions"; +$string[ 'noglossaryentriesfound'] = 'Žodyne nerasta nei vieno įrašo'; // 'No glossary entries found'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Pasirinkite klausimo kategoriją'; // 'You must select one question category'; +$string[ 'millionaire_must_select_quiz'] = 'Pasirinkite klausimų sąrašą'; // 'You must select one quiz'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Rodyti visus bandymus'; // 'Show all tries'; +$string[ 'allstudents'] = 'Rodyti visus $a'; // 'Show all $a'; +$string[ 'attemptsonly'] = 'Rodyti tik bandžiusius spręsti studentus'; // 'Show only students with attempts'; +$string[ 'deleteattemptcheck'] = 'Ar jūs tikrai norite visiškai pašalinti šiuos bandymus?'; // 'Are you absolutely sure you want to completely delete these attempts?'; +$string[ 'displayoptions'] = 'Parodyti parinktis'; // 'Display options'; +$string[ 'downloadods'] = 'Atsiųsti ODS formatu'; // 'Download in ODS format'; +$string[ 'feedback'] = 'Atsiliepimai'; // 'Feedback'; +$string[ 'noattemptsonly'] = 'Rodyti tiktai $a nebandžiusius spręsti'; // 'Show $a with no attempts only'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring atliko $a->attemptnum bandymų'; // '$a->studentnum $a->studentstring have made $a->attemptnum attempts'; +$string[ 'pagesize'] = 'Klausimų viename puslapyje:'; // 'Questions per page:'; +$string[ 'selectall'] = 'Pažymėti viską'; // 'Select all'; +$string[ 'selectnone'] = 'Panaikinti žymėjimą'; // 'Deselect all'; +$string[ 'showdetailedmarks'] = 'Rodyti vertininmą išsamiai'; // 'Show mark details'; +$string[ 'startedon'] = 'Pradėta'; // 'Started on'; +$string[ 'timecompleted'] = 'Pabaigta'; // 'Completed'; +$string[ 'timetaken'] = 'Užėmė laiko'; // 'Time taken'; +$string[ 'unfinished'] = 'atverti'; // 'open'; +$string[ 'withselected'] = 'Su pažymėtais'; // 'With selected'; + +//snakes/play.php +$string[ 'snakes_dice'] = 'Žaidimo kauliukas, $a taškų.'; // 'Dice, $a spots.'; +$string[ 'snakes_player'] = 'Žaidėjo, vieta: $a.'; // 'Player, position: $a.'; + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Sukuriamų sudoku žaidimų skaičius'; // 'Number of sudokus that will be created'; +$string[ 'sudoku_create_start'] = 'Pradėti kurti sudoku žaidimus'; // 'Start creating sudokus'; +$string[ 'sudoku_creating'] = 'Kuriamas {$a} sudoku'; // 'Creating {$a} sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Baigti žaidimą'; // 'End of game'; +$string[ 'sudoku_guessnumber'] = 'Spėti teisingą skaičių'; // 'Guess the correct number'; +$string[ 'sudoku_noentriesfound'] = 'Žodyne nerasta nei vieno įrašo'; // 'No words found in glossary'; + +//attempt.php +$string[ 'gameclosed'] = 'Žaidimas užbaigtas {$a}'; // 'This game closed on {$a}'; +$string[ 'gamenotavailable'] = 'Žaidimas nebus pradedamas iki {$a}'; // 'The game will not be available until {$a}'; + +//backuplib.php +$string[ 'modulenameplural'] = 'Žaidimai'; // 'Games'; + +//export.php +$string[ 'export'] = 'Eksportuoti'; // 'Export'; +$string[ 'html_hascheckbutton'] = 'Yra tikrinimo mygtukas:'; // 'Has check button:'; +$string[ 'html_hasprintbutton'] = 'Yra spausdinimo mygtukas:'; // 'Has print button:'; +$string[ 'html_title'] = 'html antraštė:'; // 'Title of html:'; +$string[ 'javame_createdby'] = 'Autorius:'; // 'Created by:'; +$string[ 'javame_description'] = 'Aprašymas:'; // 'Description:'; +$string[ 'javame_filename'] = 'Failo vardas:'; // 'Filename:'; +$string[ 'javame_icon'] = 'Piktograma:'; // 'Icon:'; +$string[ 'javame_maxpictureheight'] = 'Maksimalus nuotraukos aukštis:'; // 'Max picture height:'; +$string[ 'javame_maxpicturewidth'] = 'Maksimalus nuotraukos plotis:'; // 'Max picture width:'; +$string[ 'javame_name'] = 'Pavadinimas:'; // 'Name:'; +$string[ 'javame_type'] = 'Tipas:'; // 'Type:'; +$string[ 'javame_vendor'] = 'Pardavėjas:'; // 'Vendor:'; +$string[ 'javame_version'] = 'Versija:'; // 'Version:'; +$string[ 'only_teachers'] = 'Tik mokytojai gali matyti šį puslapį'; // 'Only teacher can see this page'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Žaidimas baigtas'; // 'Game over'; +$string[ 'html_hangman_new'] = 'Naujas žaidimas'; // 'New'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Salės pagalba'; // 'Help of people'; +$string[ 'millionaire_info_people'] = 'Salė sako'; // 'People say'; +$string[ 'millionaire_info_telephone'] = 'Man atrodo teisingas atsakymas yra '; // 'I think that the correct answer is '; +$string[ 'millionaire_info_wrong_answer'] = 'Jūsų atsakymas neteisingas.
    Teisingas atsakymas yra:'; // 'Your answer is wrong
    The right answer is:'; +$string[ 'millionaire_quit'] = 'Baigti'; // 'Quit'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Milijonierio žaidimui duomenys turi būti {$a} arba klausimai, bet ne'; // 'For the millionaire the source must be {$a} or questions and not'; +$string[ 'millionaire_telephone'] = 'Pagalba telefonu'; // 'Help of telephone'; +$string[ 'must_select_questioncategory'] = 'Pasirinkite klausimo kategoriją'; // 'You must select a question category'; +$string[ 'must_select_quiz'] = 'Pasirinkite klausimų sąrašą'; // 'You must select a quiz'; + +//exporthtml_snakes.php +$string[ 'html_snakes_check'] = 'Tikrinti'; // 'Check'; +$string[ 'html_snakes_correct'] = 'Teisingai!'; // 'Correct!'; +$string[ 'html_snakes_no_selection'] = 'Turite ką nors pažymėti!'; // 'Have to select something!'; +$string[ 'html_snakes_wrong'] = "Jūsų atsakymas neteisingas. Pasiliekate toje pačioje vietoje."; // "Your answer isn't correct. Stay on the same seat."; +$string[ 'score'] = 'Rezultatas'; // 'Score'; + +//header.php +$string[ 'modulename'] = 'Žaidimas'; // 'Game'; + +//index.php +$string[ 'attempts'] = 'Bandymai'; // 'Attempts'; + +//lib.php +$string[ 'attempt'] = 'Bandyti'; // 'Attempt'; +$string[ 'game_bookquiz'] = 'Knyga su klausimais'; // 'Book with questions'; +$string[ 'game_cross'] = 'Kryžiažodis'; // 'Crossword'; +$string[ 'game_cryptex'] = 'Cryptex'; // 'Cryptex'; +$string[ 'game_hangman'] = 'Kartuvės'; // 'Hangman'; +$string[ 'game_hiddenpicture'] = 'Paslėpta nuotrauka'; // 'Hidden Picture'; +$string[ 'game_millionaire'] = 'Milijonierius'; // 'Millionaire'; +$string[ 'game_snakes'] = 'Gyvatės ir kopėčios'; // 'Snakes and Ladders'; +$string[ 'game_sudoku'] = 'Sudoku'; // 'Sudoku'; +$string[ 'noattempts'] = 'Nebuvo bandyta žaisti šio žaidimo'; // 'No attempts have been made on this game'; +$string[ 'percent'] = 'Procentai'; // 'Percent'; +$string[ 'reset_game_all'] = 'Šalinti bandymus iš visų žaidimų'; // 'Delete tries from all games'; +$string[ 'reset_game_deleted_course'] = 'Šalinti bandymus iš pašalintų žaidimų'; // 'Delete tries from deleted courses'; + +//locallib.php +$string[ 'attemptfirst'] = 'Pirmas bandymas'; // 'First attempt'; +$string[ 'attemptlast'] = 'Paskutinis bandymas'; // 'Last attempt'; +$string[ 'convertfrom'] = '-'; // '-'; +$string[ 'convertto'] = '-'; // '-'; +$string[ 'gradeaverage'] = 'Vidurkis'; // 'Average grade'; +$string[ 'gradehighest'] = 'Aukščiausias rezultatas'; // 'Highest grade'; + +//mod.html +$string[ 'bottomtext'] = 'Tekstas puslapio apačioje'; // 'Text at the bottom of page'; +$string[ 'cross_layout'] = 'Išdėstymas'; // 'Layout'; +$string[ 'cross_layout0'] = 'Frazės po kryžiažodžiu'; // 'Phrases on the bottom of cross'; +$string[ 'cross_layout1'] = 'Frazės kryžiažodžio dešinėje'; // 'Phrases on the right of cross'; +$string[ 'cross_maxcols'] = 'Maksimalus stulpelių skaičius kryžiažodyje'; // 'Maximum number of cols of crossword'; +$string[ 'cross_maxwords'] = 'Maksimalus žodžių skaičius kryžiažodyje'; // 'Maximum number of words of crossword'; +$string[ 'cryptex_maxcols'] = 'Maksimalus stulpelių/eilučių skaičius cryptex žaidime'; // 'Maximum number of cols/rows in cryptex'; +$string[ 'cryptex_maxtries'] = 'Maksimalus bandymų skaičius'; // 'Max tries'; +$string[ 'cryptex_maxwords'] = 'Maksimalus žodžių skaičius cryptex žaidime'; // 'Maximum number of words in cryptex'; +$string[ 'grademethod'] = 'Vertinimo metodas'; // 'Grading method'; +$string[ 'hangman_allowspaces'] = 'Leisti naudoti tarpus žodžiuose'; // 'Allow spaces in words'; +$string[ 'hangman_allowsub'] = 'Leisti naudoti "-" (brūkšnelio ženklą) žodžiuose'; // 'Allow the symbol - in words'; +$string[ 'hangman_imageset'] = 'Parinkite Kartuvių žaidimo paveiksliuką'; // 'Select the images of hangman'; +$string[ 'hangman_language'] = 'Žodžių kalba'; // 'Language of words'; +$string[ 'hangman_maxtries'] = 'Žodžių skaičius viename žaidime'; // 'Number of words per game'; +$string[ 'hangman_showcorrectanswer'] = 'Pabaigoje parodyti teisingą atsakymą'; // 'Show the correct answer after the end'; +$string[ 'hangman_showfirst'] = 'Rodyti pirmą žodžio raidę'; // 'Show first letter of hangman'; +$string[ 'hangman_showlast'] = 'Rodyti paskutinę žodžio raidę'; // 'Show last letter of hangman'; +$string[ 'hangman_showquestion'] = 'Rodyti klausimus?'; // 'Show the questions ?'; +$string[ 'hiddenpicture_across'] = 'Langeliai horizontaliai'; // 'Cells horizontal'; +$string[ 'hiddenpicture_down'] = 'Langeliai vertikaliai'; // 'Cells down'; +$string[ 'hiddenpicture_height'] = 'Nustatyti nuotraukos aukštį'; // 'Set height of picture to'; +$string[ 'hiddenpicture_pictureglossary'] = 'Pagrindinio klausimo ir nuotraukos žodymas'; // 'The glossary for main question and picture'; +$string[ 'hiddenpicture_width'] = 'Nustatyti nuotraukos plotį'; // 'Set width of picture to'; +$string[ 'millionaire_background'] = 'Fono spalva'; // 'Background color'; +$string[ 'millionaire_shuffle'] = 'Klausimų parinkimas atsitiktine tvarka'; // 'Randomize questions'; +$string[ 'snakes_background'] = 'Fonas'; // 'Background'; +$string[ 'sourcemodule'] = 'Klausimų šaltinis'; // 'Source of questions'; +$string[ 'sourcemodule_book'] = 'Parinkite knygą'; // 'Select a book'; +$string[ 'sourcemodule_glossary'] = 'Parinkite žodyną'; // 'Select glossary'; +$string[ 'sourcemodule_glossarycategory'] = 'Parinkite žodyno grupę'; // 'Select category of glossary'; +$string[ 'sourcemodule_include_subcategories'] = 'Įtraukti pogrupį'; // 'Include subcategories'; +$string[ 'sourcemodule_question'] = 'Klausimai'; // 'Questions'; +$string[ 'sourcemodule_questioncategory'] = 'Parinkite klausimų grupę'; // 'Select question category'; +$string[ 'sourcemodule_quiz'] = 'Parinkite kontrolinių klausimų sąrašą'; // 'Select quiz'; +$string[ 'sudoku_maxquestions'] = 'Didžiausias klausimų skaičius'; // 'Maximum number of questions'; +$string[ 'toptext'] = 'Tekstas puslapio viršuje'; // 'Text at the top of page'; + +//mod_form.php +$string[ 'cross_options'] = 'Kryžiažodžio parametrai'; // 'Crossword options'; +$string[ 'cryptex_options'] = 'Cryptex žaidimo parametrai'; // 'Cryptex options'; +$string[ 'gameclose'] = 'Užbaigti žaidimą'; // 'Close the game'; +$string[ 'gameopen'] = 'Pradėti žaidimą'; // 'Open the game'; +$string[ 'hangman_maximum_number_of_errors'] = 'Maksimalus klaidų skaičius (turi būti paveiksliukai kiekvienai klaidai - hangman_0.jpg, hangman_1.jpg, ...)'; // 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +$string[ 'hangman_options'] = 'Kartuvių žaidimo parametrai'; // 'Hangman options'; +$string[ 'hiddenpicture_options'] = '\'Paslėpta nuotrauka\' žaidimo parametrai'; // '\'Hidden Picture\' options'; +$string[ 'millionaire_options'] = 'Milijonieriaus žaidimo parametrai'; // 'Millionaire\' options'; +$string[ 'snakes_cols'] = 'Stulpeliai'; // 'Cols'; +$string[ 'snakes_file'] = 'Fono failas'; // 'File for background'; +$string[ 'snakes_footerx'] = 'Tarpas apačioje kairėje'; // 'Space at bootom left'; +$string[ 'snakes_footery'] = 'Tarpas apačioje dešinėje'; // 'Space at bottom right'; +$string[ 'snakes_headerx'] = 'Tarpas viršuje kairėje'; // 'Space at up left'; +$string[ 'snakes_headery'] = 'Tarpas viršuje dešinėje'; // 'Space at up right'; +$string[ 'snakes_options'] = '\'Gyvatės ir kopėčios\' žaidimo parametrai'; // '\'Snakes and Ladders\' options'; +$string[ 'snakes_rows'] = 'Eilutės'; // 'Rows'; +$string[ 'sudoku_options'] = 'Sudoku parametrai'; // 'Sudoku options'; +$string[ 'userdefined'] = 'Naudotojo apibrėžtas'; // 'User defined'; + +//preview.php +$string[ 'lastip'] = 'Studento IP'; // 'IP student'; +$string[ 'preview'] = 'Peržiūrėti'; // 'Preview'; +$string[ 'showsolution'] = 'Sprendimas'; // 'solution'; +$string[ 'timefinish'] = 'Žaidimas pabaigtas'; // 'End of game'; +$string[ 'timelastattempt'] = 'Paskutinins bandymas'; // 'Last attempt'; +$string[ 'timestart'] = 'Pradėta'; // 'Start'; + +//review.php +$string[ 'completedon'] = 'Išspręsta'; // 'Completed on'; +$string[ 'outof'] = '{$a->grade} balų iš {$a->maxgrade}'; // '{$a->grade} out of a maximum of {$a->maxgrade}'; +$string[ 'review'] = 'Peržiūrėti'; // 'Review'; +$string[ 'reviewofattempt'] = 'Peržiūrėti bandymą {$a}'; // 'Review of Attempt {$a}'; +$string[ 'startagain'] = 'Pradėti iš naujo'; // 'Start again'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Išvalyti statistiką'; // 'Clear statistics'; +$string[ 'computerepetitions'] = 'Skaičiuoti statistiką iš naujo'; // 'Compute statistics again'; +$string[ 'feedbacks'] = 'Teisingų atsakymų pranešimai'; // 'Messages correct answer'; +$string[ 'repetitions'] = 'Pasikartojimai'; // 'Repetitions'; + +//tabs.php +$string[ 'export_to_html'] = 'Eksportuoti į HTML'; // 'Export to HTML'; +$string[ 'export_to_javame'] = 'Eksportuoti į Java'; // 'Export to Javame'; +$string[ 'info'] = 'Informacija'; // 'Info'; +$string[ 'results'] = 'Rezultatas'; // 'Results'; +$string[ 'showanswers'] = 'Rodyti atsakymus'; // 'Show answers'; +$string[ 'showattempts'] = 'Rodyti bandymus'; // 'Show attempts'; + +//view.php +$string[ 'attemptgamenow'] = 'Pradėti dabar žaidimą'; // 'Attempt game now'; +$string[ 'continueattemptgame'] = 'Tęsti anksčiau pradėtą žaidimą'; // 'Continue a previous attempt of game'; +$string[ 'reattemptgame'] = 'Bandyti žaidimą dar kartą'; // 'Reattempt game'; +$string[ 'yourfinalgradeis'] = 'Galutinis Jūsų žaidimo įvertinimas yra {$a}.'; // 'Your final grade for this game is {$a}.'; + +//Untranslated +//contest/play.php $string[ 'contest_not_solved'] = 'Not solved yet'; +//contest/play.php $string[ 'contest_solved'] = 'Solved'; +//contest/play.php $string[ 'contest_top'] = 'Top grades'; +//contest/play.php $string[ 'marks'] = 'Marks'; +//report/overview/report.php $string[ 'overview'] = 'Overview'; +//lib.php $string[ 'game_contest'] = 'Contest'; +//mod.html $string[ 'hiddenpicture_pictureglossarycategories'] = 'Glossary category for main question'; +//mod.html $string[ 'selectgame'] = 'Select game'; +//mod_form.php $string[ 'contest_has_notes'] = 'Has notes'; +//mod_form.php $string[ 'contest_options'] = 'Contest options'; +//mod_form.php $string[ 'headerfooter_options'] = 'Header/Footer options'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//preview.php $string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; +//view.php $string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +//view.php $string[ 'nomoreattempts'] = 'No more attempts are allowed'; diff --git a/lang/nl_utf8/game.php b/lang/nl_utf8/game.php new file mode 100644 index 0000000..53aa9e6 --- /dev/null +++ b/lang/nl_utf8/game.php @@ -0,0 +1,303 @@ +Welkom!

    Klik op een woord om te beginnen.'; +$string[ 'finish'] = 'Einde van het spel'; +$string[ 'letter'] = 'letter'; +$string[ 'letters'] = 'letters'; +$string[ 'nextgame'] = 'Nieuw spel'; +$string[ 'no_words'] = 'Geen woorden gevonden'; +$string[ 'print'] = 'Print'; +$string[ 'win'] = 'Gefeliciteerd!!'; + +//db/access.php +$string[ 'game:attempt'] = 'Speel het spel'; +$string[ 'game:deleteattempts'] = 'Verwijder pogingen'; +$string[ 'game:grade'] = 'Geef manueel punten'; +$string[ 'game:manage'] = 'Beheer'; +$string[ 'game:preview'] = 'Bekijk Spellen'; +$string[ 'game:reviewmyattempts'] = 'Bekijk mijn pogingen'; +$string[ 'game:view'] = 'Bekijk'; +$string[ 'game:viewreports'] = 'Bekijk het rapport'; + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'De juiste oplossing was:'; +$string[ 'hangman_correct_word'] = 'Het juiste woord was:'; +$string[ 'hangman_gradeinstance'] = 'Cijfer in het hele spel'; +$string[ 'hangman_letters'] = 'Letters'; +$string[ 'hangman_restletters_many'] = 'Je hebt $a pogingen'; +$string[ 'hangman_restletters_one'] = 'Je hebt slechts ÉÉN poging'; +$string[ 'hangman_wrongnum'] = 'Fout: %%d van de %%d'; +$string[ 'nextword'] = 'Volgende woord'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Cijfer hoofdantwoord'; +$string[ 'hiddenpicture_nocols'] = 'Het aantal kolommen horizontaal dient ingesteld te worden'; +$string[ 'hiddenpicture_nomainquestion'] = 'Er zijn geen woordenlijst onderdelen in woordenlijst $a->name met een toegevoegde afbeelding.'; +$string[ 'hiddenpicture_norows'] = 'Het aantal rijen verticaal dient ingesteld te worden'; +$string[ 'must_select_glossary'] = 'Je moet een woordenlijst kiezen'; +$string[ 'no_questions'] = "Geen vragen gevonden"; +$string[ 'noglossaryentriesfound'] = 'Geen woorden gevonden'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Je moet een vragencategorie kiezen'; +$string[ 'millionaire_must_select_quiz'] = 'Je moet één quiz kiezen'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Alle pogingen'; +$string[ 'allstudents'] = 'Alle leerlingen'; +$string[ 'attemptsonly'] = 'Laat alleen leerlingen met pogingen zien'; +$string[ 'deleteattemptcheck'] = 'Weet je zeker dat je deze pogingen wilt verwijderen?'; +$string[ 'displayoptions'] = 'Weergaveopties'; +$string[ 'downloadods'] = 'Download in ODS formaat'; +$string[ 'feedback'] = 'Reactie'; +$string[ 'noattemptsonly'] = 'Laat $a zonder pogingen zien'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring heeft $a->attemptnum pogingen gedaan'; +$string[ 'overview'] = 'Overzicht'; +$string[ 'pagesize'] = 'Aantal vragen per pagina'; +$string[ 'selectall'] = 'Selecteer allemaal'; +$string[ 'selectnone'] = 'Deselecteer allemaal'; +$string[ 'showdetailedmarks'] = 'Laat markeringsdetails zien'; +$string[ 'startedon'] = 'Gestart op'; +$string[ 'timecompleted'] = 'Voltooid'; +$string[ 'timetaken'] = 'Gebruikte tijd'; +$string[ 'unfinished'] = 'open'; +$string[ 'withselected'] = 'Met geselecteerde'; + +//snakes/play.php +$string[ 'snakes_dice'] = 'Dobbelsteen, $a ogen.'; +$string[ 'snakes_player'] = 'Speler, plaats: $a.'; + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Aantal sudokus die gemaakt worden'; +$string[ 'sudoku_create_start'] = 'Start met het maken van sudokus'; +$string[ 'sudoku_creating'] = 'Creëren van $a sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Einde van het sudoku spel'; +$string[ 'sudoku_guessnumber'] = 'Gok het correcte aantal'; +$string[ 'sudoku_noentriesfound'] = 'Geen woorden gevonden in de woordenlijst'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Spellen'; + +//export.php +$string[ 'export'] = 'Exporteer'; +$string[ 'html_hascheckbutton'] = 'Heeft een check-knop:'; +$string[ 'html_hasprintbutton'] = 'Heeft een print-knop:'; +$string[ 'html_title'] = 'Html-titel:'; +$string[ 'javame_createdby'] = 'Gemaakt door:'; +$string[ 'javame_description'] = 'Beschrijving:'; +$string[ 'javame_filename'] = 'Naam van de file:'; +$string[ 'javame_icon'] = 'Icoon:'; +$string[ 'javame_maxpictureheight'] = 'Max afbeeldingshoogte:'; +$string[ 'javame_maxpicturewidth'] = 'Max afbeeldingsbreedte:'; +$string[ 'javame_name'] = 'Naam:'; +$string[ 'javame_type'] = 'Type:'; +$string[ 'javame_vendor'] = 'Verkoper:'; +$string[ 'javame_version'] = 'Versie:'; +$string[ 'only_teachers'] = 'Alleen de leraar kan deze pagina zien'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Spel voorbij'; +$string[ 'html_hangman_new'] = 'Nieuw'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Aan het publiek vragen'; +$string[ 'millionaire_info_people'] = 'Mensen zeggen'; +$string[ 'millionaire_info_telephone'] = 'Ik denk dat het juiste antwoord is...'; +$string[ 'millionaire_info_wrong_answer'] = 'Helaas, je antwoord is fout.
    Het goede antwoord is:'; +$string[ 'millionaire_quit'] = 'Stop'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Voor de miljonair moet de bron $a zijn of de vragen en niet'; +$string[ 'millionaire_telephone'] = 'Een hulplijn bellen'; +$string[ 'must_select_questioncategory'] = 'Je moet een vragencategorie kiezen'; +$string[ 'must_select_quiz'] = 'Je moet een quiz/test kiezen'; + +//exporthtml_snakes.php +$string[ 'html_snakes_check'] = 'Check'; +$string[ 'html_snakes_correct'] = 'Juist!'; +$string[ 'html_snakes_no_selection'] = 'Je moet iets aanduiden!'; +$string[ 'html_snakes_wrong'] = "Je antwoord is niet juist, je mag niet verdergaan op het bord."; +$string[ 'score'] = 'Score'; + +//header.php +$string[ 'modulename'] = 'Spel'; + +//index.php +$string[ 'attempts'] = 'Pogingen'; + +//lib.php +$string[ 'attempt'] = 'Poging $a'; +$string[ 'game_bookquiz'] = 'Boek met vragen'; +$string[ 'game_cross'] = 'Kruiswoord'; +$string[ 'game_cryptex'] = 'Cryptex'; +$string[ 'game_hangman'] = 'Galgje'; +$string[ 'game_hiddenpicture'] = 'Verborgen foto'; +$string[ 'game_millionaire'] = 'Miljonair'; +$string[ 'game_snakes'] = 'Slangen en Ladders'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Er zijn in deze quiz/test geen pogingen gedaan'; +$string[ 'percent'] = 'Percentage'; + +//locallib.php +$string[ 'attemptfirst'] = 'Eerste poging'; +$string[ 'attemptlast'] = 'Laatste poging'; +$string[ 'gradeaverage'] = 'Gemiddeld cijfer'; +$string[ 'gradehighest'] = 'Hoogste cijfer'; + +//mod.html +$string[ 'bottomtext'] = 'Tekst aan onderkant'; +$string[ 'cross_layout'] = 'Layout'; +$string[ 'cross_layout0'] = 'Zinnen aan de onderkant van het kruiswoord'; +$string[ 'cross_layout1'] = 'Zinnen aan de rechterkant van het kruiswoord'; +$string[ 'cross_maxcols'] = 'Maximum aantal kolommen in kruiswoord'; +$string[ 'cross_maxwords'] = 'Maximum aantal woorden in het kruiswoord'; +$string[ 'cryptex_maxcols'] = 'Maximum aantal kolommen/rijen in de cryptex'; +$string[ 'cryptex_maxtries'] = 'Max pogingen'; +$string[ 'cryptex_maxwords'] = 'Maximum aantal woorden in de cryptex'; +$string[ 'grademethod'] = 'Becijferingsmethode'; +$string[ 'hangman_allowspaces'] = 'Sta spaties in woorden toe'; +$string[ 'hangman_allowsub'] = 'Sta het -symbool toe in woorden'; +$string[ 'hangman_imageset'] = 'Kies de plaatjes voor galgje'; +$string[ 'hangman_language'] = 'Taal van de woorden'; +$string[ 'hangman_maxtries'] = 'Aantal woorden per spel'; +$string[ 'hangman_showcorrectanswer'] = 'Laat de juiste antwoorden aan het einde zien'; +$string[ 'hangman_showfirst'] = 'Laat de eerste letter bij galgje zien'; +$string[ 'hangman_showlast'] = 'Laat de laatste letter bij galgje zien'; +$string[ 'hangman_showquestion'] = 'Laat de vragen zien?'; +$string[ 'hiddenpicture_across'] = 'Cellen horizontaal'; +$string[ 'hiddenpicture_down'] = 'Cellen naar beneden'; +$string[ 'hiddenpicture_height'] = 'Stel de hoogte in op'; +$string[ 'hiddenpicture_pictureglossary'] = 'De woordenlijst voor de hoofdvraag'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'De categorie uit de woordenlijst voor de hoofdvraag'; +$string[ 'hiddenpicture_width'] = 'Stel de breedte van de afbeelding in op'; +$string[ 'millionaire_background'] = 'Achtergrondkleur'; +$string[ 'millionaire_shuffle'] = 'Haal de vragen door elkaar'; +$string[ 'selectgame'] = 'Selecteer spel'; +$string[ 'snakes_background'] = 'Achtergrond'; +$string[ 'sourcemodule'] = 'Vragenbron'; +$string[ 'sourcemodule_book'] = 'Kies een boek'; +$string[ 'sourcemodule_glossary'] = 'Kies een woordenlijst'; +$string[ 'sourcemodule_glossarycategory'] = 'Selecteer een categorie van de woordenlijst'; +$string[ 'sourcemodule_include_subcategories'] = 'Subcategorieën meerekenen'; +$string[ 'sourcemodule_question'] = 'Vragen'; +$string[ 'sourcemodule_questioncategory'] = 'Selecteer vragencategorie'; +$string[ 'sourcemodule_quiz'] = 'Selecteer quiz/test'; +$string[ 'sudoku_maxquestions'] = 'Maximum aantal vragen'; +$string[ 'toptext'] = 'Teskt bovenaan de pagina'; + +//mod_form.php +$string[ 'cross_options'] = 'Kruiswoordraadsel opties'; +$string[ 'cryptex_options'] = 'Woordzoeker opties'; +$string[ 'hangman_options'] = 'Galgje opties'; +$string[ 'headerfooter_options'] = 'Opties header en footer'; +$string[ 'hiddenpicture_options'] = '\'Verborgen afbeelding\' opties'; +$string[ 'millionaire_options'] = 'Miljonair\' opties'; +$string[ 'snakes_board'] = 'Spelbord'; +$string[ 'snakes_cols'] = 'Kolommen'; +$string[ 'snakes_file'] = 'Achtergrond'; +$string[ 'snakes_footerx'] = 'Ruimte linksonder'; +$string[ 'snakes_footery'] = 'Ruimte rechtsonder'; +$string[ 'snakes_headerx'] = 'Ruimte linksboven'; +$string[ 'snakes_headery'] = 'Ruimte rechtsboven'; +$string[ 'snakes_options'] = '\'Slangen en ladders\' opties'; +$string[ 'snakes_rows'] = 'Rijen'; +$string[ 'sudoku_options'] = 'Sudoku opties'; +$string[ 'userdefined'] = 'Bepaald door de gebruiker'; + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'IP leerling'; +$string[ 'preview'] = 'Voorbeeld'; +$string[ 'showsolution'] = 'oplossing'; +$string[ 'timefinish'] = 'Einde van het spel'; +$string[ 'timelastattempt'] = 'Laatste poging'; +$string[ 'timestart'] = 'Start'; + +//review.php +$string[ 'completedon'] = 'Voltooid op'; +$string[ 'outof'] = '$a->grade uit een maximum van $a->maxgrade'; +$string[ 'review'] = 'Bekijk'; +$string[ 'reviewofattempt'] = 'Overzicht van Poging $a'; +$string[ 'startagain'] = 'Start opnieuw'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Ruim statistieken op'; +$string[ 'computerepetitions'] = 'Bereken statistieken opnieuw'; +$string[ 'feedbacks'] = 'Berichten bij juist antwoord'; +$string[ 'repetitions'] = 'Herhalingen'; + +//tabs.php +$string[ 'export_to_html'] = 'Exporteer naar HTML'; +$string[ 'export_to_javame'] = 'Exporteer naar Javame'; +$string[ 'info'] = 'Info'; +$string[ 'results'] = 'Resultaten'; +$string[ 'showanswers'] = 'Laat antwoorden zien'; +$string[ 'showattempts'] = 'Toon pogingen'; + +//view.php +$string[ 'attemptgamenow'] = 'Probeer het spel nu'; +$string[ 'continueattemptgame'] = 'Ga verder met een vorige poging'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade'; +$string[ 'nomoreattempts'] = 'Er zijn geen pogingen meer toegestaan'; +$string[ 'reattemptgame'] = 'Probeer het spel opnieuw'; +$string[ 'yourfinalgradeis'] = 'Je uiteindelijke cijfer voor dit spel is $a.'; + +//Untranslated +//contest/play.php $string[ 'contest_not_solved'] = 'Not solved yet'; +//contest/play.php $string[ 'contest_solved'] = 'Solved'; +//contest/play.php $string[ 'contest_top'] = 'Top grades'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//lib.php $string[ 'game_contest'] = 'Contest'; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod_form.php $string[ 'contest_has_notes'] = 'Has notes'; +//mod_form.php $string[ 'contest_options'] = 'Contest options'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/no_utf8/game.php b/lang/no_utf8/game.php new file mode 100644 index 0000000..e1eefa0 --- /dev/null +++ b/lang/no_utf8/game.php @@ -0,0 +1,295 @@ +Velkommen!

    Klikk et ord for å begyne.

    '; +$string[ 'finish'] = 'Spill slutt'; +$string[ 'letter'] = 'bokstav'; +$string[ 'letters'] = 'bokstaver'; +$string[ 'nextgame'] = 'Nytt spill'; +$string[ 'no_words'] = 'Ingen ord funnet'; +$string[ 'win'] = 'Gratulerer!!!'; + +//db/access.php + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Korrekt setning var:'; +$string[ 'hangman_correct_word'] = 'Korrekt ord var:'; +$string[ 'hangman_gradeinstance'] = 'Karakter i hele spillet'; +$string[ 'hangman_letters'] = 'Bokstaver:'; +$string[ 'hangman_restletters_many'] = 'Du har $a forsøk'; +$string[ 'hangman_restletters_one'] = 'Du har BARE 1 forsøk'; +$string[ 'hangman_wrongnum'] = 'Feil: %%d av %%d'; +$string[ 'nextword'] = 'Neste ord'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Karakter hovedsvar'; +$string[ 'hiddenpicture_nocols'] = 'Du må angi antall kolonner horisontalt'; +$string[ 'hiddenpicture_nomainquestion'] = 'Det er ingen ordbokinnlegg i ordboken $a->name med vedlagt bilde'; +$string[ 'hiddenpicture_norows'] = 'Må angi antall kolonner vertikalt'; +$string[ 'must_select_glossary'] = 'Du må velge en ordbok'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Du må velge en spørsmålskategori'; +$string[ 'millionaire_must_select_quiz'] = 'Du må velge en prøve'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Alle forsøk'; +$string[ 'allstudents'] = 'Alle studenter'; +$string[ 'attemptsonly'] = 'Bare vis studenter som har forsøkt'; +$string[ 'deleteattemptcheck'] = 'Er du sikkker på at du vil slette disse forsøkene helt?'; +$string[ 'displayoptions'] = 'Vis valg'; +$string[ 'downloadods'] = 'Last ned i ODS format'; +$string[ 'feedback'] = 'Tilbakemelding'; +$string[ 'noattemptsonly'] = 'Vis $a uten noen forsøk'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring har gjort $a->attemptnum forsøk'; +$string[ 'overview'] = 'Oversikt'; +$string[ 'pagesize'] = 'Spørsmål per side'; +$string[ 'selectall'] = 'Velg alle'; +$string[ 'selectnone'] = 'Ikke velg noen'; +$string[ 'showdetailedmarks'] = 'Vis markeringsdetaljer'; +$string[ 'startedon'] = 'Startet'; +$string[ 'timecompleted'] = 'Ferdig'; +$string[ 'timetaken'] = 'Tid brukt'; +$string[ 'unfinished'] = 'åpne'; +$string[ 'withselected'] = 'Med valgte'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Antall sudokus som vil lages'; +$string[ 'sudoku_create_start'] = 'Start med å lage sudokus'; +$string[ 'sudoku_creating'] = 'Lag $asudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Slutt på sudokuspill'; +$string[ 'sudoku_guessnumber'] = 'Gjett riktig tall'; +$string[ 'sudoku_noentriesfound'] = 'Ingen ord funnet i ordboken'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Spill'; + +//export.php +$string[ 'only_teachers'] = 'Bare lærer kan se denne siden'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Spillet slutt'; + +//exporthtml_millionaire.php +$string[ 'millionaire_info_people'] = 'Folk sier'; +$string[ 'millionaire_info_telephone'] = 'Jeg tror korrekt svar er'; +$string[ 'millionaire_info_wrong_answer'] = 'Svaret ditt er feil
    Riktig svar er:'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'I \"Vil du bli millionær\" må kilden være $a eller spørsmål og ikke'; +$string[ 'must_select_questioncategory'] = 'Du må velge en spørsmålskategori'; +$string[ 'must_select_quiz'] = 'Du må velge en prøve'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Score'; + +//header.php +$string[ 'modulename'] = 'Spill'; + +//index.php +$string[ 'attempts'] = 'Forsøk'; + +//lib.php +$string[ 'attempt'] = 'Forsøk $a'; +$string[ 'game_bookquiz'] = 'Bok med spørsmål'; +$string[ 'game_cross'] = 'Kryssord'; +$string[ 'game_cryptex'] = 'Cryptex'; +$string[ 'game_hangman'] = 'Hangman'; +$string[ 'game_hiddenpicture'] = 'Skjult bilde'; +$string[ 'game_millionaire'] = 'Millionær'; +$string[ 'game_snakes'] = 'Slange og stiger'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Ingen forsøk er gjort på denne prøven'; + +//locallib.php +$string[ 'attemptfirst'] = 'Første forsøk'; +$string[ 'attemptlast'] = 'Siste forsøk'; +$string[ 'gradeaverage'] = 'Gjennomsnittelig karakter'; +$string[ 'gradehighest'] = 'Høyeste karakter'; + +//mod.html +$string[ 'bottomtext'] = 'Bunntekst'; +$string[ 'cross_layout'] = 'Layout'; +$string[ 'cross_layout0'] = 'Fraser på bunnen på tvers'; +$string[ 'cross_layout1'] = 'Fraser til høyre på tvers'; +$string[ 'cross_maxcols'] = 'Maksimum antall kolonner i kryssordet'; +$string[ 'cross_maxwords'] = 'Maksimum antall ord i kryssordet'; +$string[ 'cryptex_maxcols'] = 'Max antall kol/rader i cryptex'; +$string[ 'cryptex_maxwords'] = 'Max antall ord i cryptex'; +$string[ 'grademethod'] = 'Karaktermetode'; +$string[ 'hangman_allowspaces'] = 'Tillatt mellomrom i ord'; +$string[ 'hangman_allowsub'] = 'Tillat symbolet i ord'; +$string[ 'hangman_imageset'] = 'Velg bilder for hangman'; +$string[ 'hangman_language'] = 'Språk for ordene'; +$string[ 'hangman_maxtries'] = 'Antall ord per spill'; +$string[ 'hangman_showcorrectanswer'] = 'Vis korrekt svar når du er ferdig'; +$string[ 'hangman_showfirst'] = 'Vis første bokstaven i hangman'; +$string[ 'hangman_showlast'] = 'Vis siste bokstaven i hangman'; +$string[ 'hangman_showquestion'] = 'Vis spørsmålet?'; +$string[ 'hiddenpicture_across'] = 'Ruter horisontalt'; +$string[ 'hiddenpicture_down'] = 'Ruter nedover'; +$string[ 'hiddenpicture_pictureglossary'] = 'Ordbok for hovedspørsmål'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'Katgori av ordbok for hovedspørsmål'; +$string[ 'selectgame'] = 'Velg spill'; +$string[ 'snakes_background'] = 'Bakgrunn'; +$string[ 'sourcemodule'] = 'Spørsmålskilde'; +$string[ 'sourcemodule_book'] = 'Velg en bok'; +$string[ 'sourcemodule_glossary'] = 'Velg ordbok'; +$string[ 'sourcemodule_glossarycategory'] = 'Velg ordbokskategori'; +$string[ 'sourcemodule_question'] = 'Spørsmål'; +$string[ 'sourcemodule_questioncategory'] = 'Velg spørsmålskategori'; +$string[ 'sourcemodule_quiz'] = 'Velg prøve'; +$string[ 'sudoku_maxquestions'] = 'Maks antall spørsmål'; + +//mod_form.php + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%l: %%M %%p'; +$string[ 'lastip'] = 'IP student'; +$string[ 'preview'] = 'Forhåndsvisning'; +$string[ 'showsolution'] = 'løsning'; +$string[ 'timefinish'] = 'Spill slutt'; +$string[ 'timelastattempt'] = 'Siste forsøk'; +$string[ 'timestart'] = 'Start'; + +//review.php +$string[ 'completedon'] = 'Ferdig på'; +$string[ 'outof'] = '$a->grade av makismalt $a->maxgrade'; +$string[ 'review'] = 'Rapport'; +$string[ 'reviewofattempt'] = 'Rapport fra forsøk $a'; +$string[ 'startagain'] = 'Start på nytt'; + +//showanswers.php +$string[ 'feedbacks'] = 'Tilbakemelding ved riktig svar'; + +//tabs.php +$string[ 'info'] = 'Info'; +$string[ 'results'] = 'Resulat'; +$string[ 'showanswers'] = 'Vis svar'; + +//view.php +$string[ 'attemptgamenow'] = 'Prøv å spille nå'; +$string[ 'continueattemptgame'] = 'Fortsette et tidligere forsøk av spillet'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade'; +$string[ 'marks'] = 'Markeringer'; +$string[ 'nomoreattempts'] = 'Ingen flere forsøk er tillatt'; +$string[ 'reattemptgame'] = 'Prøv spillet igjen'; +$string[ 'yourfinalgradeis'] = 'Din endelige karakter for spillet er $a.'; + +//Untranslated +//cross/play.php $string[ 'print'] = 'Print'; +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//hiddenpicture/play.php $string[ 'noglossaryentriesfound'] = 'No glossary entries found'; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//export.php $string[ 'export'] = 'Export'; +//export.php $string[ 'html_hascheckbutton'] = 'Include check button:'; +//export.php $string[ 'html_hasprintbutton'] = 'Include print button:'; +//export.php $string[ 'html_title'] = 'Title of html:'; +//export.php $string[ 'javame_createdby'] = 'Created by:'; +//export.php $string[ 'javame_description'] = 'Description:'; +//export.php $string[ 'javame_filename'] = 'Filename:'; +//export.php $string[ 'javame_icon'] = 'Icon:'; +//export.php $string[ 'javame_maxpictureheight'] = 'Max picture height:'; +//export.php $string[ 'javame_maxpicturewidth'] = 'Max picture width:'; +//export.php $string[ 'javame_name'] = 'Name:'; +//export.php $string[ 'javame_type'] = 'Type:'; +//export.php $string[ 'javame_vendor'] = 'Vendor:'; +//export.php $string[ 'javame_version'] = 'Version:'; +//exporthtml_hangman.php $string[ 'html_hangman_new'] = 'New'; +//exporthtml_millionaire.php $string[ 'millionaire_helppeople'] = 'Ask the audience'; +//exporthtml_millionaire.php $string[ 'millionaire_quit'] = 'Quit'; +//exporthtml_millionaire.php $string[ 'millionaire_telephone'] = 'Call a friend'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'percent'] = 'Percent'; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod.html $string[ 'cryptex_maxtries'] = 'Maximum tries'; +//mod.html $string[ 'hiddenpicture_height'] = 'Set height of picture to'; +//mod.html $string[ 'hiddenpicture_width'] = 'Set width of picture to'; +//mod.html $string[ 'millionaire_background'] = 'Background color'; +//mod.html $string[ 'millionaire_shuffle'] = 'Randomize questions'; +//mod.html $string[ 'sourcemodule_include_subcategories'] = 'Include subcategories'; +//mod.html $string[ 'toptext'] = 'Text at the top'; +//mod_form.php $string[ 'cross_options'] = 'Crossword options'; +//mod_form.php $string[ 'cryptex_options'] = 'Cryptex options'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'hangman_options'] = 'Hangman options'; +//mod_form.php $string[ 'headerfooter_options'] = 'Header/Footer options'; +//mod_form.php $string[ 'hiddenpicture_options'] = '\'Hidden Picture\' options'; +//mod_form.php $string[ 'millionaire_options'] = 'Millionaire options'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_options'] = '\'Snakes and Ladders\' options'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'sudoku_options'] = 'Sudoku options'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//showanswers.php $string[ 'clearrepetitions'] = 'Clear statistics'; +//showanswers.php $string[ 'computerepetitions'] = 'Compute statistics again'; +//showanswers.php $string[ 'repetitions'] = 'Repetitions'; +//tabs.php $string[ 'export_to_html'] = 'Export to HTML'; +//tabs.php $string[ 'export_to_javame'] = 'Export to Javame'; +//tabs.php $string[ 'showattempts'] = 'Show attempts'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/pl_utf8/game.php b/lang/pl_utf8/game.php new file mode 100644 index 0000000..7bd591e --- /dev/null +++ b/lang/pl_utf8/game.php @@ -0,0 +1,294 @@ +Witaj!

    Kliknij na słowo aby rozpocząć.

    '; +$string[ 'finish'] = 'Koniec gry'; +$string[ 'letter'] = 'litera'; +$string[ 'letters'] = 'litery'; +$string[ 'nextgame'] = 'Nowa gra'; +$string[ 'no_words'] = 'Nie znaleziono wyrazów'; +$string[ 'win'] = 'Gratulacje !!!'; + +//db/access.php + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Prawidłowa fraza to: '; +$string[ 'hangman_correct_word'] = 'Prawidłowe słowo to: '; +$string[ 'hangman_gradeinstance'] = 'Ocena za całą grę'; +$string[ 'hangman_letters'] = 'Litery: '; +$string[ 'hangman_restletters_many'] = 'Pozostało prób: $a'; +$string[ 'hangman_restletters_one'] = 'Pozostała TYLKO 1 próba'; +$string[ 'hangman_wrongnum'] = 'Źle: %%d z %%d'; +$string[ 'nextword'] = 'Następne słowo'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Oceń główną odpowiedź'; +$string[ 'hiddenpicture_nocols'] = 'Musisz określić maksymalną liczbę kolumn'; +$string[ 'hiddenpicture_nomainquestion'] = 'Brak wpisów z załączonym zdjęciem w słowniku $a->name'; +$string[ 'hiddenpicture_norows'] = 'Musisz określić maksymalną liczbę wierszy'; +$string[ 'must_select_glossary'] = 'Musisz wybrać słownik'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Musisz wybrać kategorię pytań'; +$string[ 'millionaire_must_select_quiz'] = 'Musisz wybrać jeden quiz'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Pokaż wszystkie próby'; +$string[ 'allstudents'] = 'Pokaż wszystkie $a'; +$string[ 'attemptsonly'] = 'Pokaż tylko studentów którzy dokonali prób'; +$string[ 'deleteattemptcheck'] = 'Czy na pewno chcesz usunąć te próby?'; +$string[ 'displayoptions'] = 'Wyświetl opcje'; +$string[ 'downloadods'] = 'Pobierz w formacie ODS'; +$string[ 'feedback'] = 'Informacja zwrotna'; +$string[ 'noattemptsonly'] = 'Pokaż $a bez prób'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring podjęło $a->attemptnum prób'; +$string[ 'overview'] = 'Przegląd'; +$string[ 'pagesize'] = 'Pytań na stronę:'; +$string[ 'selectall'] = 'Wybierz wszystkie'; +$string[ 'selectnone'] = 'Odznacz wszytko'; +$string[ 'showdetailedmarks'] = 'Pokaż szczegóły oceny'; +$string[ 'startedon'] = 'Rozpoczęto'; +$string[ 'timecompleted'] = 'Ukończono'; +$string[ 'timetaken'] = 'Zużyty czas'; +$string[ 'unfinished'] = 'otwarte'; +$string[ 'withselected'] = 'Z zaznaczonymi'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Liczba sudoku które zostaną stworzone'; +$string[ 'sudoku_create_start'] = 'Rozpocznij tworzenie sudoku'; +$string[ 'sudoku_creating'] = 'Tworzenie $a sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Sudoku zakończone'; +$string[ 'sudoku_guessnumber'] = 'Odgadnij prawidłową liczbę'; +$string[ 'sudoku_noentriesfound'] = 'Nie znaleziono słów w słowniku'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Gry'; + +//export.php +$string[ 'export'] = 'Eksportuj'; +$string[ 'javame_createdby'] = 'Stworzony przez:'; +$string[ 'javame_description'] = 'Opis:'; +$string[ 'javame_filename'] = 'Nazwa pliku:'; +$string[ 'javame_icon'] = 'Ikona:'; +$string[ 'javame_name'] = 'Nazwa:'; +$string[ 'javame_vendor'] = 'Dostawca:'; +$string[ 'javame_version'] = 'Wersja:'; +$string[ 'only_teachers'] = 'Tylko nauczyciel może oglądać tą stronę'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Koniec gry'; + +//exporthtml_millionaire.php +$string[ 'millionaire_info_people'] = 'Odpowiedź publiczności'; +$string[ 'millionaire_info_telephone'] = 'Wydaje mi się że prawidłowa odpowiedź to '; +$string[ 'millionaire_info_wrong_answer'] = 'Zła odpowiedź.
    Prawidłowo:'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'W milionerach źródłem mogą być $a lub pytania a nie'; +$string[ 'must_select_questioncategory'] = 'Musisz wybrać kategorię pytań'; +$string[ 'must_select_quiz'] = 'Musisz wybrać quiz'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Wynik'; + +//header.php +$string[ 'modulename'] = 'Gra'; + +//index.php +$string[ 'attempts'] = 'Próby'; + +//lib.php +$string[ 'attempt'] = 'Próba $a'; +$string[ 'game_bookquiz'] = 'Książka z pytaniami'; +$string[ 'game_cross'] = 'Krzyżówka'; +$string[ 'game_cryptex'] = 'Cryptex'; +$string[ 'game_hangman'] = 'Wisielec'; +$string[ 'game_hiddenpicture'] = 'Ukryty obraz'; +$string[ 'game_millionaire'] = 'Milionerzy'; +$string[ 'game_snakes'] = 'Węże i Drabiny'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Nie dokonano prób'; + +//locallib.php +$string[ 'attemptfirst'] = 'Pierwsza próba'; +$string[ 'attemptlast'] = 'Ostatnia próba'; +$string[ 'gradeaverage'] = 'Średnia ocena'; +$string[ 'gradehighest'] = 'Najwyższa ocena'; + +//mod.html +$string[ 'bottomtext'] = 'Tekst na dole'; +$string[ 'cross_layout'] = 'Układ'; +$string[ 'cross_layout0'] = 'Wyrażenia pod krzyżówką'; +$string[ 'cross_layout1'] = 'Wyrażenia na prawo od krzyżówki'; +$string[ 'cross_maxcols'] = 'Maksymalna ilość kolumn krzyżówki'; +$string[ 'cross_maxwords'] = 'Maksymalna ilość słów'; +$string[ 'cryptex_maxcols'] = 'Maksymalna liczba kolumn/wierszy'; +$string[ 'cryptex_maxwords'] = 'Maksymalna liczba wyrazów'; +$string[ 'grademethod'] = 'Metoda oceniania'; +$string[ 'hangman_allowspaces'] = 'Zezwól na spacje w wyrazach'; +$string[ 'hangman_allowsub'] = 'Zezwól na symbol - w wyrazach'; +$string[ 'hangman_imageset'] = 'Wybierz obrazek wisielca'; +$string[ 'hangman_language'] = 'Język słów'; +$string[ 'hangman_maxtries'] = 'Ilość słów na grę'; +$string[ 'hangman_showcorrectanswer'] = 'Pokazuj na koniec prawidłową odpowiedź'; +$string[ 'hangman_showfirst'] = 'Pokazuj pierwszą literę'; +$string[ 'hangman_showlast'] = 'Pokazuj ostatnią literę'; +$string[ 'hangman_showquestion'] = 'Pokazywać pytania ?'; +$string[ 'hiddenpicture_across'] = 'Komórki poziomo'; +$string[ 'hiddenpicture_down'] = 'Komórki pionowo'; +$string[ 'hiddenpicture_height'] = 'Ustaw wysokość obrazka na'; +$string[ 'hiddenpicture_pictureglossary'] = 'Słownik dla głównego pytania i obrazu'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'Kategoria słownika dla głównego pytania'; +$string[ 'hiddenpicture_width'] = 'Ustaw szerokość obrazka na'; +$string[ 'selectgame'] = 'Wybierz grę'; +$string[ 'snakes_background'] = 'Tło'; +$string[ 'sourcemodule'] = 'Źródło pytań'; +$string[ 'sourcemodule_book'] = 'Wybierz książkę'; +$string[ 'sourcemodule_glossary'] = 'Wybierz słownik'; +$string[ 'sourcemodule_glossarycategory'] = 'Wybierz kategorię słownika'; +$string[ 'sourcemodule_include_subcategories'] = 'Dołącz podkategorie'; +$string[ 'sourcemodule_question'] = 'Pytania'; +$string[ 'sourcemodule_questioncategory'] = 'Wybierz kategorię pytań'; +$string[ 'sourcemodule_quiz'] = 'Wybierz quiz'; +$string[ 'sudoku_maxquestions'] = 'Maksymalna liczba pytań'; + +//mod_form.php + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'IP studenta'; +$string[ 'preview'] = 'Podgląd'; +$string[ 'showsolution'] = 'rozwiązanie'; +$string[ 'timefinish'] = 'Koniec gry'; +$string[ 'timelastattempt'] = 'Ostatnia próba'; +$string[ 'timestart'] = 'Start'; + +//review.php +$string[ 'completedon'] = 'Ukończono'; +$string[ 'outof'] = '$a->grade z $a->maxgrade'; +$string[ 'review'] = 'Opis'; +$string[ 'reviewofattempt'] = 'Opis próby $a'; +$string[ 'startagain'] = 'Rozpocznij ponownie'; + +//showanswers.php +$string[ 'feedbacks'] = 'Wiadomości po prawidłowej odpowiedzi'; + +//tabs.php +$string[ 'info'] = 'Informacje'; +$string[ 'results'] = 'Wyniki'; +$string[ 'showanswers'] = 'Pokaż odpowiedzi'; + +//view.php +$string[ 'attemptgamenow'] = 'Rozpocznij grę'; +$string[ 'continueattemptgame'] = 'Kontynuuj poprzednią próbę'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Oceny'; +$string[ 'nomoreattempts'] = 'Nie możesz dokonać kolejnych prób'; +$string[ 'reattemptgame'] = 'Wznów grę'; +$string[ 'yourfinalgradeis'] = 'Ostateczną oceną za tą grę jest $a.'; + +//Untranslated +//cross/cross_class.php $string[ 'lettersall'] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "; +//cross/play.php $string[ 'print'] = 'Print'; +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//hiddenpicture/play.php $string[ 'noglossaryentriesfound'] = 'No glossary entries found'; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//export.php $string[ 'html_hascheckbutton'] = 'Include check button:'; +//export.php $string[ 'html_hasprintbutton'] = 'Include print button:'; +//export.php $string[ 'html_title'] = 'Title of html:'; +//export.php $string[ 'javame_maxpictureheight'] = 'Max picture height:'; +//export.php $string[ 'javame_maxpicturewidth'] = 'Max picture width:'; +//export.php $string[ 'javame_type'] = 'Type:'; +//exporthtml_hangman.php $string[ 'html_hangman_new'] = 'New'; +//exporthtml_millionaire.php $string[ 'millionaire_helppeople'] = 'Ask the audience'; +//exporthtml_millionaire.php $string[ 'millionaire_quit'] = 'Quit'; +//exporthtml_millionaire.php $string[ 'millionaire_telephone'] = 'Call a friend'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'percent'] = 'Percent'; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod.html $string[ 'cryptex_maxtries'] = 'Maximum tries'; +//mod.html $string[ 'millionaire_background'] = 'Background color'; +//mod.html $string[ 'millionaire_shuffle'] = 'Randomize questions'; +//mod.html $string[ 'toptext'] = 'Text at the top'; +//mod_form.php $string[ 'cross_options'] = 'Crossword options'; +//mod_form.php $string[ 'cryptex_options'] = 'Cryptex options'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'hangman_options'] = 'Hangman options'; +//mod_form.php $string[ 'headerfooter_options'] = 'Header/Footer options'; +//mod_form.php $string[ 'hiddenpicture_options'] = '\'Hidden Picture\' options'; +//mod_form.php $string[ 'millionaire_options'] = 'Millionaire options'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_options'] = '\'Snakes and Ladders\' options'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'sudoku_options'] = 'Sudoku options'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//showanswers.php $string[ 'clearrepetitions'] = 'Clear statistics'; +//showanswers.php $string[ 'computerepetitions'] = 'Compute statistics again'; +//showanswers.php $string[ 'repetitions'] = 'Repetitions'; +//tabs.php $string[ 'export_to_html'] = 'Export to HTML'; +//tabs.php $string[ 'export_to_javame'] = 'Export to Javame'; +//tabs.php $string[ 'showattempts'] = 'Show attempts'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/pt_br_utf8/game.php b/lang/pt_br_utf8/game.php new file mode 100644 index 0000000..06645ec --- /dev/null +++ b/lang/pt_br_utf8/game.php @@ -0,0 +1,295 @@ +Bem vindo!

    Clique em uma palavra para começar.

    '; +$string[ 'finish'] = 'Fim de jogo'; +$string[ 'letter'] = 'letra'; +$string[ 'letters'] = 'letras'; +$string[ 'nextgame'] = 'Próximo jogo'; +$string[ 'print'] = 'Imprimir'; + +//db/access.php +$string[ 'game:attempt'] = 'Começar o jogo'; +$string[ 'game:deleteattempts'] = 'Apagar tentativas'; +$string[ 'game:manage'] = 'Administrar'; +$string[ 'game:reviewmyattempts'] = 'Rever minhas tentativas'; +$string[ 'game:view'] = 'Ver'; +$string[ 'game:viewreports'] = 'Ver relatórios'; + +//hangman/play.php +$string[ 'hangman_gradeinstance'] = 'Nível do jogo completo'; +$string[ 'hangman_letters'] = 'Letras: '; +$string[ 'hangman_restletters_many'] = 'Você tem {$a} tentativas'; +$string[ 'hangman_restletters_one'] = 'Você tem SOMENTE 1 tentativa'; +$string[ 'hangman_wrongnum'] = 'Erradas: %%d de %%d'; +$string[ 'nextword'] = 'Próxima palavra'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Nota da pergunta principal'; +$string[ 'hiddenpicture_nocols'] = 'Especifique o número de linhas horizontais'; +$string[ 'hiddenpicture_nomainquestion'] = 'Sem entradas no glossário {$a->name} com imagem anexa'; +$string[ 'hiddenpicture_norows'] = 'Especifique o número de colunas verticais'; +$string[ 'must_select_glossary'] = 'Um glossário deve ser selecionado'; +$string[ 'noglossaryentriesfound'] = 'Não foram encontradas entradas no glossário'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Uma categoria de perguntas deve ser selecionada'; +$string[ 'millionaire_must_select_quiz'] = 'Um questionário deve ser selecionado'; + +//report/overview/report.php +$string[ 'feedback'] = 'Retorno'; +$string[ 'startedon'] = 'Començou em'; +$string[ 'timecompleted'] = 'Completo'; +$string[ 'timetaken'] = 'Timpo utilizado'; +$string[ 'unfinished'] = 'aberto'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Número de sudokus que serão criados'; +$string[ 'sudoku_create_start'] = 'Comece a criar sudokus'; +$string[ 'sudoku_creating'] = 'Criando {$a} sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Fim do jogo de sudoku'; +$string[ 'sudoku_guessnumber'] = 'Adivinhe o número correto'; +$string[ 'sudoku_noentriesfound'] = 'Não foram contradas palavras no glossário'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Jogos'; + +//export.php +$string[ 'export'] = 'Exportar'; +$string[ 'html_hascheckbutton'] = 'Botão de teste:'; +$string[ 'html_hasprintbutton'] = 'Botão de impressão:'; +$string[ 'html_title'] = 'Título de html:'; +$string[ 'javame_createdby'] = 'Criado por:'; +$string[ 'javame_description'] = 'Descrição:'; +$string[ 'javame_filename'] = 'Nome do arquivo:'; +$string[ 'javame_icon'] = 'Ícone:'; +$string[ 'javame_maxpictureheight'] = 'Altura máxima da imagem:'; +$string[ 'javame_maxpicturewidth'] = 'Largura máxima da imagem:'; +$string[ 'javame_name'] = 'Nome:'; +$string[ 'javame_type'] = 'Tipo:'; +$string[ 'javame_vendor'] = 'Vendedor:'; +$string[ 'javame_version'] = 'Versão'; +$string[ 'only_teachers'] = 'Somente o professor pode ver esta página'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Fim de jogo'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = 'Ajuda do público'; +$string[ 'millionaire_info_people'] = 'O púlico diz'; +$string[ 'millionaire_info_telephone'] = 'Creio que a resposta correta seja'; +$string[ 'millionaire_info_wrong_answer'] = 'Sua resposta está errada
    A resposta correta é:'; +$string[ 'millionaire_quit'] = 'Sair'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Para milhonário a fonte deve ser {$a} ou perguntas e não'; +$string[ 'millionaire_telephone'] = 'Ajuda pelo telefone'; +$string[ 'must_select_questioncategory'] = 'Uma categoria de perguntas deve ser selecionada'; +$string[ 'must_select_quiz'] = 'Um questionário deve ser selecionado'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Pontuação'; + +//header.php +$string[ 'modulename'] = 'Jogo'; + +//index.php +$string[ 'attempts'] = 'Tentativas'; + +//lib.php +$string[ 'attempt'] = 'Tentativa'; +$string[ 'game_bookquiz'] = 'Livro de perguntas'; +$string[ 'game_cross'] = 'Palavras-cruzadas'; +$string[ 'game_cryptex'] = 'Sopa de Letras'; +$string[ 'game_hangman'] = 'Forca'; +$string[ 'game_hiddenpicture'] = 'Imagem oculta'; +$string[ 'game_millionaire'] = 'Milhonário'; +$string[ 'game_snakes'] = 'Serpentes'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Nenhuma tentativa foi feita com este questionário'; +$string[ 'percent'] = 'Porcentagem'; + +//locallib.php +$string[ 'attemptfirst'] = 'Primeira tentativa'; +$string[ 'attemptlast'] = 'Última tentativa'; +$string[ 'gradeaverage'] = 'Nota média'; +$string[ 'gradehighest'] = 'Maior nota'; + +//mod.html +$string[ 'bottomtext'] = 'Texto no rodapé da página'; +$string[ 'cross_layout'] = 'Formato'; +$string[ 'cross_layout0'] = 'Frases na parte inferior do palavras-cruzadas'; +$string[ 'cross_layout1'] = 'Frases na parte direita do palavras-cruzadas'; +$string[ 'cross_maxcols'] = 'Número máximo de colunas do palavras-cruzadas'; +$string[ 'cross_maxwords'] = 'Máximo número de palavras do palavras-cruzadas'; +$string[ 'cryptex_maxcols'] = 'Máximo número de colunas/linhas do Criptograma'; +$string[ 'cryptex_maxtries'] = 'Número máximo de tantativas'; +$string[ 'cryptex_maxwords'] = 'Máximo número de palavras do Criptograma'; +$string[ 'grademethod'] = 'Método de avaliação'; +$string[ 'hangman_allowspaces'] = 'Permitir espaços nas palavras'; +$string[ 'hangman_allowsub'] = 'Permitir símbolos nas palavras'; +$string[ 'hangman_imageset'] = 'Selecione as imágens para a Forca'; +$string[ 'hangman_language'] = 'Idioma das palavras'; +$string[ 'hangman_maxtries'] = 'Número de palavras por jogo'; +$string[ 'hangman_showcorrectanswer'] = 'Mostrar a resposta correta ao final'; +$string[ 'hangman_showfirst'] = 'Mostrar a primeira letra da Forca'; +$string[ 'hangman_showlast'] = 'Mostrar a última letra da Forca'; +$string[ 'hangman_showquestion'] = 'Mostrar as perguntas ?'; +$string[ 'hiddenpicture_across'] = 'Células horizontais'; +$string[ 'hiddenpicture_down'] = 'Células verticais'; +$string[ 'hiddenpicture_height'] = 'Definir a altura da imagem em'; +$string[ 'hiddenpicture_pictureglossary'] = 'O glossário para a pergunta principal'; +$string[ 'hiddenpicture_width'] = 'Definir a largura da imagem em'; +$string[ 'millionaire_background'] = 'Cor de fundo'; +$string[ 'millionaire_shuffle'] = 'Mesclar perguntas'; +$string[ 'snakes_background'] = 'Fundo'; +$string[ 'sourcemodule'] = 'Fonte de perguntas'; +$string[ 'sourcemodule_book'] = 'Selecione un livro'; +$string[ 'sourcemodule_glossary'] = 'Selecione um glossário'; +$string[ 'sourcemodule_glossarycategory'] = 'Selecione una categoria de glossário.'; +$string[ 'sourcemodule_include_subcategories'] = 'Inclua subcategorias'; +$string[ 'sourcemodule_question'] = 'Perguntas'; +$string[ 'sourcemodule_questioncategory'] = 'Selecione uma categoria de perguntas'; +$string[ 'sourcemodule_quiz'] = 'Selecione un questionário'; +$string[ 'sudoku_maxquestions'] = 'Máximo número de perguntas'; +$string[ 'toptext'] = 'Texto da parte superior'; + +//mod_form.php +$string[ 'cross_options'] = 'Opções do Palavras-cruzadas'; +$string[ 'cryptex_options'] = 'Opções do Criptograma'; +$string[ 'hangman_options'] = 'Opções da Forca'; +$string[ 'hiddenpicture_options'] = '\'Imagem Oculta\' opções'; +$string[ 'millionaire_options'] = 'Opções o Milhonário'; +$string[ 'snakes_cols'] = 'Colunas'; +$string[ 'snakes_footerx'] = 'Espaço inferior esquerdo'; +$string[ 'snakes_footery'] = 'Espaço inferior direito'; +$string[ 'snakes_headerx'] = 'Espaço superior esquerdo'; +$string[ 'snakes_headery'] = 'Espaço superior direito'; +$string[ 'snakes_options'] = '\'Serpentes\' opções'; +$string[ 'snakes_rows'] = 'Linhas'; +$string[ 'sudoku_options'] = 'Opcções do Sudoku'; +$string[ 'userdefined'] = 'Definido pelo usuário'; + +//preview.php +$string[ 'lastip'] = 'IP do estudante'; +$string[ 'preview'] = 'Visualizar'; +$string[ 'showsolution'] = 'solução'; +$string[ 'timefinish'] = 'Fim de jogo'; +$string[ 'timelastattempt'] = 'Última tentativa'; +$string[ 'timestart'] = 'Começo'; + +//review.php +$string[ 'completedon'] = 'Completado em'; +$string[ 'outof'] = '{$a->grade} de um máximo de {$a->maxgrade}'; +$string[ 'review'] = 'Revisar'; +$string[ 'reviewofattempt'] = 'Revisar tentativas {$a}'; +$string[ 'startagain'] = 'Começar de novo'; + +//showanswers.php +$string[ 'clearrepetitions'] = 'Limpar estatísticas'; +$string[ 'computerepetitions'] = 'Recalcular estatísticas'; +$string[ 'feedbacks'] = 'Mensagens de resposta correta'; +$string[ 'repetitions'] = 'Repetições'; + +//tabs.php +$string[ 'export_to_html'] = 'Exportar como HTML'; +$string[ 'export_to_javame'] = 'Exportar como Javame'; +$string[ 'info'] = 'Info'; +$string[ 'results'] = 'Resultados'; +$string[ 'showanswers'] = 'Mostrar respostas'; +$string[ 'showattempts'] = 'Mostrar as tentativas'; + +//view.php +$string[ 'attemptgamenow'] = 'Tente jogar agora'; +$string[ 'continueattemptgame'] = 'Continue uma tentativa anterior do jogo'; +$string[ 'reattemptgame'] = 'Tentar novamente'; +$string[ 'yourfinalgradeis'] = 'Sua nota final neste jogo é {$a}.'; + +//Untranslated +//cross/play.php $string[ 'no_words'] = 'There are no words'; +//cross/play.php $string[ 'win'] = 'Congratulations !!!!'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//hangman/play.php $string[ 'hangman_correct_phrase'] = 'The correct phrase was: '; +//hangman/play.php $string[ 'hangman_correct_word'] = 'The correct word was: '; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//report/overview/report.php $string[ 'allattempts'] = 'Show all tries'; +//report/overview/report.php $string[ 'allstudents'] = 'Show all $a'; +//report/overview/report.php $string[ 'attemptsonly'] = 'Show only students with attempts'; +//report/overview/report.php $string[ 'deleteattemptcheck'] = 'Are you absolutely sure you want to completely delete these attempts?'; +//report/overview/report.php $string[ 'displayoptions'] = 'Display options'; +//report/overview/report.php $string[ 'downloadods'] = 'Download in ODS format'; +//report/overview/report.php $string[ 'noattemptsonly'] = 'Show $a with no attempts only'; +//report/overview/report.php $string[ 'numattempts'] = '$a->studentnum $a->studentstring have made $a->attemptnum attempts'; +//report/overview/report.php $string[ 'overview'] = 'Overview'; +//report/overview/report.php $string[ 'pagesize'] = 'Questions per page:'; +//report/overview/report.php $string[ 'selectall'] = 'Select all'; +//report/overview/report.php $string[ 'selectnone'] = 'Deselect all'; +//report/overview/report.php $string[ 'showdetailedmarks'] = 'Show mark details'; +//report/overview/report.php $string[ 'withselected'] = 'With selected'; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//exporthtml_hangman.php $string[ 'html_hangman_new'] = 'New'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod.html $string[ 'hiddenpicture_pictureglossarycategories'] = 'Glossary category for main question'; +//mod.html $string[ 'selectgame'] = 'Select game'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'headerfooter_options'] = 'Header/Footer options'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//preview.php $string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; +//view.php $string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +//view.php $string[ 'marks'] = 'Marks'; +//view.php $string[ 'nomoreattempts'] = 'No more attempts are allowed'; diff --git a/lang/ru_utf8/game.php b/lang/ru_utf8/game.php new file mode 100644 index 0000000..1bd715c --- /dev/null +++ b/lang/ru_utf8/game.php @@ -0,0 +1,295 @@ +Добро пожаловать!

    Сначала щелкните по любой из клеток, содержащих слово, затем введите в появившемся окне ответ.

    '; +$string[ 'finish'] = 'Конец игры'; +$string[ 'letter'] = 'буква'; +$string[ 'letters'] = 'буквы'; +$string[ 'nextgame'] = 'Новая игра'; +$string[ 'no_words'] = 'Не найдены слова'; +$string[ 'win'] = 'Поздравляем !!!'; + +//db/access.php + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Правильная фраза: '; +$string[ 'hangman_correct_word'] = 'Правильное слово: '; +$string[ 'hangman_gradeinstance'] = 'Оценить всю игру'; +$string[ 'hangman_letters'] = 'Буквы: '; +$string[ 'hangman_restletters_many'] = 'У Вас $a попыток'; +$string[ 'hangman_restletters_one'] = 'У Вас только 1 попытка'; +$string[ 'hangman_wrongnum'] = 'Неправильно: %%d из %%d'; +$string[ 'nextword'] = 'Следующее слово'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = 'Оценить главный ответ'; +$string[ 'hiddenpicture_nocols'] = 'Необходимо указать количество колонок по горизонтали'; +$string[ 'hiddenpicture_norows'] = 'Необходимо указать количество срок по вертикали'; +$string[ 'must_select_glossary'] = 'Вы должны выбрать глоссарий'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Вы должны выбрать одну из категорий вопросов'; +$string[ 'millionaire_must_select_quiz'] = 'Вы должны выбрать тест'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Все попытки'; +$string[ 'allstudents'] = 'Все студенты $a'; +$string[ 'attemptsonly'] = 'Показать только студентов с попытками'; +$string[ 'deleteattemptcheck'] = 'Вы уверены, что хотите полностью удалить эти попытки?'; +$string[ 'displayoptions'] = 'Отобразить дополнительно'; +$string[ 'downloadods'] = 'Загрузить в формате ODS'; +$string[ 'feedback'] = 'Комментарий'; +$string[ 'noattemptsonly'] = 'Показать $a только, у которых нет попыток'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring сделали $a->attemptnum попыток'; +$string[ 'overview'] = 'Обзор'; +$string[ 'pagesize'] = 'Вопросов на страницу:'; +$string[ 'selectall'] = 'Выбрать все'; +$string[ 'selectnone'] = 'Снять выделение со всех'; +$string[ 'showdetailedmarks'] = 'Показать детали оценок'; +$string[ 'startedon'] = 'Начато'; +$string[ 'timecompleted'] = 'Выполнено'; +$string[ 'timetaken'] = 'Время выполнения'; +$string[ 'unfinished'] = 'открыто'; +$string[ 'withselected'] = 'С выделенным'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Количество созданных \"Судоку\"'; +$string[ 'sudoku_create_start'] = 'Начало создания \"Судоку\"'; +$string[ 'sudoku_creating'] = 'Создание $a \"Судоку\"'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Окончание игры \"Судоку\"'; +$string[ 'sudoku_guessnumber'] = 'Введите правильное число'; +$string[ 'sudoku_noentriesfound'] = 'В глоссарии нет слов'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Игры'; + +//export.php +$string[ 'only_teachers'] = 'Только учителя могут просматривать эту страницу'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Игра окончена'; + +//exporthtml_millionaire.php +$string[ 'millionaire_info_people'] = 'Люди говорят'; +$string[ 'millionaire_info_telephone'] = 'Я думаю, что правильный ответ '; +$string[ 'millionaire_info_wrong_answer'] = 'Ваш ответ неверный
    Правильный ответ:'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Для игры Миллионер источником вопросов должен быть $a, а не'; +$string[ 'must_select_questioncategory'] = 'Вы должны выбрать категорию вопросов'; +$string[ 'must_select_quiz'] = 'Вы должны выбрать тест'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Очки'; + +//header.php +$string[ 'modulename'] = 'Игра'; + +//index.php +$string[ 'attempts'] = 'Попытки'; + +//lib.php +$string[ 'attempt'] = 'Попытка $a'; +$string[ 'game_bookquiz'] = 'Книга с вопросами'; +$string[ 'game_cross'] = 'Кроссворд'; +$string[ 'game_cryptex'] = 'Криптекст'; +$string[ 'game_hangman'] = 'Виселица'; +$string[ 'game_hiddenpicture'] = 'Спрятанная картинка'; +$string[ 'game_millionaire'] = 'Миллионер'; +$string[ 'game_snakes'] = 'Змеи и лестницы'; +$string[ 'game_sudoku'] = 'Судоку'; +$string[ 'noattempts'] = 'В этом тесте не сделано попыток'; + +//locallib.php +$string[ 'attemptfirst'] = 'Первая попытка'; +$string[ 'attemptlast'] = 'Последняя попытка'; +$string[ 'gradeaverage'] = 'Оценивание по среднему баллу'; +$string[ 'gradehighest'] = 'Оценивание по высшему баллу'; + +//mod.html +$string[ 'bottomtext'] = 'Текст внизу экрана игры'; +$string[ 'cross_layout'] = 'Слой'; +$string[ 'cross_layout0'] = 'Расшифровка внизу кроссворда'; +$string[ 'cross_layout1'] = 'Расшифровка справа от кроссворда'; +$string[ 'cross_maxcols'] = 'Максимальное число колонок в кроссворде'; +$string[ 'cross_maxwords'] = 'Максимальное число слов в кроссворде'; +$string[ 'cryptex_maxcols'] = 'Макимальное число колонок/рядов в Криптексте'; +$string[ 'cryptex_maxwords'] = 'Макимальное число слов в Криптексте'; +$string[ 'grademethod'] = 'Метод оценивания'; +$string[ 'hangman_allowspaces'] = 'Разрешить в словах пробелы'; +$string[ 'hangman_allowsub'] = 'Разрешить дефис в словах'; +$string[ 'hangman_imageset'] = 'Выберите изображение виселицы'; +$string[ 'hangman_language'] = 'Язык слов'; +$string[ 'hangman_maxtries'] = 'Число попыток в игре'; +$string[ 'hangman_showcorrectanswer'] = 'Показать правильные ответы после окончания игры'; +$string[ 'hangman_showfirst'] = 'Показать первую букву'; +$string[ 'hangman_showlast'] = 'Показать последнюю букву'; +$string[ 'hangman_showquestion'] = 'Показать вопросы?'; +$string[ 'hiddenpicture_across'] = 'Клетки по горизонтали'; +$string[ 'hiddenpicture_down'] = 'Клетки по вертикали'; +$string[ 'hiddenpicture_pictureglossary'] = 'Глоссарий для главного вопроса'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'Категория для главного вопроса'; +$string[ 'selectgame'] = 'Выберите игру'; +$string[ 'snakes_background'] = 'Фон'; +$string[ 'sourcemodule'] = 'Источник вопросов'; +$string[ 'sourcemodule_book'] = 'Выберите книгу'; +$string[ 'sourcemodule_glossary'] = 'Выберите глоссарий'; +$string[ 'sourcemodule_glossarycategory'] = 'Выберите категорию глоссария'; +$string[ 'sourcemodule_question'] = 'Вопросы'; +$string[ 'sourcemodule_questioncategory'] = 'Выберите категорию вопросов'; +$string[ 'sourcemodule_quiz'] = 'Выберите тест'; +$string[ 'sudoku_maxquestions'] = 'Максимальное число вопросов'; + +//mod_form.php + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'IP студента'; +$string[ 'preview'] = 'Предварительный просмотр'; +$string[ 'showsolution'] = 'решение'; +$string[ 'timefinish'] = 'Конец игры'; +$string[ 'timelastattempt'] = 'Последняя попытка'; +$string[ 'timestart'] = 'Начало'; + +//review.php +$string[ 'completedon'] = 'Выполнено'; +$string[ 'outof'] = '$a->grade out of a maximum of $a->maxgrade'; +$string[ 'review'] = 'Повторный просмотр'; +$string[ 'reviewofattempt'] = 'Повторный промотр попыток $a'; +$string[ 'startagain'] = 'Начать снова'; + +//showanswers.php +$string[ 'feedbacks'] = 'Текст сообщения о правильном ответе'; + +//tabs.php +$string[ 'info'] = 'Информация'; +$string[ 'results'] = 'Результаты'; +$string[ 'showanswers'] = 'Показать ответы'; + +//view.php +$string[ 'attemptgamenow'] = 'Начать новую попытку игры'; +$string[ 'continueattemptgame'] = 'Продолжить предыдущую попытку этой игры'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Оценки'; +$string[ 'nomoreattempts'] = 'Больше попытки не разрешены'; +$string[ 'reattemptgame'] = 'Сделать попытку в этой игре'; +$string[ 'yourfinalgradeis'] = 'Ваша последняя оценка за эту игру: $a.'; + +//Untranslated +//cross/play.php $string[ 'print'] = 'Print'; +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'hiddenpicture_nomainquestion'] = 'There are no glossary entries in glossary $a->name with an attached picture'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//hiddenpicture/play.php $string[ 'noglossaryentriesfound'] = 'No glossary entries found'; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//export.php $string[ 'export'] = 'Export'; +//export.php $string[ 'html_hascheckbutton'] = 'Include check button:'; +//export.php $string[ 'html_hasprintbutton'] = 'Include print button:'; +//export.php $string[ 'html_title'] = 'Title of html:'; +//export.php $string[ 'javame_createdby'] = 'Created by:'; +//export.php $string[ 'javame_description'] = 'Description:'; +//export.php $string[ 'javame_filename'] = 'Filename:'; +//export.php $string[ 'javame_icon'] = 'Icon:'; +//export.php $string[ 'javame_maxpictureheight'] = 'Max picture height:'; +//export.php $string[ 'javame_maxpicturewidth'] = 'Max picture width:'; +//export.php $string[ 'javame_name'] = 'Name:'; +//export.php $string[ 'javame_type'] = 'Type:'; +//export.php $string[ 'javame_vendor'] = 'Vendor:'; +//export.php $string[ 'javame_version'] = 'Version:'; +//exporthtml_hangman.php $string[ 'html_hangman_new'] = 'New'; +//exporthtml_millionaire.php $string[ 'millionaire_helppeople'] = 'Ask the audience'; +//exporthtml_millionaire.php $string[ 'millionaire_quit'] = 'Quit'; +//exporthtml_millionaire.php $string[ 'millionaire_telephone'] = 'Call a friend'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'percent'] = 'Percent'; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod.html $string[ 'cryptex_maxtries'] = 'Maximum tries'; +//mod.html $string[ 'hiddenpicture_height'] = 'Set height of picture to'; +//mod.html $string[ 'hiddenpicture_width'] = 'Set width of picture to'; +//mod.html $string[ 'millionaire_background'] = 'Background color'; +//mod.html $string[ 'millionaire_shuffle'] = 'Randomize questions'; +//mod.html $string[ 'sourcemodule_include_subcategories'] = 'Include subcategories'; +//mod.html $string[ 'toptext'] = 'Text at the top'; +//mod_form.php $string[ 'cross_options'] = 'Crossword options'; +//mod_form.php $string[ 'cryptex_options'] = 'Cryptex options'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'hangman_options'] = 'Hangman options'; +//mod_form.php $string[ 'headerfooter_options'] = 'Header/Footer options'; +//mod_form.php $string[ 'hiddenpicture_options'] = '\'Hidden Picture\' options'; +//mod_form.php $string[ 'millionaire_options'] = 'Millionaire options'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_options'] = '\'Snakes and Ladders\' options'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'sudoku_options'] = 'Sudoku options'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//showanswers.php $string[ 'clearrepetitions'] = 'Clear statistics'; +//showanswers.php $string[ 'computerepetitions'] = 'Compute statistics again'; +//showanswers.php $string[ 'repetitions'] = 'Repetitions'; +//tabs.php $string[ 'export_to_html'] = 'Export to HTML'; +//tabs.php $string[ 'export_to_javame'] = 'Export to Javame'; +//tabs.php $string[ 'showattempts'] = 'Show attempts'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/sq_utf8/game.php b/lang/sq_utf8/game.php new file mode 100644 index 0000000..609c6e3 --- /dev/null +++ b/lang/sq_utf8/game.php @@ -0,0 +1,294 @@ +Mirësevini!

    Kliko në një fjalë për të filluar.

    '; +$string[ 'finish'] = 'Fund loje'; +$string[ 'letter'] = 'shkronja'; +$string[ 'letters'] = 'shkronja'; +$string[ 'nextgame'] = 'Lojë e re '; +$string[ 'no_words'] = 'Nuk u gjend asnjë fjalë '; +$string[ 'print'] = 'Printim'; +$string[ 'win'] = 'Urime!!!'; + +//db/access.php + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Fjalia e saktë ishte: '; +$string[ 'hangman_correct_word'] = 'Fjala e saktë ishte: '; +$string[ 'hangman_gradeinstance'] = 'Shuma e pikeve ne gjithe lojen'; +$string[ 'hangman_letters'] = 'Shkronja : '; +$string[ 'hangman_restletters_many'] = 'Keni $a përpjekje akoma'; +$string[ 'hangman_restletters_one'] = 'Keni akoma VETEM 1 përpjekje'; +$string[ 'hangman_wrongnum'] = 'Gabime: %%d out of %%d'; +$string[ 'nextword'] = 'Fjalë tjetër '; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = "Ver pikë në pyetjen kryesore"; +$string[ 'hiddenpicture_nocols'] = 'Duhet te përcaktoni numrin e qelizave horizontalisht'; +$string[ 'hiddenpicture_nomainquestion'] = 'Nuk ka asnjë regjistrim në fjalor $a->name që të përmbajë dhë figurë'; +$string[ 'hiddenpicture_norows'] = 'Duhet te përcaktoni numrin e qelizave vertikalisht'; +$string[ 'must_select_glossary'] = 'Duhet te zgjidhni me patjetër një fjalor'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Duhet me patjetër te zgjidhni një kategori pyetjesh'; +$string[ 'millionaire_must_select_quiz'] = 'Duhet me patjetër te zgjidhni një kuiz'; + +//report/overview/report.php +$string[ 'feedback'] = 'Përgjigje'; +$string[ 'startedon'] = 'Filloni në'; +$string[ 'timecompleted'] = 'Kompletuar'; +$string[ 'timetaken'] = 'Koha e duhur'; +$string[ 'unfinished'] = 'Pafund'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Numuri i sudoku që do krijohet'; +$string[ 'sudoku_create_start'] = 'Fillimi i krijimit sudoku'; +$string[ 'sudoku_creating'] = 'U krijua $a sudoku'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Fund loje'; +$string[ 'sudoku_guessnumber'] = 'Supozo numurin '; +$string[ 'sudoku_noentriesfound'] = 'Nuk u gjendën fjalë në fjalor'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Lojra'; + +//export.php +$string[ 'export'] = 'Εksport'; +$string[ 'html_hascheckbutton'] = 'Të ketë buton kontrollimi përgjigjjeve të sakta:'; +$string[ 'html_hasprintbutton'] = 'Të ketë buton printimi:'; +$string[ 'html_title'] = 'Titulli i faqes të internetit:'; +$string[ 'javame_createdby'] = 'U krijua nga:'; +$string[ 'javame_description'] = 'Përshkrim:'; +$string[ 'javame_filename'] = 'emri i zarfit:'; +$string[ 'javame_icon'] = 'ikona:'; +$string[ 'javame_maxpictureheight'] = 'Maksimumi i gjatësisë të ikonës:'; +$string[ 'javame_maxpicturewidth'] = 'Μaksimumi i gjërësisë të ikonës:'; +$string[ 'javame_name'] = 'Emri:'; +$string[ 'javame_type'] = 'Τip:'; +$string[ 'javame_vendor'] = 'Vendor:'; +$string[ 'javame_version'] = 'versioni:'; +$string[ 'only_teachers'] = 'Vetëm mesuesi mundet te shikojë këtë faqe'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Fund loje'; +$string[ 'html_hangman_new'] = 'E re'; + +//exporthtml_millionaire.php +$string[ 'millionaire_info_people'] = 'Fjala bosh thotë'; +$string[ 'millionaire_info_telephone'] = 'Mendoj se përgjigjja e saktë është '; +$string[ 'millionaire_info_wrong_answer'] = 'Përgjigjja juaj është gabim
    Pergjigjja e saktë është :'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Burimi i pyetjeve per milionerin duhet te ishte $a ose Pyetje dhe jo '; +$string[ 'must_select_questioncategory'] = 'Duhet te zgjedhësh me patjetër një kategori pyetjesh '; +$string[ 'must_select_quiz'] = 'Duhet te zgjidhni një kuiz'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Piket'; + +//header.php +$string[ 'modulename'] = 'Lojë'; + +//index.php +$string[ 'attempts'] = 'Përpjekje'; + +//lib.php +$string[ 'attempt'] = 'Përpjekja $a'; +$string[ 'game_bookquiz'] = 'Libër me pyetje'; +$string[ 'game_cross'] = 'Fjalëkryq'; +$string[ 'game_cryptex'] = 'Fjalefshehje'; +$string[ 'game_hangman'] = 'Xhelat'; +$string[ 'game_hiddenpicture'] = "Figura e fshehtë"; +$string[ 'game_millionaire'] = 'Milioner'; +$string[ 'game_snakes'] = 'Gjarpër'; +$string[ 'game_sudoku'] = 'Sudoku'; +$string[ 'noattempts'] = 'Asnjë përpjekje nuk u bë për këtë lojë'; +$string[ 'percent'] = 'Përqindje'; + +//locallib.php +$string[ 'attemptfirst'] = 'Përpjekja e parë'; +$string[ 'attemptlast'] = 'Përpjekja e fundit'; +$string[ 'gradeaverage'] = 'Numuri mesatar'; +$string[ 'gradehighest'] = 'Numuri më i madh'; + +//mod.html +$string[ 'bottomtext'] = 'Text në pjesën e poshtme të faqes'; +$string[ 'cross_layout'] = 'Mënyrë shfaqjeje'; +$string[ 'cross_layout0'] = 'Përcaktimet poshtë fjalëkryqit'; +$string[ 'cross_layout1'] = 'Përcaktimet nga e djathta e fjalëkryqit'; +$string[ 'cross_maxcols'] = 'Maximumi i rreshtave / shtyllave të fjalëkryqit'; +$string[ 'cross_maxwords'] = 'Maximumi i fjalëve të fjalëkryqit'; +$string[ 'cryptex_maxcols'] = 'Maximumi i rreshtave / shtyllave të fjalëkryqit'; +$string[ 'cryptex_maxtries'] = 'Maximumi i përpjekjeve'; +$string[ 'cryptex_maxwords'] = 'Maximumi i fjalëve të fjalëkryqit'; +$string[ 'grademethod'] = 'Μënyrë vleresimi'; +$string[ 'hangman_allowspaces'] = 'Të lejohen vendet bosh në fjalët'; +$string[ 'hangman_allowsub'] = 'Të lejohet simboli - në fjalet'; +$string[ 'hangman_imageset'] = 'Zgjidhni fotografi'; +$string[ 'hangman_language'] = 'Gjuha në të cilën janë fjalët'; +$string[ 'hangman_maxtries'] = 'Numuri i fjalëve për cdo lojë'; +$string[ 'hangman_showcorrectanswer'] = 'Të shfaqet përgjigjja e saktë pas fund loje ;'; +$string[ 'hangman_showfirst'] = 'Të shfaqet shkronja e parë e fjalës'; +$string[ 'hangman_showlast'] = 'Të shfaqet shkronja e fundit e fjalës'; +$string[ 'hangman_showquestion'] = 'Të shfaqen pyetjet;'; +$string[ 'hiddenpicture_across'] = "Numri i qelizave horizontale "; +$string[ 'hiddenpicture_down'] = "Numri i qelizave vertikal "; +$string[ 'hiddenpicture_height'] = 'Përcaktimi i lartesisë të ikonës'; +$string[ 'hiddenpicture_pictureglossary'] = 'Fjalori për pyetjen kryesore'; +$string[ 'hiddenpicture_width'] = 'Përcaktimi i gjërësisë të ikonës'; +$string[ 'millionaire_shuffle'] = 'Përzjerje pyetjesh'; +$string[ 'selectgame'] = 'Zgjidh lojë'; +$string[ 'snakes_background'] = 'Pistë'; +$string[ 'sourcemodule'] = 'Burim pyetjesh'; +$string[ 'sourcemodule_book'] = 'Zgjidh libër '; +$string[ 'sourcemodule_glossary'] = 'Zgjidh fjalor'; +$string[ 'sourcemodule_glossarycategory'] = 'Zgjidh kategori fjalori'; +$string[ 'sourcemodule_include_subcategories'] = 'Te plotësohen nënkategoritë'; +$string[ 'sourcemodule_question'] = 'Pyetje'; +$string[ 'sourcemodule_questioncategory'] = 'Zgjidh kategori pyetjesh'; +$string[ 'sourcemodule_quiz'] = 'Zgjidh kuiz'; +$string[ 'sudoku_maxquestions'] = 'Μaximumi i pyetjeve'; + +//mod_form.php + +//preview.php +$string[ 'lastip'] = 'IP studenti'; +$string[ 'preview'] = 'Parashfaq'; +$string[ 'showsolution'] = 'Zgjedhje'; +$string[ 'timefinish'] = 'Fund loje '; +$string[ 'timelastattempt'] = 'Përpjekje e fundit'; +$string[ 'timestart'] = 'Fillimi '; + +//review.php +$string[ 'completedon'] = 'U përfundua në'; +$string[ 'outof'] = '$a->grade nga maksimumi $a->maxgrade'; +$string[ 'review'] = 'Rikorigjim'; +$string[ 'reviewofattempt'] = 'Rikorigjim i mundimit $a'; +$string[ 'startagain'] = 'Përpjekje prap'; + +//showanswers.php +$string[ 'feedbacks'] = 'Mesazh përgjigjjeje të saktë'; + +//tabs.php +$string[ 'export_to_html'] = 'Εksport në HTML'; +$string[ 'export_to_javame'] = 'Εksport në JavaMe për telefona celularë'; +$string[ 'info'] = 'Informacione'; +$string[ 'results'] = 'Përfundime'; +$string[ 'showanswers'] = 'Shfaqja e përgjigjjeve'; + +//view.php +$string[ 'attemptgamenow'] = 'Përpjekje loje tani'; +$string[ 'continueattemptgame'] = 'Vazhdim i lojës'; +$string[ 'reattemptgame'] = 'Përpjekje loje përsëri'; +$string[ 'yourfinalgradeis'] = 'Pikët përfundimtare për këtë kuiz janë $a'; + +//Untranslated +//cross/cross_class.php $string[ 'lettersall'] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "; +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//hiddenpicture/play.php $string[ 'noglossaryentriesfound'] = 'No glossary entries found'; +//report/overview/report.php $string[ 'allattempts'] = 'Show all tries'; +//report/overview/report.php $string[ 'allstudents'] = 'Show all $a'; +//report/overview/report.php $string[ 'attemptsonly'] = 'Show only students with attempts'; +//report/overview/report.php $string[ 'deleteattemptcheck'] = 'Are you absolutely sure you want to completely delete these attempts?'; +//report/overview/report.php $string[ 'displayoptions'] = 'Display options'; +//report/overview/report.php $string[ 'downloadods'] = 'Download in ODS format'; +//report/overview/report.php $string[ 'noattemptsonly'] = 'Show $a with no attempts only'; +//report/overview/report.php $string[ 'numattempts'] = '$a->studentnum $a->studentstring have made $a->attemptnum attempts'; +//report/overview/report.php $string[ 'overview'] = 'Overview'; +//report/overview/report.php $string[ 'pagesize'] = 'Questions per page:'; +//report/overview/report.php $string[ 'selectall'] = 'Select all'; +//report/overview/report.php $string[ 'selectnone'] = 'Deselect all'; +//report/overview/report.php $string[ 'showdetailedmarks'] = 'Show mark details'; +//report/overview/report.php $string[ 'withselected'] = 'With selected'; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//exporthtml_millionaire.php $string[ 'millionaire_helppeople'] = 'Ask the audience'; +//exporthtml_millionaire.php $string[ 'millionaire_quit'] = 'Quit'; +//exporthtml_millionaire.php $string[ 'millionaire_telephone'] = 'Call a friend'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod.html $string[ 'hiddenpicture_pictureglossarycategories'] = 'Glossary category for main question'; +//mod.html $string[ 'millionaire_background'] = 'Background color'; +//mod.html $string[ 'toptext'] = 'Text at the top'; +//mod_form.php $string[ 'cross_options'] = 'Crossword options'; +//mod_form.php $string[ 'cryptex_options'] = 'Cryptex options'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'hangman_options'] = 'Hangman options'; +//mod_form.php $string[ 'headerfooter_options'] = 'Header/Footer options'; +//mod_form.php $string[ 'hiddenpicture_options'] = '\'Hidden Picture\' options'; +//mod_form.php $string[ 'millionaire_options'] = 'Millionaire options'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_options'] = '\'Snakes and Ladders\' options'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'sudoku_options'] = 'Sudoku options'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//preview.php $string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +//showanswers.php $string[ 'clearrepetitions'] = 'Clear statistics'; +//showanswers.php $string[ 'computerepetitions'] = 'Compute statistics again'; +//showanswers.php $string[ 'repetitions'] = 'Repetitions'; +//tabs.php $string[ 'showattempts'] = 'Show attempts'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; +//view.php $string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +//view.php $string[ 'marks'] = 'Marks'; +//view.php $string[ 'nomoreattempts'] = 'No more attempts are allowed'; diff --git a/lang/uk_utf8/game.php b/lang/uk_utf8/game.php new file mode 100644 index 0000000..9176dab --- /dev/null +++ b/lang/uk_utf8/game.php @@ -0,0 +1,295 @@ +Ласкаво просимо!

    Щоб почати, натисніть на слово.

    '; +$string[ 'finish'] = 'Гру закінчено'; +$string[ 'letter'] = 'літера'; +$string[ 'letters'] = 'літери'; +$string[ 'nextgame'] = 'Нова гра'; +$string[ 'no_words'] = 'Не знайшлось жодного слова'; +$string[ 'print'] = 'Віддрукувати'; +$string[ 'win'] = 'Вітання!!!'; + +//db/access.php + +//hangman/play.php +$string[ 'hangman_correct_phrase'] = 'Вірна фраза була: '; +$string[ 'hangman_correct_word'] = 'Вірне слово було: '; +$string[ 'hangman_gradeinstance'] = 'Оцінка протягом усієї гри'; +$string[ 'hangman_letters'] = 'Літери: '; +$string[ 'hangman_restletters_many'] = 'Ви маєте ще$a спроб'; +$string[ 'hangman_restletters_one'] = 'Ви маєте щеТІЛЬКИ 1 спробу'; +$string[ 'hangman_wrongnum'] = 'Не вірно: %%d з %%d'; +$string[ 'nextword'] = 'Наступне слово'; + +//hiddenpicture/play.php +$string[ 'hiddenpicture_mainsubmit'] = "Оцініть питання"; +$string[ 'hiddenpicture_nocols'] = 'Ви повинні вказати кількість горизонтальних клітин'; +$string[ 'hiddenpicture_nomainquestion'] = 'Не існує жодного запису в словнику $a->name який має зображення'; +$string[ 'hiddenpicture_norows'] = 'Ви повинні вказати кількість клітин по вертикалі'; +$string[ 'must_select_glossary'] = 'Ви повинні вибрати οπωσδήποτε один словник'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = 'Виберіть категорію запитань'; +$string[ 'millionaire_must_select_quiz'] = 'Зробіть вибір вікторини'; + +//report/overview/report.php +$string[ 'allattempts'] = 'Показати всі зусилля'; +$string[ 'allstudents'] = 'Показати всі $a'; +$string[ 'attemptsonly'] = 'Показати тільки учнів які намагалися'; +$string[ 'deleteattemptcheck'] = 'Ви абсолютно впевнені,що хочете,повністю видалити ці спроби?'; +$string[ 'displayoptions'] = 'Відображити параметри'; +$string[ 'downloadods'] = 'Зберегти як ODS'; +$string[ 'feedback'] = 'Відповідь'; +$string[ 'noattemptsonly'] = 'Відображити $a які не мають жодної спроби'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring зробили $a->attemptnum спроб'; +$string[ 'overview'] = 'Πерегляд'; +$string[ 'pagesize'] = 'Питання на сторінці:'; +$string[ 'selectall'] = 'Виділити все'; +$string[ 'selectnone'] = ' Відмінити все'; +$string[ 'showdetailedmarks'] = 'Інформація питань'; +$string[ 'startedon'] = 'Гра почалася в '; +$string[ 'timecompleted'] = 'Завершенно'; +$string[ 'timetaken'] = 'Час який знадобився'; +$string[ 'unfinished'] = 'Нескінченно'; +$string[ 'withselected'] = 'З вибраним'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = 'Кількість судоку для створення'; +$string[ 'sudoku_create_start'] = 'Приступити до створення судоку'; +$string[ 'sudoku_creating'] = 'Створенно $a судоку'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = 'Гра закінчена'; +$string[ 'sudoku_guessnumber'] = 'Вгадайте число'; +$string[ 'sudoku_noentriesfound'] = 'Слів не знайдено в словнику'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = 'Гри'; + +//export.php +$string[ 'export'] = 'Експорт'; +$string[ 'html_hascheckbutton'] = 'Перевірити наявність кнопки правильної відповіді:'; +$string[ 'html_hasprintbutton'] = 'Перевірити наявність кнопки "Віддрукувати":'; +$string[ 'html_title'] = 'Назва сайту:'; +$string[ 'javame_createdby'] = 'Створено:'; +$string[ 'javame_description'] = 'Описання:'; +$string[ 'javame_filename'] = 'Назва файлу:'; +$string[ 'javame_icon'] = 'Ікона:'; +$string[ 'javame_maxpictureheight'] = 'Максимальний розмір висоти зображення:'; +$string[ 'javame_maxpicturewidth'] = 'Максимальний розмір ширини зображення:'; +$string[ 'javame_name'] = 'Назва:'; +$string[ 'javame_type'] = 'Тип:'; +$string[ 'javame_vendor'] = 'Постачальник:'; +$string[ 'javame_version'] = 'Версія:'; +$string[ 'only_teachers'] = 'Тільки вчитель може переглянути цю сторінку'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = 'Гру закінчено'; +$string[ 'html_hangman_new'] = 'Новини'; + +//exporthtml_millionaire.php +$string[ 'millionaire_info_people'] = 'відповідь аудиторії'; +$string[ 'millionaire_info_telephone'] = 'Я вважаю правильною віповіддю є'; +$string[ 'millionaire_info_wrong_answer'] = 'Ваша відповідь невірна
    Вірна відповідь :'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = 'Для мільйонера, джерело питань мають бути $a'; +$string[ 'must_select_questioncategory'] = 'Ви повинні, безумовно, вибрати категорію питань'; +$string[ 'must_select_quiz'] = 'Ви повинні вибрати вікторину'; + +//exporthtml_snakes.php +$string[ 'score'] = 'Оцінка'; + +//header.php +$string[ 'modulename'] = 'Гра'; + +//index.php +$string[ 'attempts'] = 'Спроб'; + +//lib.php +$string[ 'attempt'] = 'Спроба $a'; +$string[ 'game_bookquiz'] = 'Книга питань'; +$string[ 'game_cross'] = 'Кросворд'; +$string[ 'game_cryptex'] = 'Філворд'; +$string[ 'game_hangman'] = 'Шибениця'; +$string[ 'game_hiddenpicture'] = "Приховане зображення"; +$string[ 'game_millionaire'] = 'Мільйонер'; +$string[ 'game_snakes'] = 'Змія '; +$string[ 'game_sudoku'] = 'Судоку'; +$string[ 'noattempts'] = 'Не було зроблено жодних спроб для цієї гри'; +$string[ 'percent'] = 'Відсоток'; + +//locallib.php +$string[ 'attemptfirst'] = 'Перша спроба'; +$string[ 'attemptlast'] = 'Остання спроба'; +$string[ 'gradeaverage'] = 'Середній бал'; +$string[ 'gradehighest'] = 'Найвища оцінка'; + +//mod.html +$string[ 'bottomtext'] = 'Текст в нижній частині сторінки'; +$string[ 'cross_layout'] = 'Спосіб відображення'; +$string[ 'cross_layout0'] = 'Розмістіть питання під кросвордом'; +$string[ 'cross_layout1'] = 'Розмістіть питання на правій сторінці кросворду'; +$string[ 'cross_maxcols'] = 'Максимальна кількість рядків / стовпців у кросворді'; +$string[ 'cross_maxwords'] = 'Максимальна кількість слів у кросворді'; +$string[ 'cryptex_maxcols'] = 'Максимальна кількість рядків / стовпців у філворді'; +$string[ 'cryptex_maxtries'] = 'Максимальна кількість спроб'; +$string[ 'cryptex_maxwords'] = 'Максимальна кількість слів у філворді'; +$string[ 'grademethod'] = 'Метод оцінування'; +$string[ 'hangman_allowspaces'] = 'Дозволити прогалини в словах'; +$string[ 'hangman_allowsub'] = 'Відображати символи в словах'; +$string[ 'hangman_imageset'] = 'Виберіть колекцію фотографій'; +$string[ 'hangman_language'] = 'Визначте мову слів'; +$string[ 'hangman_maxtries'] = 'Кількість слів у грі'; +$string[ 'hangman_showcorrectanswer'] = 'Відображати вірні відповіді після закінчення гри ?'; +$string[ 'hangman_showfirst'] = 'Відображати першу літеру слова'; +$string[ 'hangman_showlast'] = 'Відображати останню літеру слова'; +$string[ 'hangman_showquestion'] = 'Відобразити всі запитання?'; +$string[ 'hiddenpicture_across'] = "Кількість горизонтальних клітин"; +$string[ 'hiddenpicture_down'] = "Кількість вертикальних клітин"; +$string[ 'hiddenpicture_height'] = 'Встановити висоту зображення'; +$string[ 'hiddenpicture_pictureglossary'] = 'Словник для конкретного питання'; +$string[ 'hiddenpicture_pictureglossarycategories'] = 'Катигорія словника для конкретного питання'; +$string[ 'hiddenpicture_width'] = 'Встановити ширину зображення'; +$string[ 'millionaire_shuffle'] = 'Перемішати питання'; +$string[ 'selectgame'] = 'Виберіть гру'; +$string[ 'snakes_background'] = 'Рівень'; +$string[ 'sourcemodule'] = 'Джерело питань'; +$string[ 'sourcemodule_book'] = 'Виберіть книгу'; +$string[ 'sourcemodule_glossary'] = 'Виберіть словник'; +$string[ 'sourcemodule_glossarycategory'] = 'Виберіть категорію словника'; +$string[ 'sourcemodule_include_subcategories'] = 'Включати підкатегорії'; +$string[ 'sourcemodule_question'] = 'Питання'; +$string[ 'sourcemodule_questioncategory'] = 'Виберіть категорію питань'; +$string[ 'sourcemodule_quiz'] = 'Виберіть вікторіну'; +$string[ 'sudoku_maxquestions'] = 'Максимальний ряд питань'; + +//mod_form.php + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%H:%%M'; +$string[ 'lastip'] = 'IP учня'; +$string[ 'preview'] = 'Πерегляд'; +$string[ 'showsolution'] = 'Рішення'; +$string[ 'timefinish'] = 'Гру закінчено'; +$string[ 'timelastattempt'] = 'Остання спроба'; +$string[ 'timestart'] = 'Початок'; + +//review.php +$string[ 'completedon'] = 'Завершено в'; +$string[ 'outof'] = '$a->grade з максимального $a->maxgrade'; +$string[ 'review'] = 'Перегляд'; +$string[ 'reviewofattempt'] = 'Перегляд спроби $a'; +$string[ 'startagain'] = 'Почати з нову'; + +//showanswers.php +$string[ 'feedbacks'] = 'Повідомлення правильної відповіді'; + +//tabs.php +$string[ 'export_to_html'] = 'Експорт у форматі HTML'; +$string[ 'export_to_javame'] = 'Експорт у форматі JavaMe для мобілних телефонів'; +$string[ 'info'] = 'Інформація'; +$string[ 'results'] = 'Результати'; +$string[ 'showanswers'] = 'Відображати питання'; + +//view.php +$string[ 'attemptgamenow'] = 'Спробувати гру зараз'; +$string[ 'continueattemptgame'] = 'Продовжити гру'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = 'Оцінки'; +$string[ 'nomoreattempts'] = 'Інші зусилля не дозволяються'; +$string[ 'reattemptgame'] = 'Почати гру знову'; +$string[ 'yourfinalgradeis'] = 'Підсумкова оцінка для цієї вікторини є $a'; + +//Untranslated +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//hiddenpicture/play.php $string[ 'noglossaryentriesfound'] = 'No glossary entries found'; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//exporthtml_millionaire.php $string[ 'millionaire_helppeople'] = 'Ask the audience'; +//exporthtml_millionaire.php $string[ 'millionaire_quit'] = 'Quit'; +//exporthtml_millionaire.php $string[ 'millionaire_telephone'] = 'Call a friend'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod.html $string[ 'millionaire_background'] = 'Background color'; +//mod.html $string[ 'toptext'] = 'Text at the top'; +//mod_form.php $string[ 'cross_options'] = 'Crossword options'; +//mod_form.php $string[ 'cryptex_options'] = 'Cryptex options'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'hangman_options'] = 'Hangman options'; +//mod_form.php $string[ 'headerfooter_options'] = 'Header/Footer options'; +//mod_form.php $string[ 'hiddenpicture_options'] = '\'Hidden Picture\' options'; +//mod_form.php $string[ 'millionaire_options'] = 'Millionaire options'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_options'] = '\'Snakes and Ladders\' options'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'sudoku_options'] = 'Sudoku options'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//showanswers.php $string[ 'clearrepetitions'] = 'Clear statistics'; +//showanswers.php $string[ 'computerepetitions'] = 'Compute statistics again'; +//showanswers.php $string[ 'repetitions'] = 'Repetitions'; +//tabs.php $string[ 'showattempts'] = 'Show attempts'; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lang/zh_cn_utf8/game.php b/lang/zh_cn_utf8/game.php new file mode 100644 index 0000000..4d83024 --- /dev/null +++ b/lang/zh_cn_utf8/game.php @@ -0,0 +1,294 @@ +名称附加照片'; +$string[ 'hiddenpicture_norows'] = '必须指定垂直列数'; +$string[ 'must_select_glossary'] = '你必须选定一个词汇'; +$string[ 'noglossaryentriesfound'] = '词汇表没找到'; + +//millionaire/play.php +$string[ 'millionaire_must_select_questioncategory'] = '你必须选定一个问题类别'; +$string[ 'millionaire_must_select_quiz'] = '你必须选择一个小测验'; + +//report/overview/report.php +$string[ 'allattempts'] = '显示所有可能的机会'; +$string[ 'allstudents'] = '显示所有的 $a'; +$string[ 'attemptsonly'] = '只显示进行尝试的学生'; +$string[ 'deleteattemptcheck'] = '你真的确定要完全删除这些尝试?'; +$string[ 'displayoptions'] = '显示选项'; +$string[ 'downloadods'] = '以ODS格式下载'; +$string[ 'feedback'] = '反馈'; +$string[ 'noattemptsonly'] = '显示 $a ,不需任何尝试'; +$string[ 'numattempts'] = '$a->studentnum $a->studentstring 已经形成 $a->attemptnum 尝试'; +$string[ 'overview'] = '浏览'; +$string[ 'pagesize'] = '每页出现的问题:'; +$string[ 'selectall'] = '全选'; +$string[ 'selectnone'] = '全不选'; +$string[ 'showdetailedmarks'] = '显示标记'; +$string[ 'startedon'] = '开始'; +$string[ 'timecompleted'] = '完成'; +$string[ 'timetaken'] = '所需时间'; +$string[ 'unfinished'] = '打开'; +$string[ 'withselected'] = '选定'; + +//snakes/play.php + +//sudoku/create.php +$string[ 'sudoku_create_count'] = '创建数独游戏数'; +$string[ 'sudoku_create_start'] = '开始创建数独游戏'; +$string[ 'sudoku_creating'] = '正在创建 $a 数独游戏'; + +//sudoku/play.php +$string[ 'sudoku_finishattemptbutton'] = '数独游戏结束'; +$string[ 'sudoku_guessnumber'] = '猜测正确的编号'; +$string[ 'sudoku_noentriesfound'] = '没找到任何字'; + +//attempt.php + +//backuplib.php +$string[ 'modulenameplural'] = '游戏'; + +//export.php +$string[ 'export'] = '输出'; +$string[ 'html_hascheckbutton'] = '已检查按钮:'; +$string[ 'html_hasprintbutton'] = '已打印按钮:'; +$string[ 'html_title'] = 'HTML的标题:'; +$string[ 'javame_createdby'] = '创建于:'; +$string[ 'javame_description'] = '描述:'; +$string[ 'javame_filename'] = '文件名:'; +$string[ 'javame_icon'] = '图标:'; +$string[ 'javame_maxpictureheight'] = '图片的最大高度:'; +$string[ 'javame_maxpicturewidth'] = '图片的最大宽度:'; +$string[ 'javame_name'] = '名称:'; +$string[ 'javame_type'] = '类型:'; +$string[ 'javame_vendor'] = '销售商:'; +$string[ 'javame_version'] = '版本:'; +$string[ 'only_teachers'] = '只有老师可以查看此页'; + +//exporthtml_hangman.php +$string[ 'hangman_loose'] = '游戏结束'; +$string[ 'html_hangman_new'] = '新的'; + +//exporthtml_millionaire.php +$string[ 'millionaire_helppeople'] = '帮助'; +$string[ 'millionaire_info_people'] = '人们说'; +$string[ 'millionaire_info_telephone'] = '我认为正确答案是 '; +$string[ 'millionaire_info_wrong_answer'] = '你的回答错误,正确答案是:'; +$string[ 'millionaire_quit'] = '退出'; +$string[ 'millionaire_sourcemodule_must_quiz_question'] = '对于百万富翁来说资源一定是 $a 要么有问题要么没有'; +$string[ 'millionaire_telephone'] = '借助电话'; +$string[ 'must_select_questioncategory'] = '你必须选定一个问题类别'; +$string[ 'must_select_quiz'] = '你必须选择一个小测验'; + +//exporthtml_snakes.php +$string[ 'score'] = '得分'; + +//header.php +$string[ 'modulename'] = '游戏'; + +//index.php +$string[ 'attempts'] = '尝试'; + +//lib.php +$string[ 'attempt'] = '尝试 $a'; +$string[ 'game_bookquiz'] = '带有问题的书'; +$string[ 'game_cross'] = '填字游戏'; +$string[ 'game_cryptex'] = '藏密筒'; +$string[ 'game_hangman'] = '刽子手'; +$string[ 'game_hiddenpicture'] = '图片隐藏'; +$string[ 'game_millionaire'] = '百万富翁'; +$string[ 'game_snakes'] = '蛇和梯子'; +$string[ 'game_sudoku'] = '数独游戏'; +$string[ 'noattempts'] = '这个游戏没有进行任何尝试'; +$string[ 'percent'] = '百分率'; + +//locallib.php +$string[ 'attemptfirst'] = '第一次机会'; +$string[ 'attemptlast'] = '最后一次机会'; +$string[ 'gradeaverage'] = '平均分'; +$string[ 'gradehighest'] = '最高分'; + +//mod.html +$string[ 'bottomtext'] = '底部文本'; +$string[ 'cross_layout'] = '布局'; +$string[ 'cross_layout0'] = '字谜底部的词组'; +$string[ 'cross_layout1'] = '字谜右侧的词组'; +$string[ 'cross_maxcols'] = '填字游戏的最大数'; +$string[ 'cross_maxwords'] = '游戏字的最大数'; +$string[ 'cryptex_maxcols'] = '藏密筒的最大行/列数'; +$string[ 'cryptex_maxtries'] = '最多机会'; +$string[ 'cryptex_maxwords'] = '藏密筒中最多词汇'; +$string[ 'grademethod'] = '评分方法'; +$string[ 'hangman_allowspaces'] = '允许文字间有间隔'; +$string[ 'hangman_allowsub'] = '允许文字里有符号'; +$string[ 'hangman_imageset'] = '选择刽子手的图像'; +$string[ 'hangman_language'] = '选择语言'; +$string[ 'hangman_maxtries'] = '每个游戏数'; +$string[ 'hangman_showcorrectanswer'] = '结束后正确答案显示'; +$string[ 'hangman_showfirst'] = '刽子手游戏的第一个字母显示'; +$string[ 'hangman_showlast'] = '刽子手游戏的最后一个字母显示'; +$string[ 'hangman_showquestion'] = '问题显示 ?'; +$string[ 'hiddenpicture_across'] = '水平单元'; +$string[ 'hiddenpicture_down'] = '纵向单元'; +$string[ 'hiddenpicture_height'] = '图片的高度设置'; +$string[ 'hiddenpicture_pictureglossary'] = '主要问题和图片词汇'; +$string[ 'hiddenpicture_pictureglossarycategories'] = '主要问题词汇分类'; +$string[ 'hiddenpicture_width'] = '图像宽度设置'; +$string[ 'millionaire_background'] = '背景颜色'; +$string[ 'millionaire_shuffle'] = '随机问题'; +$string[ 'selectgame'] = '选择游戏'; +$string[ 'snakes_background'] = '背景'; +$string[ 'sourcemodule'] = '问题来源'; +$string[ 'sourcemodule_book'] = '挑选一本书'; +$string[ 'sourcemodule_glossary'] = '词汇选择'; +$string[ 'sourcemodule_glossarycategory'] = '词汇类别选择'; +$string[ 'sourcemodule_include_subcategories'] = '包括子目录'; +$string[ 'sourcemodule_question'] = '问题'; +$string[ 'sourcemodule_questioncategory'] = '问题类别选择'; +$string[ 'sourcemodule_quiz'] = '小测验选择'; +$string[ 'sudoku_maxquestions'] = '问题的最大数量'; +$string[ 'toptext'] = '顶部文本'; + +//mod_form.php +$string[ 'cross_options'] = '填字游戏选项'; +$string[ 'cryptex_options'] = '藏密筒选项'; +$string[ 'hangman_options'] = '刽子手选项'; +$string[ 'headerfooter_options'] = '页眉/页脚选项 '; +$string[ 'hiddenpicture_options'] = '\图片隐藏\' 选项'; +$string[ 'millionaire_options'] = '百万富翁选项'; +$string[ 'snakes_options'] = '\'蛇和梯子\' 选项'; +$string[ 'sudoku_options'] = '数独游戏选项'; + +//preview.php +$string[ 'formatdatetime'] = '%%d %%b %%Y, %%I:%%M %%p'; +$string[ 'lastip'] = 'IP学生'; +$string[ 'preview'] = '预览'; +$string[ 'showsolution'] = '答案'; +$string[ 'timefinish'] = '游戏结束'; +$string[ 'timelastattempt'] = '最后一次机会'; +$string[ 'timestart'] = '开始'; + +//review.php +$string[ 'completedon'] = '完成'; +$string[ 'outof'] = '$a->$a 的最高分->最高分'; +$string[ 'review'] = '回顾'; +$string[ 'reviewofattempt'] = '回顾 $a'; +$string[ 'startagain'] = '重新开始'; + +//showanswers.php +$string[ 'clearrepetitions'] = '清除数据'; +$string[ 'computerepetitions'] = '再次计算数据'; +$string[ 'feedbacks'] = '正确答案信息'; +$string[ 'repetitions'] = '重复'; + +//tabs.php +$string[ 'export_to_html'] = '导出HTML'; +$string[ 'export_to_javame'] = '导出Javame'; +$string[ 'info'] = '信息'; +$string[ 'results'] = '结果'; +$string[ 'showanswers'] = '答案显示'; +$string[ 'showattempts'] = '试玩显示'; + +//view.php +$string[ 'attemptgamenow'] = '现在试玩游戏'; +$string[ 'continueattemptgame'] = '继续前一个游戏'; +$string[ 'gradesofar'] = '$a->method: $a->mygrade / $a->gamegrade.'; +$string[ 'marks'] = '分数'; +$string[ 'nomoreattempts'] = '不再允许试玩'; +$string[ 'reattemptgame'] = '重新试玩游戏'; +$string[ 'yourfinalgradeis'] = '此轮游戏的最后得分是 $a.'; + +//Untranslated +//db/access.php $string[ 'game:attempt'] = 'Play games'; +//db/access.php $string[ 'game:deleteattempts'] = 'Delete attempts'; +//db/access.php $string[ 'game:grade'] = 'Grade games manually'; +//db/access.php $string[ 'game:manage'] = 'Manage'; +//db/access.php $string[ 'game:preview'] = 'Preview Games'; +//db/access.php $string[ 'game:reviewmyattempts'] = 'reviewmyattempts'; +//db/access.php $string[ 'game:view'] = 'View game information'; +//db/access.php $string[ 'game:viewreports'] = 'View game reports'; +//hiddenpicture/play.php $string[ 'no_questions'] = "There are no questions"; +//snakes/play.php $string[ 'snakes_dice'] = 'Dice, $a spots.'; +//snakes/play.php $string[ 'snakes_player'] = 'Player, position: $a.'; +//attempt.php $string[ 'gameclosed'] = 'This game closed on {$a}'; +//attempt.php $string[ 'gamenotavailable'] = 'The game will not be available until {$a}'; +//exporthtml_snakes.php $string[ 'html_snakes_check'] = 'Check'; +//exporthtml_snakes.php $string[ 'html_snakes_correct'] = 'Correct!'; +//exporthtml_snakes.php $string[ 'html_snakes_no_selection'] = 'Have to select something!'; +//exporthtml_snakes.php $string[ 'html_snakes_wrong'] = "Your answer isn't correct. Stay on the same seat."; +//lib.php $string[ 'reset_game_all'] = 'Delete tries from all games'; +//lib.php $string[ 'reset_game_deleted_course'] = 'Delete tries from deleted courses'; +//mod_form.php $string[ 'gameclose'] = 'Close the game'; +//mod_form.php $string[ 'gameopen'] = 'Open the game'; +//mod_form.php $string[ 'hangman_maximum_number_of_errors'] = 'Maximum number or errors (have to be images named hangman_0.jpg, hangman_1.jpg, ...)'; +//mod_form.php $string[ 'snakes_board'] = 'Board'; +//mod_form.php $string[ 'snakes_cols'] = 'Cols'; +//mod_form.php $string[ 'snakes_file'] = 'File for background'; +//mod_form.php $string[ 'snakes_footerx'] = 'Space at bootom left'; +//mod_form.php $string[ 'snakes_footery'] = 'Space at bottom right'; +//mod_form.php $string[ 'snakes_headerx'] = 'Space at up left'; +//mod_form.php $string[ 'snakes_headery'] = 'Space at up right'; +//mod_form.php $string[ 'snakes_rows'] = 'Rows'; +//mod_form.php $string[ 'userdefined'] = "User defined "; +//view.php $string[ 'gamecloses'] = 'Game closes'; +//view.php $string[ 'gameopens'] = 'Game opens'; diff --git a/lib.php b/lib.php new file mode 100644 index 0000000..9cf2bc3 --- /dev/null +++ b/lib.php @@ -0,0 +1,956 @@ +review + * These constants help to extract the options + */ +/** + * The first 6 bits refer to the time immediately after the attempt + */ +define('GAME_REVIEW_IMMEDIATELY', 0x3f); +/** + * the next 6 bits refer to the time after the attempt but while the game is open + */ +define('GAME_REVIEW_OPEN', 0xfc0); +/** + * the final 6 bits refer to the time after the game closes + */ +define('GAME_REVIEW_CLOSED', 0x3f000); + +// within each group of 6 bits we determine what should be shown +define('GAME_REVIEW_RESPONSES', 1*0x1041); // Show responses +define('GAME_REVIEW_SCORES', 2*0x1041); // Show scores +define('GAME_REVIEW_FEEDBACK', 4*0x1041); // Show feedback +define('GAME_REVIEW_ANSWERS', 8*0x1041); // Show correct answers +// Some handling of worked solutions is already in the code but not yet fully supported +// and not switched on in the user interface. +define('GAME_REVIEW_SOLUTIONS', 16*0x1041); // Show solutions +define('GAME_REVIEW_GENERALFEEDBACK', 32*0x1041); // Show general feedback +/**#@-*/ + + +/** + * Given an object containing all the necessary data, + * (defined by the form in mod.html) this function + * will create a new instance and return the id number + * of the new instance. + * + * @param object $instance An object from the form in mod.html + * @return int The id of the newly inserted game record + **/ + +function game_add_instance($game) { + + $game->timemodified = time(); + + # May have to add extra stuff in here # + + game_before_add_or_update( $game); + + $id = insert_record('game', $game); + + $game = get_record_select( 'game', "id=$id"); + + // Do the processing required after an add or an update. + game_after_add_or_update( $game); + + return $id; +} + +/** + * Given an object containing all the necessary data, + * (defined by the form in mod.html) this function + * will update an existing instance with new data. + * + * @param object $instance An object from the form in mod.html + * @return boolean Success/Fail + **/ +function game_update_instance($game) { + $game->timemodified = time(); + $game->id = $game->instance; + + if( !isset( $game->glossarycategoryid)){ + $game->glossarycategoryid = 0; + } + + if( !isset( $game->glossarycategoryid2)){ + $game->glossarycategoryid2 = 0; + } + + if( $game->grade == ''){ + $game->grade = 0; + } + + if( !isset( $game->param1)){ + $game->param1 = 0; + } + + if( $game->param1 == ''){ + $game->param1 = 0; + } + + if( !isset( $game->param2)){ + $game->param2 = 0; + } + + if( $game->param2 == ''){ + $game->param2 = 0; + } + + game_before_add_or_update( $game); + if( !update_record('game', $game)){ + return false; + } + + // Do the processing required after an add or an update. + game_after_add_or_update( $game); + + return true; +} + +/** + * Given an ID of an instance of this module, + * this function will permanently delete the instance + * and any data that depends on it. + * + * @param int $id Id of the module instance + * @return boolean Success/Failure + **/ +function game_delete_instance($gameid) { + global $CFG; + + $result = true; + + # Delete any dependent records here # + + if( ($recs = get_records_select( 'game_attempts', "gameid='$gameid'")) != false){ + $ids = ''; + $count = 0; + $aids = array(); + foreach( $recs as $rec){ + $ids .= ','.$rec->id; + if( ++$count > 10){ + $count = 0; + $aids[] = $ids; + $ids = ''; + } + } + if( $ids != ''){ + $aids[] = $ids; + } + + foreach( $aids as $ids){ + if( $result == false){ + break; + } + $tables = array( 'game_hangman', 'game_cross', 'game_cryptex', 'game_millionaire', 'game_bookquiz', 'game_sudoku', 'game_snakes'); + foreach( $tables as $t){ + $sql = "DELETE FROM {$CFG->prefix}$t WHERE id IN (".substr( $ids, 1).')'; + if (!execute_sql( $sql, false)) { + $result = false; + break; + } + } + } + } + + $tables = array( 'game_attempts', 'game_grades', 'game_bookquiz_questions', 'game_queries', 'game_repetitions'); + foreach( $tables as $t){ + if( $result == false){ + break; + } + + if (!delete_records( $t, 'gameid', $gameid)) { + $result = false; + } + } + + $tables = array( 'game_export_javame', 'game_export_html'); + foreach( $tables as $t){ + if( $result == false){ + break; + } + + if (!delete_records( $t, 'id', $gameid)) { + $result = false; + } + } + + if( $result){ + if (!delete_records( 'game', "id", $gameid)) { + $result = false; + } + } + + return $result; +} + +/** + * Return a small object with summary information about what a + * user has done with a given particular instance of this module + * Used for user activity reports. + * $return->time = the time they did it + * $return->info = a short text description + **/ +function game_user_outline($course, $user, $mod, $game) { + if ($grade = get_record_select('game_grades', "userid=$user->id AND gameid = $game->id", 'id,score,timemodified')) { + + $result = new stdClass; + if ((float)$grade->score) { + $result->info = get_string('grade').': '.round($grade->score * $game->grade, $game->decimalpoints).' '. + get_string('percent', 'game').': '.round(100 * $grade->score, $game->decimalpoints).' %'; + } + $result->time = $grade->timemodified; + return $result; + } + return NULL; +} + +/** + * Print a detailed representation of what a user has done with + * a given particular instance of this module, for user activity reports. + **/ +function game_user_complete($course, $user, $mod, $game) { + if ($attempts = get_records_select('game_attempts', "userid='$user->id' AND gameid='$game->id'", 'attempt ASC')) { + if ($game->grade && $grade = get_record('game_grades', 'userid', $user->id, 'gameid', $game->id)) { + echo get_string('grade').': '.round($grade->score * $game->grade, $game->decimalpoints).'/'.$game->grade.'
    '; + } + foreach ($attempts as $attempt) { + echo get_string('attempt', 'game').' '.$attempt->attempt.': '; + if ($attempt->timefinish == 0) { + print_string('unfinished'); + } else { + echo round($attempt->score * $game->grade, $game->decimalpoints).'/'.$game->grade; + } + echo ' - '.userdate($attempt->timelastattempt).'
    '; + } + } else { + print_string('noattempts', 'game'); + } + + return true; +} + +/** + * Given a course and a time, this module should find recent activity + * that has occurred in game activities and print it out. + * Return true if there was output, or false is there was none. + * + * @uses $CFG + * @return boolean + * @todo Finish documenting this function + **/ +function game_print_recent_activity($course, $isteacher, $timestart) { + global $CFG; + + return false; // True if anything was printed, otherwise false +} + +/** + * Function to be run periodically according to the moodle cron + * This function searches for things that need to be done, such + * as sending out mail, toggling flags etc ... + * + * @uses $CFG + * @return boolean + * @todo Finish documenting this function + **/ +function game_cron () { + global $CFG; + + return true; +} + +/** + * Must return an array of grades for a given instance of this module, + * indexed by user. It also returns a maximum allowed grade. + * + * Example: + * $return->grades = array of grades; + * $return->maxgrade = maximum allowed grade; + * + * return $return; + * + * @param int $gameid ID of an instance of this module + * @return mixed Null or object with an array of grades and with the maximum grade + **/ +function game_grades($gameid) { +/// Must return an array of grades, indexed by user, and a max grade. + + $game = get_record('game', 'id', intval($gameid)); + if (empty($game) || empty($game->grade)) { + return NULL; + } + + $return = new stdClass; + $return->grades = get_records_menu('game_grades', 'gameid', $game->id, '', "userid, score * {$game->grade}"); + $return->maxgrade = $game->grade; + + return $return; +} + +/** + * Return grade for given user or all users. + * + * @param int $gameid id of game + * @param int $userid optional user id, 0 means all users + * @return array array of grades, false if none + */ +function game_get_user_grades($game, $userid=0) { + global $CFG; + + $user = $userid ? "AND u.id = $userid" : ""; + + $sql = "SELECT u.id, u.id AS userid, $game->grade * g.score AS rawgrade, g.timemodified AS dategraded, MAX(a.timefinish) AS datesubmitted + FROM {$CFG->prefix}user u, {$CFG->prefix}game_grades g, {$CFG->prefix}game_attempts a + WHERE u.id = g.userid AND g.gameid = {$game->id} AND a.gameid = g.gameid AND u.id = a.userid + $user + GROUP BY u.id, g.score, g.timemodified"; + + return get_records_sql($sql); +} + +/** + * Must return an array of user records (all data) who are participants + * for a given instance of game. Must include every user involved + * in the instance, independient of his role (student, teacher, admin...) + * See other modules as example. + * + * @param int $gameid ID of an instance of this module + * @return mixed boolean/array of students + **/ +function game_get_participants($gameid) { + return false; //todo +} + +/** + * This function returns if a scale is being used by one game + * it it has support for grading and scales. Commented code should be + * modified if necessary. See forum, glossary or journal modules + * as reference. + * + * @param int $gameid ID of an instance of this module + * @return mixed + * @todo Finish documenting this function + **/ +function game_scale_used ($gameid,$scaleid) { + $return = false; + + //$rec = get_record("game","id","$gameid","scale","-$scaleid"); + // + //if (!empty($rec) && !empty($scaleid)) { + // $return = true; + //} + + return $return; +} + +/** + * Update grades in central gradebook + * + * @param object $game null means all games + * @param int $userid specific user only, 0 mean all + */ +function game_update_grades($game=null, $userid=0, $nullifnone=true) { + global $CFG; + if (!function_exists('grade_update')) { //workaround for buggy PHP versions + if( file_exists( $CFG->libdir.'/gradelib.php')){ + require_once($CFG->libdir.'/gradelib.php'); + }else{ + return; + } + } + + if ($game != null) { + if ($grades = game_get_user_grades($game, $userid)) { + game_grade_item_update($game, $grades); + + } else if ($userid and $nullifnone) { + $grade = new object(); + $grade->userid = $userid; + $grade->rawgrade = NULL; + game_grade_item_update( $game, $grade); + + } else { + game_grade_item_update( $game); + } + + } else { + $sql = "SELECT a.*, cm.idnumber as cmidnumber, a.course as courseid + FROM {$CFG->prefix}game a, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m + WHERE m.name='game' AND m.id=cm.module AND cm.instance=a.id"; + if ($rs = get_recordset_sql($sql)) { + while ($game = rs_fetch_next_record( $rs)) { + if ($game->grade != 0) { + game_update_grades( $game, 0, false); + } else { + game_grade_item_update( $game); + } + } + rs_close( $rs); + } + } +} + +/** + * Create grade item for given game + * + * @param object $game object with extra cmidnumber + * @param mixed optional array/object of grade(s); 'reset' means reset grades in gradebook + * @return int 0 if ok, error code otherwise + */ +function game_grade_item_update($game, $grades=NULL) { + global $CFG; + if (!function_exists('grade_update')) { //workaround for buggy PHP versions + if( file_exists( $CFG->libdir.'/gradelib.php')){ + require_once($CFG->libdir.'/gradelib.php'); + }else{ + return; + } + } + + if (array_key_exists('cmidnumber', $game)) { //it may not be always present + $params = array('itemname'=>$game->name, 'idnumber'=>$game->cmidnumber); + } else { + $params = array('itemname'=>$game->name); + } + + if ($game->grade > 0) { + $params['gradetype'] = GRADE_TYPE_VALUE; + $params['grademax'] = $game->grade; + $params['grademin'] = 0; + + } else { + $params['gradetype'] = GRADE_TYPE_NONE; + } + + if ($grades === 'reset') { + $params['reset'] = true; + $grades = NULL; + } + + return grade_update('mod/game', $game->course, 'mod', 'game', $game->id, 0, $grades, $params); +} + + +/** + * Delete grade item for given game + * + * @param object $game object + * @return object game + */ +function game_grade_item_delete( $game) { + global $CFG; + + if( file_exists( $CFG->libdir.'/gradelib.php')){ + require_once($CFG->libdir.'/gradelib.php'); + }else{ + return; + } + + return grade_update('mod/game', $game->course, 'mod', 'game', $game->id, 0, NULL, array('deleted'=>1)); +} + +/** + * Returns all game graded users since a given time for specified game + */ +function game_get_recent_mod_activity(&$activities, &$index, $timestart, $courseid, $cmid, $userid=0, $groupid=0) { + global $CFG, $COURSE, $USER; + + if ($COURSE->id == $courseid) { + $course = $COURSE; + } else { + $course = get_record('course', 'id', $courseid); + } + + $modinfo =& get_fast_modinfo($course); + + $cm = $modinfo->cms[$cmid]; + + if ($userid) { + $userselect = "AND u.id = $userid"; + } else { + $userselect = ""; + } + + if ($groupid) { + $groupselect = "AND gm.groupid = $groupid"; + $groupjoin = "JOIN {$CFG->prefix}groups_members gm ON gm.userid=u.id"; + } else { + $groupselect = ""; + $groupjoin = ""; + } + + if (!$attempts = get_records_sql("SELECT qa.*, q.grade, + u.firstname, u.lastname, u.email, u.picture + FROM {$CFG->prefix}game_attempts qa + JOIN {$CFG->prefix}game q ON q.id = qa.gameid + JOIN {$CFG->prefix}user u ON u.id = qa.userid + $groupjoin + WHERE qa.timefinish > $timestart AND q.id = $cm->instance + $userselect $groupselect + ORDER BY qa.timefinish ASC")) { + return; + } + + + $cm_context = get_context_instance(CONTEXT_MODULE, $cm->id); + $grader = has_capability('moodle/grade:viewall', $cm_context); + $accessallgroups = has_capability('moodle/site:accessallgroups', $cm_context); + $viewfullnames = has_capability('moodle/site:viewfullnames', $cm_context); + //$grader = has_capability('mod/game:grade', $cm_context); + $grader = isteacher( $courseid, $userid); + $groupmode = groups_get_activity_groupmode($cm, $course); + + if (is_null($modinfo->groups)) { + $modinfo->groups = groups_get_user_groups($course->id); // load all my groups and cache it in modinfo + } + + $aname = format_string($cm->name,true); + foreach ($attempts as $attempt) { + if ($attempt->userid != $USER->id) { + if (!$grader) { + // grade permission required + continue; + } + + if ($groupmode == SEPARATEGROUPS and !$accessallgroups) { + $usersgroups = groups_get_all_groups($course->id, $attempt->userid, $cm->groupingid); + if (!is_array($usersgroups)) { + continue; + } + $usersgroups = array_keys($usersgroups); + $interset = array_intersect($usersgroups, $modinfo->groups[$cm->id]); + if (empty($intersect)) { + continue; + } + } + } + + $tmpactivity = new object(); + + $tmpactivity->type = 'game'; + $tmpactivity->cmid = $cm->id; + $tmpactivity->name = $aname; + $tmpactivity->sectionnum= $cm->sectionnum; + $tmpactivity->timestamp = $attempt->timefinish; + + $tmpactivity->content->attemptid = $attempt->id; + $tmpactivity->content->sumgrades = $attempt->score * $attempt->grade; + $tmpactivity->content->maxgrade = $attempt->grade; + $tmpactivity->content->attempt = $attempt->attempt; + + $tmpactivity->user->userid = $attempt->userid; + $tmpactivity->user->fullname = fullname($attempt, $viewfullnames); + $tmpactivity->user->picture = $attempt->picture; + + $activities[$index++] = $tmpactivity; + } + + return; +} + +function game_print_recent_mod_activity($activity, $courseid, $detail, $modnames) { + global $CFG; + + echo ''; + + echo "
    "; + print_user_picture($activity->user->userid, $courseid, $activity->user->picture); + echo ""; + + if ($detail) { + $modname = $modnames[$activity->type]; + echo '
    '; + echo "modpixpath/{$activity->type}/icon.gif\" ". + "class=\"icon\" alt=\"$modname\" />"; + echo "wwwroot/mod/game/view.php?id={$activity->cmid}\">{$activity->name}"; + echo '
    '; + } + + echo '
    '; + echo get_string("attempt", "game")." {$activity->content->attempt}: "; + $grades = "({$activity->content->sumgrades} / {$activity->content->maxgrade})"; + echo "wwwroot/mod/game/review.php?attempt={$activity->content->attemptid}\">$grades"; + echo '
    '; + + echo ''; + + echo "
    "; + + return; +} + +function game_before_add_or_update(&$game) { + + $pos = strpos( $game->questioncategoryid, ','); + if( $pos != false) + $game->questioncategoryid = substr( $game->questioncategoryid, 0, $pos); + + if( $game->gamekind == 'millionaire') + { + if( substr( $game->param8, 0, 1) == '#') + { + $game->param8 = hexdec(substr( $game->param8, 1)); + } + }else if( $game->gamekind == 'snakes') + { + $s = ''; + if( $game->param3 == 0) + { + if( isset( $_POST[ 'snakes_cols'])) + { + $fields = array( 'snakes_board', 'snakes_cols', 'snakes_rows', 'snakes_headerx', 'snakes_headery', 'snakes_footerx', 'snakes_footery'); + foreach( $fields as $f) + $s .= '#'.$f.':'.$_POST[ $f]; + $s = substr( $s, 1); + } + } + $game->param9 = $s; + } +} + +/** + * This function is called at the end of game_add_instance + * and game_update_instance, to do the common processing. + * + * @param object $game the game object. + */ +function game_after_add_or_update($game) { + + if( $game->gamekind == 'snakes') + { + game_snakes_savefile( $game); + } + + //update related grade item + game_grade_item_update( stripslashes_recursive( $game)); +} + +function game_file_area_name( $game) { + global $CFG; +// Creates a directory file name, suitable for make_upload_directory() + + return "$CFG->dataroot/$game->course/$CFG->moddata/game/$game->id"; +} + +function game_snakes_savefile( &$game) +{ + $filename = basename( $_FILES['param4']['name']); + if( $filename == '') + { + $game->param4 = 0; + return true; + } + + $target_path = game_file_area_name( $game); + if( !check_dir_exists( $target_path, true, true)) + { + $game->param4 = 0; + return false; + } + game_snakes_removefile( $target_path, 'board'); + + $pos = strrpos( $filename, '.'); + if( $pos == false) + { + $game->param4 = 0; + return false; + } + $filename = 'file'.substr( $filename, $pos); + + game_snakes_removefile( $target_path, 'file'); + + $target_path = $target_path . '/'.$filename; + + if( move_uploaded_file($_FILES['param4']['tmp_name'], $target_path)) { + $game->param4 = 1; + return true; + } else{ + $game->param4 = 0; + return false; + } +} + +//remove all files that start with name $file +function game_snakes_removefile( $target_path, $file) +{ + $d = dir( $target_path); + while (false !== ($entry = $d->read())) { + if( substr( $entry, 0, strlen( $file)) != $file) + continue; + + unlink( $target_path.'/'.$entry); + } + $d->close(); +} + + +/** + * Removes all grades from gradebook + * @param int $courseid + * @param string optional type + */ +function game_reset_gradebook($courseid, $type='') { + global $CFG; + + $sql = "SELECT q.*, cm.idnumber as cmidnumber, q.course as courseid + FROM {$CFG->prefix}game q, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m + WHERE m.name='game' AND m.id=cm.module AND cm.instance=q.id AND q.course=$courseid"; + + if ($games = get_records_sql( $sql)) { + foreach ($games as $game) { + game_grade_item_update( $game, 'reset'); + } + } +} + +/** + * Returns an array of game type objects to construct + * menu list when adding new game + * + */ +function game_get_types(){ + global $CFG; + + $types = array(); + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game_group_start"; + $type->typestr = '--'.get_string( 'modulenameplural', 'game'); + $types[] = $type; + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game&type=hangman"; + $type->typestr = get_string('game_hangman', 'game'); + $types[] = $type; + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game&type=contest"; + $type->typestr = get_string('game_contest', 'game'); + $types[] = $type; + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game&type=cross"; + $type->typestr = get_string('game_cross', 'game'); + $types[] = $type; + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game&type=cryptex"; + $type->typestr = get_string('game_cryptex', 'game'); + $types[] = $type; + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game&type=hiddenpicture"; + $type->typestr = get_string('game_hiddenpicture', 'game'); + $types[] = $type; + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game&type=millionaire"; + $type->typestr = get_string('game_millionaire', 'game'); + $types[] = $type; + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game&type=snakes"; + $type->typestr = get_string('game_snakes', 'game'); + $types[] = $type; + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game&type=sudoku"; + $type->typestr = get_string('game_sudoku', 'game'); + $types[] = $type; + + if(get_record_select( 'modules', "name='book'", 'id,id')){ + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game&type=bookquiz"; + $type->typestr = get_string('game_bookquiz', 'game'); + $types[] = $type; + } + + $type = new object(); + $type->modclass = MOD_CLASS_ACTIVITY; + $type->type = "game_group_end"; + $type->typestr = '--'; + $types[] = $type; + + return $types; + +} + +/** + * Return a textual summary of the number of attemtps that have been made at a particular game, + * returns '' if no attemtps have been made yet, unless $returnzero is passed as true. + * @param object $game the game object. Only $game->id is used at the moment. + * @param object $cm the cm object. Only $cm->course, $cm->groupmode and $cm->groupingid fields are used at the moment. + * @param boolean $returnzero if false (default), when no attempts have been made '' is returned instead of 'Attempts: 0'. + * @param int $currentgroup if there is a concept of current group where this method is being called + * (e.g. a report) pass it in here. Default 0 which means no current group. + * @return string a string like "Attempts: 123", "Attemtps 123 (45 from your groups)" or + * "Attemtps 123 (45 from this group)". + */ +function game_num_attempt_summary($game, $cm, $returnzero = false, $currentgroup = 0) { + global $CFG, $USER; + $numattempts = count_records('game_attempts', 'gameid', $game->id, 'preview', 0); + if ($numattempts || $returnzero) { + if (groups_get_activity_groupmode($cm)) { + $a->total = $numattempts; + if ($currentgroup) { + $a->group = count_records_sql('SELECT count(1) FROM ' . + $CFG->prefix . 'game_attempts qa JOIN ' . + $CFG->prefix . 'groups_members gm ON qa.userid = gm.userid ' . + 'WHERE gameid = ' . $game->id . ' AND preview = 0 AND groupid = ' . $currentgroup); + return get_string('attemptsnumthisgroup', 'quiz', $a); + } else if ($groups = groups_get_all_groups($cm->course, $USER->id, $cm->groupingid)) { + $a->group = count_records_sql('SELECT count(1) FROM ' . + $CFG->prefix . 'game_attempts qa JOIN ' . + $CFG->prefix . 'groups_members gm ON qa.userid = gm.userid ' . + 'WHERE gameid = ' . $game->id . ' AND preview = 0 AND ' . + 'groupid IN (' . implode(',', array_keys($groups)) . ')'); + return get_string('attemptsnumyourgroups', 'quiz', $a); + } + } + return get_string('attemptsnum', 'quiz', $numattempts); + } + return ''; +} + +/** + * Implementation of the function for printing the form elements that control + * whether the course reset functionality affects the Game. + * @param object $mform form passed by reference + */ +function game_reset_course_form_definition(&$mform) { + $mform->addElement('header', 'gameheader', get_string('modulenameplural', 'game')); + $mform->addElement('checkbox', 'reset_game_all', get_string('reset_game_all','game')); + + $mform->addElement('checkbox', 'reset_game_deleted_course', get_string('reset_game_deleted_course', 'game')); +} + +/** + * Course reset form defaults. + * @return array + */ +function game_reset_course_form_defaults($course) { + return array('reset_game_all'=>0, 'reset_game_deleted_course' => 0); +} + +/** + * Actual implementation of the reset course functionality, delete all the + * Game responses for course $data->courseid. + * + * @global object + * @param $data the data submitted from the reset course. + * @return array status array + */ +function game_reset_userdata($data) { + global $CFG; + + $componentstr = get_string('modulenameplural', 'game'); + $status = array(); + + for($i=1; $i <= 2; $i++){ + if( $i == 1){ + if (empty($data->reset_game_all)) + continue; + $allgamessql = "SELECT g.id FROM {$CFG->prefix}game g WHERE g.course = ".$data->courseid; + $allattemptssql = "SELECT ga.id FROM {$CFG->prefix}game g LEFT JOIN {$CFG->prefix}game_attempts ga ON g.id = ga.gameid WHERE g.course = ".$data->courseid; + $newstatus = array('component'=>$componentstr, 'item'=>get_string('reset_game_all', 'game'), 'error'=>false); + }else if( $i == 2) + { + //Delete data of deleted courses + if (empty($data->reset_game_deleted_course)) + continue; + $allgamessql = "SELECT g.id FROM {$CFG->prefix}game g WHERE NOT EXISTS( SELECT * FROM {$CFG->prefix}course c WHERE c.id = g.course)"; + $allattemptssql = "SELECT ga.id FROM {$CFG->prefix}game_attempts ga WHERE NOT EXISTS( SELECT * FROM {$CFG->prefix}game g WHERE ga.gameid = g.id)"; + $newstatus = array('component'=>$componentstr, 'item'=>get_string('reset_game_deleted_course', 'game'), 'error'=>false); + } + + $recs = get_recordset_sql($allgamessql); + if ($recs != false) { + foreach ($recs as $rec) { + $game = get_record_select( 'game', 'id='.$rec[ 'id'], 'id,name,course'); + + remove_dir( $CFG->dataroot.'/'.$game->course.'/moddata/game/'.$game->id); + + //reset grades + $grades = NULL; + $params = array('itemname'=>$game->name, 'idnumber'=>0); + $params['reset'] = true; + grade_update('mod/game', $game->course, 'mod', 'game', $game->id, 0, $grades, $params); + } + } + + delete_records_select('game_bookquiz', "id IN ($allgamessql)"); + delete_records_select('game_bookquiz_chapters', "attemptid IN ($allattemptssql)"); + delete_records_select('game_bookquiz_questions', "gameid IN ($allgamessql)"); + delete_records_select('game_cross', "id IN ($allgamessql)"); + delete_records_select('game_cryptex', "id IN ($allgamessql)"); + delete_records_select('game_export_html', "id IN ($allgamessql)"); + delete_records_select('game_export_javame', "id IN ($allgamessql)"); + delete_records_select('game_grades', "gameid IN ($allgamessql)"); + delete_records_select('game_hangman', "id IN ($allgamessql)"); + delete_records_select('game_hiddenpicture', "id IN ($allgamessql)"); + delete_records_select('game_millionaire', "id IN ($allgamessql)"); + delete_records_select('game_queries', "gameid IN ($allgamessql)"); + delete_records_select('game_repetitions', "gameid IN ($allgamessql)"); + delete_records_select('game_snakes', "id IN ($allgamessql)"); + delete_records_select('game_sudoku', "id IN ($allgamessql)"); + + if( $i == 2) + delete_records_select('game_attempts', "NOT EXISTS (SELECT * FROM {$CFG->prefix}game g WHERE {$CFG->prefix}game_attempts.gameid=g.id)"); + else + delete_records_select('game_attempts', "gameid IN ($allgamessql)"); + + $status[] = $newstatus; + } + + if (empty($data->reset_game_deleted_course)) + return $status; + + //Delete data from deleted games + $a = array( 'bookquiz', 'cross', 'cryptex', 'grades', 'bookquiz_questions', 'export_html', 'export_javame', 'hangman', + 'hiddenpicture', 'millionaire', 'snakes', 'sudoku'); + foreach( $a as $table) + delete_records_select( 'game_'.$table, "NOT EXISTS( SELECT * FROM {$CFG->prefix}game g WHERE {$CFG->prefix}game_$table.id=g.id)"); + + //Tables that have the field gameid + $a = array( 'grades', 'queries', 'repetitions'); + foreach( $a as $table) + delete_records_select( 'game_'.$table, "NOT EXISTS( SELECT * FROM {$CFG->prefix}game g WHERE {$CFG->prefix}game_$table.gameid=g.id)"); + + //Tables that have the key attemptid + $a = array( 'bookquiz_chapters'); + foreach( $a as $table) + delete_records_select( 'game_'.$table, "NOT EXISTS( SELECT * FROM {$CFG->prefix}game_attempts ga WHERE {$CFG->prefix}game_$table.attemptid=ga.id)"); + + return $status; +} + +function game_file_area_query_name( $game, $query) { + return game_file_area_name( $game).'/queries/'.$query->id; +} + + diff --git a/locallib.php b/locallib.php new file mode 100644 index 0000000..dbeaa88 --- /dev/null +++ b/locallib.php @@ -0,0 +1,1506 @@ + get_string("gradehighest", "game"), + GAME_GRADEMETHOD_AVERAGE => get_string("gradeaverage", "game"), + GAME_GRADEMETHOD_FIRST => get_string("attemptfirst", "game"), + GAME_GRADEMETHOD_LAST => get_string("attemptlast", "game")); + +define( "CONST_GAME_TRIES_REPETITION", "3"); + +/**#@-*/ + + +function game_upper( $str, $lang='') +{ + global $CFG; + + $textlib = textlib_get_instance(); + $str = $textlib->strtoupper( $str); + + if( $lang != ''){ + $langfile = "{$CFG->dirroot}/mod/game/lang/$lang/game.php"; + if (file_exists($langfile)) { + if ($result = get_string_from_file('convertfrom', $langfile, "\$convert1")) { + eval($result); + if ($result = get_string_from_file('convertto', $langfile, "\$convert2")) { + eval($result); + if( $convert1 != '' and $convert2 != ''){ + $len = $textlib->strlen( $convert1); + for($i=0; $i < $len; $i++){ + $str = str_replace( $textlib->substr( $convert1, $i, 1), $textlib->substr( $convert2, $i, 1), $str); + } + return $str; + } + } + } + } + } + + $convert1 = get_string( 'convertfrom', 'game'); + if( $convert1 != ""){ + $convert2 = get_string( 'convertto', 'game'); + $len = $textlib->strlen( $convert1); + for($i=0; $i < $len; $i++){ + $str = str_replace( $textlib->substr( $convert1, $i, 1), $textlib->substr( $convert2, $i, 1), $str); + } + } + + return $str; +} + + +function game_showselectcontrol( $name, $a, $input, $events=''){ + $ret = "\r\n"; + + return $ret; +} + +function game_showcheckbox( $name, $value) +{ + $a = array(); + $a[ 0] = get_string( 'no'); + $a[ 1] = get_string( 'yes'); + + return game_showselectcontrol( $name, $a, $value); + + $ret = 'sourcemodule) + { + case 'glossary': + return game_question_shortanswer_glossary( $game, $allowspaces, $use_repetitions); + case 'quiz': + return game_question_shortanswer_quiz( $game, $allowspaces, $use_repetitions); + case 'question': + return game_question_shortanswer_question( $game, $allowspaces, $use_repetitions); + } + + return false; +} + +//used by hangman +function game_question_shortanswer_glossary( $game, $allowspaces, $use_repetitions) +{ + global $CFG; + + if( $game->glossaryid == 0){ + error( get_string( 'must_select_glossary', 'game')); + } + + $select = "glossaryid={$game->glossaryid}"; + $table = 'glossary_entries'; + if( $game->glossarycategoryid){ + $table .= ",{$CFG->prefix}glossary_entries_categories"; + $select .= " AND {$CFG->prefix}glossary_entries_categories.entryid = {$CFG->prefix}glossary_entries.id ". + " AND {$CFG->prefix}glossary_entries_categories.categoryid = {$game->glossarycategoryid}"; + } + if( $allowspaces == false){ + $select .= " AND concept NOT LIKE '% %' "; + } + + if( ($id = game_question_selectrandom( $game, $table, $select, "{$CFG->prefix}glossary_entries.id", $use_repetitions)) == false) + return false; + + $sql = 'SELECT id, concept as answertext, definition as questiontext, id as glossaryentryid, 0 as questionid, glossaryid, attachment, 0 as answerid'. + " FROM {$CFG->prefix}glossary_entries WHERE id = $id"; + if( ($rec = get_record_sql( $sql)) == false) + return false; + + if( $rec->attachment != ''){ + $rec->attachment = "glossary/{$game->glossaryid}/$rec->id/$rec->attachment"; + } + + return $rec; +} + +//used by hangman +function game_question_shortanswer_quiz( $game, $allowspaces, $use_repetitions) +{ + global $CFG; + + if( $game->quizid == 0){ + error( get_string( 'must_select_quiz', 'game')); + } + + $select = "qtype='shortanswer' AND quiz='$game->quizid' ". + " AND {$CFG->prefix}quiz_question_instances.question={$CFG->prefix}question.id"; + $table = "question,{$CFG->prefix}quiz_question_instances"; + $fields = "{$CFG->prefix}question.id"; + + if( ($id = game_question_selectrandom( $game, $table, $select, $fields, $use_repetitions)) == false) + return false; + + $select = "q.id=$id AND qa.question=$id". + " AND q.hidden=0 AND qtype='shortanswer'"; + $table = "question q,{$CFG->prefix}question_answers qa"; + $fields = "qa.id as answerid, q.id, q.questiontext as questiontext, ". + "qa.answer as answertext, q.id as questionid, ". + "0 as glossaryentryid, '' as attachment"; + + //Maybe there are more answers to one question. I use as correct the one with bigger fraction + $recs = get_records_select( $table, $select, 'fraction DESC', $fields); + if( $recs == false){ + return false; + } + foreach( $recs as $rec){ + return $rec; + } +} + +//used by hangman +function game_question_shortanswer_question( $game, $allowspaces, $use_repetitions) +{ + global $CFG; + + if( $game->questioncategoryid == 0){ + error( get_string( 'must_select_questioncategory', 'game')); + } + + $select = $CFG->prefix.'question.category='.$game->questioncategoryid; + if( $game->subcategories){ + $cats = question_categorylist( $game->questioncategoryid); + if( strpos( $cats, ',') > 0){ + $select = $CFG->prefix.'question.category in ('.$cats.')'; + } + } + $select .= " AND qtype='shortanswer'"; + + $table = "question"; + $fields = "{$CFG->prefix}question.id"; + + if( ($id = game_question_selectrandom( $game, $table, $select, $fields, $use_repetitions)) == false) + return false; + + $select = "q.id=$id AND qa.question=$id". + " AND q.hidden=0 AND qtype='shortanswer'"; + $table = "question q,{$CFG->prefix}question_answers qa"; + $fields = "qa.id as answerid, q.id, q.questiontext as questiontext, ". + "qa.answer as answertext, q.id as questionid, ". + "0 as glossaryentryid, '' as attachment"; + + //Maybe there are more answers to one question. I use as correct the one with bigger fraction + $recs = get_records_select( $table, $select, 'fraction DESC', $fields); + if( $recs == false){ + return false; + } + foreach( $recs as $rec){ + return $rec; + } +} + +//used by millionaire, game_question_shortanswer_quiz, hidden picture +function game_question_selectrandom( $game, $table, $select, $id_fields="id", $use_repetitions=true) +{ + global $CFG, $USER; + + $sql = "SELECT COUNT(*) AS c FROM {$CFG->prefix}$table WHERE $select"; + if( ($rec = get_record_sql( $sql)) == false) + return false; + + $count = $rec->c; + if( $count == 0) + return false; + + $min_num = 0; + $min_id = 0; + for($i=1; $i <= CONST_GAME_TRIES_REPETITION; $i++){ + $sel = mt_rand(0, $count-1); + + $sql = "SELECT $id_fields,$id_fields FROM {$CFG->prefix}$table WHERE $select"; + if( ($recs=get_records_sql( $sql, $sel, 1)) == false){ + return false; + } + + $id = 0; + foreach( $recs as $rec){ + $id = $rec->id; + } + if( $min_id == 0){ + $min_id = $id; + } + + if( $use_repetitions == false){ + return $id; + } + + if( $count == 1){ + break; + } + + $questionid = $glossaryentryid = 0; + if( $game->sourcemodule == 'glossary') + $glossaryentryid = $id; + else + $questionid = $id; + + $select2 = "gameid=$game->id AND userid='$USER->id' AND questionid='$questionid' AND glossaryentryid='$glossaryentryid'"; + if( ($rec = get_record_select( 'game_repetitions', $select2, 'id,repetitions r')) != false){ + if( ($rec->r < $min_num) or ($min_num == 0)){ + $min_num = $rec->r; + $min_id = $id; + } + }else + { + $min_id = $questionid; + break; + } + + } + + if( $game->sourcemodule == 'glossary') + game_update_repetitions( $game->id, $USER->id, 0, $min_id); + else + game_update_repetitions( $game->id, $USER->id, $min_id, 0); + + return $min_id; +} + +function game_update_repetitions( $gameid, $userid, $questionid, $glossaryentryid){ + $select = "gameid=$gameid AND userid='$userid' AND questionid='$questionid' AND glossaryentryid='$glossaryentryid'"; + if( ($rec = get_record_select( 'game_repetitions', $select, 'id,repetitions r')) != false){ + $updrec->id = $rec->id; + $updrec->repetitions = $rec->r + 1; + if( !update_record( 'game_repetitions', $updrec)){ + error("Update page: can't update game_repetitions id={$updrec->id}"); + } + }else + { + $newrec->gameid = $gameid; + $newrec->userid = $userid; + $newrec->questionid = $questionid; + $newrec->glossaryentryid = $glossaryentryid; + $newrec->repetitions = 1; + + if( $newrec->questionid == ''){ + $newrec->questionid = 0; + } + if( $newrec->glossaryentryid == ''){ + $newrec->glossaryentryid = 0; + } + + if (!insert_record( 'game_repetitions', $newrec)){ + print_r( $newrec); + error("Insert page: new page game_repetitions not inserted"); + } + } +} + +//used by sudoku +function game_questions_selectrandom( $game, $count=1) +{ + global $CFG; + + switch( $game->sourcemodule) + { + case 'quiz': + + if( $game->quizid == 0){ + error( get_string( 'must_select_quiz', 'game')); + } + + $table = "question,{$CFG->prefix}quiz_question_instances"; + $select = " {$CFG->prefix}quiz_question_instances.quiz=$game->quizid". + " AND {$CFG->prefix}quiz_question_instances.question={$CFG->prefix}question.id ". + " AND {$CFG->prefix}question.qtype in ('shortanswer', 'truefalse', 'multichoice')". + " AND {$CFG->prefix}question.hidden=0"; +//todo 'match' + $field = "{$CFG->prefix}question.id as id"; + + $table2 = 'question'; + $fields2 = 'id as questionid,0 as glossaryentryid,qtype'; + break; + case 'glossary': + if( $game->glossaryid == 0){ + error( get_string( 'must_select_glossary', 'game')); + } + $table = 'glossary_entries ge'; + $select = "glossaryid='$game->glossaryid' "; + if( $game->glossarycategoryid){ + $table .= ",{$CFG->prefix}glossary_entries_categories gec"; + $select .= " AND gec.entryid = ge.id ". + " AND gec.categoryid = {$game->glossarycategoryid}"; + } + $field = 'ge.id'; + $table2 = 'glossary_entries ge'; + $fields2 = 'ge.id as glossaryentryid, 0 as questionid'; + break; + case 'question': + if( $game->questioncategoryid == 0){ + error( get_string( 'must_select_questioncategory', 'game')); + } + $table = "question"; + + //inlcude subcategories + $select = 'category='.$game->questioncategoryid; + if( $game->subcategories){ + $cats = question_categorylist( $game->questioncategoryid); + if( strpos( $cats, ',') > 0){ + $select = 'category in ('.$cats.')'; + } + } + + $select .= " AND {$CFG->prefix}question.qtype in ('shortanswer', 'truefalse', 'multichoice') ". + "AND {$CFG->prefix}question.hidden=0"; +//todo 'match' + $field = "id"; + + $table2 = 'question'; + $fields2 = 'id as questionid,0 as glossaryentryid'; + break; + default: + error( 'No sourcemodule defined'); + break; + } + + $ids = game_questions_selectrandom_detail( $table, $select, $field, $count); + if( $ids === false){ + error( get_string( 'no_questions', 'game')); + } + + if( count( $ids) > 1){ + //randomize the array + shuffle( $ids); + } + + $ret = array(); + foreach( $ids as $id) + { + if( $recquestion = get_record_select( $table2, "id=$id", $fields2)){ + unset( $new); + $new->questionid = (int )$recquestion->questionid; + $new->glossaryentryid = (int )$recquestion->glossaryentryid; + $ret[] = $new; + } + } + + return $ret; +} + +//used by game_questions_selectrandom +function game_questions_selectrandom_detail( $table, $select, $id_field="id", $count=1) +{ + global $CFG; + + $sql = "SELECT $id_field,$id_field FROM {$CFG->prefix}$table WHERE $select"; + if( ($recs=get_records_sql( $sql)) == false) + return false; + + //the array contains the ids of all questions + $a = array(); + foreach( $recs as $rec){ + $a[ $rec->id] = $rec->id; + } + + if( $count >= count( $a)){ + return $a; + }else + { + srand(); + + $id = array_rand( $a, $count); + return ( $count == 1 ? array( $id) : $id); + } +} + +//Tries to detect the language of word +function game_detectlanguage( $word){ + global $CFG; + + $langs = get_directory_list( "{$CFG->dirroot}/mod/game/lang", '', true, true, false); + sort( $langs); + + //English has more priority + $value = 'en_utf8'; + $key = array_search( $value, $langs); + if( $key > 0) + { + unset( $langs[ $key]); + array_unshift( $langs, $value); + } + $langs_installed = get_list_of_languages(); + + foreach( $langs as $lang){ + if( !array_key_exists( $lang, $langs_installed)) + continue; //Not install yet this language + + $langfile = "{$CFG->dirroot}/mod/game/lang/$lang/game.php"; + if (file_exists($langfile)) { + if ($result = get_string_from_file('lettersall', $langfile, "\$letters")) { + eval($result); + if( $letters != ''){ + $word2 = game_upper( $word, $lang); + if( hangman_existall( $word2, $letters)){ + return $lang; + } + } + } + } + } + + return false; +} + +//The words maybe are in two languages e.g. greek or english +//so I try to find the correct one. +function game_getallletters( $word, $lang='') +{ + global $CFG; + + if( $lang != ''){ + $langfile = "{$CFG->dirroot}/mod/game/lang/$lang/game.php"; + if (file_exists($langfile)) { + if ($result = get_string_from_file('lettersall', $langfile, "\$letters")) { + eval($result); + if( $letters != ''){ + if( hangman_existall( $word, $letters)){ + return $letters; + } + } + } + } + } + + $letters = game_upper( get_string( 'lettersall', 'game')); + if( hangman_existall( $word, $letters)){ + return $letters; + } + + return ''; +} + +function game_get_string_lang( $identifier, $module, $lang) +{ + global $CFG; + + $langfile = "{$CFG->dirroot}/mod/game/lang/$lang/game.php"; + + if ($result = get_string_from_file( $identifier, $langfile, "\$ret")) { + eval($result); + if( $ret != '') + return $ret; + } + + return get_string( $identifier, $module); +} + +function hangman_existall( $str, $strfind) +{ + $textlib = textlib_get_instance(); + + $n = $textlib->strlen( $str); + for( $i=0; $i < $n; $i++) + { + $pos = $textlib->strpos( $strfind, $textlib->substr( $str, $i, 1)); + if( $pos === false) + return false; + } + + return true; +} + +//used by cross +function game_questions_shortanswer( $game) +{ + switch( $game->sourcemodule) + { + case "glossary": + $recs = game_questions_shortanswer_glossary( $game); + break; + case "quiz"; + $recs = game_questions_shortanswer_quiz( $game); + break; + case "question"; + $recs = game_questions_shortanswer_question( $game); + break; + } + + return $recs; +} + +//used by cross +function game_questions_shortanswer_glossary( $game) +{ + global $CFG; + + $select = "glossaryid={$game->glossaryid}"; + $table = "{$CFG->prefix}glossary_entries ge"; + if( $game->glossarycategoryid){ + $table .= ",{$CFG->prefix}glossary_entries_categories gec"; + $select .= " AND gec.entryid = ge.id ". + " AND gec.categoryid = {$game->glossarycategoryid}"; + } + + $sql = 'SELECT ge.id, concept as answertext, definition as questiontext, ge.id as glossaryentryid, 0 as questionid, attachment '. + " FROM $table WHERE $select"; + + return get_records_sql( $sql); + +} +//used by cross +function game_questions_shortanswer_quiz( $game) +{ + global $CFG; + + if( $game->quizid == 0){ + error( get_string( 'must_select_quiz', 'game')); + } + + $select = "qtype='shortanswer' AND quiz='$game->quizid' ". + " AND qqi.question=q.id". + " AND qa.question=q.id". + " AND q.hidden=0"; + $table = "question q,{$CFG->prefix}quiz_question_instances qqi,{$CFG->prefix}question_answers qa"; + $fields = "qa.id as qaid, q.id, q.questiontext as questiontext, ". + "qa.answer as answertext, q.id as questionid,". + " 0 as glossaryentryid,'' as attachment"; + + return game_questions_shortanswer_question_fraction( $table, $fields, $select); +} + +//used by cross +function game_questions_shortanswer_question( $game) +{ + global $CFG; + + if( $game->questioncategoryid == 0){ + error( get_string( 'must_select_questioncategory', 'game')); + } + + //include subcategories + $select = 'q.category='.$game->questioncategoryid; + if( $game->subcategories){ + $cats = question_categorylist( $game->questioncategoryid); + if( strpos( $cats, ',') > 0){ + $select = 'q.category in ('.$cats.')'; + } + } + + $select .= " AND qtype='shortanswer' ". + " AND qa.question=q.id". + " AND q.hidden=0"; + $table = "question q,{$CFG->prefix}question_answers qa"; + $fields = "qa.id as qaid, q.id, q.questiontext as questiontext, ". + "qa.answer as answertext, q.id as questionid"; + + return game_questions_shortanswer_question_fraction( $table, $fields, $select); +} + +function game_questions_shortanswer_question_fraction( $table, $fields, $select) +{ + global $CFG; + + $sql = "SELECT $fields FROM {$CFG->prefix}$table WHERE $select ORDER BY fraction DESC"; + + $recs = get_records_sql( $sql); + if( $recs == false){ + error( get_string( 'no_questions', 'game')); + } + + $recs2 = array(); + $map = array(); + foreach( $recs as $rec){ + unset( $rec2); + if( array_key_exists( $rec->questionid, $map)){ + continue; + } + $rec2->id = $rec->id; + $rec2->questiontext = $rec->questiontext; + $rec2->answertext = $rec->answertext; + $rec2->questionid = $rec->questionid; + $rec2->glossaryentryid = 0; + $rec2->attachment = ''; + $recs2[] = $rec2; + + $map[ $rec->questionid] = $rec->questionid; + } + + return $recs2; +} + + function game_setchar( &$s, $pos, $char) + { + $ret = ""; + + $textlib = textlib_get_instance(); + + if( $pos > 0){ + $ret .= $textlib->substr( $s, 0, $pos); + } + + $s = $ret . $char . $textlib->substr( $s, $pos+1); + } + + function game_insert_record( $table, $rec) + { + global $CFG; + + if( get_record_select($table, "id=$rec->id", 'id,id') == false){ + $sql = "INSERT INTO {$CFG->prefix}$table(id) VALUES($rec->id)"; + if( !execute_sql( $sql, false)){ + error( "Cannot insert an empty $table with id=$rec->id"); + return false; + } + } + if( isset( $rec->question)){ + $temp = $rec->question; + $rec->question = addslashes( $rec->question); + } + + $ret = update_record( $table, $rec); + + if( isset( $rec->question)){ + $rec->question = $temp; + } + + return $ret; + } + + //if score is negative doesn't update the record + //score is between 0 and 1 + function game_updateattempts( $game, $attempt, $score, $finished) + { + if( $attempt != false){ + $updrec->id = $attempt->id; + $updrec->timelastattempt = time(); + $updrec->lastip = getremoteaddr(); + if( isset( $_SERVER[ 'REMOTE_HOST'])) + $updrec->lastremotehost = $_SERVER[ 'REMOTE_HOST']; + else if( $updrec->lastip != '') + $updrec->lastremotehost = gethostbyaddr( $updrec->lastip); + else + $updrec->lastremotehost = ''; + $updrec->lastremotehost = substr( $updrec->lastremotehost, 0, 50); + + if( $score >= 0){ + $updrec->score = $score; + } + + if( $finished){ + $updrec->timefinish = $updrec->timelastattempt; + } + + $updrec->attempts = $attempt->attempts + 1; + + if( !update_record( 'game_attempts', $updrec)){ + error( "game_updateattempts: Can't update game_attempts id=$updrec->id"); + } + + // update grade item and send all grades to gradebook + game_grade_item_update( $game); + game_update_grades( $game); + } + + //Update table game_grades + if( $finished){ + global $USER; + game_save_best_score( $game, $USER->id); + } + } + + + function game_updateattempts_maxgrade( $game, $attempt, $grade, $finished) + { + $recgrade = get_field( 'game_attempts', 'score', 'id', $attempt->id); + + if( $recgrade > $grade){ + $grade = -1; //don't touch the grade + } + + game_updateattempts( $game, $attempt, $grade, $finished); + } + + function game_update_queries( $game, $attempt, $query, $score, $studentanswer, $updatetries=false) + { + global $USER; + + if( $query->id != 0){ + $select = "id=$query->id"; + }else + { + $select = "attemptid = $attempt->id AND sourcemodule = '{$query->sourcemodule}'"; + switch( $query->sourcemodule) + { + case 'quiz': + $select .= " AND questionid='$query->questionid' "; + break; + case 'glossary': + $select .= " AND glossaryentryid='$query->glossaryentryid'"; + break; + } + } + + if( ($recq = get_record_select( 'game_queries', $select)) === false) + { + unset( $recq); + $recq->gamekind = $game->gamekind; + $recq->gameid = $attempt->gameid; + $recq->userid = $attempt->userid; + $recq->attemptid = $attempt->id; + $recq->sourcemodule = $query->sourcemodule; + $recq->questionid = $query->questionid; + $recq->glossaryentryid = $query->glossaryentryid; + if ($updatetries) + $recq->tries = 1; + + if (!($recq->id = insert_record( "game_queries", $recq))){ + error("Insert page: new page game_queries not inserted"); + } + } + + $updrec->id = $recq->id; + $updrec->timelastattempt = time(); + + if( $score >= 0){ + $updrec->score = $score; + } + + if( $studentanswer != ''){ + $updrec->studentanswer = $studentanswer; + } + + if ($updatetries) + $updrec->tries = $recq->tries + 1; + + if (!(update_record( "game_queries", $updrec))){ + error("game_update_queries: not updated id=$updrec->id"); + } + } + + + function game_getattempt( $game, &$detail) + { + global $USER; + + $select = "gameid=$game->id AND userid=$USER->id and timefinish=0 "; + if( $USER->id == 1){ + $key = 'mod/game:instanceid'.$game->id; + if( array_key_exists( $key, $_SESSION)){ + $select .= ' AND id="'.$_SESSION[ $key].'"'; + }else{ + $select .= ' AND id=-1'; + } + } + + if( ($recs=get_records_select( 'game_attempts', $select))){ + foreach( $recs as $attempt){ + if( $USER->id == 1){ + $_SESSION[ $key] = $attempt->id; + } + + $detail = get_record_select( 'game_'.$game->gamekind, "id=$attempt->id"); + + return $attempt; + } + } + return false; + } + +/** + * @param integer $gameid the game id. + * @param integer $userid the userid. + * @param string $status 'all', 'finished' or 'unfinished' to control + * @return an array of all the user's attempts at this game. Returns an empty array if there are none. + */ +function game_get_user_attempts( $gameid, $userid, $status = 'finished') { + $status_condition = array( + 'all' => '', + 'finished' => ' AND timefinish > 0', + 'unfinished' => ' AND timefinish = 0' + ); + if ($attempts = get_records_select( 'game_attempts', + "gameid = '$gameid' AND userid = '$userid' AND preview = 0" . $status_condition[$status], + 'attempt ASC')) { + return $attempts; + } else { + return array(); + } +} + + +/** + * Returns an unfinished attempt (if there is one) for the given + * user on the given game. This function does not return preview attempts. + * + * @param integer $gameid the id of the game. + * @param integer $userid the id of the user. + * + * @return mixed the unfinished attempt if there is one, false if not. + */ +function game_get_user_attempt_unfinished( $gameid, $userid) { + $attempts = game_get_user_attempts( $gameid, $userid, 'unfinished'); + if ($attempts) { + return array_shift($attempts); + } else { + return false; + } +} + +/** + * Get the best current score for a particular user in a game. + * + * @param object $game the game object. + * @param integer $userid the id of the user. + * @return float the user's current grade for this game. + */ +function game_get_best_score($game, $userid) { + $score = get_field( 'game_grades', 'score', 'gameid', $game->id, 'userid', $userid); + + // Need to detect errors/no result, without catching 0 scores. + if (is_numeric($score)) { + return $score; + } else { + return NULL; + } +} + +function game_get_best_grade($game, $userid) { + $score = game_get_best_score( $game, $userid); + + if( is_numeric( $score)){ + return round( $score * $game->grade, $game->decimalpoints); + }else + { + return NULL; + } +} + +/** + * @param integer $gameid the id of the game object. + * @return boolean Whether this game has any non-blank feedback text. + */ +function game_has_feedback($gameid) { + return false; + static $cache = array(); + if (!array_key_exists($gameid, $cache)) { + $cache[$gameid] = record_exists_select('game_feedback', + "gameid = $gameid AND feedbacktext <> ''"); + } + return $cache[$gameid]; +} + + +/** +* Returns a comma separated list of question ids for the game +* +* @return string Comma separated list of question ids +* @param string $layout The string representing the game layout. Each page is represented as a +* comma separated list of question ids and 0 indicating page breaks. +* So 5,2,0,3,0 means questions 5 and 2 on page 1 and question 3 on page 2 +*/ +function game_questions_in_game($layout) { + return str_replace(',0', '', $layout); +} + +/** + * Convert the raw score stored in $attempt into a grade out of the maximum + * grade for this game. + * + * @param float $rawgrade the unadjusted grade, fof example $attempt->sumgrades + * @param object $game the game object. Only the fields grade, sumgrades and decimalpoints are used. + * @return float the rescaled grade. + */ +function game_score_to_grade($score, $game) { + if ($score) { + return round($score*$game->grade, $game->decimalpoints); + } else { + return 0; + } +} + +/** + * Get the feedback text that should be show to a student who + * got this grade on this game. + * + * @param float $grade a grade on this game. + * @param integer $gameid the id of the game object. + * @return string the comment that corresponds to this grade (empty string if there is not one. + */ +function game_feedback_for_grade($grade, $gameid) { + return ''; + $feedback = get_field_select('game_feedback', 'feedbacktext', + "gameid = $gameid AND mingrade <= $grade AND $grade < maxgrade"); + + if (empty($feedback)) { + $feedback = ''; + } + + return $feedback; +} + + +/** + * Determine review options + * + * @param object $game the game instance. + * @param object $attempt the attempt in question. + * @param $context the roles and permissions context, + * normally the context for the game module instance. + * + * @return object an object with boolean fields responses, scores, feedback, + * correct_responses, solutions and general feedback + */ +function game_get_reviewoptions($game, $attempt, $context=null) { + + $options = new stdClass; + $options->readonly = true; + // Provide the links to the question review and comment script + $options->questionreviewlink = '/mod/game/reviewquestion.php'; + + if ($context /* && has_capability('mod/game:viewreports', $context) */ and !$attempt->preview) { + // The teacher should be shown everything except during preview when the teachers + // wants to see just what the students see + $options->responses = true; + $options->scores = true; + $options->feedback = true; + $options->correct_responses = true; + $options->solutions = false; + $options->generalfeedback = true; + $options->overallfeedback = true; + + // Show a link to the comment box only for closed attempts + if ($attempt->timefinish) { + $options->questioncommentlink = '/mod/game/comment.php'; + } + } else { + if (((time() - $attempt->timefinish) < 120) || $attempt->timefinish==0) { + $game_state_mask = GAME_REVIEW_IMMEDIATELY; + } else if (!$game->timeclose or time() < $game->timeclose) { + $game_state_mask = GAME_REVIEW_OPEN; + } else { + $game_state_mask = GAME_REVIEW_CLOSED; + } + $options->responses = ($game->review & $game_state_mask & GAME_REVIEW_RESPONSES) ? 1 : 0; + $options->scores = ($game->review & $game_state_mask & GAME_REVIEW_SCORES) ? 1 : 0; + $options->feedback = ($game->review & $game_state_mask & GAME_REVIEW_FEEDBACK) ? 1 : 0; + $options->correct_responses = ($game->review & $game_state_mask & GAME_REVIEW_ANSWERS) ? 1 : 0; + $options->solutions = ($game->review & $game_state_mask & GAME_REVIEW_SOLUTIONS) ? 1 : 0; + $options->generalfeedback = ($game->review & $game_state_mask & GAME_REVIEW_GENERALFEEDBACK) ? 1 : 0; + $options->overallfeedback = $attempt->timefinish && ($game->review & $game_state_mask & GAME_REVIEW_FEEDBACK); + } + + return $options; +} + +/** +* Returns a comma separated list of question ids for the current page +* +* @return string Comma separated list of question ids +* @param string $layout The string representing the game layout. Each page is represented as a +* comma separated list of question ids and 0 indicating page breaks. +* So 5,2,0,3,0 means questions 5 and 2 on page 1 and question 3 on page 2 +* @param integer $page The number of the current page. +*/ +function game_questions_on_page($layout, $page) { + $pages = explode(',0', $layout); + + return trim($pages[$page], ','); +} + +function game_compute_attempt_layout( $game, &$attempt) +{ + $ret = ''; + $recs = get_records_select( 'game_queries', "attemptid=$attempt->id", '', 'id,questionid,sourcemodule,glossaryentryid'); + if( $recs){ + foreach( $recs as $rec){ + if( $rec->sourcemodule == 'glossary'){ + $ret .= $rec->glossaryentryid.'G,'; + }else{ + $ret .= $rec->questionid.','; + } + } + } + + $attempt->layout = $ret.'0'; +} + +/** + * Combines the review options from a number of different game attempts. + * Returns an array of two ojects, so he suggested way of calling this + * funciton is: + * list($someoptions, $alloptions) = game_get_combined_reviewoptions(...) + * + * @param object $game the game instance. + * @param array $attempts an array of attempt objects. + * @param $context the roles and permissions context, + * normally the context for the game module instance. + * + * @return array of two options objects, one showing which options are true for + * at least one of the attempts, the other showing which options are true + * for all attempts. + */ +function game_get_combined_reviewoptions($game, $attempts, $context=null) { + $fields = array('readonly', 'scores', 'feedback', 'correct_responses', 'solutions', 'generalfeedback', 'overallfeedback'); + $someoptions = new stdClass; + $alloptions = new stdClass; + foreach ($fields as $field) { + $someoptions->$field = false; + $alloptions->$field = true; + } + foreach ($attempts as $attempt) { + $attemptoptions = game_get_reviewoptions( $game, $attempt, $context); + foreach ($fields as $field) { + $someoptions->$field = $someoptions->$field || $attemptoptions->$field; + $alloptions->$field = $alloptions->$field && $attemptoptions->$field; + } + } + return array( $someoptions, $alloptions); +} + +/** + * Save the overall grade for a user at a game in the game_grades table + * + * @param object $quiz The game for which the best grade is to be calculated and then saved. + * @param integer $userid The userid to calculate the grade for. Defaults to the current user. + * @return boolean Indicates success or failure. + */ +function game_save_best_score($game, $userid = null) { + global $USER; + + if (empty($userid)) { + $userid = $USER->id; + } + + // Get all the attempts made by the user + if (!$attempts = game_get_user_attempts( $game->id, $userid)) { + notify('Could not find any user attempts'); + return false; + } + + // Calculate the best grade + $bestscore = game_calculate_best_score($game, $attempts); + //$bestgrade = game_rescale_grade($bestgrade, $game); + + // Save the best grade in the database + if ($grade = get_record('game_grades', 'gameid', $game->id, 'userid', $userid)) { + $grade->score = $bestscore; + $grade->timemodified = time(); + if (!update_record('game_grades', $grade)) { + notify('Could not update best grade'); + return false; + } + } else { + $grade->gameid = $game->id; + $grade->userid = $userid; + $grade->score = $bestscore; + $grade->timemodified = time(); + if (!insert_record('game_grades', $grade)) { + notify('Could not insert new best grade'); + return false; + } + } + return true; +} + +/** +* Calculate the overall grade for a game given a number of attempts by a particular user. +* +* @return float The overall grade +* @param object $quiz The game for which the best grade is to be calculated +* @param array $attempts An array of all the attempts of the user at the game +*/ +function game_calculate_best_score($game, $attempts) { + + switch ($game->grademethod) { + + case GAME_GRADEMETHOD_FIRST: + foreach ($attempts as $attempt) { + return $attempt->score; + } + break; + + case GAME_GRADEMETHOD_LAST: + foreach ($attempts as $attempt) { + $final = $attempt->score; + } + return $final; + + case GAME_GRADEMETHOD_AVERAGE: + $sum = 0; + $count = 0; + foreach ($attempts as $attempt) { + $sum += $attempt->score; + $count++; + } + return (float)$sum/$count; + + default: + case GAME_GRADEMETHOD_HIGHEST: + $max = 0; + foreach ($attempts as $attempt) { + if ($attempt->score > $max) { + $max = $attempt->score; + } + } + return $max; + } +} + +/** +* Return the attempt with the best grade for a game +* +* Which attempt is the best depends on $game->grademethod. If the grade +* method is GRADEAVERAGE then this function simply returns the last attempt. +* @return object The attempt with the best grade +* @param object $quiz The game for which the best grade is to be calculated +* @param array $attempts An array of all the attempts of the user at the game +*/ +function game_calculate_best_attempt($game, $attempts) { + + switch ($game->grademethod) { + + case GAME_ATTEMPTFIRST: + foreach ($attempts as $attempt) { + return $attempt; + } + break; + + case GAME_GRADEAVERAGE: // need to do something with it :-) + case GAME_ATTEMPTLAST: + foreach ($attempts as $attempt) { + $final = $attempt; + } + return $final; + + default: + case GAME_GRADEHIGHEST: + $max = -1; + foreach ($attempts as $attempt) { + if ($attempt->sumgrades > $max) { + $max = $attempt->sumgrades; + $maxattempt = $attempt; + } + } + return $maxattempt; + } +} + +/** +* Returns the number of pages in the game layout +* +* @return integer Comma separated list of question ids +* @param string $layout The string representing the game layout. +*/ +function game_number_of_pages($layout) { + return substr_count($layout, ',0'); +} + + +/** +* Returns the first question number for the current game page +* +* @return integer The number of the first question +* @param string $gamelayout The string representing the layout for the whole game +* @param string $pagelayout The string representing the layout for the current page +*/ +function game_first_questionnumber($gamelayout, $pagelayout) { + // this works by finding all the questions from the gamelayout that + // come before the current page and then adding up their lengths. + global $CFG; + $start = strpos($gamelayout, ','.$pagelayout.',')-2; + if ($start > 0) { + $prevlist = substr($gamelayout, 0, $start); + return get_field_sql("SELECT sum(length)+1 FROM {$CFG->prefix}question + WHERE id IN ($prevlist)"); + } else { + return 1; + } +} + + +/** +* Loads the most recent state of each question session from the database +* +* For each question the most recent session state for the current attempt +* is loaded from the game_questions table and the question type specific data +* +* @return array An array of state objects representing the most recent +* states of the question sessions. +* @param array $questions The questions for which sessions are to be restored or +* created. +* @param object $cmoptions +* @param object $attempt The attempt for which the question sessions are +* to be restored or created. +* @param mixed either the id of a previous attempt, if this attmpt is +* building on a previous one, or false for a clean attempt. +*/ +function game_get_question_states(&$questions, $cmoptions, $attempt, $lastattemptid = false) { + global $CFG, $QTYPES; + + // get the question ids + $ids = array_keys( $questions); + $questionlist = implode(',', $ids); + + $statefields = 'questionid as question, manualcomment, score as grade'; + + $sql = "SELECT $statefields". + " FROM {$CFG->prefix}game_questions ". + " WHERE attemptid = '$attempt->id'". + " AND questionid IN ($questionlist)"; + $states = get_records_sql($sql); + + // loop through all questions and set the last_graded states + foreach ($ids as $i) { + // Create the empty question type specific information + if (!$QTYPES[$questions[$i]->qtype]->create_session_and_responses( + $questions[$i], $states[$i], $cmoptions, $attempt)) { + return false; + } + + $states[$i]->last_graded = clone($states[$i]); + } + return $states; +} + +function game_sudoku_getquestions( $questionlist) +{ + // Load the questions + if (!$questions = get_records_select( 'question', "id IN ($questionlist)")) { + error(get_string('noquestionsfound', 'quiz')); + } + + // Load the question type specific information + if (!get_question_options($questions)) { + error('Could not load question options'); + } + + return $questions; +} + +function game_filtertext( $text, $courseid){ + $formatoptions->noclean = true; + $formatoptions->filter = 1; + + $text = trim( format_text( $text, FORMAT_MOODLE, $formatoptions, $courseid)); + + if( substr( $text, 0, 3) == '

    '){ + if( substr( $text, -4) == '

    '){ + $text = substr( $text, 3, -4); + } + } + if( substr( $text, 0, 3) == '

    '){ + if( substr( $text, -4) == '

    '){ + $text = substr( $text, 3, -4); + } + } + + return $text; +} + +function game_tojavascriptstring( $text) +{ + $from = array('"',"\r", "\n"); + $to = array('\"', ' ', ' '); + + $from[] = ' diff --git a/mod.html b/mod.html new file mode 100644 index 0000000..5c1aa00 --- /dev/null +++ b/mod.html @@ -0,0 +1,684 @@ +dirroot/lib/ddllib.php"); +require_once $CFG->dirroot.'/lib/accesslib.php'; +require_once $CFG->dirroot.'/lib/questionlib.php'; + +/// First we check that form variables have been initialised +if (!isset($form->name)) { + $form->name = ''; + $form->gamekind = ''; + $form->sourcemodule = 'glossary'; + $form->id = 0; + $form->glossaryid = 0; + $form->glossarycategoryid = 0; + $gamekind = '-'; +}else + $gamekind = $form->gamekind; + +$existsbook = ( get_record_select( 'modules', "name='book'", 'id,id') ? 1 : 0); + +if( $form->sourcemodule == ''){ + //the variables need initialization + switch( $form->gamekind){ + case 'hangman': + case '': + $form->param1 = 0; //show first letter + $form->param2 = 0; //show last letter + $form->param3 = 1; //image set + $form->param4 = 1; //how many words in each game + $form->param5 = 1; //show question + $form->param6 = 1; //show answer + $form->param7 = 0; //allow spaces + $form->param8 = 0; //allow - + break; + case 'cross': + $form->param1 = 0; //max cols + $form->param2 = 0; //max words + $form->param3 = 0; //layout + $form->param7 = 0; //allow spaces + break; + case 'cryptex': + $form->param1 = 0; //max cols + $form->param2 = 0; //max words + $form->param3 = 0; //layout + $form->param7 = 0; //allow spaces + $form->param8 = 0; //maxtries + break; + case 'sudoku': + $form->param2 = 0; //max questions + break; + case 'snakes': + $form->param3 = 0; //background + break; + case 'hiddenpicture': + $form->param1 = 3; //cols accross + $form->param2 = 3; //cols down + $form->param4 = 0; //width + $form->param5 = 0; //height + $form->param7 = 0; //allow spaces + break; + case 'millionaire': + $form->shuffle = 1; //randomize + $form->param4 = 0; //width + $form->param5 = 0; //height + $form->param7 = 0; //allow spaces + $form->param8 = 0x408080; + $form->shuffle = 1; //randomize questions + break; + } +} + +require_once( "locallib.php"); + +?> + +
    +
    + + + + + + + +mode == 'add'){ +?> + + +mode != 'add'){ + + for( $i=1; $i <= 6; $i++){ + $name = 'param'.$i; + echo ''."\r\n"; + } + echo ''."\r\n"; + +?> + +'; + $form->sourcemodule = 'question'; + echo ''; + } +}else +{ + $a = array(); + if( $form->gamekind != 'millionaire'){ + $a[ 'glossary'] = get_string('modulename','glossary'); + } + + $a[ 'question'] = get_string('sourcemodule_question','game'); + $a[ 'quiz'] = get_string('modulename','quiz'); + $events = 'ONCHANGE="onselectsourcemodule(document.form.sourcemodule.value)"'; + echo game_showselectcontrol( 'sourcemodule', $a, $form->sourcemodule, $events); + echo ''; +} +echo "\r\n"; + + +?> + + + + + + + + + + + + + + + + + + +gamekind == 'millionaire' && $form->sourcemodule == 'quiz' ){ +?> + + + +gamekind == 'millionaire' ){ + if( $form->param8 == 0) + $form->param8 = 0x408080; +?> + + + + + + + + + + + +gamekind == 'hangman') +{ +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +gamekind == 'cross'){ +?> + + + + + + + + + + + + + + + + + + + + + +gamekind == 'sudoku'){ + if( !record_exists_select( 'game_sudoku_database')){ + require( "{$CFG->dirroot}/mod/game/db/importsudoku.php"); + } + +?> + + + + + +gamekind == 'cryptex'){ +?> + + + + + + + + + + + + + + + + + + + + +gamekind == 'bookquiz' and $existsbook){ +?> + + + + + + +gamekind == 'millionaire'){ +?> + + + + +gamekind == 'snakes'){ +?> + + + + +gamekind == 'hiddenpicture'){ +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +gamekind <> 'bookquiz'){ + echo ''; + + echo ''; +} + +//grademethod +?> + + + + + +mode != 'add' + +$answers = 0; +if (array_key_exists( 'answers', $_GET)) { + $answers = ( $_GET[ 'answers'] != 0 ? 1 : 0); +} +$nanswers = ($answers ? '0' : '1'); + +?> +
      +gamekind != '') + echo get_string('game_'.$form->gamekind,'game'); +?> +
    : + +
    : + gamekind, $events); + ?> +
    : +gamekind == 'bookquiz'){ + if( $existsbook){ + echo get_string('sourcemodule_question','game').'
    : + id'", 'id,name')){ + foreach( $recs as $rec){ + $a[ $rec->id] = $rec->name; + } + } + echo game_showselectcontrol( 'quizid', $a, $form->quizid); + ?> +
    : + id'", 'id,name')){ + foreach( $recs as $rec){ + $a[ $rec->id] = $rec->name; + } + } + echo game_showselectcontrol( 'bookid', $a, $form->bookid); + ?> +
    : + id'", 'id,name')){ + foreach( $recs as $rec){ + $a[ $rec->id] = $rec->name; + } + } + $events = 'ONCHANGE="onselectglossary(document.form.glossaryid.value)"'; + echo game_showselectcontrol( 'glossaryid', $a, $form->glossaryid, $events); + ?> +
    : + id'", 'id,name')){ + foreach($recs as $rec){ + $a[$rec->id] = $rec->name; + } + } + + if( count( $a) == 0) + $select = 'glossaryid=-1'; + else if( count( $a) == 1) + $select = 'glossaryid='.$rec->id; + else + { + $select = ''; + foreach($recs as $rec){ + $select .= ','.$rec->id; + } + $select = 'g.id IN ('.substr( $select, 1).')'; + } + $select .= ' AND g.id=gc.glossaryid'; + $table = "glossary g, {$CFG->prefix}glossary_categories gc"; + $a = array(); + $a[ ] = ''; + if($recs = get_records_select( $table, $select, 'g.name,gc.name', 'gc.id,gc.name,g.name as name2')){ + foreach($recs as $rec){ + $a[$rec->id] = $rec->name2.' -> '.$rec->name; + } + } + echo game_showselectcontrol( 'glossarycategoryid', $a, $form->glossarycategoryid); + ?> +
    : + id"; + }else{ + $context = get_context_instance(50, $course->id); + $select = " contextid in ($context->id)"; + } + break; + } + + $a = array(); + if( $recs = get_records_select( 'question_categories', $select, 'id,name')){ + foreach( $recs as $rec){ + $s = $rec->name; + if( ($count = count_records_select( 'question', "category={$rec->id}")) != 0){ + $s .= " ($count)"; + } + $a[ $rec->id] = $s; + } + } + echo game_showselectcontrol( 'questioncategoryid', $a, $form->questioncategoryid); + ?> +
    : + subcategories); + ?> +
    : + shuffle); + ?> +
    : + +
    : + +
    : + +
    : + param1); ?> +
    : + param2); ?> +
    : + param7); ?> +
    : + param8); ?> +
    : + param3 < 1){ + $form->param3 = 1; + } + $a = array(); + $a[ 1] = 1; + echo game_showselectcontrol( 'param3', $a, $form->param3); + ?> +
    : + param5); ?> +
    : + param6); ?> +
    : + language); + ?> +
    : + +
    : + +
    : + param7); ?> +
    : + param3 != 2){ + $form->param3 = 1; + } + $a = array(); + $a[ 1] = get_string('cross_layout0', 'game'); + $a[ 2] = get_string('cross_layout1', 'game'); + echo game_showselectcontrol( 'param3', $a, $form->param3); + ?> +
    : + +
    : + +
    : + +
    : + param7); ?> +
    : + +
    +
    + +
    : + shuffle); + ?> +
    : + id] = $rec->name; + } + } + if( count( $a) == 0){ + require( "{$CFG->dirroot}/mod/game/db/importsnakes.php"); + + if( $recs = get_records_select( 'game_snakes_database', "", 'id,name')){ + foreach( $recs as $rec){ + $a[ $rec->id] = $rec->name; + } + } + } + echo game_showselectcontrol( 'param3', $a, $form->param3); + ?> +
    : + +
    : + +
    : + id'", 'id,name')){ + foreach( $recs as $rec){ + $a[ $rec->id] = $rec->name; + } + } + echo game_showselectcontrol( 'glossaryid2', $a, $form->glossaryid2); + ?> +
    : + glossaryid ? 'glossaryid='.$form->glossaryid2 : ''); + if( $recs = get_records_select( 'glossary_categories', $select, 'id,name')){ + foreach( $recs as $rec){ + if( count( $a) == 0){ + $a[] = ''; + } + $a[ $rec->id] = $rec->name; + } + } + echo game_showselectcontrol( 'glossarycategoryid2', $a, $form->glossarycategoryid2); + ?> +
    : + param7); ?> +
    : + +
    : + +
    '.get_string('toptext', 'game').''; + print_textarea( $usehtmleditor, 15, 60, 630, 200, 'toptext', $game->toptext, $game->course); + echo '
    '.get_string('bottomtext', 'game').''; + print_textarea( $usehtmleditor, 15, 60, 630, 200, 'bottomtext', $game->bottomtext, $game->course); + echo '
    : + grademethod); ?> +
    + +
    + + + + + + + + + +" /> +
    +
    + + + diff --git a/mod_form.php b/mod_form.php new file mode 100644 index 0000000..1d4a9a8 --- /dev/null +++ b/mod_form.php @@ -0,0 +1,434 @@ + + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once ($CFG->dirroot.'/course/moodleform_mod.php'); +require( 'locallib.php'); + +class mod_game_mod_form extends moodleform_mod { + + function set_data($default_values) { + if( isset( $default_values->type)) + { + //Default values for every game. + if( $default_values->type == 'hangman') + { + $default_values->param10 = 6; //maximum number of wrongs + }else if( $default_values->type == 'snakes') + { + $default_values->gamekind = $default_values->type; + $default_values->param3 = 1; + $default_values->questioncategoryid = 0; + }else if( $default_values->type == 'millionaire') + { + $default_values->shuffle = 1; + } + } + + if( isset( $default_values->gamekind)){ + if( $default_values->gamekind == 'millionaire'){ + $default_values->param8 = '#'.strtoupper( dechex( $default_values->param8)); + } + //append contextid to questioncategoryid + $categoryid = $default_values->questioncategoryid; + $contextid = get_field( 'question_categories', 'contextid', 'id', $categoryid); + $default_values->questioncategoryid = $categoryid.','.$contextid; + + if( $default_values->gamekind == 'snakes'){ + if( isset( $default_values->param9)){ + $a = explode( '#',$default_values->param9); + foreach( $a as $s){ + $pos = strpos( $s, ':'); + if( $pos){ + $name = substr( $s, 0, $pos); + $default_values->$name = substr( $s, $pos+1); + } + } + } + if( isset( $default_values->param3)){ + $board = $default_values->param3; + if( $board != 0){ + $rec = get_record_select( 'game_snakes_database', 'id='.$board); + $default_values->snakes_board = $rec->data; + $default_values->snakes_cols = $rec->cols; + $default_values->snakes_rows = $rec->rows; + $default_values->snakes_headerx = $rec->headerx; + $default_values->snakes_headery = $rec->headery; + $default_values->snakes_footerx = $rec->footerx; + $default_values->snakes_footery = $rec->footery; + } + } + } + } + parent::set_data($default_values); + } + + function definition() { + global $CFG, $COURSE; + + $mform =& $this->_form; + + if(!empty($this->_instance)){ + if($g = get_record('game', 'id', (int)$this->_instance)){ + $gamekind = $g->gamekind; + } + else{ + error('incorrect game'); + } + } + else { + $gamekind = required_param('type', PARAM_ALPHA); + } + + //Hidden elements + $mform->addElement('hidden', 'gamekind', $gamekind); + $mform->setDefault('gamekind',$gamekind); + $mform->addElement('hidden', 'type', $gamekind); + $mform->setDefault('type',$gamekind); + + $mform->addElement('header', 'general', get_string('general', 'form')); + + $mform->addElement('text', 'name', 'Name', array('size'=>'64')); + if (!empty($CFG->formatstringstriptags)){ + $mform->setType('name', PARAM_TEXT); + } + else{ + $mform->setType('name', PARAM_CLEAN); + } + if( !isset( $g)) + $mform->setDefault('name', get_string( 'game_'.$gamekind, 'game')); + $mform->addRule('name', null, 'required', null, 'client'); + + $hasglossary = ($gamekind == 'hangman' || $gamekind == 'cross' || $gamekind == 'cryptex' || $gamekind == 'sudoku' || $gamekind == 'hiddenpicture' || $gamekind == 'snakes' || $gamekind == 'contest'); + + $questionsourceoptions = array(); + if($hasglossary) + $questionsourceoptions['glossary'] = get_string('modulename', 'glossary'); + $questionsourceoptions['question'] = get_string('sourcemodule_question', 'game'); + if( $gamekind != 'bookquiz') + $questionsourceoptions['quiz'] = get_string('modulename', 'quiz'); + $mform->addElement('select', 'sourcemodule', get_string('sourcemodule','game'), $questionsourceoptions); + + if($hasglossary){ + $a = array(); + if($recs = get_records_select('glossary', "course='$COURSE->id'", 'id,name')){ + foreach($recs as $rec){ + $a[$rec->id] = $rec->name; + } + } + $mform->addElement('select', 'glossaryid', get_string('sourcemodule_glossary', 'game'), $a); + $mform->disabledIf('glossaryid', 'sourcemodule', 'neq', 'glossary'); + + if( count( $a) == 0) + $select = 'glossaryid=-1'; + else if( count( $a) == 1) + $select = 'glossaryid='.$rec->id; + else + { + $select = ''; + foreach($recs as $rec){ + $select .= ','.$rec->id; + } + $select = 'g.id IN ('.substr( $select, 1).')'; + } + $select .= ' AND g.id=gc.glossaryid'; + $table = "glossary g, {$CFG->prefix}glossary_categories gc"; + $a = array(); + $a[ ] = ''; + if($recs = get_records_select( $table, $select, 'g.name,gc.name', 'gc.id,gc.name,g.name as name2')){ + foreach($recs as $rec){ + $a[$rec->id] = $rec->name2.' -> '.$rec->name; + } + } + $mform->addElement('select', 'glossarycategoryid', get_string('sourcemodule_glossarycategory', 'game'), $a); + $mform->disabledIf('glossarycategoryid', 'sourcemodule', 'neq', 'glossary'); + } + + + //********************* + // Question Category + if( $gamekind != 'bookquiz'){ + $contexts = game_get_contexts(); + $mform->addElement('questioncategory', 'questioncategoryid', get_string('sourcemodule_questioncategory', 'game'), compact('contexts')); + $mform->disabledIf('questioncategoryid', 'sourcemodule', 'neq', 'question'); + + //subcategories + $mform->addElement('selectyesno', 'subcategories', get_string('sourcemodule_include_subcategories', 'game')); + $mform->disabledIf('subcategories', 'sourcemodule', 'neq', 'question'); + } + + //*********************** + // Quiz + if( $gamekind != 'bookquiz'){ + $a = array(); + if( $recs = get_records_select( 'quiz', "course='$COURSE->id'", 'id,name')){ + foreach( $recs as $rec){ + $a[$rec->id] = $rec->name; + } + } + $mform->addElement('select', 'quizid', get_string('sourcemodule_quiz', 'game'), $a); + $mform->disabledIf('quizid', 'sourcemodule', 'neq', 'quiz'); + } + + + //*********************** + // Book + if($gamekind == 'bookquiz'){ + $a = array(); + if($recs = get_records_select('book', "course='$COURSE->id'", 'id,name')){ + foreach($recs as $rec){ + $a[$rec->id] = $rec->name; + } + } + $mform->addElement('select', 'bookid', get_string('sourcemodule_book', 'game'), $a); + } + +//--------------------------------------------------------------------------- +// Grade options + + $mform->addElement('header', 'gradeoptions', get_string('grades', 'grades')); + $mform->addElement('text', 'grade', get_string( 'grademax', 'grades'), array('size' => 4)); + $mform->setType('grade', PARAM_INT); + $gradingtypeoptions = array(); + $gradingtypeoptions[0] = get_string('gradehighest','game'); + $gradingtypeoptions[1] = get_string('gradeaverage','game'); + $gradingtypeoptions[2] = get_string('attemptfirst','game'); + $gradingtypeoptions[3] = get_string('attemptlast','game'); + $mform->addElement('select', 'grademethod', get_string('grademethod','game'), $gradingtypeoptions); + + $mform->addElement('header', 'timinghdr', get_string('timing', 'form')); + $mform->addElement('date_time_selector', 'timeopen', get_string('gameopen', 'game'), array('optional'=>true)); + $mform->setHelpButton('timeopen', array('timeopen', get_string('gameopen', 'game'), 'game')); + + $mform->addElement('date_time_selector', 'timeclose', get_string('gameclose', 'game'), array('optional'=>true)); + $mform->setHelpButton('timeclose', array('timeopen', get_string('gameclose', 'game'), 'game')); + +//--------------------------------------------------------------------------- +// Hangman options + + if($gamekind == 'hangman'){ + $mform->addElement('header', 'hangman', get_string( 'hangman_options', 'game')); + $mform->addElement('text', 'param4', get_string('hangman_maxtries', 'game'), array('size' => 4)); + $mform->setType('param4', PARAM_INT); + $mform->addElement('selectyesno', 'param1', get_string('hangman_showfirst', 'game')); + $mform->addElement('selectyesno', 'param2', get_string('hangman_showlast', 'game')); + $mform->addElement('selectyesno', 'param7', get_string('hangman_allowspaces','game')); + $mform->addElement('selectyesno', 'param8', get_string('hangman_allowsub', 'game')); + + $mform->addElement('text', 'param10', get_string( 'hangman_maximum_number_of_errors', 'game'), array('size' => 4)); + $mform->setType('param10', PARAM_INT); + + $a = array( 1 => 1); + $mform->addElement('select', 'param3', get_string('hangman_imageset','game'), $a); + + $mform->addElement('selectyesno', 'param5', get_string('hangman_showquestion', 'game')); + $mform->addElement('selectyesno', 'param6', get_string('hangman_showcorrectanswer', 'game')); + + $a = array(); + $a = get_list_of_languages(); + $a[ ''] = '----------'; + ksort( $a); + $mform->addElement('select', 'language', get_string('hangman_language','game'), $a); + } + + if($gamekind == 'contest'){ + $mform->addElement('header', 'contest', get_string( 'contest_options', 'game')); + $mform->addElement('selectyesno', 'param1', get_string('contest_has_notes', 'game')); + + $choices = get_max_upload_sizes($CFG->maxbytes, $COURSE->maxbytes); + $choices[1] = get_string('uploadnotallowed'); + $choices[0] = get_string('courseuploadlimit') . ' ('.display_size($COURSE->maxbytes).')'; + $mform->addElement('select', 'param2', get_string('maxattachmentsize', 'forum'), $choices); + } + +//--------------------------------------------------------------------------- +// Crossword options + + if($gamekind == 'cross'){ + $mform->addElement('header', 'cross', get_string( 'cross_options', 'game')); + $mform->addElement('text', 'param1', get_string('cross_maxcols', 'game')); + $mform->setType('param1', PARAM_INT); + $mform->addElement('text', 'param2', get_string('cross_maxwords', 'game')); + $mform->setType('param2', PARAM_INT); + $mform->addElement('selectyesno', 'param7', get_string('hangman_allowspaces','game')); + $crosslayoutoptions = array(); + $crosslayoutoptions[0] = get_string('cross_layout0', 'game'); + $crosslayoutoptions[1] = get_string('cross_layout1', 'game'); + $mform->addElement('select','param3', get_string('cross_layout', 'game'), $crosslayoutoptions); + } + +//--------------------------------------------------------------------------- +// Cryptex options + + if($gamekind == 'cryptex'){ + $mform->addElement('header', 'cryptex', get_string( 'cryptex_options', 'game')); + $mform->addElement('text', 'param1', get_string('cryptex_maxcols', 'game')); + $mform->setType('param1', PARAM_INT); + $mform->addElement('text', 'param2', get_string('cryptex_maxwords', 'game')); + $mform->setType('param2', PARAM_INT); + $mform->addElement('selectyesno', 'param7', get_string('hangman_allowspaces','game')); + $mform->addElement('text', 'param8', get_string('cryptex_maxtries','game')); + $mform->setType('param8', PARAM_INT); + } + +//--------------------------------------------------------------------------- +// Millionaire options + + if($gamekind == 'millionaire'){ + $mform->addElement('header', 'millionaire', get_string( 'millionaire_options', 'game')); + + $mform->addElement('text', 'param8', get_string('millionaire_background', 'game')); + $mform->setDefault('param8', '#408080'); + + $mform->addElement('selectyesno', 'shuffle', get_string('millionaire_shuffle','game')); + } + +//--------------------------------------------------------------------------- +// Sudoku options + + if($gamekind == 'sudoku'){ + $mform->addElement('header', 'sudoku', get_string( 'sudoku_options', 'game')); + $mform->addElement('text', 'param2', get_string('sudoku_maxquestions', 'game')); + } + +//--------------------------------------------------------------------------- +// Snakes and Ladders options + + if($gamekind == 'snakes'){ + $mform->addElement('header', 'snakes', get_string( 'snakes_options', 'game')); + $snakesandladdersbackground = array(); + if($recs = get_records_select( 'game_snakes_database', "", 'id,name')){ + foreach( $recs as $rec){ + $snakesandladdersbackground[$rec->id] = $rec->name; + } + } + if(count($snakesandladdersbackground) == 0){ + require("{$CFG->dirroot}/mod/game/db/importsnakes.php"); + + if($recs = get_records_select('game_snakes_database', "", 'id,name')){ + foreach($recs as $rec){ + $snakesandladdersbackground[$rec->id] = $rec->name; + } + } + } + + $snakesandladdersbackground[ 0] = get_string( 'userdefined', 'game'); + ksort( $snakesandladdersbackground); + $mform->addElement('select', 'param3', get_string('snakes_background', 'game'), $snakesandladdersbackground); + + //param4 = itemid for file_storage + //param5 (=1 means dirty file and and have to be computed again) + + $attachmentoptions = array('subdirs'=>false, 'maxfiles'=>1); + $mform->addElement('file', 'param4', get_string('snakes_file', 'game'), $attachmentoptions); + $mform->disabledIf('param4', 'param3', 'neq', '0'); + + $mform->addElement('textarea', 'snakes_board', get_string('snakes_board', 'game'), 'rows="2" cols="70"'); + $mform->disabledIf('snakes_board', 'param3', 'neq', '0'); + + $mform->addElement('text', 'snakes_cols', get_string('snakes_cols', 'game'), array('size' => 4)); + $mform->disabledIf('snakes_cols', 'param3', 'neq', '0'); + + $mform->addElement('text', 'snakes_rows', get_string('snakes_rows', 'game'), array('size' => 4)); + $mform->disabledIf('snakes_rows', 'param3', 'neq', '0'); + + $mform->addElement('text', 'snakes_headerx', get_string('snakes_headerx', 'game'), array('size' => 4)); + $mform->disabledIf('snakes_headerx', 'param3', 'neq', '0'); + + $mform->addElement('text', 'snakes_headery', get_string('snakes_headery', 'game'), array('size' => 4)); + $mform->disabledIf('snakes_headery', 'param3', 'neq', '0'); + + $mform->addElement('text', 'snakes_footerx', get_string('snakes_footerx', 'game'), array('size' => 4)); + $mform->disabledIf('snakes_footerx', 'param3', 'neq', '0'); + + $mform->addElement('text', 'snakes_footery', get_string('snakes_footery', 'game'), array('size' => 4)); + $mform->disabledIf('snakes_footery', 'param3', 'neq', '0'); + } + +//--------------------------------------------------------------------------- +// Hidden Picture options + + if($gamekind == 'hiddenpicture'){ + $mform->addElement('header', 'hiddenpicture', get_string( 'hiddenpicture_options', 'game')); + $mform->addElement('text', 'param1', get_string('hiddenpicture_across', 'game')); + $mform->setType('param1', PARAM_INT); + $mform->setDefault('param1',3); + $mform->addElement('text', 'param2', get_string('hiddenpicture_down', 'game')); + $mform->setType('param2', PARAM_INT); + $mform->setDefault('param2',3); + + $a = array(); + if($recs = get_records_select('glossary', "course='$COURSE->id'", 'id,name')){ + foreach($recs as $rec){ + $a[$rec->id] = $rec->name; + } + } + $mform->addElement('select', 'glossaryid2', get_string('hiddenpicture_pictureglossary', 'game'), $a); + + if( count( $a) == 0) + $select = 'glossaryid=-1'; + else if( count( $a) == 1) + $select = 'glossaryid='.$rec->id; + else + { + $select = ''; + foreach($recs as $rec){ + $select .= ','.$rec->id; + } + $select = 'g.id IN ('.substr( $select, 1).')'; + } + $select .= ' AND g.id=gc.glossaryid'; + $table = "glossary g, {$CFG->prefix}glossary_categories gc"; + $a = array(); + $a[ ] = ''; + if($recs = get_records_select( $table, $select, 'g.name,gc.name', 'gc.id,gc.name,g.name as name2')){ + foreach($recs as $rec){ + $a[$rec->id] = $rec->name2.' -> '.$rec->name; + } + } + $mform->addElement('select', 'glossarycategoryid2', get_string('hiddenpicture_pictureglossarycategories', 'game'), $a); + $mform->disabledIf('glossarycategoryid2', 'glossaryid', 'eq', 0); + + $mform->addElement('text', 'param4', get_string('hiddenpicture_width', 'game')); + $mform->setType('param4', PARAM_INT); + $mform->addELement('text', 'param5', get_string('hiddenpicture_height', 'game')); + $mform->setType('param5', PARAM_INT); + $mform->addElement('selectyesno', 'param7', get_string('hangman_allowspaces','game')); + } + +//--------------------------------------------------------------------------- +// Header/Footer options + + $mform->addElement('header', 'headerfooteroptions', get_string( 'headerfooter_options', 'game')); + $mform->addElement('htmleditor', 'toptext', get_string('toptext','game')); + $mform->addElement('htmleditor', 'bottomtext', get_string('bottomtext','game')); + +//--------------------------------------------------------------------------- + $this->standard_coursemodule_elements(array('groups'=>false, 'groupmembersonly'=>true)); + +//--------------------------------------------------------------------------- +// buttons + $this->add_action_buttons(); + } + + function data_preprocessing(&$default_values){ + + } + + function validation($data, $files){ + $errors = parent::validation($data, $files); + + // Check open and close times are consistent. + if ($data['timeopen'] != 0 && $data['timeclose'] != 0 && $data['timeclose'] < $data['timeopen']) { + $errors['timeclose'] = get_string('closebeforeopen', 'quiz'); + } + + return $errors; + } +} + diff --git a/pagelib.php b/pagelib.php new file mode 100644 index 0000000..aaab468 --- /dev/null +++ b/pagelib.php @@ -0,0 +1,92 @@ +libdir.'/pagelib.php'); +require_once($CFG->dirroot.'/course/lib.php'); // needed for some blocks + +define('PAGE_GAME_VIEW', 'mod-game-view'); + +page_map_class( PAGE_GAME_VIEW, 'page_game'); + +$DEFINEDPAGES = array( PAGE_GAME_VIEW); + +/** + * Class that models the behavior of a game + * + * @author Jon Papaioannou + * @package pages + */ + +class page_game extends page_generic_activity { + + function init_quick($data) { + if(empty($data->pageid)) { + error('Cannot quickly initialize page: empty course id'); + } + $this->activityname = 'game'; + parent::init_quick($data); + } + + function print_header($title, $morebreadcrumbs = NULL, $navigation ='') { + global $USER, $CFG; + + $this->init_full(); + $replacements = array( + '%fullname%' => format_string($this->activityrecord->name) + ); + foreach($replacements as $search => $replace) { + $title = str_replace($search, $replace, $title); + } + + if($this->courserecord->id == SITEID) { + $breadcrumbs = array(); + } + else { + $breadcrumbs = array($this->courserecord->shortname => $CFG->wwwroot.'/course/view.php?id='.$this->courserecord->id); + } + + $breadcrumbs[get_string('modulenameplural', 'game')] = $CFG->wwwroot.'/mod/game/index.php?id='.$this->courserecord->id; + $breadcrumbs[format_string($this->activityrecord->name)] = $CFG->wwwroot.'/mod/game/view.php?id='.$this->modulerecord->id; + + if(!empty($morebreadcrumbs)) { + $breadcrumbs = array_merge($breadcrumbs, $morebreadcrumbs); + } +/* + $total = count($breadcrumbs); + $current = 1; + $crumbtext = ''; + foreach($breadcrumbs as $text => $href) { + if($current++ == $total) { + $crumbtext .= ' '.$text; + } + else { + $crumbtext .= ' '.$text.' ->'; + } + } +*/ + if(empty($morebreadcrumbs) && $this->user_allowed_editing()) { + $buttons = ''; + if(!empty($CFG->showblocksonmodpages)) { + $buttons .= ''; + } + $buttons .= '
    '. + update_module_button($this->modulerecord->id, $this->courserecord->id, get_string('modulename', 'game')).'
    frametarget.' method="get" action="view.php">'. + '
    '. + ''. + ''. + ''. + '
    '; + } + else { + $buttons = ' '; + } + //print_header($title, $this->courserecord->fullname, $crumbtext, '', '', true, $buttons, navmenu($this->courserecord, $this->modulerecord),false,$bodytags); + print_header($title, $this->courserecord->fullname, $navigation); + + } + + function get_type() { + return PAGE_GAME_VIEW; + } +} + +?> diff --git a/preview.php b/preview.php new file mode 100644 index 0000000..3061959 --- /dev/null +++ b/preview.php @@ -0,0 +1,278 @@ +libdir/questionlib.php"); + require_once("$CFG->dirroot/question/type/shortanswer/questiontype.php"); + require_once("lib.php"); + require_once("locallib.php"); + + require_once( "header.php"); + + require_once( "hangman/play.php"); + require_once( "cross/play.php"); + require_once( "cryptex/play.php"); + require_once( "millionaire/play.php"); + require_once( "sudoku/play.php"); + require_once( "bookquiz/play.php"); + + if( !isteacher( $game->course, $USER->id)){ + error( get_string( 'only_teachers', 'game')); + } + + $currenttab = required_param('action', PARAM_TEXT); + + include('tabs.php'); + + switch( $currenttab){ + case 'showattempts': + echo get_string( 'group').': '; + game_showgroups( $game); + echo get_string('user').': '; + game_showusers($game); + echo '

    '; + game_showattempts($game); + print_footer(); + die; + case 'delete': + if (has_capability('mod/game:deleteattempts', $context)) + { + $attemptid = required_param('attemptid', PARAM_INT); + game_ondeleteattempt($game, $attemptid); + print_footer(); + } + die; + case 'answers': + showanswers( $game, false); + print_footer(); + die; + } + + $attemptid = required_param('attemptid', PARAM_INT); + $update = required_param('update', PARAM_INT); + + $attempt = get_record_select( 'game_attempts', "id=$attemptid"); + $game = get_record_select( 'game', "id=$attempt->gameid"); + $detail = get_record_select( 'game_'.$game->gamekind, "id=$attemptid"); + $solution = ($currenttab == 'solution'); + + switch( $game->gamekind) + { + case 'cross': + game_cross_play( $update, $game, $attempt, $detail, '', true, $solution, false, false, false, false, true); + break; + case 'sudoku': + game_sudoku_play( $update, $game, $attempt, $detail, true, $solution); + break; + case 'hangman': + game_hangman_play( $update, $game, $attempt, $detail, true, $solution); + break; + case 'cryptex': + $crossm = get_record_select( 'game_cross', "id=$attemptid"); + game_cryptex_play( $update, $game, $attempt, $detail, $crossm, false, true, $solution); + break; + } + + function game_showattempts($game){ + global $CFG, $USER; + + $gamekind = $game->gamekind; + $update = get_coursemodule_from_instance( 'game', $game->id, $game->course)->id; + + //Here are user attempts + $table = "game_attempts as ga, {$CFG->prefix}user u, {$CFG->prefix}game as g"; + $select = "ga.userid=u.id AND ga.gameid={$game->id} AND g.id={$game->id}"; + $fields = "ga.id, u.lastname, u.firstname, ga.attempts,". + "timestart, timefinish, timelastattempt, score, ga.lastip, ga.lastremotehost"; + + $userid = optional_param('userid',0,PARAM_INT); + if( $userid != 0) + $select .= ' AND ga.userid='.$userid; + + $count = count_records_select( $table, $select, 'COUNT( *)'); + $maxlines = 20; + $limitfrom = optional_param('limitfrom', 0, PARAM_INT); + $recslimitfrom = $recslimitnum = ''; + if( $count > $maxlines){ + $recslimitfrom = ( $limitfrom ? $limitfrom * $maxlines : ''); + $recslimitnum = $maxlines; + + for($i=0; $i*$maxlines < $count; $i++){ + if( $i == $limitfrom){ + echo ($i+1).' '; + }else + { + echo "wwwroot}/mod/game/preview.php?action=showattempts&update=$update&q={$game->id}&limitfrom=$i&\">".($i+1).""; + echo '  '; + } + } + echo "
    "; + } + + if( ($recs = get_records_select( $table, $select, 'timelastattempt DESC,timestart DESC', $fields, $recslimitfrom, $recslimitnum)) != false){ + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo "\r\n"; + $strftimedate = get_string('formatdatetime', 'game'); + + foreach( $recs as $rec){ + echo ''; + echo ''; + echo ''; + echo ''; + echo '\r\n"; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + //Show solution + echo ''; + echo "\r\n"; + } + echo "
    '.get_string( 'delete').''.get_string('user').''.get_string('lastip', 'game').''.get_string('timestart', 'game').''.get_string('timelastattempt', 'game').''.get_string('timefinish', 'game').''.get_string('score', 'game').''.get_string('attempts', 'game').''.get_string('preview', 'game').''.get_string('showsolution', 'game').'
    '; + if( $rec->timefinish == 0){ + echo "\r\nwwwroot}/mod/game/preview.php?attemptid={$rec->id}&q={$game->id}&action=delete\">"; + echo ''.get_string( 'delete').''; + } + echo '
    '.$rec->firstname. ' '.$rec->lastname.'
    '.(strlen( $rec->lastremotehost) > 0 ? $rec->lastremotehost : $rec->lastip).'
    '.( $rec->timestart != 0 ? userdate($rec->timestart, $strftimedate) : '')."
    '.( $rec->timelastattempt != 0 ? userdate($rec->timelastattempt, $strftimedate) : '').'
    '.( $rec->timefinish != 0 ? userdate($rec->timefinish, $strftimedate) : '').'
    '.round($rec->score * 100).'
    '.$rec->attempts.'
    '; + //Preview + if( ($gamekind == 'cross') or ($gamekind == 'sudoku') or ($gamekind == 'hangman') or ($gamekind == 'cryptex')){ + echo "\r\nwwwroot}/mod/game/preview.php?action=preview&attemptid={$rec->id}&gamekind=$gamekind"; + echo '&update='.$update."&q={$game->id}\">"; + echo ''.get_string( 'preview', 'game').''; + } + echo '
    '; + if( ($gamekind == 'cross') or ($gamekind == 'sudoku') or ($gamekind == 'hangman') or ($gamekind == 'cryptex') ){ + echo "\r\nwwwroot}/mod/game/preview.php?action=solution&attemptid={$rec->id}&gamekind={$gamekind}&update=$update&solution=1&q={$game->id}\">"; + echo ''.get_string( 'showsolution', 'game').''; + } + echo '
    \r\n"; + } + } + + function game_ondeleteattempt( $game, $attemptid) + { + global $CFG; + + $attempt = get_record_select( 'game_attempts', 'id='.$attemptid); + $game = get_record_select( 'game', 'id='.$attempt->gameid); + + switch( $game->gamekind) + { + case 'bookquiz': + delete_records( 'game_bookquiz_chapters', 'attemptid', $attemptid); + break; + } + delete_records( 'game_queries', 'attemptid', $attemptid); + delete_records( 'game_attempts', 'id', $attemptid); + + $url = $CFG->wwwroot.'/mod/game/preview.php?action=showattempts&q='.$game->id; + redirect( $url); + } + +function game_showusers($game) +{ + global $CFG, $USER; + + $users = array(); + + $context = get_context_instance(CONTEXT_COURSE, $game->course); + + $groupid = optional_param('groupid',0, PARAM_INT); + $sql = "SELECT DISTINCT ra.userid,u.lastname,u.firstname FROM {$CFG->prefix}role_assignments ra, {$CFG->prefix}user u ". + " WHERE ra.contextid={$context->id} AND ra.userid=u.id"; + if( $groupid != 0) + $sql .= " AND ra.userid IN (SELECT gm.userid FROM {$CFG->prefix}groups_members gm WHERE gm.groupid=$groupid)"; + if( ($recs = get_records_sql( $sql))){ + foreach( $recs as $rec){ + $users[ $rec->userid] = $rec->lastname.' '.$rec->firstname; + } + } + + if ($guest = get_guest()) { + $users[$guest->id] = fullname($guest); + } + + $userid = optional_param('userid',0,PARAM_INT); + + ?> + + prefix}groups WHERE courseid=$game->course ORDER BY name"))){ + foreach( $recs as $rec){ + $groups[ $rec->id] = $rec->name; + } + } + + ?> + + ' . "\n"; + $output .= ' ' . "\n"; + } + } + } + echo $output . '' . "\n"; + } + diff --git a/print.php b/print.php new file mode 100644 index 0000000..4a11d14 --- /dev/null +++ b/print.php @@ -0,0 +1,41 @@ +course); + + game_print( $game, $id); + + function game_print( $game, $update){ + + if( $game->gamekind == 'cross'){ + game_print_cross( $game, $update); + } + } + + function game_print_cross( $game, $update){ + + global $CFG; + + require( "cross/play.php"); + $attempt = false; + game_getattempt( $game, &$crossrec); + + game_cross_play( $update, $game, $attempt, $crossrec, '', true, false, false, true, false, false, false); + + } + +?> diff --git a/report.php b/report.php new file mode 100644 index 0000000..4b96e80 --- /dev/null +++ b/report.php @@ -0,0 +1,80 @@ +course)) { + error("Course is misconfigured"); + } + + if (! $game = get_record("game", "id", $cm->instance)) { + error("The game with id $cm->instance corresponding to this coursemodule $id is missing"); + } + + } else { + if (! $game = get_record("game", "id", $q)) { + error("There is no game with id $q"); + } + if (! $course = get_record("course", "id", $game->course)) { + error("The course with id $game->course that the game with id $a belongs to is missing"); + } + if (! $cm = get_coursemodule_from_instance("game", $game->id, $course->id)) { + error("The course module for the game with id $q is missing"); + } + } + + require_login($course->id, false); + $context = get_context_instance(CONTEXT_MODULE, $cm->id); + //require_capability('mod/game:viewreports', $context); + + // if no questions have been set up yet redirect to edit.php + //if (!$game->questions and has_capability('mod/game:manage', $context)) { + // redirect('edit.php?gameid='.$game->id); + //} + + // Upgrade any attempts that have not yet been upgraded to the + // Moodle 1.5 model (they will not yet have the timestamp set) + //if ($attempts = get_records_sql("SELECT a.*". + // " FROM {$CFG->prefix}game_attempts a, {$CFG->prefix}question_states s". + // " WHERE a.game = '$game->id' AND s.attempt = a.uniqueid AND s.timestamp = 0")) { + // foreach ($attempts as $attempt) { + // game_upgrade_states($attempt); + // } + //} + + add_to_log($course->id, "game", "report", "report.php?id=$cm->id", "$game->id", "$cm->id"); + +/// Open the selected game report and display it + + $mode = clean_param( $mode, PARAM_SAFEDIR); + + if (! is_readable("report/$mode/report.php")) { + error("Report not known ($mode)"); + } + + include("report/default.php"); // Parent class + include("report/$mode/report.php"); + + $report = new game_report(); + + if (! $report->display( $game, $cm, $course)) { // Run the report! + error("Error occurred during pre-processing!"); + } + +/// Print footer + + print_footer($course); + +?> diff --git a/report/default.php b/report/default.php new file mode 100644 index 0000000..284cf01 --- /dev/null +++ b/report/default.php @@ -0,0 +1,49 @@ +id" or q=$quiz->id", and "mode=reportname". +//////////////////////////////////////////////////////////////////// + +// Included by ../report.php + +class game_default_report { + + function display($cm, $course, $game) { /// This function just displays the report + return true; + } + + function print_header_and_tabs($cm, $course, $game, $reportmode="overview", $meta=""){ + global $CFG; + /// Define some strings + $strgames = get_string("modulenameplural", "game"); + $strgame = get_string("modulename", "game"); + /// Print the page header + + if( function_exists( 'build_navigation')){ + $navigation = build_navigation('', $cm); + print_header( $course->shortname, $course->shortname, $navigation); + }else{ + print_header_simple(format_string($game->name), "", + "id\">$strgames + -> ".format_string($game->name), + '', $meta, true, update_module_button($cm->id, $course->id, $strgame), navmenu($course, $cm)); + } + + /// Print the tabs + $currenttab = 'reports'; + $mode = $reportmode; + + include('tabs.php'); + } +} + +?> diff --git a/report/overview/report.php b/report/overview/report.php new file mode 100644 index 0000000..0a331af --- /dev/null +++ b/report/overview/report.php @@ -0,0 +1,615 @@ +libdir.'/tablelib.php'); + +class game_report extends game_default_report { + + /** + * Display the report. + */ + function display($game, $cm, $course) { + global $CFG, $SESSION, $db, $QTYPES; + + // Define some strings + $strreallydel = addslashes(get_string('deleteattemptcheck','game')); + $strtimeformat = get_string('strftimedatetime'); + $strreviewquestion = get_string('reviewresponse', 'quiz'); + + // Only print headers if not asked to download data + if (!$download = optional_param('download', NULL)) { + $this->print_header_and_tabs($cm, $course, $game, $reportmode="overview"); + } + + // Deal with actions + $action = optional_param('action', '', PARAM_ACTION); + + switch($action) { + case 'delete': // Some attempts need to be deleted + $attemptids = optional_param('attemptid', array(), PARAM_INT); + + foreach($attemptids as $attemptid) { + if ($attemptid && $todelete = get_record('game_attempts', 'id', $attemptid)) { + delete_records('game_attempts', 'id', $attemptid); + delete_records('game_queries', 'attemptid', $attemptid); + + // Search game_attempts for other instances by this user. + // If none, then delete record for this game, this user from game_grades + // else recalculate best grade + + $userid = $todelete->userid; + if (!record_exists('game_attempts', 'userid', $userid, 'gameid', $game->id)) { + delete_records('game_grades', 'userid', $userid,'gameid', $game->id); + } else { + game_save_best_score( $game, $userid); + } + } + } + break; + } + + // Print information on the number of existing attempts + if (!$download) { //do not print notices when downloading + if ($attemptnum = count_records('game_attempts', 'gameid', $game->id)) { + $a = new stdClass; + $a->attemptnum = $attemptnum; + $a->studentnum = count_records_select('game_attempts', "gameid = '$game->id' AND preview = '0'", 'COUNT(DISTINCT userid)'); + $a->studentstring = $course->students; + + notify( get_string('numattempts', 'game', $a)); + } + } + + $context = get_context_instance(CONTEXT_MODULE, $cm->id); + /// find out current groups mode + if ($groupmode = groupmode($course, $cm)) { // Groups are being used + if (!$download) { + $currentgroup = setup_and_print_groups($course, $groupmode, "report.php?id=$cm->id&mode=overview"); + } else { + $currentgroup = get_and_set_current_group($course, $groupmode); + } + } else { + $currentgroup = get_and_set_current_group($course, $groupmode); + } + + // Set table options + $noattempts = optional_param('noattempts', 0, PARAM_INT); + $detailedmarks = optional_param('detailedmarks', 0, PARAM_INT); + $pagesize = optional_param('pagesize', 10, PARAM_INT); + $hasfeedback = game_has_feedback($game->id) && $game->grade > 1.e-7; + if ($pagesize < 1) { + $pagesize = 10; + } + + // Now check if asked download of data + if ($download) { + $filename = clean_filename("$course->shortname ".format_string($game->name,true)); + $sort = ''; + } + + // Define table columns + $tablecolumns = array('checkbox', 'picture', 'fullname', 'timestart', 'timefinish', 'duration'); + $tableheaders = array(NULL, '', get_string('fullname'), get_string('startedon', 'game'), get_string('timecompleted','game'), get_string('timetaken', 'game')); + + if ($game->grade) { + $tablecolumns[] = 'grade'; + $tableheaders[] = get_string('grade', 'game').'/'.$game->grade; + } + + if($detailedmarks) { + // we want to display marks for all questions + // Start by getting all questions + $questionlist = game_questions_in_game( $game->questions); + $questionids = explode(',', $questionlist); + $sql = "SELECT q.*, i.score AS maxgrade, i.id AS instance". + " FROM {$CFG->prefix}question q,". + " {$CFG->prefix}game_queries i". + " WHERE i.gameid = '$game->id' AND q.id = i.questionid". + " AND q.id IN ($questionlist)"; + if (!$questions = get_records_sql($sql)) { + error('No questions found'); + } + $number = 1; + foreach($questionids as $key => $id) { + if ($questions[$id]->length) { + // Only print questions of non-zero length + $tablecolumns[] = '$'.$id; + $tableheaders[] = '#'.$number; + $questions[$id]->number = $number; + $number += $questions[$id]->length; + } else { + // get rid of zero length questions + unset($questions[$id]); + unset($questionids[$key]); + } + } + } + + if ($hasfeedback) { + $tablecolumns[] = 'feedbacktext'; + $tableheaders[] = get_string('feedback', 'game'); + } + + if (!$download) { + // Set up the table + + $table = new flexible_table('mod-game-report-overview-report'); + + $table->define_columns($tablecolumns); + $table->define_headers($tableheaders); + $table->define_baseurl($CFG->wwwroot.'/mod/game/report.php?mode=overview&id=' . + $cm->id . '&noattempts=' . $noattempts . '&detailedmarks=' . $detailedmarks . + '&pagesize=' . $pagesize); + + $table->sortable(true); + $table->collapsible(true); + + $table->column_suppress('picture'); + $table->column_suppress('fullname'); + + $table->column_class('picture', 'picture'); + + $table->set_attribute('cellspacing', '0'); + $table->set_attribute('id', 'attempts'); + $table->set_attribute('class', 'generaltable generalbox'); + + // Start working -- this is necessary as soon as the niceties are over + $table->setup(); + } else if ($download =='ODS') { + require_once("$CFG->libdir/odslib.class.php"); + + $filename .= ".ods"; + // Creating a workbook + $workbook = new MoodleODSWorkbook("-"); + // Sending HTTP headers + $workbook->send($filename); + // Creating the first worksheet + $sheettitle = get_string('overview','game'); + $myxls =& $workbook->add_worksheet($sheettitle); + // format types + $format =& $workbook->add_format(); + $format->set_bold(0); + $formatbc =& $workbook->add_format(); + $formatbc->set_bold(1); + $formatbc->set_align('center'); + $formatb =& $workbook->add_format(); + $formatb->set_bold(1); + $formaty =& $workbook->add_format(); + $formaty->set_bg_color('yellow'); + $formatc =& $workbook->add_format(); + $formatc->set_align('center'); + $formatr =& $workbook->add_format(); + $formatr->set_bold(1); + $formatr->set_color('red'); + $formatr->set_align('center'); + $formatg =& $workbook->add_format(); + $formatg->set_bold(1); + $formatg->set_color('green'); + $formatg->set_align('center'); + // Here starts workshhet headers + + $headers = array(get_string('fullname'), + get_string('startedon', 'game'), + get_string('timecompleted', 'game'), + get_string('timetaken', 'game') + ); + + if ($game->grade) { + $headers[] = get_string('grade', 'game').'/'.$game->grade; + } + if($detailedmarks) { + foreach ($questionids as $id) { + $headers[] = '#'.$questions[$id]->number; + } + } + if ($hasfeedback) { + $headers[] = get_string('feedback', 'game'); + } + $colnum = 0; + foreach ($headers as $item) { + $myxls->write(0,$colnum,$item,$formatbc); + $colnum++; + } + $rownum=1; + } else if ($download =='Excel') { + require_once("$CFG->libdir/excellib.class.php"); + + $filename .= ".xls"; + // Creating a workbook + $workbook = new MoodleExcelWorkbook("-"); + // Sending HTTP headers + $workbook->send($filename); + // Creating the first worksheet + $sheettitle = get_string('overview','game'); + $myxls =& $workbook->add_worksheet($sheettitle); + // format types + $format =& $workbook->add_format(); + $format->set_bold(0); + $formatbc =& $workbook->add_format(); + $formatbc->set_bold(1); + $formatbc->set_align('center'); + $formatb =& $workbook->add_format(); + $formatb->set_bold(1); + $formaty =& $workbook->add_format(); + $formaty->set_bg_color('yellow'); + $formatc =& $workbook->add_format(); + $formatc->set_align('center'); + $formatr =& $workbook->add_format(); + $formatr->set_bold(1); + $formatr->set_color('red'); + $formatr->set_align('center'); + $formatg =& $workbook->add_format(); + $formatg->set_bold(1); + $formatg->set_color('green'); + $formatg->set_align('center'); + // Here starts workshhet headers + + $headers = array(get_string('fullname'), get_string('startedon', 'game'), get_string('timecompleted', 'game'), get_string('timetaken', 'game')); + + if ($game->grade) { + $headers[] = get_string('grade', 'game').'/'.$game->grade; + } + if($detailedmarks) { + foreach ($questionids as $id) { + $headers[] = '#'.$questions[$id]->number; + } + } + if ($hasfeedback) { + $headers[] = get_string('feedback', 'game'); + } + $colnum = 0; + foreach ($headers as $item) { + $myxls->write(0,$colnum,$item,$formatbc); + $colnum++; + } + $rownum=1; + } else if ($download=='CSV') { + $filename .= ".txt"; + + header("Content-Type: application/download\n"); + header("Content-Disposition: attachment; filename=\"$filename\""); + header("Expires: 0"); + header("Cache-Control: must-revalidate,post-check=0,pre-check=0"); + header("Pragma: public"); + + $headers = get_string('fullname')."\t".get_string('startedon', 'game')."\t".get_string('timecompleted', 'game')."\t".get_string('timetaken', 'game'); + + if ($game->grade) { + $headers .= "\t".get_string('grade', 'game')."/".$game->grade; + } + if($detailedmarks) { + foreach ($questionids as $id) { + $headers .= "\t#".$questions[$id]->number; + } + } + if ($hasfeedback) { + $headers .= "\t" . get_string('feedback', 'game'); + } + echo $headers." \n"; + } + + $contextlists = get_related_contexts_string( get_context_instance( CONTEXT_COURSE, $course->id)); + + // Construct the SQL + $select = 'SELECT qa.id,'.sql_concat('u.id', '\'#\'', $db->IfNull('qa.attempt', '0')).' AS uniqueid, '. + 'qa.id as attemptuniqueid, qa.id AS attempt, u.id AS userid, u.firstname, u.lastname, u.picture, '. +// 'qa.uniqueid as attemptuniqueid, qa.id AS attempt, u.id AS userid, u.firstname, u.lastname, u.picture, '. + 'qa.score, qa.timefinish, qa.timestart, qa.timefinish - qa.timestart AS duration '; + if ($course->id != SITEID) { // this is too complicated, so just do it for each of the four cases. + if (!empty($currentgroup) && empty($noattempts)) { + // we want a particular group and we only want to see students WITH attempts. + // So join on groups_members and do an inner join on attempts. + $from = 'FROM '.$CFG->prefix.'user u JOIN '.$CFG->prefix.'role_assignments ra ON ra.userid = u.id '. + groups_members_join_sql(). + 'JOIN '.$CFG->prefix.'game_attempts qa ON u.id = qa.userid AND qa.gameid = '.$game->id; + $where = ' WHERE ra.contextid ' . $contextlists . ' AND '. groups_members_where_sql($currentgroup) .' AND qa.preview = 0'; + } else if (!empty($currentgroup) && !empty($noattempts)) { + // We want a particular group and we want to do something funky with attempts + // So join on groups_members and left join on attempts... + $from = 'FROM '.$CFG->prefix.'user u JOIN '.$CFG->prefix.'role_assignments ra ON ra.userid = u.id '. + groups_members_join_sql(). + 'LEFT JOIN '.$CFG->prefix.'game_attempts qa ON u.id = qa.userid AND qa.gameid = '.$game->id; + $where = ' WHERE ra.contextid ' .$contextlists . ' AND '.groups_members_where_sql($currentgroup); + if ($noattempts == 1) { + // noattempts = 1 means only no attempts, so make the left join ask for only records where the right is null (no attempts) + $where .= ' AND qa.userid IS NULL'; // show ONLY no attempts; + } else { + // We are including attempts, so exclude previews. + $where .= ' AND qa.preview = 0'; + } + } else if (empty($currentgroup)) { + // We don't care about group, and we to do something funky with attempts + // So do a left join on attempts + $from = 'FROM '.$CFG->prefix.'user u JOIN '.$CFG->prefix.'role_assignments ra ON ra.userid = u.id LEFT JOIN '.$CFG->prefix.'game_attempts qa ON u.id = qa.userid AND qa.gameid = '.$game->id; + $where = " WHERE ra.contextid $contextlists"; + if (empty($noattempts)) { + $where .= ' AND qa.userid IS NOT NULL AND qa.preview = 0'; // show ONLY students with attempts; + } else if ($noattempts == 1) { + // noattempts = 1 means only no attempts, so make the left join ask for only records where the right is null (no attempts) + $where .= ' AND qa.userid IS NULL'; // show ONLY students without attempts; + } else if ($noattempts == 3) { + // we want all attempts + $from = 'FROM '.$CFG->prefix.'user u JOIN '.$CFG->prefix.'game_attempts qa ON u.id = qa.userid '; + $where = ' WHERE qa.gameid = '.$game->id.' AND qa.preview = 0'; + } // noattempts = 2 means we want all students, with or without attempts + } + $countsql = 'SELECT COUNT(DISTINCT('.sql_concat('u.id', '\'#\'', $db->IfNull('qa.attempt', '0')).')) '.$from.$where; + } else { + if (empty($noattempts)) { + $from = 'FROM '.$CFG->prefix.'user u JOIN '.$CFG->prefix.'game_attempts qa ON u.id = qa.userid '; + $where = ' WHERE qa.gameid = '.$game->id.' AND qa.preview = 0'; + $countsql = 'SELECT COUNT(DISTINCT('.sql_concat('u.id', '\'#\'', $db->IfNull('qa.attempt', '0')).')) '.$from.$where; + } + } + if (!$download) { + // Add extra limits due to initials bar + if($table->get_sql_where()) { + $where .= ' AND '.$table->get_sql_where(); + } + + // Count the records NOW, before funky question grade sorting messes up $from + if (!empty($countsql)) { + $totalinitials = count_records_sql($countsql); + if ($table->get_sql_where()) { + $countsql .= ' AND '.$table->get_sql_where(); + } + $total = count_records_sql($countsql); + + } + + // Add extra limits due to sorting by question grade + if($sort = $table->get_sql_sort()) { + $sortparts = explode(',', $sort); + $newsort = array(); + $questionsort = false; + foreach($sortparts as $sortpart) { + $sortpart = trim($sortpart); + if(substr($sortpart, 0, 1) == '$') { + if(!$questionsort) { + $qid = intval(substr($sortpart, 1)); + $select .= ', grade '; + $from .= ' LEFT JOIN '.$CFG->prefix.'question_sessions qns ON qns.attemptid = qa.id '. + 'LEFT JOIN '.$CFG->prefix.'question_states qs ON qs.id = qns.newgraded '; + $where .= ' AND ('.sql_isnull('qns.questionid').' OR qns.questionid = '.$qid.')'; + $newsort[] = 'grade '.(strpos($sortpart, 'ASC')? 'ASC' : 'DESC'); + $questionsort = true; + } + } else { + $newsort[] = $sortpart; + } + } + + // Reconstruct the sort string + $sort = ' ORDER BY '.implode(', ', $newsort); + } + + // Fix some wired sorting + if (empty($sort)) { + //$sort = ' ORDER BY uniqueid'; + $sort = ' ORDER BY qa.id'; + } + + $table->pagesize($pagesize, $total); + } + + // If there is feedback, include it in the query. + if ($hasfeedback) { + $select .= ', qf.feedbacktext '; + $from .= " JOIN {$CFG->prefix}game_feedback AS qf ON " . + "qf.gameid = $game->id AND qf.mingrade <= qa.score * $game->grade AND qa.score * $game->grade < qf.maxgrade"; + } + + // Fetch the attempts + if (!empty($from)) { // if we're in the site course and displaying no attempts, it makes no sense to do the query. + if (!$download) { + $attempts = get_records_sql($select.$from.$where.$sort, + $table->get_page_start(), $table->get_page_size()); + } else { + $attempts = get_records_sql($select.$from.$where.$sort); + } + } else { + $attempts = array(); + } + + + // Build table rows + + if (!$download) { + $table->initialbars($totalinitials>20); + } + if(!empty($attempts) || !empty($noattempts)) { + if ($attempts) { + foreach ($attempts as $attempt) { + + $picture = print_user_picture($attempt->userid, $course->id, $attempt->picture, false, true); + + // uncomment the commented lines below if you are choosing to show unenrolled users and + // have uncommented the corresponding lines earlier in this script + //if (in_array($attempt->userid, $unenrolledusers)) { + // $userlink = ''.fullname($attempt).''; + //} + //else { + $userlink = ''.fullname($attempt).''; + //} + if (!$download) { + $row = array( + '', + $picture, + $userlink, + empty($attempt->attempt) ? '-' : ''.userdate($attempt->timestart, $strtimeformat).'', + empty($attempt->timefinish) ? '-' : ''.userdate($attempt->timefinish, $strtimeformat).'', + empty($attempt->attempt) ? '-' : (empty($attempt->timefinish) ? get_string('unfinished', 'game') : format_time($attempt->duration)) + ); + } else { + $row = array(fullname($attempt), + empty($attempt->attempt) ? '-' : userdate($attempt->timestart, $strtimeformat), + empty($attempt->timefinish) ? '-' : userdate($attempt->timefinish, $strtimeformat), + empty($attempt->attempt) ? '-' : (empty($attempt->timefinish) ? get_string('unfinished', 'game') : format_time($attempt->duration)) + ); + } + + if ($game->grade) { + if (!$download) { + $row[] = $attempt->score === NULL ? '-' : ''.round($attempt->score * $game->grade,$game->decimalpoints).''; + } else { + $row[] = $attempt->score === NULL ? '-' : round($attempt->score * $game->grade,$game->decimalpoints); + } + } + if($detailedmarks) { + if(empty($attempt->attempt)) { + foreach($questionids as $questionid) { + $row[] = '-'; + } + } else { + foreach($questionids as $questionid) { + if ($gradedstateid = get_field('question_sessions', 'newgraded', 'attemptid', $attempt->attemptuniqueid, 'questionid', $questionid)) { + $grade = round(get_field('question_states', 'grade', 'id', $gradedstateid), $game->decimalpoints); + } else { + $grade = '--'; + } + if (!$download) { + $row[] = link_to_popup_window ('/mod/game/reviewquestion.php?state='.$gradedstateid.'&number='.$questions[$questionid]->number, 'reviewquestion', $grade, 450, 650, $strreviewquestion, 'none', true); + } else { + $row[] = $grade; + } + } + } + } + if ($hasfeedback) { + if ($attempt->timefinish) { + $row[] = $attempt->feedbacktext; + } else { + $row[] = '-'; + } + } + if (!$download) { + $table->add_data($row); + } else if ($download == 'Excel' or $download == 'ODS') { + $colnum = 0; + foreach($row as $item){ + $myxls->write($rownum,$colnum,$item,$format); + $colnum++; + } + $rownum++; + } else if ($download=='CSV') { + $text = implode("\t", $row); + echo $text." \n"; + } + } + } + if (!$download) { + // Start form + echo '
    '; + echo '
    '; + echo '
    '; + echo ''; + echo ''; + + // Print table + $table->print_html(); + + // Print "Select all" etc. + if (!empty($attempts)) { + echo ''; + echo '
    '; + echo ''.get_string('selectall', 'game').' / '; + echo ''.get_string('selectnone', 'game').' '; + echo '  '; + $options = array('delete' => get_string('delete')); + echo choose_from_menu($options, 'action', '', get_string('withselected', 'game'), 'if(this.selectedIndex > 0) submitFormById(\'attemptsform\');', '', true); + echo ''; + echo ''; + echo '
    '; + } + // Close form + echo '
    '; + echo '
    '; + + if (!empty($attempts)) { + echo ''; + $options = array(); + $options["id"] = "$cm->id"; + $options["q"] = "$game->id"; + $options["mode"] = "overview"; + $options['sesskey'] = sesskey(); + $options["noheader"] = "yes"; + $options['noattempts'] = $noattempts; + $options['detailedmarks'] = $detailedmarks; + echo '\n"; + echo '\n"; + echo '\n"; + echo "\n"; + echo '
    '; + $options["download"] = "ODS"; + print_single_button("report.php", $options, get_string("downloadods", 'game')); ///check bdaloukas + echo "'; + $options["download"] = "Excel"; + print_single_button("report.php", $options, get_string("downloadexcel")); + echo "'; + $options["download"] = "CSV"; + print_single_button('report.php', $options, get_string("downloadtext")); + echo ""; + helpbutton('overviewdownload', get_string('overviewdownload', 'quiz'), 'quiz'); + echo "
    '; + } + } else if ($download == 'Excel' or $download == 'ODS') { + $workbook->close(); + exit; + } else if ($download == 'CSV') { + exit; + } + + } else { + if (!$download) { + $table->print_html(); + } + } + // Print display options + echo '
    '; + echo '
    '; + echo '
    '; + echo '

    '.get_string('displayoptions', 'game').':

    '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
    '; + $options = array(0 => get_string('attemptsonly','game', $course->students)); + if ($course->id != SITEID) { + $options[1] = get_string('noattemptsonly', 'game', $course->students); + $options[2] = get_string('allstudents','game', $course->students); + $options[3] = get_string('allattempts','game'); + } + choose_from_menu($options,'noattempts',$noattempts,''); + echo '
    '; + echo '
    '; + echo ''; + echo '
    '; + echo '
    '; + echo '
    '; + echo '
    '; + echo "\n"; + + return true; + } +} + +?> diff --git a/restorelib.php b/restorelib.php new file mode 100644 index 0000000..856505e --- /dev/null +++ b/restorelib.php @@ -0,0 +1,784 @@ +id) + // + // Meaning: pk->primary key field of the table + // fk->foreign key to link with parent + // nt->nested field (recursive data) + // SL->site level info + // CL->course level info + // UL->user level info + // files->table may have files + // + //----------------------------------------------------------- + require( 'locallib.php'); + + function game_restore_mods($mod,$restore) { + + global $CFG; + $status = true; + + //Get record from backup_ids + $data = backup_getid($restore->backup_unique_code,$mod->modtype,$mod->id); + + if ($data) { + //Now get completed xmlized object + $info = $data->info; + //if necessary, write to restorelog and adjust date/time fields + if ($restore->course_startdateoffset) { + restore_log_date_changes('Game', $restore, $info['MOD']['#'], array('TIMEOPEN', 'TIMECLOSE')); + } + //Now, build the GAME record structure + $game = new stdClass; + $game->course = $restore->course_id; + + $mod_info = $info[ 'MOD']; + + $fields = array( 'name', 'sourcemodule', 'timeopen', 'timeclose', 'quizid', 'glossaryid', 'glossarycategoryid', 'questioncategoryid', + 'bookid', 'gameinputid', 'gamekind', 'param1', 'param2', 'param3', 'param4', 'param5', 'param6', 'param7', 'param8', + 'timemodified', 'bottomtext', 'grademethod', 'grade', 'decimalpoints', 'review', 'attempts', + 'glossaryid2', 'glossarycategoryid2', 'language'); + game_restore_record( $mod_info, $game, $fields); + + game_recode( $restore->backup_unique_code, $game, 'quizid', 'quiz'); + game_recode( $restore->backup_unique_code, $game, 'glossaryid', 'glossary'); + game_recode( $restore->backup_unique_code, $game, 'glossarycategoryid', 'glossary_categories'); + game_recode( $restore->backup_unique_code, $game, 'glossaryid2', 'glossary'); + game_recode( $restore->backup_unique_code, $game, 'glossarycategoryid2', 'glossary_categories'); + + game_restore_stamp( $info, $restore, $map_question_categories, 'QUESTION_CATEGORIES', 'QUESTION_CATEGORY'); + game_restore_stamp( $info, $restore, $map_questions, 'QUESTIONS', 'QUESTION'); + + game_recode_questioncategoryid( $game, $map_question_categories); + game_recode( $restore->backup_unique_code, $game, 'bookid', 'book'); + + //The structure is equal to the db, so insert the game + $newid = insert_record ("game", $game); + + //Do some output + if (!defined('RESTORE_SILENTLY')) { + echo "
  • ".get_string("modulename","game")." \"".format_string(stripslashes($game->name),true)."\"
  • "; + } + backup_flush(300); + + if ($newid) { + //We have the newid, update backup_ids + backup_putid($restore->backup_unique_code,$mod->modtype, $mod->id, $newid); + + //Now check if want to restore user data and do it. + if (restore_userdata_selected($restore,'game',$mod->id)) { + $status = game_restore_grades( $newid, $info, $restore); + $status = game_restore_snakes_database( $info, $restore); + $status = game_restore_bookquiz_questions( $newid, $info, $restore, $map_question_categories); + + //Restore game_attempts + $status = game_attempts_restore_mods ($newid,$info,$restore, $map_questions); + } + } else { + $status = false; + } + } else { + $status = false; + } + + return $status; + } + + function game_recode( $backup_unique_code, &$rec, $field, $table){ + $data = backup_getid( $backup_unique_code, $table, $rec->$field); + + if( $data != false){ + $rec->$field = $data->new_id; + } + } + + function game_restore_record( $info, &$table, $fields){ + $info = $info[ '#']; + foreach( $fields as $f){ + $table->$f = backup_todb($info[ strtoupper( $f)]['0']['#']); + } + } + + function game_recode_questioncategoryid( &$game, $map_question_categories){ + + $stamp = $map_question_categories[ $game->questioncategoryid]; + + $game->questioncategoryid = get_field_select( 'question_categories', 'id', "stamp='$stamp'"); + } + + //This function restores the quiz_attempts + function game_attempts_restore_mods($newgameid,$info,$restore) { + + global $CFG; + + $status = true; + + //Get the game_attempts array + if (array_key_exists('GAME_ATTEMPTS', $info['MOD']['#'])) { + $attempts = $info['MOD']['#']['GAME_ATTEMPTS']['0']['#']['GAME_ATTEMPT']; + } else { + $attempts = array(); + } + + //Iterate over attempts + for($i = 0; $i < sizeof($attempts); $i++) { + $att_info = $attempts[$i]; + + //We'll need this later!! + $oldid = backup_todb($att_info['#']['ID']['0']['#']); + + //Now, build the ATTEMPTS record structure + $attempt = new stdClass; + $attempt->gameid = $newgameid; + $fields = array( 'userid', 'timestart', 'timefinish', 'timelastattempt', 'lastip', + 'lastremotehost', 'preview', 'attempt', 'score', 'attempts'); + game_restore_record( $att_info, $attempt, $fields); + //We have to recode + game_recode( $restore->backup_unique_code, $attempt, 'userid', 'users'); + + //The structure is equal to the db, so insert the quiz_attempts + $newid = insert_record ("game_attempts", $attempt); + + //Do some output + game_do_some_output( $i); + + if ($newid) { + //We have the newid, update backup_ids + backup_putid($restore->backup_unique_code, "game_attempts", $oldid, $newid); + //Now process game_hangman, game_cross + $status = game_restore_queries( $newgameid, $newid, $att_info, $restore); + $status = game_restore_hangman( $newid, $att_info, $restore); + $status = game_restore_cross( $newid, $att_info, $restore); + $status = game_restore_cryptex( $newid, $att_info, $restore); + $status = game_restore_millionaire( $newid, $att_info, $restore); + $status = game_restore_sudoku( $newid, $att_info, $restore); + $status = game_restore_snakes( $newid, $att_info, $restore); + $status = game_restore_hiddenpicture( $newid, $att_info, $restore); + } else { + $status = false; + } + } + + return $status; + } + + //This function restores the game_snakes_database + function game_restore_snakes_database( $info, $restore) { + + global $CFG; + + $status = true; + //Get the game_attempts array + if (array_key_exists('GAME_SNAKES_DATABASE', $info['MOD']['#'])) { + $recs = $info['MOD']['#']['GAME_SNAKES_DATABASE']['0']['#']['GAME_SNAKES_DATABASE_RECORD']; + } else { + return $status; + } + + //Iterate over snakes_database + for($i = 0; $i < sizeof($recs); $i++) { + $att_info = $recs[$i]; + + //Now, build the game_snakes_database record structure + $snakes_database = new stdClass; + $fields = array( 'id', 'name', 'cols', 'rows', 'data', 'fileboard', 'direction', 'headerx', 'headery', + 'footerx', 'footery', 'width', 'height'); + game_restore_record( $att_info, $snakes_database, $fields); + + if( ($recdb = get_record_select( 'game_snakes_database', "name='{$snakes_database->name}'")) != false){ + backup_putid($restore->backup_unique_code, 'game_snakes_database', $snakes_database->id, $recdb->id); + continue; + } + + //The structure is equal to the db, so insert the quiz_attempts + $newid = insert_record ("game_snakes_database", $snakes_database); + + //Do some output + game_do_some_output( $i); + + if ($newid == false) { + $status = false; + } + } + + return $status; + } + + //This function restores the game_grades + function game_restore_grades($newgameid,$info,$restore) { + + global $CFG; + + $status = true; + //Get the game_attem array + if (array_key_exists('GAME_GRADES', $info['MOD']['#'])) { + $recs = $info['MOD']['#']['GAME_GRADES']['0']['#']['GAME_GRADE']; + } else { + return $status; + } + + //Iterate over game_grades + for($i = 0; $i < sizeof($recs); $i++) { + $att_info = $recs[$i]; + + //Now, build the game_grades record structure + $game_grade = new stdClass; + $game_grade->gameid = $newgameid; + $fields = array( 'userid', 'score', 'timemodified'); + game_restore_record( $att_info, $game_grade, $fields); + + //The structure is equal to the db, so insert the quiz_attempts + $newid = insert_record ("game_grades", $games_grade); + + //Do some output + game_do_some_output( $i); + } + + return $status; + } + + function game_restore_stamp( $info, $restore, &$map, $tags, $tag) { + + global $CFG; + + $map = array(); + + $status = true; + //Get the game_attempt array + if (array_key_exists($tags, $info['MOD']['#'])) { + $recs = $info['MOD']['#'][$tags]['0']['#'][$tag]; + } else { + return $status; + } + + //Iterate + for($i = 0; $i < sizeof($recs); $i++) { + $att_info = $recs[$i]; + + $rec = new stdClass; + $fields = array( 'id', 'stamp'); + game_restore_record( $att_info, $rec, $fields); + + $map[ $rec->id] = $rec->stamp; + } + + return $status; + } + + //This function restores the game_bookquiz_questions + function game_restore_bookquiz_questions($newgameid,$info,$restore, $map_question_categories) { + + global $CFG; + + $status = true; + //Get the c array + if (array_key_exists('GAME_BOOKQUIZ_QUESTIONS', $info['MOD']['#'])) { + $recs = $info['MOD']['#']['GAME_BOOKQUIZ_QUESTIONS']['0']['#']['GAME_BOOKQUIZ_QUESTION']; + } else { + return $status; + } + + //Iterate over game_bookquiz_questions + for($i = 0; $i < sizeof($recs); $i++) { + $att_info = $recs[$i]; + + //Now, build the game_snakes_database record structure + $game_bookquiz_question = new stdClass; + $game_bookquiz_question->gameid = $newgameid; + $fields = array( 'chapterid', 'questioncategoryid'); + game_restore_record( $att_info, $game_bookquiz_question, $fields); + + //We have to recode the some + game_recode( $restore->backup_unique_code, $game_bookquiz_question, 'chapterid', 'book_chapters'); + game_recode_questioncategoryid( $game_bookquiz_question, $map_question_categories); + + //The structure is equal to the db, so insert the game_bookquiz_question + $newid = insert_record ("game_bookquiz_questions", $game_bookquiz_question); + + game_do_some_output( $i); + } + + return $status; + } + + + function game_restore_queries( $newgameid, $newattemptid, $info, $restore) { + + global $CFG; + + $status = true; + //Get the c array + if (array_key_exists('GAME_QUERIES', $info['#'])) { + $recs = $info['#']['GAME_QUERIES']['0']['#']['GAME_QUERY']; + } else { + return $status; + } + + //Iterate over game_queries + for($i = 0; $i < sizeof($recs); $i++) { + $att_info = $recs[$i]; + + //Now, build the game_queries record structure + $game_query = new stdClass; + $game_query->gameid = $newgameid; + $game_query->attemptid = $newattemptid; + $fields = array( 'gamekind', 'userid', 'sourcemodule','questionid', + 'glossaryentryid', 'questiontext', 'score', 'timelastattempt', 'studentanswer', + 'col', 'row', 'horizontal', 'answertext', 'correct'); + game_restore_record( $att_info, $game_query, $fields); + + //We have to recode the some + game_recode( $restore->backup_unique_code, $game_query, 'userid', 'users'); + game_recode( $restore->backup_unique_code, $game_query, 'questionid', 'questions'); + game_recode( $restore->backup_unique_code, $game_query, 'glossaryentryid', 'glossary_entries'); + + //The structure is equal to the db, so insert the game_bookquiz_question + $newid = insert_record ("game_queries", $game_query); + } + + return $status; + } + + function game_do_some_output( $i){ + //Do some output + if (defined('RESTORE_SILENTLY')) { + return; + } + + if( ($i+1) % 100 == 0){ + return; + } + + echo "."; + if (($i+1) % 200*100 == 0) { + echo "
    "; + } + + backup_flush( 300); + } + + //This function restores the game_hangman + function game_restore_hangman( $newattemptid, $info, $restore) { + + global $CFG; + + $status = true; + + + //Get the game_hangman array + if (array_key_exists('GAME_HANGMAN', $info['#'])) { + $info = $info['#']['GAME_HANGMAN'][ 0]; + } else { + return $status; + } + + //Now, build the game_hangman record structure + $game_hangman = new stdClass; + $game_hangman->id = $newattemptid; + $fields = array( 'queryid', 'letters', 'allletters', 'try', 'maxtries', 'finishedword', 'corrects', 'iscorrect'); + game_restore_record( $info, $game_hangman, $fields); + + //We have to recode the some + game_recode( $restore->backup_unique_code, $game_hangman, 'queryid', 'game_queries'); + + //The structure is equal to the db, so insert the game_hangman + if( ( game_insert_record ("game_hangman", $game_hangman) == false)){ + $status = false; + } + return $status; + } + + //This function restores the game_hiddenpicture + function game_restore_hiddenpicture( $newattemptid, $info, $restore) { + + global $CFG; + + $status = true; + + + //Get the game_hiddenpicture array + if (array_key_exists('GAME_HIDDENPICTURE', $info['#'])) { + $info = $info['#']['GAME_HIDDENPICTURE'][ 0]; + } else { + return $status; + } + + //Now, build the game_hiddenpicture record structure + $game_hiddenpicture = new stdClass; + $game_hiddenpicture->id = $newattemptid; + $fields = array( 'correct', 'wrong', 'found'); + game_restore_record( $info, $game_hiddenpicture, $fields); + + //The structure is equal to the db, so insert the game_hiddenpicture + if( ( game_insert_record ("game_hiddenpicture", $game_hiddenpicture) == false)){ + $status = false; + } + return $status; + } + + //This function restores the game_cross + function game_restore_cross( $newattemptid, $info, $restore) { + + global $CFG; + + $status = true; + + //Get the game_cross array + if (array_key_exists('GAME_CROSS', $info['#'])) { + $info = $info['#']['GAME_CROSS'][ 0]; + } else { + return $status; + } + + //Now, build the game_cross record structure + $game_cross = new stdClass; + $game_cross->id = $newattemptid; + $fields = array( 'cols', 'rows', 'words', 'wordsall', 'createscore', 'createtries', + 'createtimelimit', 'createconnectors', 'createfilleds', 'createspaces'); + game_restore_record( $info, $game_cross, $fields); + + //The structure is equal to the db, so insert the game_hangman + if( ( game_insert_record ("game_cross", $game_cross) == false)){ + $status = false; + } + return $status; + } + + //This function restores the game_cryptex + function game_restore_cryptex( $newattemptid, $info, $restore) { + + global $CFG; + + $status = true; + + //Get the game_cryptex array + if (array_key_exists('GAME_CRYPTEX', $info['#'])) { + $info = $info['#']['GAME_CRYPTEX'][ 0]; + } else { + return $status; + } + + //Now, build the game_cryptex record structure + $game_cryptex = new stdClass; + $game_cryptex->id = $newattemptid; + $fields = array( 'letters'); + game_restore_record( $info, $game_cryptex, $fields); + + //The structure is equal to the db, so insert the game_cryptex + if( ( game_insert_record ("game_cryptex", $game_cryptex) == false)){ + $status = false; + } + return $status; + } + + //This function restores the game_millionaire + function game_restore_millionaire( $newattemptid, $info, $restore) { + + global $CFG; + + $status = true; + + //Get the game_cryptex array + if (array_key_exists('GAME_MILLIONAIRE', $info['#'])) { + $info = $info['#']['GAME_MILLIONAIRE'][ 0]; + } else { + return $status; + } + + //Now, build the game_millionaire record structure + $game_millionaire = new stdClass; + $game_millionaire->id = $newattemptid; + $fields = array( 'queryid', 'state', 'level'); + game_restore_record( $info, $game_millionaire, $fields); + + //We have to recode the some + game_recode( $restore->backup_unique_code, $game_millionaire, 'queryid', 'game_queries'); + + //The structure is equal to the db, so insert the game_millionaire + if( ( game_insert_record ("game_millionaire", $game_millionaire) == false)){ + $status = false; + } + return $status; + } + + //This function restores the game_sudoku + function game_restore_sudoku( $newattemptid, $info, $restore) { + + global $CFG; + + $status = true; + + //Get the game_cryptex array + if (array_key_exists('GAME_SUDOKU', $info['#'])) { + $info = $info['#']['GAME_SUDOKU'][ 0]; + } else { + return $status; + } + + //Now, build the game_cryptex record structure + $game_sudoku = new stdClass; + $game_sudoku->id = $newattemptid; + $fields = array( 'level', 'data', 'opened', 'guess'); + game_restore_record( $info, $game_sudoku, $fields); + + //The structure is equal to the db, so insert the game_sudoku + if( ( game_insert_record ("game_sudoku", $game_sudoku) == false)){ + $status = false; + } + return $status; + } + + //This function restores the game_snakes + function game_restore_snakes( $newattemptid, $info, $restore) { + + global $CFG; + + $status = true; + + //Get the game_snakes array + if (array_key_exists('GAME_SNAKES', $info['#'])) { + $info = $info['#']['GAME_SNAKES'][ 0]; + } else { + return $status; + } + + //Now, build the game_snakes record structure + $game_snakes = new stdClass; + $game_snakes->id = $newattemptid; + $fields = array( 'snakesdatabaseid', 'queryid', 'position', 'dice'); + game_restore_record( $info, $game_snakes, $fields); + + //We have to recode the some + game_recode( $restore->backup_unique_code, $game_snakes, 'queryid', 'game_queries'); + game_recode( $restore->backup_unique_code, $game_snakes, 'snakesdatabaseid', 'game_snakes_database'); + + //The structure is equal to the db, so insert the game_snakes + if( ( game_insert_record ("game_snakes", $game_snakes) == false)){ + $status = false; + } + return $status; + } + + //This function returns a log record with all the necessay transformations + //done. It's used by restore_log_module() to restore modules log. + function game_restore_logs($restore,$log) { + + $status = false; + + //Depending of the action, we recode different things + switch ($log->action) { + case "add": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + $log->url = "view.php?id=".$log->cmid; + $log->info = $mod->new_id; + $status = true; + } + } + break; + case "update": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + $log->url = "view.php?id=".$log->cmid; + $log->info = $mod->new_id; + $status = true; + } + } + break; + case "view": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + $log->url = "view.php?id=".$log->cmid; + $log->info = $mod->new_id; + $status = true; + } + } + break; + case "view all": + $log->url = "index.php?id=".$log->course; + $status = true; + break; + case "report": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + $log->url = "report.php?id=".$log->cmid; + $log->info = $mod->new_id; + $status = true; + } + } + break; + case "attempt": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + //Extract the attempt id from the url field + $attid = substr(strrchr($log->url,"="),1); + //Get the new_id of the attempt (to recode the url field) + $att = backup_getid($restore->backup_unique_code,"game_attempts",$attid); + if ($att) { + $log->url = "review.php?id=".$log->cmid."&attempt=".$att->new_id; + $log->info = $mod->new_id; + $status = true; + } + } + } + break; + case "submit": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + //Extract the attempt id from the url field + $attid = substr(strrchr($log->url,"="),1); + //Get the new_id of the attempt (to recode the url field) + $att = backup_getid($restore->backup_unique_code,"game_attempts",$attid); + if ($att) { + $log->url = "review.php?id=".$log->cmid."&attempt=".$att->new_id; + $log->info = $mod->new_id; + $status = true; + } + } + } + break; + case "review": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + //Extract the attempt id from the url field + $attid = substr(strrchr($log->url,"="),1); + //Get the new_id of the attempt (to recode the url field) + $att = backup_getid($restore->backup_unique_code,"game_attempts",$attid); + if ($att) { + $log->url = "review.php?id=".$log->cmid."&attempt=".$att->new_id; + $log->info = $mod->new_id; + $status = true; + } + } + } + break; + case "editquestions": + if ($log->cmid) { + //Get the new_id of the module (to recode the url field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + $log->url = "view.php?id=".$log->cmid; + $log->info = $mod->new_id; + $status = true; + } + } + break; + case "preview": + if ($log->cmid) { + //Get the new_id of the module (to recode the url field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + $log->url = "attempt.php?id=".$log->cmid; + $log->info = $mod->new_id; + $status = true; + } + } + break; + case "start attempt": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + //Extract the attempt id from the url field + $attid = substr(strrchr($log->url,"="),1); + //Get the new_id of the attempt (to recode the url field) + $att = backup_getid($restore->backup_unique_code,"game_attempts",$attid); + if ($att) { + $log->url = "review.php?id=".$log->cmid."&attempt=".$att->new_id; + $log->info = $mod->new_id; + $status = true; + } + } + } + break; + case "close attempt": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + //Extract the attempt id from the url field + $attid = substr(strrchr($log->url,"="),1); + //Get the new_id of the attempt (to recode the url field) + $att = backup_getid($restore->backup_unique_code,"game_attempts",$attid); + if ($att) { + $log->url = "review.php?id=".$log->cmid."&attempt=".$att->new_id; + $log->info = $mod->new_id; + $status = true; + } + } + } + break; + case "continue attempt": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + //Extract the attempt id from the url field + $attid = substr(strrchr($log->url,"="),1); + //Get the new_id of the attempt (to recode the url field) + $att = backup_getid($restore->backup_unique_code,"game_attempts",$attid); + if ($att) { + $log->url = "review.php?id=".$log->cmid."&attempt=".$att->new_id; + $log->info = $mod->new_id; + $status = true; + } + } + } + break; + case "continue attemp": + if ($log->cmid) { + //Get the new_id of the module (to recode the info field) + $mod = backup_getid($restore->backup_unique_code,$log->module,$log->info); + if ($mod) { + //Extract the attempt id from the url field + $attid = substr(strrchr($log->url,"="),1); + //Get the new_id of the attempt (to recode the url field) + $att = backup_getid($restore->backup_unique_code,"game_attempts",$attid); + if ($att) { + $log->url = "review.php?id=".$log->cmid."&attempt=".$att->new_id; + $log->info = $mod->new_id; + $log->action = "continue attempt"; //To recover some bad actions + $status = true; + } + } + } + break; + default: + if (!defined('RESTORE_SILENTLY')) { + echo "action (".$log->module."-".$log->action.") unknown. Not restored
    "; //Debug + } + break; + } + + if ($status) { + $status = $log; + } + return $status; + } + +?> diff --git a/review.php b/review.php new file mode 100644 index 0000000..3535281 --- /dev/null +++ b/review.php @@ -0,0 +1,379 @@ +course, $USER->id)){ + error( get_string( 'only_teachers', 'game')); + } + + $currenttab = 'reports'; + include( 'tabs.php'); + + $attemptid = required_param('attempt', PARAM_INT); // A particular attempt ID for review + + if( $game->sourcemodule == 'glossary'){ + game_review_glossary( $game, $attemptid); + print_footer(); + die; + } + + function game_repair_queries( $game, &$rec){ + if($game->gamekind == 'sudoku'){ + if( $rec->sourcemodule == 'glossary') + { + $rec2 = get_record_select( 'glossary_entries', 'id='.$rec->glossaryentryid, 'id,concept,definition'); + $rec->questiontext = $rec2->concept; + $rec->answertext = $rec2->definition; + }else + { + $rec2 = get_record_select( 'question', 'id='.$rec->questionid, 'id,questiontext'); + $rec->questiontext = $rec2->questiontext; + //$rec2 = get_record_select( 'question', 'id='.$rec->question, 'id,questiontext'); + //$rec->answertext = $rec2->definition; + } + } + } + + require_once($CFG->libdir."/questionlib.php"); + + $attempt = required_param('attempt', PARAM_INT); // A particular attempt ID for review + $page = optional_param('page', 0, PARAM_INT); // The required page + $showall = optional_param('showall', 0, PARAM_BOOL); + + if (! $attempt = get_record("game_attempts", "id", $attempt)) { + error("No such attempt ID exists"); + } + if (! $game = get_record("game", "id", $attempt->gameid)) { + error("The game with id $attempt->gameid belonging to attempt $attempt is missing"); + } + + game_compute_attempt_layout( $game, $attempt); + + if (! $course = get_record("course", "id", $game->course)) { + error("The course with id $game->course that the game with id $game->id belongs to is missing"); + } + if (! $cm = get_coursemodule_from_instance("game", $game->id, $course->id)) { + error("The course module for the game with id $game->id is missing"); + } + + $grade = game_score_to_grade( $attempt->score, $game); + $feedback = game_feedback_for_grade( $grade, $attempt->gameid); + + require_login( $course->id, false, $cm); + $context = get_context_instance( CONTEXT_MODULE, $cm->id); + $coursecontext = get_context_instance( CONTEXT_COURSE, $cm->course); + $isteacher = isteacher( $game->course, $USER->id); + $options = game_get_reviewoptions( $game, $attempt, $context); + + add_to_log($course->id, "game", "review", "review.php?id=$cm->id&attempt=$attempt->id", "$game->id", "$cm->id"); + +/// Print the page header + + $strgames = get_string('modulenameplural', 'game'); + $strreview = get_string('review', 'game'); + $strscore = get_string('score', 'game'); + $strgrade = get_string('grade'); + $strbestgrade = get_string('bestgrade', 'quiz'); + $strtimetaken = get_string('timetaken', 'game'); + $strtimecompleted = get_string('completedon', 'game'); + + + $strupdatemodule = has_capability('moodle/course:manageactivities', $coursecontext) + ? update_module_button($cm->id, $course->id, get_string('modulename', 'game')) + : ""; + + $strgames = get_string('modulenameplural', 'game'); + $strgame = get_string('modulename', 'game'); + /* + if( function_exists( 'build_navigation')){ + $navigation = build_navigation('', $cm); + print_header("$course->shortname: $game->name", "$course->shortname: $game->name", $navigation, + "", "", true, update_module_button($cm->id, $course->id, $strgame), + navmenu($course, $cm)); + }else{ + if ($course->category) { + $navigation = "wwwroot}/course/view.php?id=$course->id\">$course->shortname ->"; + } else { + $navigation = ''; + } + print_header("$course->shortname: $game->name", "$course->fullname", + "$navigation id>$strgames -> $game->name", + "", "", true, update_module_button($cm->id, $course->id, $strgame), + navmenu($course, $cm)); + } +*/ + echo ''; // for overlib +/// Print heading and tabs if this is part of a preview + //if (has_capability('mod/game:preview', $context)) { + /* if ($attempt->userid == $USER->id) { // this is the report on a preview + $currenttab = 'preview'; + } else { + $currenttab = 'reports'; + $mode = ''; + } + include('tabs.php'); + //} else { + // print_heading(format_string($game->name)); + //} +*/ +/// Load all the questions and states needed by this script + + // load the questions needed by page + $pagelist = $showall ? game_questions_in_game( $attempt->layout) : game_questions_on_page( $attempt->layout, $page); + $a = explode( ',', $pagelist); + $pagelist = ''; + foreach( $a as $item){ + if( substr( $item, 0, 1)){ + if( substr( $item, -1) != 'G'){ + $pagelist .= ','.$item; + } + } + } + $pagelist = substr( $pagelist, 1); + + if( $pagelist != ''){ + $sql = "SELECT q.*, i.id AS instance,i.id as iid,". + "i.score AS score,i.studentanswer". + " FROM {$CFG->prefix}question q,". + " {$CFG->prefix}game_queries i". + " WHERE i.attemptid = '$attempt->id' AND q.id = i.questionid AND (i.sourcemodule='question' or i.sourcemodule = 'quiz')". + " AND q.id IN ($pagelist)"; + + if (!$questions = get_records_sql( $sql)) { + error('No questions found'); + } + }else + { + $questions = array(); + } + + // Load the question type specific information + if (!get_question_options( $questions)) { + error('Could not load question options'); + } + + $states = game_compute_states( $game, $questions); +/// Print infobox + + //$timelimit = (int)$game->timelimit * 60; + $timelimit = 0; + $overtime = 0; + + if ($attempt->timefinish) { + if ($timetaken = ($attempt->timefinish - $attempt->timestart)) { + if($timelimit && $timetaken > ($timelimit + 60)) { + $overtime = $timetaken - $timelimit; + $overtime = format_time($overtime); + } + $timetaken = format_time($timetaken); + } else { + $timetaken = "-"; + } + } else { + $timetaken = get_string('unfinished', 'game'); + } + + $table->align = array("right", "left"); + if ($attempt->userid <> $USER->id) { + $student = get_record('user', 'id', $attempt->userid); + $picture = print_user_picture($student->id, $course->id, $student->picture, false, true); + $table->data[] = array($picture, ''.fullname($student, true).''); + } + //if (has_capability('mod/game:grade', $context)){ + if( count($attempts = get_records_select('game_attempts', "gameid = '$game->id' AND userid = '$attempt->userid'", 'attempt ASC')) > 1) { + // print list of attempts + $attemptlist = ''; + foreach ($attempts as $at) { + $attemptlist .= ($at->id == $attempt->id) + ? ''.$at->attempt.', ' + : ''.$at->attempt.', '; + } + $table->data[] = array(get_string('attempts', 'game').':', trim($attemptlist, ' ,')); + } + //} + + $table->data[] = array(get_string('startedon', 'game').':', userdate($attempt->timestart)); + if ($attempt->timefinish) { + $table->data[] = array("$strtimecompleted:", userdate($attempt->timefinish)); + $table->data[] = array("$strtimetaken:", $timetaken); + } + //if the student is allowed to see their score + if ($options->scores) { + if ($game->grade) { + if($overtime) { + $result->sumgrades = "0"; + $result->grade = "0.0"; + } + + $a = new stdClass; + $percentage = round($attempt->score*100, 0); + $a->grade = game_score_to_grade( $attempt->score, $game); + $a->maxgrade = $game->grade; + $table->data[] = array("$strscore:", "{$a->grade}/{$game->grade} ($percentage %)"); + //$table->data[] = array("$strgrade:", get_string('outof', 'game', $a)); + } + } + if ($options->overallfeedback && $feedback) { + $table->data[] = array(get_string('feedback', 'game'), $feedback); + } + if ($isteacher and $attempt->userid == $USER->id) { + // the teacher is at the end of a preview. Print button to start new preview + unset($buttonoptions); + $buttonoptions['q'] = $game->id; + $buttonoptions['forcenew'] = true; + echo '
    '; + print_single_button($CFG->wwwroot.'/mod/game/attempt.php', $buttonoptions, get_string('startagain', 'game')); + echo '
    '; + } else { // print number of the attempt + print_heading(get_string('reviewofattempt', 'game', $attempt->attempt)); + } + print_table($table); + + // print javascript button to close the window, if necessary + if (!$isteacher) { + include('attempt_close_js.php'); + } + +/// Print the navigation panel if required + $numpages = game_number_of_pages( $attempt->layout); + if ($numpages > 1 and !$showall) { + print_paging_bar($numpages, $page, 1, 'review.php?attempt='.$attempt->id.'&'); + echo ''; + } + +/// Print all the questions + if( $pagelist){ + game_print_questions( $pagelist, $attempt, $questions, $options, $states, $game); + } + + // Print the navigation panel if required + if ($numpages > 1 and !$showall) { + print_paging_bar($numpages, $page, 1, 'review.php?attempt='.$attempt->id.'&'); + } + + // print javascript button to close the window, if necessary + if (!$isteacher) { + include('attempt_close_js.php'); + } + + print_footer($course); + + function game_compute_states( $game, $questions) + { + global $QTYPES; + + // Restore the question sessions to their most recent states + // creating new sessions where required + + $states = array(); + foreach ($questions as $question) { + $state = new StdClass; + + $cmoptions->course = $game->course; + $cmoptions->optionflags->optionflags = 0; + $cmoptions->id = 0; + $cmoptions->shuffleanswers = 1; + + $state->last_graded = new StdClass; + $state->last_graded->event = QUESTION_EVENTOPEN; + + $state->raw_grade = 0; + + $attempt = 0; + if (!$QTYPES[$question->qtype]->create_session_and_responses( $question, $state, $cmoptions, $attempt)) { + error( 'game_compute_states: problem'); + } + + $state->event = QUESTION_EVENTOPEN; + //$question->maxgrade = 100; + $state->manualcomment = ''; + + $state->responses = array( '' => $question->studentanswer); + $state->attempt = $question->iid; + + $states[ $question->id] = $state; + } + return $states; + } + + + + function game_print_questions( $pagelist, $attempt, $questions, $options, $states, $game) + { + $pagequestions = explode(',', $pagelist); + $number = game_first_questionnumber( $attempt->layout, $pagelist); + foreach ($pagequestions as $i) { + if (!isset($questions[$i])) { + print_simple_box_start('center', '90%'); + echo '' . $number . '
    '; + notify(get_string('errormissingquestion', 'quiz', $i)); + print_simple_box_end(); + $number++; // Just guessing that the missing question would have lenght 1 + continue; + } + $options->validation = QUESTION_EVENTVALIDATE === $states[$i]->event; + //$options->history = ($isteacher and !$attempt->preview) ? 'all' : 'graded'; + $options->history = false; + unset( $options->questioncommentlink); + // Print the question + if ($i > 0) { + echo "
    \n"; + } + $questions[$i]->maxgrade = 0; + + $options->correct_responses = 0; + $options->feedback = 0; + $options->readonly = 0; + + global $QTYPES; + + unset( $cmoptions); + $cmoptions->course = $game->course; + $cmoptions->optionflags->optionflags = 0; + $cmoptions->id = 0; + $cmoptions->shuffleanswers = 1; + $attempt = 0; + $question = $questions[ $i]; + if (!$QTYPES[$question->qtype]->create_session_and_responses( $question, $state, $cmoptions, $attempt)) { + error( 'game_sudoku_showquestions_quiz: problem'); + } + $cmoptions->optionflags = 0; + print_question( $question, $states[$i], $number, $cmoptions, $options); + $number += $questions[$i]->length; + } + } + + function game_review_glossary( $game, $attemptid){ + echo '
    '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + $fields = 'id,questiontext,studentanswer,answertext,score,sourcemodule,questionid'; + $recs = get_records_select( 'game_queries', 'attemptid='.$attemptid, 'id', $fields); + if( $recs){ + foreach( $recs as $rec){ + echo ''; + game_repair_queries( $game, $rec); + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + } + echo '
    '.get_string( 'question').''.get_string( 'answer').''.get_string( 'student').''.get_string( 'grade').'
    '.$rec->questiontext.''.$rec->answertext.''.$rec->studentanswer.''.(round(100*$rec->score) >=1 ? round($rec->score*100, 0).' %' : '').'
    '; + } diff --git a/showanswers.php b/showanswers.php new file mode 100644 index 0000000..4dfe796 --- /dev/null +++ b/showanswers.php @@ -0,0 +1,374 @@ +course, $USER->id)){ + error( get_string( 'only_teachers', 'game')); + } + + $currenttab = 'answers'; + + include('tabs.php'); + + $action = optional_param('action', "", PARAM_ALPHANUM); // action + if( $action == 'delstats') + delete_records('game_repetitions', 'gameid', $game->id, 'userid', $USER->id); + if( $action == 'computestats') + game_compute_repetitions($game); + + echo ''.get_string('repetitions', 'game').':   '; + echo get_string('user').': '; + game_showusers($game); + echo "  wwwroot/mod/game/showanswers.php?q=$q&action=delstats\">".get_string('clearrepetitions','game').''; + echo "   wwwroot/mod/game/showanswers.php?q=$q&action=computestats\">".get_string('computerepetitions','game').''; + echo '

    '; + + game_showanswers( $game, false); + print_footer(); + +function game_compute_repetitions($game){ + global $CFG, $USER; + + delete_records('game_repetitions', 'gameid', $game->id,'userid',$USER->id); + + $sql = "INSERT INTO {$CFG->prefix}game_repetitions( gameid,userid,questionid,glossaryentryid,repetitions) ". + "SELECT $game->id,$USER->id,questionid,glossaryentryid,COUNT(*) ". + "FROM {$CFG->prefix}game_queries WHERE gameid=$game->id AND userid=$USER->id GROUP BY questionid,glossaryentryid"; + + if( !execute_sql( $sql, false)) + error('Problem on computing statistics for repetitions'); +} + +function game_showusers($game) +{ + global $CFG, $USER; + + $users = array(); + + $context = get_context_instance(CONTEXT_COURSE, $game->course); + + if ($courseusers = get_course_users( $game->course)) { + foreach ($courseusers as $courseuser) { + $users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context)); + } + } + if ($guest = get_guest()) { + $users[$guest->id] = fullname($guest); + } + + $userid = optional_param('userid',$USER->id,PARAM_INT); + + ?> + + gamekind == 'bookquiz' and $existsbook){ + showanswers_bookquiz( $game); + return; + } + + switch( $game->sourcemodule){ + case 'question': + showanswers_question( $game); + break; + case 'glossary': + showanswers_glossary( $game); + break; + case 'quiz': + showanswers_quiz( $game); + break; + } +} + +function showanswers_appendselect( $game) +{ + switch( $game->gamekind){ + case 'hangman': + case 'cross': + case 'crypto': + return " AND qtype='shortanswer'"; + case 'millionaire': + return " AND qtype = 'multichoice'"; + case 'sudoku': + case 'bookquiz': + case 'snakes': + return " AND qtype in ('shortanswer', 'truefalse', 'multichoice')"; + } + + return ''; +} + +function showanswers_question( $game) +{ + if( $game->gamekind != 'bookquiz'){ + $select = ' category='.$game->questioncategoryid; + + if( $game->subcategories){ + $cats = question_categorylist( $game->questioncategoryid); + if( strpos( $cats, ',') > 0){ + $select = ' category in ('.$cats.')'; + } + } + }else + { + $select = ''; + $recs = get_records_select( 'question_categories', '', '', '*', 0, 1); + foreach( $recs as $rec){ + if( array_key_exists( 'course', $rec)){ + $select = "course=$game->course"; + }else{ + $context = get_context_instance(50, $game->course); + $select = "contextid in ($context->id)"; + } + break; + } + $select2 = ''; + if( $recs = get_records_select( 'question_categories', $select, 'id,id')){ + foreach( $recs as $rec){ + $select2 .= ','.$rec->id; + } + } + $select = ' category IN ('.substr( $select2, 1).')'; + } + + $select .= ' AND hidden = 0 '; + $select .= showanswers_appendselect( $game); + + $showcategories = ($game->gamekind == 'bookquiz'); + $order = ($showcategories ? 'category,questiontext' : 'questiontext'); + showanswers_question_select( $game, 'question q', $select, '*', $order, $showcategories, $game->course); +} + + +function showanswers_quiz( $game) +{ + global $CFG; + + $select = "quiz='$game->quizid' ". + " AND qzi.question=q.id". + " AND q.hidden=0". + showanswers_appendselect( $game); + $table = "question q,{$CFG->prefix}quiz_question_instances qzi"; + + showanswers_question_select( $game, $table, $select, "q.*", 'category,questiontext', false, $game->course); +} + + +function showanswers_question_select( $game, $table, $select, $fields='*', $order='questiontext', $showcategoryname=false, $courseid=0) +{ + global $CFG; + + if( ($questions = get_records_select( $table, $select, $order, $fields)) === false){ + return; + } + + $table .= ",{$CFG->prefix}game_repetitions gr"; + $select .= " AND gr.questionid=q.id AND gr.glossaryentryid=0 AND gr.gameid=".$game->id; + $userid = optional_param('userid',0,PARAM_INT); + if( $userid) + $select .= " AND gr.userid=$userid"; + $sql = "SELECT q.id as id,SUM(repetitions) as c FROM {$CFG->prefix}$table WHERE $select GROUP BY q.id"; + $reps = get_records_sql( $sql); + + $categorynames = array(); + if( $showcategoryname){ + $select = ''; + $recs = get_records_select( 'question_categories', '', '', '*', 0, 1); + foreach( $recs as $rec){ + if( array_key_exists( 'course', $rec)){ + $select = "course=$courseid"; + }else{ + $context = get_context_instance(50, $courseid); + $select = " contextid in ($context->id)"; + } + break; + } + + if( ($categories = get_records_select( 'question_categories', $select, '', 'id,name'))){ + foreach( $categories as $rec){ + $categorynames[ $rec->id] = $rec->name; + } + } + } + + echo ''; + echo ''; + if( $showcategoryname){ + echo ''; + } + echo ''; + echo ''; + echo ''; + if( $reps) + echo ''; + echo "\r\n"; + $line = 0; + foreach( $questions as $question){ + echo ''; + echo ''; + + if( $showcategoryname){ + echo ''; + } + + echo ''; + + switch( $question->qtype){ + case 'shortanswer': + $recs = get_records_select( 'question_answers', "question=$question->id", 'fraction DESC', 'id,answer,feedback'); + if( $recs == false){ + $rec = false; + }else{ + foreach( $recs as $rec) + break; + } + echo ""; + if( $rec->feedback == '') + $rec->feedback = ' '; + echo ""; + break; + case 'multichoice': + case 'truefalse': + $recs = get_records_select( 'question_answers', "question=$question->id"); + $feedback = ''; + echo ''; + if( $feedback == '') + $feedback = ' '; + echo ""; + break; + default: + echo ""; + if( $feedback == '') + $feedback = ' '; + echo ""; + break; + } + //Show repetitions + if( $reps){ + if( array_key_exists( $question->id, $reps)){ + $rep = $reps[ $question->id]; + echo ''; + }else + echo ''; + } + echo "\r\n"; + } + echo "
    '.get_string( 'categories', 'quiz').''.get_string( 'questions', 'quiz').''.get_string( 'answers', 'quiz').''.get_string( 'feedbacks', 'game').''.get_string( 'repetitions', 'game').'
    '.(++$line); + echo ''; + if( array_key_exists( $question->category, $categorynames)){ + echo $categorynames[ $question->category]; + }else{ + echo ' '; + } + echo ''; + echo "wwwroot/question/question.php?inpopup=1&id=$question->id&courseid=$courseid\" target=\"_blank\">wwwroot/pix/t/edit.gif\" alt=\"Edit\" /> "; + echo $question->questiontext.'$rec->answer$rec->feedback'; + $i = 0; + foreach( $recs as $rec){ + if( $i++ > 0) + echo '
    '; + if( $rec->fraction == 1){ + echo " $rec->answer"; + if( $rec->feedback == '') + $feedback .= '
    '; + else + $feedback .= "$rec->feedback
    "; + + }else + { + echo " $rec->answer"; + if( $rec->feedback == '') + $feedback .= '
    '; + else + $feedback .= "
    "; + } + } + echo '
    $feedback$question->qtype$feedback
    '.$rep->c.'
     

    \r\n\r\n"; +} + +function showanswers_glossary( $game) +{ + global $CFG; + + $table = 'glossary_entries ge'; + $select = "glossaryid={$game->glossaryid}"; + if( $game->glossarycategoryid){ + $select .= " AND gec.entryid = ge.id ". + " AND gec.categoryid = {$game->glossarycategoryid}"; + $table .= ",{$CFG->prefix}glossary_entries_categories gec"; + } + + if( ($questions = get_records_select( $table, $select, 'definition', "ge.id,definition,concept")) === false){ + return; + } + + //Show repetiotions of questions + $table = "glossary_entries ge, {$CFG->prefix}game_repetitions gr"; + $select = "glossaryid={$game->glossaryid} AND gr.glossaryentryid=ge.id AND gr.gameid=".$game->id; + $userid = optional_param('userid',0,PARAM_INT); + if( $userid) + $select .= " AND gr.userid=$userid"; + if( $game->glossarycategoryid){ + $select .= " AND gec.entryid = ge.id ". + " AND gec.categoryid = {$game->glossarycategoryid}"; + $table .= ",{$CFG->prefix}glossary_entries_categories gec"; + } + $sql = "SELECT ge.id,SUM(repetitions) as c FROM {$CFG->prefix}$table WHERE $select GROUP BY ge.id"; + $reps = get_records_sql( $sql); + + echo ''; + echo ''; + echo ''; + echo ''; + if( $reps != false) + echo ''; + echo "\r\n"; + $line = 0; + foreach( $questions as $question){ + echo ''; + echo ''; + + echo ''; + echo ''; + if( $reps != false){ + if( array_key_exists( $question->id, $reps)) + { + $rep = $reps[ $question->id]; + echo ''; + }else + echo ''; + } + echo "\r\n"; + } + echo "
    '.get_string( 'questions', 'quiz').''.get_string( 'answers', 'quiz').''.get_string( 'repetitions', 'game').'
    '.(++$line); + echo ''.$question->definition.''.$question->concept.'
    '.$rep->c.'
     

    \r\n\r\n"; +} + +function showanswers_bookquiz( $game) +{ + global $CFG; + + $select = "{$CFG->prefix}game_bookquiz_questions.questioncategoryid={$CFG->prefix}question.category ". + " AND {$CFG->prefix}game_bookquiz_questions.bookid = $game->bookid". + " AND {$CFG->prefix}book_chapters.id = {$CFG->prefix}game_bookquiz_questions.chapterid"; + $table = "question,{$CFG->prefix}game_bookquiz_questions,{$CFG->prefix}book_chapters"; + + showanswers_question_select( $game, $table, $select, "{$CFG->prefix}question.*", "{$CFG->prefix}book_chapters.pagenum,questiontext"); +} diff --git a/snakes/1/dice1.png b/snakes/1/dice1.png new file mode 100644 index 0000000000000000000000000000000000000000..6513f664834486da6191122f3180baa144a5a243 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^h9Jzu3?%tJt?UOfKvo07L+6Hv&&)5S4F<9u=gPir#+8(ScYzR2A6Bb=oYoqJX+J+Wua)F&SU md?imlfI}TDI*>AW+EG)5S4F<9u=gPir#+8(ScYzR2A6Bb=oQo!hx)if_x(inIv{ zK2dgBgI{CgTe~DWM4f;R`z$ literal 0 HcmV?d00001 diff --git a/snakes/1/dice3.png b/snakes/1/dice3.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff4585e3bcaa597af7fad7c6de6a712531a0409 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^h9Jzu3?%tJt?UOfK9)Va*M7bxWE>EaloaXvYLr?r`ZjV+KxUu16k5zbPD&h1fKqyRC0l3KX*Rba4#PIG>!r)7s3y#umt;FEY3N2xqB6=XS0`F|5y8*UsX4 v)Sxk`V#TrvZ>LQ>BfaKhgZ|ZpOZ*wa&29v%2z}cHG=#y^)z4*}Q$iB}CrvyP literal 0 HcmV?d00001 diff --git a/snakes/1/dice5.png b/snakes/1/dice5.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5550cf7ed3f5889e67d77d4968bc02cd3aef1f GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^h9Jzu3?%tJt?UOfJv-#A~a9Vq1H>EaloaXvYLr?r`ZjV+KxUu16k5zbPD&h1=>VpyNGuARm8 zs6k^=#foJU-imQm1bR=bjMP5)c;PIkaC@F>6$hrj3b>@sP?vgZ;Xf_$OF$DDJYD@< J);T3K0RV6`LEHcU literal 0 HcmV?d00001 diff --git a/snakes/1/dice6.png b/snakes/1/dice6.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2574709532e93138bb4c73a36beec80b0af39b GIT binary patch literal 990 zcmWktJ&09j5IxJH8&?+zArNJaQ>2Y-AX=CxC(B#juInyl-9~H%17WrDkHm6N5KSRs zDHa1ZR*RO#W;#ieMhKD=X+pphDbva1d>8J!@6Ma={LQ@k=QgJc^M~gFEUc|gw)FgB z+#k&9bF%#6m>x4Xwx-M2{dMsjFpG0%w^vjI2n5hDzz7Rij~WRE*l@rJ4|tEpAR-Wr z1d_-=HVP=B0@Y}N5gq6@L4t-bv>D837G`bYA&p^dbC}aS%-cfzvuoJ4|+4?N#$TP6HGFL*(|Wg3RY9@1<=86 zmvx;+INA+vbPKn3#XOpo-=K!zd_YG)#onUUF9$YNGxb!zeoPyF4bu`4-|qsvgnvMB4)E+|eZ zVwa(U7$LzR()GM^mGaOW8B=@JP-c;_WSX2X?;4uy*)=( z^|J5k>V+G?{*T5zgU3%kQE~3(+Q!PaRi=l8yRAf4+U{y;~%DP{@wZc@W!jBmw$Zz fPfpkG{`KF-SbG1}q2J&Bwj)%mt!z$qm;LttYEYFR literal 0 HcmV?d00001 diff --git a/snakes/1/la11.png b/snakes/1/la11.png new file mode 100644 index 0000000000000000000000000000000000000000..02e53404443106af1bbf59f56be519f2386334d3 GIT binary patch literal 3163 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 literal 0 HcmV?d00001 diff --git a/snakes/1/la13.png b/snakes/1/la13.png new file mode 100644 index 0000000000000000000000000000000000000000..b7983b2c6b00f48b1ccf35af569227ec62ade531 GIT binary patch literal 4954 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�r=Z}B%KcP5_40HkgNBBN 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 literal 0 HcmV?d00001 diff --git a/snakes/1/numbers.png b/snakes/1/numbers.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a282a646df03c1fbc454601ffbc473d8afd003 GIT binary patch literal 4983 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 literal 0 HcmV?d00001 diff --git a/snakes/1/sa12.png b/snakes/1/sa12.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3dc2e74aceb9890918e139b34bd1beb9bf135c GIT binary patch literal 4092 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 VQp|`a{db7L*uYHx!@Y-b{{s@06UP7m literal 0 HcmV?d00001 diff --git a/snakes/boards/fidaki.jpg b/snakes/boards/fidaki.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52f7a900e55a57a624c200b4a686429e8c0fac4d GIT binary patch literal 48398 zcmb@u1yqz>+dn!8NJt3Mt$;L0N{^_th;)O}A>AMh@sQF8NJw{gBZx?M3(_4!=fDi- z#(MNU-}|le|F45UzjA!-Kx6Cp>b04J zE9TWS=m`k@=1sJlsOV^DXc!pim{cOMC7>jurlKUHprD~+XP~*qN=re( z_>hV90VfX+4>f~;2tSuFJ2wy4^-Yj4Ffg!gVUb{ClW^UoxXbl_{BzX;!b3+|Ls~~h zx(B*}hlGrWbkzo;2G)s+^!*3)^9Sh$G79QVG;|EiTfl^>+n^gr$jCQPkWo=lP=MJU zz~4bAc&PYyImK??QFw)R&z6A8J2DNO_Ho%KLdBsyI&OVC9}G+)ViHm^`uhxwOw2sI zd=L2r1fM(=mync_mQhkxQB_md&@=!x%f!^o+}^>_$=Su#&G#Qa|A4@t;Hc<#F|l#) z;}g;|GPAOCa`W=bD=Mq1YijH2TR*pbY47Ol>K+~$9UGsR{5rL;xU{^oy0*TtxqonY zbbNApb`HB<7ZM2h$FhL$9}D}Bb>RW)x`Bd%jDmK(E~FdIzy}!*1@$iHO?)v0v{$xw z?s0je6FiPgEBk~&%dNOasBbrfNkqr9K)-*zwC^kX|F$rn|Erb#Uf93ungU@VBLT!i z#sh&tyQb-NO}8Eo=M26!ij%K)r6OeQBcV%DwQNYb{SSq9Ce*^=I&5SIP^(u_#wCs5}zk-bOmY^%76^APaxpI;04N|=5i$_1!0^;IM9)5#-LFjvN1kQG)r`A zCFF+Yvy?$k6?+8U3^~F(w)u2hQLaMfU7pz2uI=QRVUNo`85ZoLIc!N6HnRRUZHiaI zWpfeSAtqCWzys2+KtEoohP1;$l8t?LM{m_!K?AZEwmx@s>v|FT;b)Q#*07tJSD?8v zrQAAG;7u>$&J*6L>Rr;-KZGN*L3Ste-IBdCJIq589Lu9^Z$!~jV&$V>1`#BhX%ELR zt1yr-iD+s$pMO9ljJpD%?}T1~9yRD)oG=2*b^g6^$J{F!mjnMkzxjW7zC>D&Bk;uzPl?Qmmsg=0X&q>TtQt8W)g6; zF1&G6%V$DOcQ<_H`EaENXW^XF2h%p~=c$#<&ru3N81 z7c;DuL&}gchZ5LL4al6|6$lgj=fFA6dTWP!SA!$7Ht)7x zf&8fd91vg6#?b~J%3gtx^e!Xaf-~T6vmk?9J%~$=Glf5YcXdL1od4^-g&Gc_JQk{D zp@M_7TD@Q1#C*D&@u^*8VAXu>ggpk>*B*|Gz2*gJnddNwo^9s(!eaXQY(DV9I}?Yl z|LbcB_0$}nk{&EvffDr2Ft0$%Z%0+Aw{=(mmeM<2fV77H@%!8BxoGUv=UG=EuM&h* zlehxn%P_#v0GE3bUot0`WSW(k)*MLYXwnunh7^|O()jVyEJnYJYHBX29gd+8k%{z4 z9Lw4(Za&$s`uk$WKkvjes{>px5Qlp?dls=Ro&* zx`53UsE^|k6>=cH$sGRYwn+Xt5MP;wUHJYlw4JB z{aE~voVN^2mAJ$9uiZ>t+;|CQqsP{rln~!kc9$$gTii|Q{tY1jFYe~_e zPivvbnTk4t(+E=es>k4AJn5g5cP{?8EWYw1bJoJVk` zhwNV-hY=~f`yf#?5(klY*<3FSKa=3mgQ0zaU4cR$BS=TYN5y!i?U4rFOAAogK0koM zJ=&OEOitzyH=56Bor2e_g@rOD9dq*4+lgd-iUpQkpW9B1;&vASxWsvl0-_ufmu5`T zM~IJ$Ig+@9M61VYXKGH(iJcSa<=_R9A;>y4@fLyy^2hA�h)$@DRYQYfdf^H~izz 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 W5C3w=_-$%T((w9!{yXsF+y4N8YD8TC literal 0 HcmV?d00001 diff --git a/snakes/boards/fidaki2.jpg b/snakes/boards/fidaki2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa2d4e4bfb71a58debc3d6df3120c55cca1948e7 GIT binary patch literal 38119 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 V>0VDtb literal 0 HcmV?d00001 diff --git a/snakes/createboard.php b/snakes/createboard.php new file mode 100644 index 0000000..6886ca9 --- /dev/null +++ b/snakes/createboard.php @@ -0,0 +1,290 @@ +dirroot.'/mod/game/snakes/1'; + + $im = imagecreatefromstring($imageasstring); + + $cx = imagesx($im) - $ofsright - $ofsleft; + $cy = imagesy($im) - $ofstop - $ofsbottom; + + $color = 0xFF0000; + for( $i=0; $i <= $colsx; $i++) + { + imageline( $im, $ofsleft+$i * $cx / $colsx, $ofstop, $ofsleft+$i * $cx / $colsx, $cy+$ofstop, $color); + } + + for( $i=0; $i <= $colsy; $i++) + { + imageline( $im, $ofsleft, $ofstop+$i * $cy / $colsy, $cx+$ofsleft, $ofstop+$i * $cy / $colsy, $color); + } + + $filenamenumbers=$dir.'/numbers.png'; + $img_numbers = imageCreateFrompng( $filenamenumbers); + $size_numbers = getimagesize ($filenamenumbers); + + for( $iy=0; $iy < $colsy; $iy++) + { + if( $iy % 2 == 0){ + $inc=false; + $num = ($colsy-$iy)*$colsy; + }else + { + $inc=true; + $num = ($colsy-$iy)*$colsy-($colsy-1); + } + $ypos = $iy * $cy / $colsy+$ofstop; + for( $ix=0; $ix < $colsx; $ix++) + { + $xpos = $ix * $cx / $colsx + $ofsleft; + shownumber( $im, $img_numbers, $num, $xpos, $ypos, $cx/4, $cy/4, $size_numbers); + $num = ($inc ? $num+1 : $num-1); + } + } + + makeboard( $im, $dir, $cx, $cy, $board, $colsx, $colsy, $ofsleft, $ofstop); + + return $im; +} + +function computexy( $pos, &$x, &$y, $colsx, $colsy) +{ + $x = ($pos - 1) % $colsx; + $y = ($colsy-1) - floor( ($pos - 1) / $colsy); + if($y % 2 == 0) + $x = ($colsx-1) - $x; +} + +function makeboard( $im, $dir, $cx, $cy, $board, $colsx, $colsy, $ofsleft, $ofstop) +{ + $a = explode( ',', $board); + foreach( $a as $s) + { + if( substr( $s,0,1) == 'L') + makeboardL( $im, $dir, $cx, $cy, substr( $s, 1), $colsx, $colsy, $ofsleft, $ofstop); + else + makeboardS( $im, $dir, $cx, $cy, substr( $s, 1), $colsx, $colsy, $ofsleft, $ofstop); + } +} + +function makeboardL( $im, $dir, $cx, $cy, $s, $colsx, $colsy, $ofsleft, $ofstop) +{ + $pos = strpos( $s, '-'); + $from = substr( $s, 0, $pos); + $to = substr( $s, $pos+1); + + computexy( $from, $startx, $starty, $colsx, $colsy); + computexy( $to, $x2, $y2, $colsx, $colsy); + if( ($x2 < $startx) and ($y2 < $starty)) + { + $temp = $x2; $x2 = $startx; $startx = $temp; + $temp = $y2; $y2 = $starty; $starty = $temp; + } + $movex = $x2 - $startx; + $movey = $y2 - $starty; + + $letter = ( $movex * $movey < 0 ? 'b' : 'a'); + + $_startx = $startx; $_movex=$movex; $_starty = $starty; $_movey=$movey; + if( $movex < 0) + { + $startx += $movex; + $movex = -$movex; + } + if( $movey < 0) + { + $starty += $movey; + $movey = -$movey; + } + $stamp = 0; + if( $letter == 'b'){ + $file = $dir.'/l'.$letter.$movey.$movex.'.png'; + if( file_exists( $file)){ + $stamp = game_imagecreatefrompng( $file); + }else + { + $file = $dir.'/la'.$movey.$movex.'.png'; + + $source = game_imagecreatefrompng( $file); + if( $source != 0) + $stamp = imagerotate($source, 90, 0); + } + }else + { + $file = $dir.'/la'.$movex.$movey.'.png'; + $stamp = game_imagecreatefrompng( $file); + } + + $dst_x = $startx*$cx/$colsx; + $dst_y = $starty*$cy/$colsy; + $dst_w = ($movex+1) * $cx / $colsx; + $dst_h = ($movey+1) * $cy / $colsy; + + if( $stamp == 0) + { + game_printladder( $im, $file, $dst_x+$ofsleft, $dst_y+$ofstop, $dst_w, $dst_h, $cx/$colsx, $cy/$colsy); + }else + { + imagecopyresampled( $im, $stamp, $ofsleft+$dst_x, $ofstop+$dst_y, 0, 0, $dst_w, $dst_h, 100*$movex+100, 100*$movey+100); + } +} + +function makeboardS( $im, $dir, $cx, $cy, $s, $colsx, $colsy, $ofsleft, $ofstop) +{ + $pos = strpos( $s, '-'); + $from = substr( $s, 0, $pos); + $to = substr( $s, $pos+1); + + computexy( $from, $startx, $starty, $colsx, $colsy); + computexy( $to, $x2, $y2, $colsx, $colsy); + $swap=0; + if( ($x2 < $startx) and ($y2 < $starty)) + { + $temp = $x2; $x2 = $startx; $startx = $temp; + $temp = $y2; $y2 = $starty; $starty = $temp; + $swap=1; + } + $movex = $x2 - $startx; + $movey = $y2 - $starty; + + //a*d + //*** + //b*c + $stamp = $rotate = 0; + if( $movex >= 0 and $movey < 0){ + $letter = 'b'; + $file = $dir.'/sa'.$movey.$movex.'.png'; + $source = game_imagecreatefrompng( $file); + if( $source != 0) + { + $stamp = imagerotate($source, 270, 0); + $starty += $movey; $movey = -$movey; + }else + $rotate = 270; + }else if( $movex < 0 and $movey < 0){ + $letter = 'c'; + $file = $dir.'/sa'.$movey.$movex.'.png'; + $source = game_imagecreatefrompng( $file); + if( $source != 0) + { + $stamp = imagerotate($source, 180, 0); + $startx += $movex; $movex = -$movex; + $starty += $movey; $movey = -$movey; + }else + $rotate = 180; + }else if( ($movex < 0) and ($movey >= 0)){ + $letter = 'd'; + $file = $dir.'/sa'.$movey.$movex.'.png'; + $source = game_imagecreatefrompng( $file); + if( $source != 0) + { + $stamp = imagerotate($source, 270, 0); + $startx += $movex; $movex = -$movex; + }else + $rotate=270; + }else + { + $file = $dir.'/sa'.$movex.$movey.'.png'; + $stamp = game_imagecreatefrompng( $file); + } + + if( ($swap != 0) and ($stamp == 0)) + { + $temp = $x2; $x2 = $startx; $startx = $temp; + $temp = $y2; $y2 = $starty; $starty = $temp; + $movex = $x2 - $startx; + $movey = $y2 - $starty; + } + + $dst_x = $startx*$cx/$colsx; + $dst_y = $starty*$cy/$colsy; + $dst_w = ($movex+1) * $cx / $colsx; + $dst_h = ($movey+1) * $cy / $colsy; + + if( $stamp == 0) + { + game_printsnake( $im, $file, $dst_x+$ofsleft, $dst_y+$ofstop, $dst_w, $dst_h, $cx/$colsx, $cy/$colsy); + }else + imagecopyresampled( $im, $stamp, $dst_x+$ofsleft, $dst_y+$ofstop, 0, 0, $dst_w, $dst_h, 100*$movex+100, 100*$movey+100); +} + +function game_imagecreatefrompng( $file){ + if( file_exists( $file)) + return imagecreatefrompng( $file); + + return 0; +} + +function shownumber( $img_handle, $img_numbers, $number, $x1 , $y1, $width, $height, $size_numbers){ + if( $number < 10){ + $width_number = $size_numbers[ 0] / 10; + $dstX = $x1 + $width / 10; + $dstY = $y1 + $height / 10; + $srcX = $number * $size_numbers[ 0] / 10; + $srcW = $size_numbers[ 0]/10; + $srcH = $size_numbers[ 1]; + $dstW = $width / 10; + $dstH = $dstW * $srcH / $srcW; + imagecopyresampled( $img_handle, $img_numbers, $dstX, $dstY, $srcX, 0, $dstW, $dstH, $srcW, $srcH); + }else + { + $number1 = floor( $number / 10); + $number2 = $number % 10; + shownumber( $img_handle, $img_numbers, $number1, $x1-$width/20, $y1, $width, $height, $size_numbers); + shownumber( $img_handle, $img_numbers, $number2, $x1+$width/20, $y1, $width, $height, $size_numbers); + } +} + +function returnRotatedPoint($x,$y,$cx,$cy,$a) +{ + // radius using distance formula + $r = sqrt(pow(($x-$cx),2)+pow(($y-$cy),2)); + // initial angle in relation to center + $iA = rad2deg(atan2(($y-$cy),($x-$cx))); + + $nx = $r * cos(deg2rad($a + $iA)); + $ny = $r * sin(deg2rad($a + $iA)); + + return array("x"=>$cx+$nx,"y"=>$cy+$ny); +} + +function game_printladder( $im, $file, $x, $y, $width, $height, $cellx, $celly) +{ + $color = imagecolorallocate($im, 0, 0, 255); + $x2 = $x+$width-$cellx/2; + $y2 = $y+$height-$celly/2; + $x1 = $x+$cellx/2; + $y1 = $y+$celly/2; + imageline( $im, $x1, $y1, $x2, $y2, $color); + $r = sqrt(pow(($x2-$x1),2)+pow(($y2-$y1),2)); + $mul = 100 / $r; + $x1 = $x2 - ($x2-$x1) * $mul; + $y1 = $y2 - ($y2-$y1) * $mul; + $a = returnRotatedPoint( $x1, $y1, $x2, $y2, 20); + imageline( $im, $x2, $y2, $a[ 'x'], $a[ 'y'], $color); + $a = returnRotatedPoint( $x1, $y1, $x2, $y2, -20); + imageline( $im, $x2, $y2, $a[ 'x'], $a[ 'y'], $color); +} + +function game_printsnake( $im, $file, $x, $y, $width, $height, $cellx, $celly) +{ + $color = imagecolorallocate($im, 0, 255, 0); + $x2 = $x+$width-$cellx/2; + $y2 = $y+$height-$celly/2; + $x1 = $x+$cellx/2; + $y1 = $y+$celly/2; + imageline( $im, $x1, $y1, $x2, $y2, $color); + + $r = sqrt(pow(($x2-$x1),2)+pow(($y2-$y1),2)); + $mul = 100 / $r; + $x2 = $x1 + ($x2-$x1) * $mul; + $y2 = $y1 + ($y2-$y1) * $mul; + $a = returnRotatedPoint( $x1, $y1, $x2, $y2, 80); + imageline( $im, $x1, $y1, $a[ 'x'], $a[ 'y'], $color); + $a = returnRotatedPoint( $x1, $y1, $x2, $y2, -80); + imageline( $im, $x1, $y1, $a[ 'x'], $a[ 'y'], $color); +} diff --git a/snakes/play.php b/snakes/play.php new file mode 100644 index 0000000..7e643e5 --- /dev/null +++ b/snakes/play.php @@ -0,0 +1,527 @@ +id = $attempt->id; + $newrec->snakesdatabaseid = $game->param3; + $newrec->position = 1; + $newrec->queryid = 0; + if( !game_insert_record( 'game_snakes', $newrec)){ + error( 'game_snakes_continue: error inserting in game_snakes'); + } + + game_updateattempts( $game, $attempt, 0, 0); + + return game_snakes_play( $id, $game, $attempt, $newrec); +} + +function game_snakes_play( $id, $game, $attempt, $snakes) +{ + global $CFG; + + $board = game_snakes_getboard( $game, $snakes); + + if( $snakes->position > $board->cols * $board->rows && $snakes->queryid <> 0){ + $finish = true; + + if (! $cm = get_record("course_modules", "id", $id)) { + error("Course Module ID was incorrect id=$id"); + } + + echo ''.get_string( 'win', 'game').'
    '; + echo '
    '; + echo "
    wwwroot/mod/game/attempt.php?id=$id\">".get_string( 'nextgame', 'game').'         '; + echo "wwwroot/course/view.php?id=$cm->course\">".get_string( 'finish', 'game').' '; + + $gradeattempt = 1; + $finish = 1; + game_updateattempts( $game, $attempt, $gradeattempt, $finish); + }else + { + $finish = false; + if( $snakes->queryid == 0){ + game_snakes_computenextquestion( $game, $snakes, $query); + }else + { + $query = get_record( 'game_queries', 'id', $snakes->queryid); + } + if( $game->toptext != ''){ + echo $game->toptext.'
    '; + } + game_snakes_showquestion( $id, $game, $snakes, $query); + } + + +?> + + + + + + +
    + +

    +
    <?php print_string('snakes_board', 'game', $board->name); /*Accessibility ('name' may be a bit long.) */ ?>
    +
    + + +
    +bottomtext != ''){ + echo '
    '.$game->bottomtext; + } +} + +function game_snakes_getboard( $game, $snakes) +{ + global $CFG; + + if( $game->param3 != 0 or $snakes->snakesdatabaseid == 0) + { + $board = get_record_select( 'game_snakes_database', 'id='.$snakes->snakesdatabaseid); + if( $board == false) + { + require_once(dirname(__FILE__) . '/../db/importsnakes.php'); + $board = get_record_select( 'game_snakes_database', 'id='.$snakes->snakesdatabaseid); + } + if( $board == false) + print_error( 'No board '.$snakes->snakesdatabaseid); + $board->imagesrc = $CFG->wwwroot.'/mod/game/snakes/boards/'.$board->fileboard; + }else + { + $board = game_snakes_create_user_defined_board( $game); + } + + return $board; +} + +function game_snakes_showdice( $snakes, $board) +{ + $pos = game_snakes_computeplayerposition( $snakes, $board); +?> +

    +
    <?php print_string('snakes_player', 'game', ($snakes->position +1)); /*Accessibility. */ ?>
    +
    + +

    + <?php print_string('snakes_dice', 'game', $snakes->dice) ?> +
    +position - 1) % $board->cols; + $y = floor( ($snakes->position-1) / $board->cols); + + $cellwidth = ($board->width - $board->headerx - $board->footerx) / $board->cols; + $cellheight = ($board->height - $board->headery - $board->footery) / $board->rows; + + unset( $pos); + + switch( $board->direction){ + case 1: + if( ($y % 2) == 1){ + $x = $board->cols - $x - 1; + } + $pos->x = round( $board->headerx + $x * $cellwidth + ($cellwidth-$pawn_width)/2); + $pos->y = round( $board->footery + ($board->rows - $y-1) * $cellheight)- $board->height-10 + ($cellheight-$pawn_height)/2; + break; + } + return $pos; +} + +function game_snakes_computenextquestion( $game, &$snakes, &$query) +{ + global $USER; + + //Retrieves CONST_GAME_TRIES_REPETITION words and select the one which is used fewer times + if( ($recs = game_questions_selectrandom( $game, CONST_GAME_TRIES_REPETITION)) == false){ + return false; + } + + $glossaryid = 0; + $questionid = 0; + $min_num = 0; + foreach( $recs as $rec){ + $select = "gameid=$game->id AND userid='$USER->id' AND questionid='$rec->questionid' AND glossaryentryid='$rec->glossaryentryid'"; + if(($rec2 = get_record_select('game_repetitions', $select, 'id,repetitions r')) != false){ + if( ($rec2->r < $min_num) or ($min_num == 0)){ + $min_num = $rec2->r; + $query->glossaryentryid = $rec->glossaryentryid; + $query->questionid = $rec->questionid; + } + } + else{ + $query->glossaryentryid = $rec->glossaryentryid; + $query->questionid = $rec->questionid; + break; + } + } + + if( ($query->glossaryentryid == 0) AND ($query->questionid == 0)) + return false; + + $query->attemptid = $snakes->id; + $query->gameid = $game->id; + $query->userid = $USER->id; + $query->sourcemodule = $game->sourcemodule; + $query->score = 0; + $query->timelastattempt = time(); + if( !($query->id = insert_record( 'game_queries', $query))){ + error( "Can't insert to table game_queries"); + } + + $snakes->queryid = $query->id; + + $updrec->id = $snakes->id; + $updrec->queryid = $query->id; + $updrec->dice = rand( 1, 6); + + if( !update_record( 'game_snakes', $updrec)){echo "
    "; + error( 'game_questions_selectrandom: error updating in game_snakes'); + } + + $snakes->dice = $updrec->dice; + + game_update_repetitions($game->id, $USER->id, $query->questionid, $query->glossaryentryid); + + return true; +} + +function game_snakes_showquestion( $id, $game, $snakes, $query) +{ + if( $query->sourcemodule == 'glossary'){ + game_snakes_showquestion_glossary( $id, $snakes, $query); + }else + { + game_snakes_showquestion_question( $game, $id, $snakes, $query); + } +} + +function game_snakes_showquestion_question( $game, $id, $snakes, $query) +{ + global $CFG; + + $questionlist = $query->questionid; + $questions = game_sudoku_getquestions( $questionlist); + + /// Start the form + echo '
    '; + echo "
    wwwroot}/mod/game/attempt.php\" onclick=\"this.autocomplete='off'\">\n"; + echo "
    \n"; + + // Add a hidden field with the quiz id + echo '\n"; + echo ''; + echo '\n"; + + /// Print all the questions + + // Add a hidden field with questionids + echo '\n"; + + foreach ($questions as $question) { + global $QTYPES; + unset( $cmoptions); + $cmoptions->course = $game->course; + $cmoptions->shuffleanswers = $question->options->shuffleanswers = false; + $cmoptions->optionflags->optionflags = 0; + $cmoptions->id = 0; + $attempt = 0; + if (!$QTYPES[$question->qtype]->create_session_and_responses( $question, $state, $cmoptions, $attempt)) { + error( 'game_sudoku_showquestions_quiz: problem'); + } + + $state->last_graded = new StdClass; + $state->last_graded->event = QUESTION_EVENTOPEN; + $state->event = QUESTION_EVENTOPEN; + $options->scores->score = 0; + $question->maxgrade = 100; + $state->manualcomment = ''; + $cmoptions->optionflags = 0; + $options->correct_responses = 0; + $options->feedback = 0; + $options->readonly = 0; + + print_question($question, $state, '', $cmoptions, $options); + + break; + } + + echo "
    \n"; +} + +function game_snakes_showquestion_glossary( $id, $snakes, $query) +{ + global $CFG; + + $entry = get_record( 'glossary_entries', 'id', $query->glossaryentryid); + + /// Start the form + echo '
    '; + echo "
    wwwroot}/mod/game/attempt.php\" onclick=\"this.autocomplete='off'\">\n"; + echo "
    \n"; + + // Add a hidden field with the queryid + echo '\n"; + echo ''; + echo '\n"; + + /// Print all the questions + + // Add a hidden field with glossaryentryid + echo '\n"; + + echo game_filtertext( $entry->definition, 0).'
    '; + + //Accessibility