--- /dev/null
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle 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.
+//
+// Moodle 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.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Allows the admin to manage question behaviours.
+ *
+ * @package moodlecore
+ * @subpackage questionengine
+ * @copyright 2011 The Open University
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+
+require_once(dirname(__FILE__) . '/../config.php');
+require_once($CFG->libdir . '/questionlib.php');
+require_once($CFG->libdir . '/adminlib.php');
+require_once($CFG->libdir . '/tablelib.php');
+
+// Check permissions.
+require_login();
+$systemcontext = get_context_instance(CONTEXT_SYSTEM);
+require_capability('moodle/question:config', $systemcontext);
+
+admin_externalpage_setup('manageqbehaviours');
+$thispageurl = new moodle_url('/admin/qbehaviours.php');
+
+$behaviours = get_plugin_list('qbehaviour');
+
+// Get some data we will need - question counts and which types are needed.
+$counts = $DB->get_records_sql_menu("
+ SELECT behaviour, COUNT(1)
+ FROM {question_attempts} GROUP BY behaviour");
+$needed = array();
+$archetypal = array();
+foreach ($behaviours as $behaviour => $notused) {
+ if (!array_key_exists($behaviour, $counts)) {
+ $counts[$behaviour] = 0;
+ }
+ $needed[$behaviour] = $counts[$behaviour] > 0;
+ $archetypal[$behaviour] = question_engine::is_behaviour_archetypal($behaviour);
+}
+
+foreach ($behaviours as $behaviour => $notused) {
+ foreach (question_engine::get_behaviour_required_behaviours($behaviour) as $reqbehaviour) {
+ $needed[$reqbehaviour] = true;
+ }
+}
+foreach ($counts as $behaviour => $count) {
+ if (!array_key_exists($behaviour, $behaviours)) {
+ $counts['missingtype'] += $count;
+ }
+}
+
+// Work of the correct sort order.
+$config = get_config('question');
+$sortedbehaviours = array();
+foreach ($behaviours as $behaviour => $notused) {
+ $sortedbehaviours[$behaviour] = question_engine::get_behaviour_name($behaviour);
+}
+if (!empty($config->behavioursortorder)) {
+ $sortedbehaviours = question_engine::sort_behaviours($sortedbehaviours,
+ $config->behavioursortorder, '');
+}
+
+if (!empty($config->disabledbehaviours)) {
+ $disabledbehaviours = explode(',', $config->disabledbehaviours);
+} else {
+ $disabledbehaviours = array();
+}
+
+// Process actions ============================================================
+
+// Disable.
+if (($disable = optional_param('disable', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+ if (!isset($behaviours[$disable])) {
+ print_error('unknownbehaviour', 'question', $thispageurl, $disable);
+ }
+
+ if (array_search($disable, $disabledbehaviours) === false) {
+ $disabledbehaviours[] = $disable;
+ set_config('disabledbehaviours', implode(',', $disabledbehaviours), 'question');
+ }
+ redirect($thispageurl);
+}
+
+// Enable.
+if (($enable = optional_param('enable', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+ if (!isset($behaviours[$enable])) {
+ print_error('unknownbehaviour', 'question', $thispageurl, $enable);
+ }
+
+ if (!$archetypal[$enable]) {
+ print_error('cannotenablebehaviour', 'question', $thispageurl, $enable);
+ }
+
+ if (($key = array_search($enable, $disabledbehaviours)) !== false) {
+ unset($disabledbehaviours[$key]);
+ set_config('disabledbehaviours', implode(',', $disabledbehaviours), 'question');
+ }
+ redirect($thispageurl);
+}
+
+// Move up in order.
+if (($up = optional_param('up', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+ if (!isset($behaviours[$up])) {
+ print_error('unknownbehaviour', 'question', $thispageurl, $up);
+ }
+
+ // This function works fine for behaviours, as well as qtypes.
+ $neworder = question_reorder_qtypes($sortedbehaviours, $up, -1);
+ set_config('behavioursortorder', implode(',', $neworder), 'question');
+ redirect($thispageurl);
+}
+
+// Move down in order.
+if (($down = optional_param('down', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+ if (!isset($behaviours[$down])) {
+ print_error('unknownbehaviour', 'question', $thispageurl, $down);
+ }
+
+ // This function works fine for behaviours, as well as qtypes.
+ $neworder = question_reorder_qtypes($sortedbehaviours, $down, +1);
+ set_config('behavioursortorder', implode(',', $neworder), 'question');
+ redirect($thispageurl);
+}
+
+// Delete.
+if (($delete = optional_param('delete', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
+ // Check it is OK to delete this question type.
+ if ($delete == 'missing') {
+ print_error('cannotdeletemissingbehaviour', 'question', $thispageurl);
+ }
+
+ if (!isset($behaviours[$delete])) {
+ print_error('unknownbehaviour', 'question', $thispageurl, $delete);
+ }
+
+ $behaviourname = $sortedbehaviours[$delete];
+ if ($counts[$delete] > 0) {
+ print_error('cannotdeletebehaviourinuse', 'question', $thispageurl, $behaviourname);
+ }
+ if ($needed[$delete] > 0) {
+ print_error('cannotdeleteneededbehaviour', 'question', $thispageurl, $behaviourname);
+ }
+
+ // If not yet confirmed, display a confirmation message.
+ if (!optional_param('confirm', '', PARAM_BOOL)) {
+ echo $OUTPUT->header();
+ echo $OUTPUT->heading(get_string('deletebehaviourareyousure', 'question', $behaviourname));
+ echo $OUTPUT->confirm(
+ get_string('deletebehaviourareyousuremessage', 'question', $behaviourname),
+ new moodle_url($thispageurl, array('delete' => $delete, 'confirm' => 1)),
+ $thispageurl);
+ echo $OUTPUT->footer();
+ exit;
+ }
+
+ // Do the deletion.
+ echo $OUTPUT->header();
+ echo $OUTPUT->heading(get_string('deletingbehaviour', 'question', $behaviourname));
+
+ // Delete any configuration records.
+ if (!unset_all_config_for_plugin('qbehaviour_' . $delete)) {
+ echo $OUTPUT->notification(get_string('errordeletingconfig', 'admin', 'qbehaviour_' . $delete));
+ }
+ if (($key = array_search($delete, $disabledbehaviours)) !== false) {
+ unset($disabledbehaviours[$key]);
+ set_config('disabledbehaviours', implode(',', $disabledbehaviours), 'question');
+ }
+ $behaviourorder = explode(',', $config->behavioursortorder);
+ if (($key = array_search($delete, $behaviourorder)) !== false) {
+ unset($behaviourorder[$key]);
+ set_config('behavioursortorder', implode(',', $behaviourorder), 'question');
+ }
+
+ // Then the tables themselves
+ drop_plugin_tables($delete, get_plugin_directory('qbehaviour', $delete) . '/db/install.xml', false);
+
+ // Remove event handlers and dequeue pending events
+ events_uninstall('qbehaviour_' . $delete);
+
+ $a->behaviour = $behaviourname;
+ $a->directory = get_plugin_directory('qbehaviour', $delete);
+ echo $OUTPUT->box(get_string('qbehaviourdeletefiles', 'question', $a), 'generalbox', 'notice');
+ echo $OUTPUT->continue_button($thispageurl);
+ echo $OUTPUT->footer();
+ exit;
+}
+
+// End of process actions ==================================================
+
+// Print the page heading.
+echo $OUTPUT->header();
+echo $OUTPUT->heading(get_string('manageqbehaviours', 'admin'));
+
+// Set up the table.
+$table = new flexible_table('qbehaviouradmintable');
+$table->define_baseurl($thispageurl);
+$table->define_columns(array('behaviour', 'numqas', 'version', 'requires',
+ 'available', 'delete'));
+$table->define_headers(array(get_string('behaviour', 'question'), get_string('numqas', 'question'),
+ get_string('version'), get_string('requires', 'admin'),
+ get_string('availableq', 'question'), get_string('delete')));
+$table->set_attribute('id', 'qbehaviours');
+$table->set_attribute('class', 'generaltable generalbox boxaligncenter boxwidthwide');
+$table->setup();
+
+// Add a row for each question type.
+foreach ($sortedbehaviours as $behaviour => $behaviourname) {
+ $row = array();
+
+ // Question icon and name.
+ $row[] = $behaviourname;
+
+ // Count
+ $row[] = $counts[$behaviour];
+
+ // Question version number.
+ $version = get_config('qbehaviour_' . $behaviour, 'version');
+ if ($version) {
+ $row[] = $version;
+ } else {
+ $row[] = html_writer::tag('span', get_string('nodatabase', 'admin'), array('class' => 'disabled'));
+ }
+
+ // Other question types required by this one.
+ $requiredbehaviours = question_engine::get_behaviour_required_behaviours($behaviour);
+ if (!empty($requiredbehaviours)) {
+ $strrequiredbehaviours = array();
+ foreach ($requiredbehaviours as $required) {
+ $strrequiredbehaviours[] = $sortedbehaviours[$required];
+ }
+ $row[] = implode(', ', $strrequiredbehaviours);
+ } else {
+ $row[] = '';
+ }
+
+ // Are people allowed to create new questions of this type?
+ $rowclass = '';
+ if ($archetypal[$behaviour]) {
+ $enabled = array_search($behaviour, $disabledbehaviours) === false;
+ $icons = question_behaviour_enable_disable_icons($behaviour, $enabled);
+ if (!$enabled) {
+ $rowclass = 'dimmed_text';
+ }
+ } else {
+ $icons = $OUTPUT->spacer() . ' ';
+ }
+
+ // Move icons.
+ $icons .= question_behaviour_icon_html('up', $behaviour, 't/up', get_string('up'), null);
+ $icons .= question_behaviour_icon_html('down', $behaviour, 't/down', get_string('down'), null);
+ $row[] = $icons;
+
+ // Delete link, if available.
+ if ($needed[$behaviour]) {
+ $row[] = '';
+ } else {
+ $row[] = html_writer::link(new moodle_url($thispageurl,
+ array('delete' => $behaviour, 'sesskey' => sesskey())), get_string('delete'),
+ array('title' => get_string('uninstallbehaviour', 'question')));
+ }
+
+ $table->add_data($row, $rowclass);
+}
+
+$table->finish_output();
+
+echo $OUTPUT->footer();
+
+function question_behaviour_enable_disable_icons($behaviour, $enabled) {
+ if ($enabled) {
+ return question_behaviour_icon_html('disable', $behaviour, 'i/hide',
+ get_string('enabled', 'question'), get_string('disable'));
+ } else {
+ return question_behaviour_icon_html('enable', $behaviour, 'i/show',
+ get_string('disabled', 'question'), get_string('enable'));
+ }
+}
+
+function question_behaviour_icon_html($action, $behaviour, $icon, $alt, $tip) {
+ global $OUTPUT;
+ return $OUTPUT->action_icon(new moodle_url('/admin/qbehaviours.php',
+ array($action => $behaviour, 'sesskey' => sesskey())),
+ new pix_icon($icon, $alt, 'moodle', array('title' => '')),
+ null, array('title' => $tip)) . ' ';
+}
+
$canviewreports = has_capability('report/questioninstances:view', $systemcontext);
admin_externalpage_setup('manageqtypes');
+$thispageurl = new moodle_url('/admin/qtypes.php');
$qtypes = question_bank::get_all_qtypes();
// Disable.
if (($disable = optional_param('disable', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
if (!isset($qtypes[$disable])) {
- print_error('unknownquestiontype', 'question', new moodle_url('/admin/qtypes.php'), $disable);
+ print_error('unknownquestiontype', 'question', $thispageurl, $disable);
}
set_config($disable . '_disabled', 1, 'question');
- redirect(admin_url('qtypes.php'));
+ redirect($thispageurl);
}
// Enable.
if (($enable = optional_param('enable', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
if (!isset($qtypes[$enable])) {
- print_error('unknownquestiontype', 'question', new moodle_url('/admin/qtypes.php'), $enable);
+ print_error('unknownquestiontype', 'question', $thispageurl, $enable);
}
if (!$qtypes[$enable]->menu_name()) {
- print_error('cannotenable', 'question', new moodle_url('/admin/qtypes.php'), $enable);
+ print_error('cannotenable', 'question', $thispageurl, $enable);
}
unset_config($enable . '_disabled', 'question');
- redirect(new moodle_url('/admin/qtypes.php'));
+ redirect($thispageurl);
}
// Move up in order.
if (($up = optional_param('up', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
if (!isset($qtypes[$up])) {
- print_error('unknownquestiontype', 'question', new moodle_url('/admin/qtypes.php'), $up);
+ print_error('unknownquestiontype', 'question', $thispageurl, $up);
}
$neworder = question_reorder_qtypes($sortedqtypes, $up, -1);
question_save_qtype_order($neworder, $config);
- redirect(new moodle_url('/admin/qtypes.php'));
+ redirect($thispageurl);
}
// Move down in order.
if (($down = optional_param('down', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
if (!isset($qtypes[$down])) {
- print_error('unknownquestiontype', 'question', admin_url('qtypes.php'), $down);
+ print_error('unknownquestiontype', 'question', $thispageurl, $down);
}
$neworder = question_reorder_qtypes($sortedqtypes, $down, +1);
question_save_qtype_order($neworder, $config);
- redirect(new moodle_url('/admin/qtypes.php'));
+ redirect($thispageurl);
}
// Delete.
if (($delete = optional_param('delete', '', PARAM_SAFEDIR)) && confirm_sesskey()) {
// Check it is OK to delete this question type.
if ($delete == 'missingtype') {
- print_error('cannotdeletemissingqtype', 'admin', new moodle_url('/admin/qtypes.php'));
+ print_error('cannotdeletemissingqtype', 'question', $thispageurl);
}
if (!isset($qtypes[$delete])) {
- print_error('unknownquestiontype', 'question', new moodle_url('/admin/qtypes.php'), $delete);
+ print_error('unknownquestiontype', 'question', $thispageurl, $delete);
}
$qtypename = $qtypes[$delete]->local_name();
if ($counts[$delete]->numquestions + $counts[$delete]->numhidden > 0) {
- print_error('cannotdeleteqtypeinuse', 'admin', new moodle_url('/admin/qtypes.php'), $qtypename);
+ print_error('cannotdeleteqtypeinuse', 'question', $thispageurl, $qtypename);
}
if ($needed[$delete] > 0) {
- print_error('cannotdeleteqtypeneeded', 'admin', new moodle_url('/admin/qtypes.php'), $qtypename);
+ print_error('cannotdeleteqtypeneeded', 'question', $thispageurl, $qtypename);
}
// If not yet confirmed, display a confirmation message.
if (!optional_param('confirm', '', PARAM_BOOL)) {
$qtypename = $qtypes[$delete]->local_name();
echo $OUTPUT->header();
- echo $OUTPUT->heading(get_string('deleteqtypeareyousure', 'admin', $qtypename));
- echo $OUTPUT->confirm(get_string('deleteqtypeareyousuremessage', 'admin', $qtypename),
- new moodle_url('/admin/qtypes.php', array('delete' => $delete, 'confirm' => 1)),
- new moodle_url('/admin/qtypes.php'));
+ echo $OUTPUT->heading(get_string('deleteqtypeareyousure', 'question', $qtypename));
+ echo $OUTPUT->confirm(get_string('deleteqtypeareyousuremessage', 'question', $qtypename),
+ new moodle_url($thispageurl, array('delete' => $delete, 'confirm' => 1)),
+ $thispageurl);
echo $OUTPUT->footer();
exit;
}
// Do the deletion.
echo $OUTPUT->header();
- echo $OUTPUT->heading(get_string('deletingqtype', 'admin', $qtypename));
+ echo $OUTPUT->heading(get_string('deletingqtype', 'question', $qtypename));
// Delete any configuration records.
if (!unset_all_config_for_plugin('qtype_' . $delete)) {
drop_plugin_tables($delete, $qtypes[$delete]->plugin_dir() . '/db/install.xml', false);
// Remove event handlers and dequeue pending events
- events_uninstall('qtype/' . $delete);
+ events_uninstall('qtype_' . $delete);
$a->qtype = $qtypename;
$a->directory = $qtypes[$delete]->plugin_dir();
- echo $OUTPUT->box(get_string('qtypedeletefiles', 'admin', $a), 'generalbox', 'notice');
- echo $OUTPUT->continue_button(new moodle_url('/admin/qtypes.php'));
+ echo $OUTPUT->box(get_string('qtypedeletefiles', 'question', $a), 'generalbox', 'notice');
+ echo $OUTPUT->continue_button($thispageurl);
echo $OUTPUT->footer();
exit;
}
// Set up the table.
$table = new flexible_table('qtypeadmintable');
-$table->define_baseurl(new moodle_url('/admin/qtypes.php'));
+$table->define_baseurl($thispageurl);
$table->define_columns(array('questiontype', 'numquestions', 'version', 'requires',
'availableto', 'delete', 'settings'));
-$table->define_headers(array(get_string('questiontype', 'admin'), get_string('numquestions', 'admin'),
+$table->define_headers(array(get_string('questiontype', 'question'), get_string('numquestions', 'question'),
get_string('version'), get_string('requires', 'admin'), get_string('availableq', 'question'),
get_string('delete'), get_string('settings')));
$table->set_attribute('id', 'qtypes');
// Number of questions of this type.
if ($counts[$qtypename]->numquestions + $counts[$qtypename]->numhidden > 0) {
if ($counts[$qtypename]->numhidden > 0) {
- $strcount = get_string('numquestionsandhidden', 'admin', $counts[$qtypename]);
+ $strcount = get_string('numquestionsandhidden', 'question', $counts[$qtypename]);
} else {
$strcount = $counts[$qtypename]->numquestions;
}
if ($canviewreports) {
- $row[] = '<a href="' . new moodle_url('/admin/report/questioninstances/index.php', array('qtype' => $qtypename)) .
- '" title="' . get_string('showdetails', 'admin') . '">' . $strcount . '</a>';
+ $row[] = html_writer::link(new moodle_url('/admin/report/questioninstances/index.php',
+ array('qtype' => $qtypename)), $strcount, array('title' => get_string('showdetails', 'admin')));
} else {
$strcount;
}
if ($version) {
$row[] = $version;
} else {
- $row[] = '<span class="disabled">' . get_string('nodatabase', 'admin') . '</span>';
+ $row[] = html_writer::tag('span', get_string('nodatabase', 'admin'), array('class' => 'disabled'));
}
// Other question types required by this one.
$rowclass = '';
if ($qtype->menu_name()) {
$createable = isset($createabletypes[$qtypename]);
- $icons = enable_disable_button($qtypename, $createable);
+ $icons = question_types_enable_disable_icons($qtypename, $createable);
if (!$createable) {
$rowclass = 'dimmed_text';
}
} else {
- $icons = '<img src="' . $OUTPUT->pix_url('spacer') . '" alt="" class="spacer" />';
+ $icons = $OUTPUT->spacer() . ' ';
}
// Move icons.
- $icons .= icon_html('up', $qtypename, 't/up', get_string('up'), '');
- $icons .= icon_html('down', $qtypename, 't/down', get_string('down'), '');
+ $icons .= question_type_icon_html('up', $qtypename, 't/up', get_string('up'), '');
+ $icons .= question_type_icon_html('down', $qtypename, 't/down', get_string('down'), '');
$row[] = $icons;
// Delete link, if available.
if ($needed[$qtypename]) {
$row[] = '';
} else {
- $row[] = '<a href="' . new moodle_url('/admin/qtypes.php', array('delete' => $qtypename,
- 'sesskey' => sesskey())) . '" title="' .
- get_string('uninstallqtype', 'admin') . '">' . get_string('delete') . '</a>';
+ $row[] = html_writer::link(new moodle_url($thispageurl,
+ array('delete' => $qtypename, 'sesskey' => sesskey())), get_string('delete'),
+ array('title' => get_string('uninstallqtype', 'question')));
}
// Settings link, if available.
$settings = admin_get_root()->locate('qtypesetting' . $qtypename);
if ($settings instanceof admin_externalpage) {
- $row[] = '<a href="' . $settings->url .
- '">' . get_string('settings') . '</a>';
+ $row[] = html_writer::link($settings->url, get_string('settings'));
} else if ($settings instanceof admin_settingpage) {
- $row[] = '<a href="' . new moodle_url('/admin/settings.php', array('section' => 'qtypesetting' . $qtypename)) .
- '">' . get_string('settings') . '</a>';
+ $row[] = html_writer::link(new moodle_url('/admin/settings.php',
+ array('section' => 'qtypesetting' . $qtypename)), get_string('settings'));
} else {
$row[] = '';
}
echo $OUTPUT->footer();
-function enable_disable_button($qtypename, $createable) {
+function question_types_enable_disable_icons($qtypename, $createable) {
if ($createable) {
- return icon_html('disable', $qtypename, 'i/hide', get_string('enabled', 'question'), get_string('disable'));
+ return question_type_icon_html('disable', $qtypename, 'i/hide',
+ get_string('enabled', 'question'), get_string('disable'));
} else {
- return icon_html('enable', $qtypename, 'i/show', get_string('disabled', 'question'), get_string('enable'));
+ return question_type_icon_html('enable', $qtypename, 'i/show',
+ get_string('disabled', 'question'), get_string('enable'));
}
}
-function icon_html($action, $qtypename, $icon, $alt, $tip) {
+function question_type_icon_html($action, $qtypename, $icon, $alt, $tip) {
global $OUTPUT;
- if ($tip) {
- $tip = 'title="' . $tip . '" ';
- }
- $html = ' <form action="' . new moodle_url('/admin/qtypes.php') . '" method="post"><div>';
- $html .= '<input type="hidden" name="sesskey" value="' . sesskey() . '" />';
- $html .= '<input type="image" name="' . $action . '" value="' . $qtypename .
- '" src="' . $OUTPUT->pix_url($icon) . '" alt="' . $alt . '" ' . $tip . '/>';
- $html .= '</div></form>';
- return $html;
+ return $OUTPUT->action_icon(new moodle_url('/admin/qtypes.php',
+ array($action => $qtypename, 'sesskey' => sesskey())),
+ new pix_icon($icon, $alt, 'moodle', array('title' => '')),
+ null, array('title' => $tip)) . ' ';
}
// Question type settings
if ($hassiteconfig || has_capability('moodle/question:config', $systemcontext)) {
+ // Question behaviour settings.
+ $ADMIN->add('modules', new admin_category('qbehavioursettings', get_string('questionbehaviours', 'admin')));
+ $ADMIN->add('qbehavioursettings', new admin_page_manageqbehaviours());
+
// Question type settings.
$ADMIN->add('modules', new admin_category('qtypesettings', get_string('questiontypes', 'admin')));
$ADMIN->add('qtypesettings', new admin_page_manageqtypes());
define('MOODLE_QUIZ_MACHT', 'match');
define('MOODLE_QUIZ_ESSAY', 'essay');
define('MOODLE_QUIZ_SHORTANSWER', 'shortanswer');
-
-?>
-
<?php
// This file is part of Moodle - http://moodle.org/
$oldctxid, $this->task->get_userid(), 'question_created', $question->itemid, $newctxid, true);
restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'generalfeedback',
$oldctxid, $this->task->get_userid(), 'question_created', $question->itemid, $newctxid, true);
+ restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'answer',
+ $oldctxid, $this->task->get_userid(), 'question_answer', null, $newctxid, true);
restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'answerfeedback',
$oldctxid, $this->task->get_userid(), 'question_answer', null, $newctxid, true);
restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'hint',
} else if ($state === backup_cron_automated_helper::STATE_RUNNING) {
mtrace('RUNNING');
if ($rundirective == self::RUN_IMMEDIATELY) {
- mtrace('automated backups are already. If this script is being run by cron this constitues an error. You will need to increase the time between executions within cron.');
+ mtrace('Automated backups are already running. If this script is being run by cron this constitues an error. You will need to increase the time between executions within cron.');
} else {
mtrace("automated backup are already running. Execution delayed");
}
if ($active === self::AUTO_BACKUP_DISABLED || ($rundirective == self::RUN_ON_SCHEDULE && $active === self::AUTO_BACKUP_MANUAL)) {
return self::STATE_DISABLED;
} else if (!empty($config->backup_auto_running)) {
- // TODO: We should find some way of checking whether the automated
- // backup has infact finished. In 1.9 this was being done by checking
- // the log entries.
- return self::STATE_RUNNING;
+ // Detect if the backup_auto_running semaphore is a valid one
+ // by looking for recent activity in the backup_controllers table
+ // for backups of type backup::MODE_AUTOMATED
+ $timetosee = 60 * 90; // Time to consider in order to clean the semaphore
+ $params = array( 'purpose' => backup::MODE_AUTOMATED, 'timetolook' => (time() - $timetosee));
+ if ($DB->record_exists_select('backup_controllers',
+ "operation = 'backup' AND type = 'course' AND purpose = :purpose AND timemodified > :timetolook", $params)) {
+ return self::STATE_RUNNING; // Recent activity found, still running
+ } else {
+ // No recent activity found, let's clean the semaphore
+ mtrace('Automated backups activity not found in last ' . (int)$timetosee/60 . ' minutes. Cleaning running status');
+ backup_cron_automated_helper::set_state_running(false);
+ }
}
return self::STATE_OK;
}
$context = get_context_instance(CONTEXT_USER);
} else if (isset($data->userid) && $data->userid > 0 && $data->userid != $USER->id &&
isset($data->instance) && $data->instance > 0) {
- $cm = get_coursemodule_from_id('', $data->instance, 0, false, MUST_EXIST);
+ $cm = get_coursemodule_from_instance($data->modulename, $data->instance, 0, false, MUST_EXIST);
$context = get_context_instance(CONTEXT_COURSE, $cm->course);
} else {
$context = get_context_instance(CONTEXT_USER);
--- /dev/null
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle 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.
+//
+// Moodle 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.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Automatically generated strings for Moodle 2.1 installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/en/Development:Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package installer
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+$string['cannotcreatetempdir'] = 'Не може да създаде временна директория';
+$string['cannotfindcomponent'] = 'Не можа да намери компонент';
$string['availablelangs'] = 'Списък на наличните езици';
$string['chooselanguagehead'] = 'Изберете език';
+$string['chooselanguagesub'] = 'Моля, изберете език за инсталацията. Този език ще бъде, също така, език по подразбиране на сайта, но може да бъде променен и по-късно след инсталирането.';
+$string['installation'] = 'Инсталиране';
+$string['paths'] = 'Пътища';
+$string['pathshead'] = 'Потвърждаване на пътищата';
$string['errorsinenvironment'] = 'Fehler bei der Prüfung der Systemvoraussetzungen!';
$string['installation'] = 'Installation';
$string['langdownloaderror'] = 'Leider konnte das Sprachpaket "{$a}" nicht heruntergeladen werden. Die Installation wird in englischer Sprache fortgesetzt.';
-$string['memorylimithelp'] = '<p>Die PHP-Einstellung memory_limit für Ihren Server ist zur Zeit auf {$a} eingestellt. </p>
+$string['memorylimithelp'] = '<p>Die PHP-Einstellung memory_limit Ihres Servers ist zur Zeit auf {$a} eingestellt. </p>
<p>Wenn Sie Moodle mit vielen Aktivitäten oder vielen Nutzer/innen verwenden, wird dies vermutlich zu Problemen führen.</p>
<p>Wir empfehlen die Einstellung wenn möglich zu erhöhen, z.B. auf 40M oder mehr. Dies können Sie auf verschiedene Arten machen:</p>
<ol>
$string['welcomep40'] = 'Das Paket enthält: <strong>Moodle {$a->moodlerelease} ({$a->moodleversion})</strong>.';
$string['welcomep50'] = 'Die Nutzung dieser Anwendungen ist lizenzrechtlich geprüft. Alle Anwendungen von <strong>{$a->installername}</strong> sind
<a href="http://www.opensource.org/docs/definition_plain.html"> Open Source </a> und unterliegen der <a href="http://www.gnu.org/copyleft/gpl.html"> GPL</a> Lizenz.';
-$string['welcomep60'] = 'Die folgenden Seiten führen Sie in einfachen Schritten durch die Konfiguration und Installation von <strong>Moodle</strong> auf Ihrem Computer. Sie können die vorgeschlagenen Einstellungen übernehmen oder an Ihre Bedürfnisse anpassen.';
+$string['welcomep60'] = 'Die folgenden Webseiten führen Sie in einfachen Schritten durch die Konfiguration und Installation von <strong>Moodle</strong> auf Ihrem Computer. Sie können die vorgeschlagenen Einstellungen übernehmen oder an Ihre Bedürfnisse anpassen.';
$string['welcomep70'] = 'Klicken Sie auf die Taste \'Weiter\', um mit der Installation von Moodle fortzufahren.';
$string['wwwroot'] = 'Webadresse';
$string['langdownloaderror'] = 'Unfortunately the language "{$a}" could not be downloaded. The installation process will continue in English.';
$string['memorylimithelp'] = '<p>The PHP memory limit for your server is currently set to {$a}.</p>
-<p>This may cause Moodle to have memory problems later on, especially
+<p>This may cause Moodle to have memory problems later on, especially
if you have a lot of modules enabled and/or a lot of users.</p>
-<p>We recommend that you configure PHP with a higher limit if possible, like 40M.
+<p>We recommend that you configure PHP with a higher limit if possible, like 40M.
There are several ways of doing this that you can try:</p>
<ol>
-<li>If you are able to, recompile PHP with <i>--enable-memory-limit</i>.
+<li>If you are able to, recompile PHP with <i>--enable-memory-limit</i>.
This will allow Moodle to set the memory limit itself.</li>
-<li>If you have access to your php.ini file, you can change the <b>memory_limit</b>
- setting in there to something like 40M. If you don\'t have access you might
+<li>If you have access to your php.ini file, you can change the <b>memory_limit</b>
+ setting in there to something like 40M. If you don\'t have access you might
be able to ask your administrator to do this for you.</li>
-<li>On some PHP servers you can create a .htaccess file in the Moodle directory
+<li>On some PHP servers you can create a .htaccess file in the Moodle directory
containing this line:
<blockquote><div>php_value memory_limit 40M</div></blockquote>
- <p>However, on some servers this will prevent <b>all</b> PHP pages from working
+ <p>However, on some servers this will prevent <b>all</b> PHP pages from working
(you will see errors when you look at pages) so you\'ll have to remove the .htaccess file.</p></li>
</ol>';
$string['paths'] = 'Paths';
<p>You must upgrade PHP or move to a host with a newer version of PHP!<br />
(In case of 5.0.x you could also downgrade to 4.4.x version)</p>';
$string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
-$string['welcomep20'] = 'You are seeing this page because you have successfully installed and
+$string['welcomep20'] = 'You are seeing this page because you have successfully installed and
launched the <strong>{$a->packname} {$a->packversion}</strong> package in your computer. Congratulations!';
-$string['welcomep30'] = 'This release of the <strong>{$a->installername}</strong> includes the applications
+$string['welcomep30'] = 'This release of the <strong>{$a->installername}</strong> includes the applications
to create an environment in which <strong>Moodle</strong> will operate, namely:';
$string['welcomep40'] = 'The package also includes <strong>Moodle {$a->moodlerelease} ({$a->moodleversion})</strong>.';
-$string['welcomep50'] = 'The use of all the applications in this package is governed by their respective
- licences. The complete <strong>{$a->installername}</strong> package is
- <a href="http://www.opensource.org/docs/definition_plain.html">open source</a> and is distributed
+$string['welcomep50'] = 'The use of all the applications in this package is governed by their respective
+ licences. The complete <strong>{$a->installername}</strong> package is
+ <a href="http://www.opensource.org/docs/definition_plain.html">open source</a> and is distributed
under the <a href="http://www.gnu.org/copyleft/gpl.html">GPL</a> license.';
-$string['welcomep60'] = 'The following pages will lead you through some easy to follow steps to
- configure and set up <strong>Moodle</strong> on your computer. You may accept the default
+$string['welcomep60'] = 'The following pages will lead you through some easy to follow steps to
+ configure and set up <strong>Moodle</strong> on your computer. You may accept the default
settings or, optionally, amend them to suit your own needs.';
$string['welcomep70'] = 'Click the "Next" button below to continue with the set up of <strong>Moodle</strong>.';
$string['wwwroot'] = 'Web address';
$string['installation'] = 'Installazione';
$string['langdownloaderror'] = 'Purtroppo non è stato possibile scaricare la lingua "{$a}". L\'installazione proseguirà in lingua Inglese.';
$string['memorylimithelp'] = '<p>Il limite della memoria assegnata al PHP attualmente è {$a}.</p>
+
<p>Questo limite potrà causare problemi nel funzionamento di Moodle, specialmente se usate molti moduli di attività con molti utenti.</p>
-<p>Vi raccomandiamo di impostare il PHP con un limite più alto se possibile, ad esempio 40M.
-Ci sono diversi modi che potete provare:
+
+<p>Ti raccomandiamo di impostare il PHP con un limite più alto se possibile, ad esempio 40M.
+Ci sono diversi modi che puoi provare:
<ol>
-<li>Se possibile, ricompilate il PHP con l\'opzione <i>--enable-memory-limit</i>.
+<li>Se possibile, ricompila il PHP con l\'opzione <i>--enable-memory-limit</i>.
Questo permetterà a Moodle di impostare il limite di memoria da solo.</li>
-<li>Se avete accesso al file php.ini, è possibile modificare la variabile <b>memory_limit</b> a un valore più alto, ad esempio 40M. Se non avete accesso, potete chiedere al vostro amministratore di sistema di farlo.</li>
-<li>Su alcuni server PHP è possibile creare un file .htaccess nella Cartella di Moodle che contenga questa linea:
+<li>Se hai accesso al file php.ini, è possibile modificare la variabile <b>memory_limit</b> a un valore più alto, ad esempio 40M. Se non hai accesso, potete chiedere al vostro amministratore di sistema di farlo.</li>
+<li>Su alcuni server con il PHP è possibile creare un file .htaccess nella cartella di Moodle contenente questa linea:
<blockquote>php_value memory_limit 40M</blockquote>
-<p>Tuttavia, su alcuni server questo impedirà a <b>tutte</b> le pagine PHP di funzionare (vedrete degli errori quando visualizzerete le pagine) cosi dovrete rimuovere il file .htaccess.</li></ol>';
+<p>Tuttavia, su alcuni server la direttiva potrebbe impedire a <b>tutte</b> le pagine PHP di funzionare (apapriranno degli erorri durante la visualizzazione delle pagine), in tal caso dovrai rimuovere il file .htaccess.</li></ol>';
$string['paths'] = 'Percorsi';
$string['pathserrcreatedataroot'] = 'Lo script di installazione non ha potuto creare la Cartella dei dati ({$a->dataroot}).';
$string['pathshead'] = 'Conferma percorsi';
<p>Dovete aggiornare la versione del PHP oppure spostarsi su un host che abbia una versione più aggiornata del PHP!<br>
(Se avete la 5.0.x, potete fare il downgrade alla versione 4.4.x)</p>';
$string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
-$string['welcomep20'] = 'Se vedete questa pagina avete installato correttamente e lanciato il pacchetto <strong>{$a->packname} {$a->packversion}</strong>. Complimenti!';
-$string['welcomep30'] = 'La release di <strong>{$a->installername}</strong> include un applicazione per creare l\'ambiente dive girerà <strong>Moodle</strong>:';
+$string['welcomep20'] = 'Se vedi questa pagina hai installato correttamente e lanciato il pacchetto <strong>{$a->packname} {$a->packversion}</strong>. Complimenti!';
+$string['welcomep30'] = 'La release di <strong>{$a->installername}</strong> include l\'applicazione per creare l\'ambiente necessario a far girare <strong>Moodle</strong>:';
$string['welcomep40'] = 'Il pacchetto include anche <strong>Moodle {$a->moodlerelease} ({$a->moodleversion})</strong>.';
$string['welcomep50'] = 'L\'utilizzo delle applicazioni incluse in questo pacchetto è regolato dalle rispettive licenze. L\'intero pacchetto <strong>{$a->installername}</strong> è <a href="http://www.opensource.org/docs/definition_plain.html">open source</a> ed è distribuito in accordo alla licenza <a href="http://www.gnu.org/copyleft/gpl.html">GPL</a>.';
-$string['welcomep60'] = 'Le prossime pagine vi guideranno attraverso semplici passi per installare e configurare <strong>Moodle</strong> nel vostro computer. Potete utilizzare le impostazioni di default oppure modificarle per adeguarle alle vostre esigenze.';
+$string['welcomep60'] = 'Le prossime pagine ti guideranno attraverso semplici passi per installare e configurare <strong>Moodle</strong> nel tuo computer. Puoi utilizzare le impostazioni di default oppure modificarle per adeguarle alle tue esigenze.';
$string['welcomep70'] = 'Fate click sul pulsante "Avanti" per continuare l\'installazione di <strong>Moodle</strong>.';
$string['wwwroot'] = 'Indirizzo web';
{$a}
请使用 --help 选项。';
$string['cliyesnoprompt'] = '输入y(表示是)或n(表示否)';
-$string['environmentrequireinstall'] = 'å¿\85é\9c\80安装并启用';
+$string['environmentrequireinstall'] = 'å¿\85é¡»安装并启用';
$string['environmentrequireversion'] = '需要 {$a->needed} 版本,而您的是 {$a->current}';
*/
$string['language'] = '语言';
-$string['next'] = '向后';
+$string['next'] = '下一步';
$string['previous'] = '向前';
$string['reload'] = '重新载入';
$string['calendarexportsalt'] = 'Calendar export salt';
$string['calendarsettings'] = 'Calendar';
$string['calendar_weekend'] = 'Weekend days';
-$string['cannotdeletemissingqtype'] = 'You cannot delete the missing question type. It is needed by the system.';
$string['cannotdeletemodfilter'] = 'You cannot uninstall the \'{$a->filter}\' because it is part of the \'{$a->module}\' module.';
-$string['cannotdeleteqtypeinuse'] = 'You cannot delete the question type \'{$a}\'. There are questions of this type in the question bank.';
-$string['cannotdeleteqtypeneeded'] = 'You cannot delete the question type \'{$a}\'. There are other question types installed that rely on it.';
$string['cfgwwwrootslashwarning'] = 'You have defined $CFG->wwwroot incorrectly in your config.php file. You have included a \'/\' character at the end. Please remove it, or you will experience strange bugs like <a href=\'http://tracker.moodle.org/browse/MDL-11061\'>MDL-11061</a>.';
$string['cfgwwwrootwarning'] = 'You have defined $CFG->wwwroot incorrectly in your config.php file. It does not match the URL you are using to access this page. Please correct it, or you will experience strange bugs like <a href=\'http://tracker.moodle.org/browse/MDL-11061\'>MDL-11061</a>.';
$string['clamfailureonupload'] = 'On clam AV failure';
$string['deletefilterareyousuremessage'] = 'You are about to completely delete the filter \'{$a}\'. Are you sure you want to uninstall it?';
$string['deletefilterfiles'] = 'All data associated with the filter \'{$a->filter}\' has been deleted from the database. To complete the deletion (and to prevent the filter from re-installing itself), you should now delete this directory from your server: {$a->directory}';
$string['deleteincompleteusers'] = 'Delete incomplete users after';
-$string['deleteqtypeareyousure'] = 'Are you sure you want to delete the question type \'{$a}\'';
-$string['deleteqtypeareyousuremessage'] = 'You are about to completely delete the question type \'{$a}\'. Are you sure you want to uninstall it?';
$string['deleteunconfirmed'] = 'Delete not fully setup users after';
$string['deleteuser'] = 'Delete user';
$string['deletingfilter'] = 'Deleting filter \'{$a}\'';
-$string['deletingqtype'] = 'Deleting question type \'{$a}\'';
$string['density'] = 'Density';
$string['denyemailaddresses'] = 'Denied email domains';
$string['development'] = 'Development';
$string['maintinprogress'] = 'Maintenance is in progress...';
$string['managelang'] = 'Manage';
$string['managelicenses'] = 'Manage licences';
+$string['manageqbehaviours'] = 'Manage question behaviours';
$string['manageqtypes'] = 'Manage question types';
$string['maturity50'] = 'Alpha';
$string['maturity100'] = 'Beta';
$string['notloggedinroleid'] = 'Role for visitors';
$string['numberofmissingstrings'] = 'Number of missing strings: {$a}';
$string['numberofstrings'] = 'Total number of strings: {$a->strings}<br />Missing: {$a->missing} ({$a->missingpercent} %)';
-$string['numquestions'] = 'No. questions';
-$string['numquestionsandhidden'] = '{$a->numquestions} (+{$a->numhidden} hidden)';
$string['numcoursesincombo'] = 'Maximum number of courses in combo list';
$string['numcoursesincombo_help'] = 'The combo list doesn\'t work well with large numbers of courses. When the total number of courses in the site is higher than this setting then a link to the dedicated course listing will be shown instead of trying to display all the courses on the front page.';
$string['opensslrecommended'] = 'Installing the optional OpenSSL library is highly recommended -- it enables Moodle Networking functionality.';
$string['proxyport'] = 'Proxy port';
$string['proxytype'] = 'Proxy type';
$string['proxyuser'] = 'Proxy username';
-$string['qtypedeletefiles'] = 'All data associated with the question type \'{$a->qtype}\' has been deleted from the database. To complete the deletion (and to prevent the question type from re-installing itself), you should now delete this directory from your server: {$a->directory}';
$string['qtyperqpwillberemoved'] = 'During the upgrade, the RQP question type will be removed. You were not using this question type, so you should not experience any problems.';
$string['qtyperqpwillberemovedanyway'] = 'During the upgrade, the RQP question type will be removed. You have some RQP questions in your database, and these will stop working unless you reinstall the code from http://moodle.org/mod/data/view.php?d=13&rid=797 before continuing with the upgrade.';
$string['quarantinedir'] = 'Quarantine directory';
$string['question'] = 'Question';
+$string['questionbehaviours'] = 'Question behaviours';
$string['questioncwqpfscheck'] = 'One or more \'random\' questions in a quiz are set up to select questions from a mixture of shared and unshared question categories. There is a more detailed report <a href="{$a->reporturl}">here</a> and see Moodle Docs page <a href="{$a->docsurl}">here</a>.';
$string['questioncwqpfsok'] = 'Good. There are no \'random\' questions in your quizzes that are set up to select questions from a mixture of shared and unshared question categories.';
$string['questiontype'] = 'Question type';
$string['uninstall'] = 'Uninstall selected language pack';
$string['uninstallconfirm'] = 'You are about to completely uninstall language pack {$a}, are you sure?';
$string['uninstallplugin'] = 'Uninstall';
-$string['uninstallqtype'] = 'Uninstall this question type.';
$string['unsupported'] = 'Unsupported';
$string['updateaccounts'] = 'Update existing accounts';
$string['updatecomponent'] = 'Update component';
$string['adminreport'] = 'Report on possible problems in your question database.';
$string['availableq'] = 'Available?';
$string['badbase'] = 'Bad base before **: {$a}**';
+$string['behaviour'] = 'Behaviour';
$string['broken'] = 'This is a "broken link", it points to a nonexistent file.';
$string['byandon'] = 'by <em>{$a->user}</em> on <em>{$a->time}</em>';
$string['cannotcopybackup'] = 'Could not copy backup file';
$string['cannotcreate'] = 'Could not create new entry in question_attempts table';
$string['cannotcreatepath'] = 'Cannot create path: {$a}';
+$string['cannotdeletebehaviourinuse'] = 'You cannot delete the behaviour \'{$a}\'. It is used by question attempts.';
$string['cannotdeletecate'] = 'You can\'t delete that category it is the default category for this context.';
+$string['cannotdeletemissingbehaviour'] = 'You cannot uninstall the missing behaviour. It is required by the system.';
+$string['cannotdeletemissingqtype'] = 'You cannot uninstall the missing question type. It is needed by the system.';
+$string['cannotdeleteneededbehaviour'] = 'Cannot delete the question behaviour \'{$a}\'. There are other behaviours installed that rely on it.';
+$string['cannotdeleteqtypeinuse'] = 'You cannot delete the question type \'{$a}\'. There are questions of this type in the question bank.';
+$string['cannotdeleteqtypeneeded'] = 'You cannot delete the question type \'{$a}\'. There are other question types installed that rely on it.';
$string['cannotenable'] = 'Question type {$a} cannot be created directly.';
+$string['cannotenablebehaviour'] = 'Question behaviour {$a} cannot be used directly. It is for internal use only.';
$string['cannotfindcate'] = 'Could not find category record';
$string['cannotfindquestionfile'] = 'Could not find question data file in zip';
$string['cannotgetdsfordependent'] = 'Cannot get the specified dataset for a dataset dependent question! (question: {$a->id}, datasetitem: {$a->item})';
$string['categorycurrentuse'] = 'Use this category';
$string['categorydoesnotexist'] = 'This category does not exist';
$string['categoryinfo'] = 'Category info';
+$string['categorymove'] = 'The category \'{$a->name}\' contains {$a->count} questions (some of them may be old, hidden, questions that are still in use in some existing quizzes). Please choose another category to move them to.';
$string['categorymoveto'] = 'Save in category';
$string['categorynamecantbeblank'] = 'The category name cannot be blank.';
$string['clicktoflag'] = 'Click to flag this question';
$string['cwrqpfsnoprob'] = 'No question categories in your site are affected by the \'Random questions selecting questions from sub categories\' issue.';
$string['defaultfor'] = 'Default for {$a}';
$string['defaultinfofor'] = 'The default category for questions shared in context \'{$a}\'.';
+$string['deletebehaviourareyousure'] = 'Delete behaviour {$a}: are you sure?';
+$string['deletebehaviourareyousuremessage'] = 'You are about to completely delete the question behaviour {$a}. This will completely delete everything in the database associated with this question behaviour. Are you SURE you want to continue?';
$string['deletecoursecategorywithquestions'] = 'There are questions in the question bank associated with this course category. If you proceed, they will be deleted. You may wish to move them first, using the question bank interface.';
+$string['deleteqtypeareyousure'] = 'Delete question type {$a}: are you sure?';
+$string['deleteqtypeareyousuremessage'] = 'You are about to completely delete the question type {$a}. This will completely delete everything in the database associated with this question type. Are you SURE you want to continue?';
$string['deletequestioncheck'] = 'Are you absolutely sure you want to delete \'{$a}\'?';
$string['deletequestionscheck'] = 'Are you absolutely sure you want to delete the following questions?<br /><br />{$a}';
+$string['deletingbehaviour'] = 'Deleting question behaviour \'{$a}\'';
+$string['deletingqtype'] = 'Deleting question type \'{$a}\'';
$string['disabled'] = 'Disabled';
$string['disterror'] = 'The distribution {$a} caused problems';
$string['donothing'] = 'Don\'t copy or move files or change links.';
$string['editcategory'] = 'Edit category';
$string['editingcategory'] = 'Editing a category';
$string['editingquestion'] = 'Editing a question';
+$string['editquestion'] = 'Edit question';
$string['editthiscategory'] = 'Edit this category';
$string['emptyxml'] = 'Unkown error - empty imsmanifest.xml';
$string['enabled'] = 'Enabled';
$string['notenoughdatatomovequestions'] = 'You need to provide the question ids of questions you want to move.';
$string['notflagged'] = 'Not flagged';
$string['novirtualquestiontype'] = 'No virtual question type for question type {$a}';
+$string['numqas'] = 'No. question attempts';
+$string['numquestions'] = 'No. questions';
+$string['numquestionsandhidden'] = '{$a->numquestions} (+{$a->numhidden} hidden)';
$string['page-question-x'] = 'Any question page';
$string['page-question-edit'] = 'Question editing page';
$string['page-question-category'] = 'Question category page';
$string['permissionsaveasnew'] = 'Save this as a new question';
$string['permissionto'] = 'You have permission to :';
$string['published'] = 'shared';
+$string['qbehaviourdeletefiles'] = 'All data associated with the question behaviour \'{$a->behaviour}\' has been deleted from the database. To complete the deletion (and to prevent the behaviour from re-installing itself), you should now delete this directory from your server: {$a->directory}';
+$string['qtypedeletefiles'] = 'All data associated with the question type \'{$a->qtype}\' has been deleted from the database. To complete the deletion (and to prevent the question type from re-installing itself), you should now delete this directory from your server: {$a->directory}';
$string['qtypeveryshort'] = 'T';
$string['questionaffected'] = '<a href="{$a->qurl}">Question "{$a->name}" ({$a->qtype})</a> is in this question category but is also being used in <a href="{$a->qurl}">quiz "{$a->quizname}"</a> in another course "{$a->coursename}".';
$string['questionbank'] = 'Question bank';
$string['stoponerror_help'] = 'This setting determines whether the import process stops when an error is detected, resulting in no questions being imported, or whether any questions containing errors are ignored and any valid questions are imported.';
$string['tofilecategory'] = 'Write category to file';
$string['tofilecontext'] = 'Write context to file';
+$string['uninstallbehaviour'] = 'Uninstall this question behaviour.';
+$string['uninstallqtype'] = 'Uninstall this question type.';
$string['unknown'] = 'Unknown';
$string['unknownquestiontype'] = 'Unknown question type: {$a}.';
$string['unknowntolerance'] = 'Unknown tolerance type {$a}';
$string['submit'] = 'Submit';
$string['submitandfinish'] = 'Submit and finish';
$string['submitted'] = 'Submit: {$a}';
+$string['unknownbehaviour'] = 'Unknown behaviour: {$a}.';
$string['unknownquestion'] = 'Unknown question: {$a}.';
$string['unknownquestioncatregory'] = 'Unknown question category: {$a}.';
+$string['unknownquestiontype'] = 'Unknown question type: {$a}.';
$string['whethercorrect'] = 'Whether correct';
$string['withselected'] = 'With selected';
$string['xoutofmax'] = '{$a->mark} out of {$a->max}';
}
}
+
+/**
+ * Manage question behaviours page
+ *
+ * @copyright 2011 The Open University
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class admin_page_manageqbehaviours extends admin_externalpage {
+ /**
+ * Constructor
+ */
+ public function __construct() {
+ global $CFG;
+ parent::__construct('manageqbehaviours', get_string('manageqbehaviours', 'admin'),
+ new moodle_url('/admin/qbehaviours.php'));
+ }
+
+ /**
+ * Search question behaviours for the specified string
+ *
+ * @param string $query The string to search for in question behaviours
+ * @return array
+ */
+ public function search($query) {
+ global $CFG;
+ if ($result = parent::search($query)) {
+ return $result;
+ }
+
+ $found = false;
+ $textlib = textlib_get_instance();
+ require_once($CFG->dirroot . '/question/engine/lib.php');
+ foreach (get_plugin_list('qbehaviour') as $behaviour => $notused) {
+ if (strpos($textlib->strtolower(question_engine::get_behaviour_name($behaviour)),
+ $query) !== false) {
+ $found = true;
+ break;
+ }
+ }
+ if ($found) {
+ $result = new stdClass();
+ $result->page = $this;
+ $result->settings = array();
+ return array($this->name => $result);
+ } else {
+ return array();
+ }
+ }
+}
+
+
/**
* Question type manage page
*
<FIELD NAME="questionid" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" COMMENT="The id of the question being attempted. Foreign key references question.id." PREVIOUS="behaviour" NEXT="variant"/>
<FIELD NAME="variant" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" DEFAULT="1" COMMENT="The variant of the qusetion being used." PREVIOUS="questionid" NEXT="maxmark"/>
<FIELD NAME="maxmark" TYPE="number" LENGTH="12" NOTNULL="true" UNSIGNED="false" SEQUENCE="false" DECIMALS="7" COMMENT="The grade this question is marked out of in this attempt." PREVIOUS="variant" NEXT="minfraction"/>
- <FIELD NAME="minfraction" TYPE="number" LENGTH="12" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" DECIMALS="7" COMMENT="Some questions can award negative marks. This indicates the most negative mark that can be awarded, on the faction scale where the maximum positive mark is 1." PREVIOUS="maxmark" NEXT="flagged"/>
+ <FIELD NAME="minfraction" TYPE="number" LENGTH="12" NOTNULL="true" UNSIGNED="false" SEQUENCE="false" DECIMALS="7" COMMENT="Some questions can award negative marks. This indicates the most negative mark that can be awarded, on the faction scale where the maximum positive mark is 1." PREVIOUS="maxmark" NEXT="flagged"/>
<FIELD NAME="flagged" TYPE="int" LENGTH="1" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" COMMENT="Whether this question has been flagged within the attempt." PREVIOUS="minfraction" NEXT="questionsummary"/>
<FIELD NAME="questionsummary" TYPE="text" LENGTH="small" NOTNULL="false" SEQUENCE="false" COMMENT="If this question uses randomisation, it should set this field to summarise what random version the student actually saw. This is a human-readable textual summary of the student's response which might, for example, be used in a report." PREVIOUS="flagged" NEXT="rightanswer"/>
<FIELD NAME="rightanswer" TYPE="text" LENGTH="small" NOTNULL="false" SEQUENCE="false" COMMENT="This is a human-readable textual summary of the right answer to this question. Might be used, for example on the quiz preview, to help people who are testing the question. Or might be used in reports." PREVIOUS="questionsummary" NEXT="responsesummary"/>
'capabilities'=> 'moodle/user:viewdetails, moodle/user:viewhiddendetails, moodle/course:useremail, moodle/user:update',
),
+ 'moodle_user_get_course_participants_by_id' => array(
+ 'classname' => 'moodle_user_external',
+ 'methodname' => 'get_course_participants_by_id',
+ 'classpath' => 'user/externallib.php',
+ 'description' => 'Get course user profiles by id.',
+ 'type' => 'read',
+ 'capabilities'=> 'moodle/user:viewdetails, moodle/user:viewhiddendetails, moodle/course:useremail, moodle/user:update, moodle/site:accessallgroups',
+ ),
+
'moodle_user_delete_users' => array(
'classname' => 'moodle_user_external',
'methodname' => 'delete_users',
'moodle_user_get_users_by_id',
'moodle_webservice_get_siteinfo',
'moodle_notes_create_notes',
+ 'moodle_user_get_course_participants_by_id',
'moodle_message_send_messages'),
'enabled' => 0,
'restrictedusers' => 0,
upgrade_main_savepoint(true, 2011060800.01);
}
+ if ($oldversion < 2011062000.01) {
+ // Changing sign of field minfraction on table question_attempts to signed
+ $table = new xmldb_table('question_attempts');
+ $field = new xmldb_field('minfraction', XMLDB_TYPE_NUMBER, '12, 7', null,
+ XMLDB_NOTNULL, null, null, 'maxmark');
+
+ // Launch change of sign for field minfraction
+ $dbman->change_field_unsigned($table, $field);
+
+ // Main savepoint reached
+ upgrade_main_savepoint(true, 2011062000.01);
+ }
+
return true;
}
/** @var int internal temporary variable */
private $fix_sql_params_i;
+ /** @var int internal temporary variable used by {@link get_in_or_equal()}. */
+ private $inorequaluniqueindex = 1; // guarantees unique parameters in each request
/**
* Constructor - instantiates the database, specifying if it's external (connect to other systems) or no (Moodle DB)
* @return array - $sql and $params
*/
public function get_in_or_equal($items, $type=SQL_PARAMS_QM, $prefix='param', $equal=true, $onemptyitems=false) {
- static $counter = 1; // guarantees unique parameters in each request
// default behavior, throw exception on empty array
if (is_array($items) and empty($items) and $onemptyitems === false) {
}
if (!is_array($items)){
- $param = $prefix.$counter++;
+ $param = $prefix.$this->inorequaluniqueindex++;
$sql = $equal ? "= :$param" : "<> :$param";
$params = array($param=>$items);
} else if (count($items) == 1) {
- $param = $prefix.$counter++;
+ $param = $prefix.$this->inorequaluniqueindex++;
$sql = $equal ? "= :$param" : "<> :$param";
$item = reset($items);
$params = array($param=>$item);
$params = array();
$sql = array();
foreach ($items as $item) {
- $param = $prefix.$counter++;
+ $param = $prefix.$this->inorequaluniqueindex++;
$params[$param] = $item;
$sql[] = ':'.$param;
}
$string['dragmath:dragmath_javaneeded'] = 'To use this page you need a Java-enabled browser. Download the latest Java plug-in from {$a}.';
$string['dragmath:dragmath_title'] = 'DragMath Equation Editor';
$string['media_dlg:filename'] = 'Filename';
-$string['moodlenolink:desc'] = 'Prevent automatic linking';
$string['moodleemoticon:desc'] = 'Insert emoticon';
+$string['moodlenolink:desc'] = 'Prevent automatic linking';
$string['pluginname'] = 'TinyMCE HTML editor';
$string['xhtmlxtras_dlg:title_cite_element'] = 'Citation Element';
$string['xhtmlxtras_dlg:title_del_element'] = 'Deletion Element';
$string['xhtmlxtras_dlg:title_ins_element'] = 'Insertion Element';
-
class tinymce_texteditor extends texteditor {
/** @var string active version - directory name */
- public $version = '3.3.9.2';
+ public $version = '3.4.2';
public function supported_by_browser() {
if (check_browser_version('MSIE', 6)) {
public function use_editor($elementid, array $options=null, $fpoptions=null) {
global $PAGE;
- $PAGE->requires->js('/lib/editor/tinymce/tiny_mce/'.$this->version.'/tiny_mce.js');
+ if (debugging('', DEBUG_DEVELOPER)) {
+ $PAGE->requires->js('/lib/editor/tinymce/tiny_mce/'.$this->version.'/tiny_mce_src.js');
+ } else {
+ $PAGE->requires->js('/lib/editor/tinymce/tiny_mce/'.$this->version.'/tiny_mce.js');
+ }
$PAGE->requires->js_init_call('M.editor_tinymce.init_editor', array($elementid, $this->get_init_params($elementid, $options)), true);
if ($fpoptions) {
$PAGE->requires->js_init_call('M.editor_tinymce.init_filepicker', array($elementid, $fpoptions), true);
=========================================================================================
Upgrade procedure:
- 1/ clone http://github.com/skodak/tinymce
- 2/ clone http://github.com/skodak/tinymce_spellchecker_php
- 3/ merge new changes in MOODLE_20_STABLE branches in these těo repos
+ 1/ clone http://github.com/moodle/tinymce
+ 2/ clone http://github.com/moodle/tinymce_spellchecker_php
+ 3/ merge new changes in latest STABLE branches into these two repos
4/ tweak paths in build script in moodle_build.sh and execute
5/ fix line endings
6/ download all TinyMCE lang files (extra/tools/download_langs.sh)
+ 7/ make sure your moodle installation has all language packs installed.
7/ update moodle lang string files (extra/tools/update_lang_files.php)
+ 8/ ensure lang packs are updated into AMOS (lang.moodle.net)
=========================================================================================
Added:
+++ /dev/null
-(function(b){var e,d,a=[],c=window;b.fn.tinymce=function(j){var p=this,g,k,h,m,i,l="",n="";if(!p.length){return p}if(!j){return tinyMCE.get(p[0].id)}function o(){var r=[],q=0;if(f){f();f=null}p.each(function(t,u){var s,w=u.id,v=j.oninit;if(!w){u.id=w=tinymce.DOM.uniqueId()}s=new tinymce.Editor(w,j);r.push(s);if(v){s.onInit.add(function(){var x,y=v;if(++q==r.length){if(tinymce.is(y,"string")){x=(y.indexOf(".")===-1)?null:tinymce.resolve(y.replace(/\.\w+$/,""));y=tinymce.resolve(y)}y.apply(x||tinymce,r)}})}});b.each(r,function(t,s){s.render()})}if(!c.tinymce&&!d&&(g=j.script_url)){d=1;h=g.substring(0,g.lastIndexOf("/"));if(/_(src|dev)\.js/g.test(g)){n="_src"}m=g.lastIndexOf("?");if(m!=-1){l=g.substring(m+1)}c.tinyMCEPreInit=c.tinyMCEPreInit||{base:h,suffix:n,query:l};if(g.indexOf("gzip")!=-1){i=j.language||"en";g=g+(/\?/.test(g)?"&":"?")+"js=true&core=true&suffix="+escape(n)+"&themes="+escape(j.theme)+"&plugins="+escape(j.plugins)+"&languages="+i;if(!c.tinyMCE_GZ){tinyMCE_GZ={start:function(){tinymce.suffix=n;function q(r){tinymce.ScriptLoader.markDone(tinyMCE.baseURI.toAbsolute(r))}q("langs/"+i+".js");q("themes/"+j.theme+"/editor_template"+n+".js");q("themes/"+j.theme+"/langs/"+i+".js");b.each(j.plugins.split(","),function(s,r){if(r){q("plugins/"+r+"/editor_plugin"+n+".js");q("plugins/"+r+"/langs/"+i+".js")}})},end:function(){}}}}b.ajax({type:"GET",url:g,dataType:"script",cache:true,success:function(){tinymce.dom.Event.domLoaded=1;d=2;if(j.script_loaded){j.script_loaded()}o();b.each(a,function(q,r){r()})}})}else{if(d===1){a.push(o)}else{o()}}return p};b.extend(b.expr[":"],{tinymce:function(g){return g.id&&!!tinyMCE.get(g.id)}});function f(){function i(l){if(l==="remove"){this.each(function(n,o){var m=h(o);if(m){m.remove()}})}this.find("span.mceEditor,div.mceEditor").each(function(n,o){var m=tinyMCE.get(o.id.replace(/_parent$/,""));if(m){m.remove()}})}function k(n){var m=this,l;if(n!==e){i.call(m);m.each(function(p,q){var o;if(o=tinyMCE.get(q.id)){o.setContent(n)}})}else{if(m.length>0){if(l=tinyMCE.get(m[0].id)){return l.getContent()}}}}function h(m){var l=null;(m)&&(m.id)&&(c.tinymce)&&(l=tinyMCE.get(m.id));return l}function g(l){return !!((l)&&(l.length)&&(c.tinymce)&&(l.is(":tinymce")))}var j={};b.each(["text","html","val"],function(n,l){var o=j[l]=b.fn[l],m=(l==="text");b.fn[l]=function(s){var p=this;if(!g(p)){return o.apply(p,arguments)}if(s!==e){k.call(p.filter(":tinymce"),s);o.apply(p.not(":tinymce"),arguments);return p}else{var r="";var q=arguments;(m?p:p.eq(0)).each(function(u,v){var t=h(v);r+=t?(m?t.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):t.getContent()):o.apply(b(v),q)});return r}}});b.each(["append","prepend"],function(n,m){var o=j[m]=b.fn[m],l=(m==="prepend");b.fn[m]=function(q){var p=this;if(!g(p)){return o.apply(p,arguments)}if(q!==e){p.filter(":tinymce").each(function(s,t){var r=h(t);r&&r.setContent(l?q+r.getContent():r.getContent()+q)});o.apply(p.not(":tinymce"),arguments);return p}}});b.each(["remove","replaceWith","replaceAll","empty"],function(m,l){var n=j[l]=b.fn[l];b.fn[l]=function(){i.call(this,l);return n.apply(this,arguments)}});j.attr=b.fn.attr;b.fn.attr=function(n,q,o){var m=this;if((!n)||(n!=="value")||(!g(m))){return j.attr.call(m,n,q,o)}if(q!==e){k.call(m.filter(":tinymce"),q);j.attr.call(m.not(":tinymce"),n,q,o);return m}else{var p=m[0],l=h(p);return l?l.getContent():j.attr.call(b(p),n,q,o)}}}})(jQuery);
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>{#advhr.advhr_desc}</title>
- <script type="text/javascript" src="../../tiny_mce_popup.js?v={tinymce_version}"></script>
- <script type="text/javascript" src="js/rule.js?v={tinymce_version}"></script>
- <script type="text/javascript" src="../../utils/mctabs.js?v={tinymce_version}"></script>
- <script type="text/javascript" src="../../utils/form_utils.js?v={tinymce_version}"></script>
- <link href="css/advhr.css?v={tinymce_version}" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<form onsubmit="AdvHRDialog.update();return false;" action="#">
- <div class="tabs">
- <ul>
- <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advhr.advhr_desc}</a></span></li>
- </ul>
- </div>
-
- <div class="panel_wrapper">
- <div id="general_panel" class="panel current">
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td><label for="width">{#advhr_dlg.width}</label></td>
- <td class="nowrap">
- <input id="width" name="width" type="text" value="" class="mceFocus" />
- <select name="width2" id="width2">
- <option value="">px</option>
- <option value="%">%</option>
- </select>
- </td>
- </tr>
- <tr>
- <td><label for="size">{#advhr_dlg.size}</label></td>
- <td><select id="size" name="size">
- <option value="">Normal</option>
- <option value="1">1</option>
- <option value="2">2</option>
- <option value="3">3</option>
- <option value="4">4</option>
- <option value="5">5</option>
- </select></td>
- </tr>
- <tr>
- <td><label for="noshade">{#advhr_dlg.noshade}</label></td>
- <td><input type="checkbox" name="noshade" id="noshade" class="radio" /></td>
- </tr>
- </table>
- </div>
- </div>
-
- <div class="mceActionPanel">
- <input type="submit" id="insert" name="insert" value="{#insert}" />
- <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
- </div>
-</form>
-</body>
-</html>
+++ /dev/null
-(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.AdvListPlugin",{init:function(b,c){var d=this;d.editor=b;function e(g){var f=[];a(g.split(/,/),function(h){f.push({title:"advlist."+(h=="default"?"def":h.replace(/-/g,"_")),styles:{listStyleType:h=="default"?"":h}})});return f}d.numlist=b.getParam("advlist_number_styles")||e("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");d.bullist=b.getParam("advlist_bullet_styles")||e("default,circle,disc,square")},createControl:function(d,b){var f=this,e,h;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){h=f[d][0]}function c(i,k){var j=true;a(k.styles,function(m,l){if(f.editor.dom.getStyle(i,l)!=m){j=false;return false}});return j}function g(){var k,i=f.editor,l=i.dom,j=i.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,h)){i.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(h){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,h.styles);k.removeAttribute("_mce_style")}}}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){g()}});e.onRenderMenu.add(function(i,j){j.onShowMenu.add(function(){var m=f.editor.dom,l=m.getParent(f.editor.selection.getNode(),"ol,ul"),k;if(l||h){k=f[d];a(j.items,function(n){var o=true;n.setSelected(0);if(l&&!n.isDisabled()){a(k,function(p){if(p.id==n.id){if(!c(l,p)){o=false;return false}}});if(o){n.setSelected(1)}}});if(!l){j.items[h.id].setSelected(1)}}});j.add({id:f.editor.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle"}).setDisabled(1);a(f[d],function(k){k.id=f.editor.dom.uniqueId();j.add({id:k.id,title:k.title,onclick:function(){h=k;g()}})})});return e}},getInfo:function(){return{longname:"Advanced lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlist",tinymce.plugins.AdvListPlugin)})();
\ No newline at end of file
+++ /dev/null
-(function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this;if(a.getParam("fullscreen_is_enabled")){return}function b(){var h=a.getDoc(),e=h.body,j=h.documentElement,g=tinymce.DOM,i=d.autoresize_min_height,f;f=tinymce.isIE?e.scrollHeight:j.offsetHeight;if(f>d.autoresize_min_height){i=f}g.setStyle(g.get(a.id+"_ifr"),"height",i+"px");if(d.throbbing){a.setProgressState(false);a.setProgressState(true)}}d.editor=a;d.autoresize_min_height=a.getElement().offsetHeight;a.onChange.add(b);a.onSetContent.add(b);a.onPaste.add(b);a.onKeyUp.add(b);a.onPostRender.add(b);if(a.getParam("autoresize_on_init",true)){a.onInit.add(function(f,e){f.setProgressState(true);d.throbbing=true;f.getBody().style.overflowY="hidden"});a.onLoadContent.add(function(f,e){b();setTimeout(function(){b();f.setProgressState(false);d.throbbing=false},1250)})}a.addCommand("mceAutoResize",b)},getInfo:function(){return{longname:"Auto Resize",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autoresize",tinymce.plugins.AutoResizePlugin)})();
\ No newline at end of file
+++ /dev/null
-(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(d){var f=this,g;f.editor=d;f.onContextMenu=new tinymce.util.Dispatcher(this);d.onContextMenu.add(function(h,i){if(!i.ctrlKey){if(g){h.selection.setRng(g)}f._getMenu(h).showMenu(i.clientX,i.clientY);a.add(h.getDoc(),"click",function(j){e(h,j)});a.cancel(i)}});d.onRemove.add(function(){if(f._menu){f._menu.removeAll()}});function e(h,i){g=null;if(i&&i.button==2){g=h.selection.getRng();return}if(f._menu){f._menu.removeAll();f._menu.destroy();a.remove(h.getDoc(),"click",e)}}d.onMouseDown.add(e);d.onKeyDown.add(e)},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(h){var l=this,f=l._menu,i=h.selection,e=i.isCollapsed(),d=i.getNode()||h.getBody(),g,k,j;if(f){f.removeAll();f.destroy()}k=b.getPos(h.getContentAreaContainer());j=b.getPos(h.getContainer());f=h.controlManager.createDropMenu("contextmenu",{offset_x:k.x+h.getParam("contextmenu_offset_x",0),offset_y:k.y+h.getParam("contextmenu_offset_y",0),constrain:1});l._menu=f;f.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(e);f.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(e);f.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((d.nodeName=="A"&&!h.dom.getAttrib(d,"name"))||!e){f.addSeparator();f.add({title:"advanced.link_desc",icon:"link",cmd:h.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}f.addSeparator();f.add({title:"advanced.image_desc",icon:"image",cmd:h.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator();g=f.addMenu({title:"contextmenu.align"});g.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});g.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});g.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});g.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});l.onContextMenu.dispatch(l,f,d,e);return f}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();
\ No newline at end of file
+++ /dev/null
-(function(){tinymce.create("tinymce.plugins.FullPagePlugin",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceFullPageProperties",function(){a.windowManager.open({file:b+"/fullpage.htm",width:430+parseInt(a.getLang("fullpage.delta_width",0)),height:495+parseInt(a.getLang("fullpage.delta_height",0)),inline:1},{plugin_url:b,head_html:c.head})});a.addButton("fullpage",{title:"fullpage.desc",cmd:"mceFullPageProperties"});a.onBeforeSetContent.add(c._setContent,c);a.onSetContent.add(c._setBodyAttribs,c);a.onGetContent.add(c._getContent,c)},getInfo:function(){return{longname:"Fullpage",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_setBodyAttribs:function(d,a){var l,c,e,g,b,h,j,f=this.head.match(/body(.*?)>/i);if(f&&f[1]){l=f[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g);if(l){for(c=0,e=l.length;c<e;c++){g=l[c].split("=");b=g[0].replace(/\s/,"");h=g[1];if(h){h=h.replace(/^\s+/,"").replace(/\s+$/,"");j=h.match(/^["'](.*)["']$/);if(j){h=j[1]}}else{h=b}d.dom.setAttrib(d.getBody(),"style",h)}}}},_createSerializer:function(){return new tinymce.dom.Serializer({dom:this.editor.dom,apply_source_formatting:true})},_setContent:function(d,b){var h=this,a,j,f=b.content,g,i="";if(b.format=="raw"&&h.head){return}if(b.source_view&&d.getParam("fullpage_hide_in_source_view")){return}f=f.replace(/<(\/?)BODY/gi,"<$1body");a=f.indexOf("<body");if(a!=-1){a=f.indexOf(">",a);h.head=f.substring(0,a+1);j=f.indexOf("</body",a);if(j==-1){j=f.indexOf("</body",j)}b.content=f.substring(a+1,j);h.foot=f.substring(j);function e(c){return c.replace(/<\/?[A-Z]+/g,function(k){return k.toLowerCase()})}h.head=e(h.head);h.foot=e(h.foot)}else{h.head="";if(d.getParam("fullpage_default_xml_pi")){h.head+='<?xml version="1.0" encoding="'+d.getParam("fullpage_default_encoding","ISO-8859-1")+'" ?>\n'}h.head+=d.getParam("fullpage_default_doctype",'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');h.head+="\n<html>\n<head>\n<title>"+d.getParam("fullpage_default_title","Untitled document")+"</title>\n";if(g=d.getParam("fullpage_default_encoding")){h.head+='<meta http-equiv="Content-Type" content="'+g+'" />\n'}if(g=d.getParam("fullpage_default_font_family")){i+="font-family: "+g+";"}if(g=d.getParam("fullpage_default_font_size")){i+="font-size: "+g+";"}if(g=d.getParam("fullpage_default_text_color")){i+="color: "+g+";"}h.head+="</head>\n<body"+(i?' style="'+i+'"':"")+">\n";h.foot="\n</body>\n</html>"}},_getContent:function(a,c){var b=this;if(!c.source_view||!a.getParam("fullpage_hide_in_source_view")){c.content=tinymce.trim(b.head)+"\n"+tinymce.trim(c.content)+"\n"+tinymce.trim(b.foot)}}});tinymce.PluginManager.add("fullpage",tinymce.plugins.FullPagePlugin)})();
\ No newline at end of file
+++ /dev/null
-/**
- * editor_plugin_src.js
- *
- * Copyright 2009, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://tinymce.moxiecode.com/license
- * Contributing: http://tinymce.moxiecode.com/contributing
- */
-
-(function() {
- tinymce.create('tinymce.plugins.FullPagePlugin', {
- init : function(ed, url) {
- var t = this;
-
- t.editor = ed;
-
- // Register commands
- ed.addCommand('mceFullPageProperties', function() {
- ed.windowManager.open({
- file : url + '/fullpage.htm',
- width : 430 + parseInt(ed.getLang('fullpage.delta_width', 0)),
- height : 495 + parseInt(ed.getLang('fullpage.delta_height', 0)),
- inline : 1
- }, {
- plugin_url : url,
- head_html : t.head
- });
- });
-
- // Register buttons
- ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'});
-
- ed.onBeforeSetContent.add(t._setContent, t);
- ed.onSetContent.add(t._setBodyAttribs, t);
- ed.onGetContent.add(t._getContent, t);
- },
-
- getInfo : function() {
- return {
- longname : 'Fullpage',
- author : 'Moxiecode Systems AB',
- authorurl : 'http://tinymce.moxiecode.com',
- infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage',
- version : tinymce.majorVersion + "." + tinymce.minorVersion
- };
- },
-
- // Private plugin internal methods
-
- _setBodyAttribs : function(ed, o) {
- var bdattr, i, len, kv, k, v, t, attr = this.head.match(/body(.*?)>/i);
-
- if (attr && attr[1]) {
- bdattr = attr[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g);
-
- if (bdattr) {
- for(i = 0, len = bdattr.length; i < len; i++) {
- kv = bdattr[i].split('=');
- k = kv[0].replace(/\s/,'');
- v = kv[1];
-
- if (v) {
- v = v.replace(/^\s+/,'').replace(/\s+$/,'');
- t = v.match(/^["'](.*)["']$/);
-
- if (t)
- v = t[1];
- } else
- v = k;
-
- ed.dom.setAttrib(ed.getBody(), 'style', v);
- }
- }
- }
- },
-
- _createSerializer : function() {
- return new tinymce.dom.Serializer({
- dom : this.editor.dom,
- apply_source_formatting : true
- });
- },
-
- _setContent : function(ed, o) {
- var t = this, sp, ep, c = o.content, v, st = '';
-
- // Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate
- if (o.format == 'raw' && t.head)
- return;
-
- if (o.source_view && ed.getParam('fullpage_hide_in_source_view'))
- return;
-
- // Parse out head, body and footer
- c = c.replace(/<(\/?)BODY/gi, '<$1body');
- sp = c.indexOf('<body');
-
- if (sp != -1) {
- sp = c.indexOf('>', sp);
- t.head = c.substring(0, sp + 1);
-
- ep = c.indexOf('</body', sp);
- if (ep == -1)
- ep = c.indexOf('</body', ep);
-
- o.content = c.substring(sp + 1, ep);
- t.foot = c.substring(ep);
-
- function low(s) {
- return s.replace(/<\/?[A-Z]+/g, function(a) {
- return a.toLowerCase();
- })
- };
-
- t.head = low(t.head);
- t.foot = low(t.foot);
- } else {
- t.head = '';
- if (ed.getParam('fullpage_default_xml_pi'))
- t.head += '<?xml version="1.0" encoding="' + ed.getParam('fullpage_default_encoding', 'ISO-8859-1') + '" ?>\n';
-
- t.head += ed.getParam('fullpage_default_doctype', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
- t.head += '\n<html>\n<head>\n<title>' + ed.getParam('fullpage_default_title', 'Untitled document') + '</title>\n';
-
- if (v = ed.getParam('fullpage_default_encoding'))
- t.head += '<meta http-equiv="Content-Type" content="' + v + '" />\n';
-
- if (v = ed.getParam('fullpage_default_font_family'))
- st += 'font-family: ' + v + ';';
-
- if (v = ed.getParam('fullpage_default_font_size'))
- st += 'font-size: ' + v + ';';
-
- if (v = ed.getParam('fullpage_default_text_color'))
- st += 'color: ' + v + ';';
-
- t.head += '</head>\n<body' + (st ? ' style="' + st + '"' : '') + '>\n';
- t.foot = '\n</body>\n</html>';
- }
- },
-
- _getContent : function(ed, o) {
- var t = this;
-
- if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view'))
- o.content = tinymce.trim(t.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(t.foot);
- }
- });
-
- // Register plugin
- tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin);
-})();
\ No newline at end of file
+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>{#fullpage_dlg.title}</title>
- <script type="text/javascript" src="../../tiny_mce_popup.js?v={tinymce_version}"></script>
- <script type="text/javascript" src="../../utils/mctabs.js?v={tinymce_version}"></script>
- <script type="text/javascript" src="../../utils/form_utils.js?v={tinymce_version}"></script>
- <script type="text/javascript" src="js/fullpage.js?v={tinymce_version}"></script>
- <link href="css/fullpage.css?v={tinymce_version}" rel="stylesheet" type="text/css" />
-</head>
-<body id="advlink" style="display: none">
- <form onsubmit="updateAction();return false;" name="fullpage" action="#">
- <div class="tabs">
- <ul>
- <li id="meta_tab" class="current"><span><a href="javascript:mcTabs.displayTab('meta_tab','meta_panel');" onmousedown="return false;">{#fullpage_dlg.meta_tab}</a></span></li>
- <li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#fullpage_dlg.appearance_tab}</a></span></li>
- <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_tab}</a></span></li>
- </ul>
- </div>
-
- <div class="panel_wrapper">
- <div id="meta_panel" class="panel current">
- <fieldset>
- <legend>{#fullpage_dlg.meta_props}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="nowrap"><label for="metatitle">{#fullpage_dlg.meta_title}</label> </td>
- <td><input type="text" id="metatitle" name="metatitle" value="" class="mceFocus" /></td>
- </tr>
- <tr>
- <td class="nowrap"><label for="metakeywords">{#fullpage_dlg.meta_keywords}</label> </td>
- <td><textarea id="metakeywords" name="metakeywords" rows="4"></textarea></td>
- </tr>
- <tr>
- <td class="nowrap"><label for="metadescription">{#fullpage_dlg.meta_description}</label> </td>
- <td><textarea id="metadescription" name="metadescription" rows="4"></textarea></td>
- </tr>
- <tr>
- <td class="nowrap"><label for="metaauthor">{#fullpage_dlg.author}</label> </td>
- <td><input type="text" id="metaauthor" name="metaauthor" value="" /></td>
- </tr>
- <tr>
- <td class="nowrap"><label for="metacopyright">{#fullpage_dlg.copyright}</label> </td>
- <td><input type="text" id="metacopyright" name="metacopyright" value="" /></td>
- </tr>
- <tr>
- <td class="nowrap"><label for="metarobots">{#fullpage_dlg.meta_robots}</label> </td>
- <td>
- <select id="metarobots" name="metarobots">
- <option value="">{#not_set}</option>
- <option value="index,follow">{#fullpage_dlg.meta_index_follow}</option>
- <option value="index,nofollow">{#fullpage_dlg.meta_index_nofollow}</option>
- <option value="noindex,follow">{#fullpage_dlg.meta_noindex_follow}</option>
- <option value="noindex,nofollow">{#fullpage_dlg.meta_noindex_nofollow}</option>
- </select>
- </td>
- </tr>
- </table>
- </fieldset>
-
- <fieldset>
- <legend>{#fullpage_dlg.langprops}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="docencoding">{#fullpage_dlg.encoding}</label></td>
- <td>
- <select id="docencoding" name="docencoding">
- <option value="">{#not_set}</option>
- </select>
- </td>
- </tr>
- <tr>
- <td class="nowrap"><label for="doctypes">{#fullpage_dlg.doctypes}</label> </td>
- <td>
- <select id="doctypes" name="doctypes">
- <option value="">{#not_set}</option>
- </select>
- </td>
- </tr>
- <tr>
- <td class="nowrap"><label for="langcode">{#fullpage_dlg.langcode}</label> </td>
- <td><input type="text" id="langcode" name="langcode" value="" /></td>
- </tr>
- <tr>
- <td class="column1"><label for="langdir">{#fullpage_dlg.langdir}</label></td>
- <td>
- <select id="langdir" name="langdir">
- <option value="">{#not_set}</option>
- <option value="ltr">{#fullpage_dlg.ltr}</option>
- <option value="rtl">{#fullpage_dlg.rtl}</option>
- </select>
- </td>
- </tr>
- <tr>
- <td class="nowrap"><label for="xml_pi">{#fullpage_dlg.xml_pi}</label> </td>
- <td><input type="checkbox" id="xml_pi" name="xml_pi" class="checkbox" /></td>
- </tr>
- </table>
- </fieldset>
- </div>
-
- <div id="appearance_panel" class="panel">
- <fieldset>
- <legend>{#fullpage_dlg.appearance_textprops}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="fontface">{#fullpage_dlg.fontface}</label></td>
- <td>
- <select id="fontface" name="fontface" onchange="changedStyleField(this);">
- <option value="">{#not_set}</option>
- </select>
- </td>
- </tr>
-
- <tr>
- <td class="column1"><label for="fontsize">{#fullpage_dlg.fontsize}</label></td>
- <td>
- <select id="fontsize" name="fontsize" onchange="changedStyleField(this);">
- <option value="">{#not_set}</option>
- </select>
- </td>
- </tr>
-
- <tr>
- <td class="column1"><label for="textcolor">{#fullpage_dlg.textcolor}</label></td>
- <td>
- <table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="textcolor" name="textcolor" type="text" value="" size="9" onchange="updateColor('textcolor_pick','textcolor');changedStyleField(this);" /></td>
- <td id="textcolor_pickcontainer"> </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </fieldset>
-
- <fieldset>
- <legend>{#fullpage_dlg.appearance_bgprops}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="bgimage">{#fullpage_dlg.bgimage}</label></td>
- <td>
- <table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="bgimage" name="bgimage" type="text" value="" onchange="changedStyleField(this);" /></td>
- <td id="bgimage_pickcontainer"> </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td class="column1"><label for="bgcolor">{#fullpage_dlg.bgcolor}</label></td>
- <td>
- <table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedStyleField(this);" /></td>
- <td id="bgcolor_pickcontainer"> </td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </fieldset>
-
- <fieldset>
- <legend>{#fullpage_dlg.appearance_marginprops}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="leftmargin">{#fullpage_dlg.left_margin}</label></td>
- <td><input id="leftmargin" name="leftmargin" type="text" value="" onchange="changedStyleField(this);" /></td>
- <td class="column1"><label for="rightmargin">{#fullpage_dlg.right_margin}</label></td>
- <td><input id="rightmargin" name="rightmargin" type="text" value="" onchange="changedStyleField(this);" /></td>
- </tr>
- <tr>
- <td class="column1"><label for="topmargin">{#fullpage_dlg.top_margin}</label></td>
- <td><input id="topmargin" name="topmargin" type="text" value="" onchange="changedStyleField(this);" /></td>
- <td class="column1"><label for="bottommargin">{#fullpage_dlg.bottom_margin}</label></td>
- <td><input id="bottommargin" name="bottommargin" type="text" value="" onchange="changedStyleField(this);" /></td>
- </tr>
- </table>
- </fieldset>
-
- <fieldset>
- <legend>{#fullpage_dlg.appearance_linkprops}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="link_color">{#fullpage_dlg.link_color}</label></td>
- <td>
- <table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="link_color" name="link_color" type="text" value="" size="9" onchange="updateColor('link_color_pick','link_color');changedStyleField(this);" /></td>
- <td id="link_color_pickcontainer"> </td>
- </tr>
- </table>
- </td>
-
- <td class="column1"><label for="visited_color">{#fullpage_dlg.visited_color}</label></td>
- <td>
- <table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="visited_color" name="visited_color" type="text" value="" size="9" onchange="updateColor('visited_color_pick','visited_color');changedStyleField(this);" /></td>
- <td id="visited_color_pickcontainer"> </td>
- </tr>
- </table>
- </td>
- </tr>
-
- <tr>
- <td class="column1"><label for="active_color">{#fullpage_dlg.active_color}</label></td>
- <td>
- <table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="active_color" name="active_color" type="text" value="" size="9" onchange="updateColor('active_color_pick','active_color');changedStyleField(this);" /></td>
- <td id="active_color_pickcontainer"> </td>
- </tr>
- </table>
- </td>
-
- <td> </td>
- <td> </td>
-
-<!-- <td class="column1"><label for="hover_color">{#fullpage_dlg.hover_color}</label></td>
- <td>
- <table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="hover_color" name="hover_color" type="text" value="" size="9" onchange="changedStyleField(this);" /></td>
- <td id="hover_color_pickcontainer"> </td>
- </tr>
- </table>
- </td> -->
- </tr>
- </table>
- </fieldset>
-
- <fieldset>
- <legend>{#fullpage_dlg.appearance_style}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="stylesheet">{#fullpage_dlg.stylesheet}</label></td>
- <td><table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="stylesheet" name="stylesheet" type="text" value="" /></td>
- <td id="stylesheet_browsercontainer"> </td>
- </tr>
- </table></td>
- </tr>
- <tr>
- <td class="column1"><label for="style">{#fullpage_dlg.style}</label></td>
- <td><input id="style" name="style" type="text" value="" onchange="changedStyleField(this);" /></td>
- </tr>
- </table>
- </fieldset>
- </div>
-
- <div id="advanced_panel" class="panel">
- <div id="addmenu">
- <table border="0" cellpadding="0" cellspacing="0">
- <tr><td><a href="javascript:addHeadElm('title');" onmousedown="return false;"><span>{#fullpage_dlg.add_title}</span></a></td></tr>
- <tr><td><a href="javascript:addHeadElm('meta');" onmousedown="return false;"><span>{#fullpage_dlg.add_meta}</span></a></td></tr>
- <tr><td><a href="javascript:addHeadElm('script');" onmousedown="return false;"><span>{#fullpage_dlg.add_script}</span></a></td></tr>
- <tr><td><a href="javascript:addHeadElm('style');" onmousedown="return false;"><span>{#fullpage_dlg.add_style}</span></a></td></tr>
- <tr><td><a href="javascript:addHeadElm('link');" onmousedown="return false;"><span>{#fullpage_dlg.add_link}</span></a></td></tr>
- <tr><td><a href="javascript:addHeadElm('base');" onmousedown="return false;"><span>{#fullpage_dlg.add_base}</span></a></td></tr>
- <tr><td><a href="javascript:addHeadElm('comment');" onmousedown="return false;"><span>{#fullpage_dlg.add_comment}</span></a></td></tr>
- </table>
- </div>
-
- <fieldset>
- <legend>{#fullpage_dlg.head_elements}</legend>
-
- <div class="headlistwrapper">
- <div class="toolbar">
- <div style="float: left">
- <a id="addbutton" href="javascript:showAddMenu();" onmousedown="return false;" class="addbutton" title="{#fullpage_dlg.add}"></a>
- <a href="#" onmousedown="return false;" class="removebutton" title="{#fullpage_dlg.remove}"></a>
- </div>
- <div style="float: right">
- <a href="#" onmousedown="return false;" class="moveupbutton" title="{#fullpage_dlg.moveup}"></a>
- <a href="#" onmousedown="return false;" class="movedownbutton" title="{#fullpage_dlg.movedown}"></a>
- </div>
- <br style="clear: both" />
- </div>
- <select id="headlist" size="26" onchange="updateHeadElm(this.options[this.selectedIndex].value);">
- <option value="title_0"><title>Some title bla bla bla</title></option>
- <option value="meta_1"><meta name="keywords">Some bla bla bla</meta></option>
- <option value="meta_2"><meta name="description">Some bla bla bla bla bla bla bla bla bla</meta></option>
- <option value="script_3"><script language="javascript">...</script></option>
- <option value="style_4"><style>...</style></option>
- <option value="base_5"><base href="." /></option>
- <option value="comment_6"><!-- ... --></option>
- <option value="link_7"><link href="." /></option>
- </select>
- </div>
- </fieldset>
-
- <fieldset id="meta_element">
- <legend>{#fullpage_dlg.meta_element}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="element_meta_type">{#fullpage_dlg.type}</label></td>
- <td><select id="element_meta_type">
- <option value="name">name</option>
- <option value="http-equiv">http-equiv</option>
- </select></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_meta_name">{#fullpage_dlg.name}</label></td>
- <td><input id="element_meta_name" name="element_meta_name" type="text" value="" /></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_meta_content">{#fullpage_dlg.content}</label></td>
- <td><input id="element_meta_content" name="element_meta_content" type="text" value="" /></td>
- </tr>
- </table>
-
- <input type="button" id="meta_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
- </fieldset>
-
- <fieldset id="title_element">
- <legend>{#fullpage_dlg.title_element}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="element_title">{#fullpage_dlg.meta_title}</label></td>
- <td><input id="element_title" name="element_title" type="text" value="" /></td>
- </tr>
- </table>
-
- <input type="button" id="title_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
- </fieldset>
-
- <fieldset id="script_element">
- <legend>{#fullpage_dlg.script_element}</legend>
-
- <div class="tabs">
- <ul>
- <li id="script_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('script_props_tab','script_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li>
- <li id="script_value_tab"><span><a href="javascript:mcTabs.displayTab('script_value_tab','script_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li>
- </ul>
- </div>
-
- <br style="clear: both" />
-
- <div class="panel_wrapper">
- <div id="script_props_panel" class="panel current">
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="element_script_type">{#fullpage_dlg.type}</label></td>
- <td><select id="element_script_type">
- <option value="text/javascript">text/javascript</option>
- <option value="text/jscript">text/jscript</option>
- <option value="text/vbscript">text/vbscript</option>
- <option value="text/vbs">text/vbs</option>
- <option value="text/ecmascript">text/ecmascript</option>
- <option value="text/xml">text/xml</option>
- </select></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_script_src">{#fullpage_dlg.src}</label></td>
- <td><table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="element_script_src" name="element_script_src" type="text" value="" /></td>
- <td id="script_src_pickcontainer"> </td>
- </tr>
- </table></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_script_charset">{#fullpage_dlg.charset}</label></td>
- <td><select id="element_script_charset"><option value="">{#not_set}</option></select></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_script_defer">{#fullpage_dlg.defer}</label></td>
- <td><input type="checkbox" id="element_script_defer" name="element_script_defer" class="checkbox" /></td>
- </tr>
- </table>
- </div>
-
- <div id="script_value_panel" class="panel">
- <textarea id="element_script_value"></textarea>
- </div>
- </div>
-
- <input type="button" id="script_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
- </fieldset>
-
- <fieldset id="style_element">
- <legend>{#fullpage_dlg.style_element}</legend>
-
- <div class="tabs">
- <ul>
- <li id="style_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('style_props_tab','style_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li>
- <li id="style_value_tab"><span><a href="javascript:mcTabs.displayTab('style_value_tab','style_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li>
- </ul>
- </div>
-
- <br style="clear: both" />
-
- <div class="panel_wrapper">
- <div id="style_props_panel" class="panel current">
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="element_style_type">{#fullpage_dlg.type}</label></td>
- <td><select id="element_style_type">
- <option value="text/css">text/css</option>
- </select></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_style_media">{#fullpage_dlg.media}</label></td>
- <td><select id="element_style_media"></select></td>
- </tr>
- </table>
- </div>
-
- <div id="style_value_panel" class="panel">
- <textarea id="element_style_value"></textarea>
- </div>
- </div>
-
- <input type="button" id="style_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
- </fieldset>
-
- <fieldset id="base_element">
- <legend>{#fullpage_dlg.base_element}</legend>
-
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="element_base_href">{#fullpage_dlg.href}</label></td>
- <td><input id="element_base_href" name="element_base_href" type="text" value="" /></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_base_target">{#fullpage_dlg.target}</label></td>
- <td><input id="element_base_target" name="element_base_target" type="text" value="" /></td>
- </tr>
- </table>
-
- <input type="button" id="base_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
- </fieldset>
-
- <fieldset id="link_element">
- <legend>{#fullpage_dlg.link_element}</legend>
-
- <div class="tabs">
- <ul>
- <li id="link_general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('link_general_tab','link_general_panel');" onmousedown="return false;">{#fullpage_dlg.general_props}</a></span></li>
- <li id="link_advanced_tab"><span><a href="javascript:mcTabs.displayTab('link_advanced_tab','link_advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_props}</a></span></li>
- </ul>
- </div>
-
- <br style="clear: both" />
-
- <div class="panel_wrapper">
- <div id="link_general_panel" class="panel current">
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="element_link_href">{#fullpage_dlg.href}</label></td>
- <td><table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td><input id="element_link_href" name="element_link_href" type="text" value="" /></td>
- <td id="link_href_pickcontainer"> </td>
- </tr>
- </table></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_link_title">{#fullpage_dlg.meta_title}</label></td>
- <td><input id="element_link_title" name="element_link_title" type="text" value="" /></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_link_type">{#fullpage_dlg.type}</label></td>
- <td><select id="element_link_type" name="element_link_type">
- <option value="text/css">text/css</option>
- <option value="text/javascript">text/javascript</option>
- </select></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_link_media">{#fullpage_dlg.media}</label></td>
- <td><select id="element_link_media" name="element_link_media"></select></td>
- </tr>
- <tr>
- <td><label for="element_style_rel">{#fullpage_dlg.rel}</label></td>
- <td><select id="element_style_rel" name="element_style_rel">
- <option value="">{#not_set}</option>
- <option value="stylesheet">Stylesheet</option>
- <option value="alternate">Alternate</option>
- <option value="designates">Designates</option>
- <option value="start">Start</option>
- <option value="next">Next</option>
- <option value="prev">Prev</option>
- <option value="contents">Contents</option>
- <option value="index">Index</option>
- <option value="glossary">Glossary</option>
- <option value="copyright">Copyright</option>
- <option value="chapter">Chapter</option>
- <option value="subsection">Subsection</option>
- <option value="appendix">Appendix</option>
- <option value="help">Help</option>
- <option value="bookmark">Bookmark</option>
- </select>
- </td>
- </tr>
- </table>
- </div>
-
- <div id="link_advanced_panel" class="panel">
- <table border="0" cellpadding="4" cellspacing="0">
- <tr>
- <td class="column1"><label for="element_link_charset">{#fullpage_dlg.charset}</label></td>
- <td><select id="element_link_charset"><option value="">{#not_set}</option></select></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_link_hreflang">{#fullpage_dlg.hreflang}</label></td>
- <td><input id="element_link_hreflang" name="element_link_hreflang" type="text" value="" /></td>
- </tr>
- <tr>
- <td class="column1"><label for="element_link_target">{#fullpage_dlg.target}</label></td>
- <td><input id="element_link_target" name="element_link_target" type="text" value="" /></td>
- </tr>
- <tr>
- <td><label for="element_style_rev">{#fullpage_dlg.rev}</label></td>
- <td><select id="element_style_rev" name="element_style_rev">
- <option value="">{#not_set}</option>
- <option value="alternate">Alternate</option>
- <option value="designates">Designates</option>
- <option value="stylesheet">Stylesheet</option>
- <option value="start">Start</option>
- <option value="next">Next</option>
- <option value="prev">Prev</option>
- <option value="contents">Contents</option>
- <option value="index">Index</option>
- <option value="glossary">Glossary</option>
- <option value="copyright">Copyright</option>
- <option value="chapter">Chapter</option>
- <option value="subsection">Subsection</option>
- <option value="appendix">Appendix</option>
- <option value="help">Help</option>
- <option value="bookmark">Bookmark</option>
- </select>
- </td>
- </tr>
- </table>
- </div>
- </div>
-
- <input type="button" id="link_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
- </fieldset>
-
- <fieldset id="comment_element">
- <legend>{#fullpage_dlg.comment_element}</legend>
-
- <textarea id="element_comment_value"></textarea>
-
- <input type="button" id="comment_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
- </fieldset>
- </div>
- </div>
-
- <div class="mceActionPanel">
- <input type="submit" id="insert" name="update" value="{#update}" />
- <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
- </div>
- </form>
-</body>
-</html>
+++ /dev/null
-/**
- * fullpage.js
- *
- * Copyright 2009, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://tinymce.moxiecode.com/license
- * Contributing: http://tinymce.moxiecode.com/contributing
- */
-
-tinyMCEPopup.requireLangPack();
-
-var doc;
-
-var defaultDocTypes =
- 'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' +
- 'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' +
- 'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' +
- 'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">,' +
- 'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' +
- 'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' +
- 'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';
-
-var defaultEncodings =
- 'Western european (iso-8859-1)=iso-8859-1,' +
- 'Central European (iso-8859-2)=iso-8859-2,' +
- 'Unicode (UTF-8)=utf-8,' +
- 'Chinese traditional (Big5)=big5,' +
- 'Cyrillic (iso-8859-5)=iso-8859-5,' +
- 'Japanese (iso-2022-jp)=iso-2022-jp,' +
- 'Greek (iso-8859-7)=iso-8859-7,' +
- 'Korean (iso-2022-kr)=iso-2022-kr,' +
- 'ASCII (us-ascii)=us-ascii';
-
-var defaultMediaTypes =
- 'all=all,' +
- 'screen=screen,' +
- 'print=print,' +
- 'tty=tty,' +
- 'tv=tv,' +
- 'projection=projection,' +
- 'handheld=handheld,' +
- 'braille=braille,' +
- 'aural=aural';
-
-var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';
-var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px';
-
-function init() {
- var f = document.forms['fullpage'], el = f.elements, e, i, p, doctypes, encodings, mediaTypes, fonts, ed = tinyMCEPopup.editor, dom = tinyMCEPopup.dom, style;
-
- // Setup doctype select box
- doctypes = ed.getParam("fullpage_doctypes", defaultDocTypes).split(',');
- for (i=0; i<doctypes.length; i++) {
- p = doctypes[i].split('=');
-
- if (p.length > 1)
- addSelectValue(f, 'doctypes', p[0], p[1]);
- }
-
- // Setup fonts select box
- fonts = ed.getParam("fullpage_fonts", defaultFontNames).split(';');
- for (i=0; i<fonts.length; i++) {
- p = fonts[i].split('=');
-
- if (p.length > 1)
- addSelectValue(f, 'fontface', p[0], p[1]);
- }
-
- // Setup fontsize select box
- fonts = ed.getParam("fullpage_fontsizes", defaultFontSizes).split(',');
- for (i=0; i<fonts.length; i++)
- addSelectValue(f, 'fontsize', fonts[i], fonts[i]);
-
- // Setup mediatype select boxs
- mediaTypes = ed.getParam("fullpage_media_types", defaultMediaTypes).split(',');
- for (i=0; i<mediaTypes.length; i++) {
- p = mediaTypes[i].split('=');
-
- if (p.length > 1) {
- addSelectValue(f, 'element_style_media', p[0], p[1]);
- addSelectValue(f, 'element_link_media', p[0], p[1]);
- }
- }
-
- // Setup encodings select box
- encodings = ed.getParam("fullpage_encodings", defaultEncodings).split(',');
- for (i=0; i<encodings.length; i++) {
- p = encodings[i].split('=');
-
- if (p.length > 1) {
- addSelectValue(f, 'docencoding', p[0], p[1]);
- addSelectValue(f, 'element_script_charset', p[0], p[1]);
- addSelectValue(f, 'element_link_charset', p[0], p[1]);
- }
- }
-
- document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
- document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color');
- //document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color');
- document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color');
- document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color');
- document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor');
- document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage');
- document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage');
- document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage');
- document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage');
-
- // Resize some elements
- if (isVisible('stylesheetbrowser'))
- document.getElementById('stylesheet').style.width = '220px';
-
- if (isVisible('link_href_browser'))
- document.getElementById('element_link_href').style.width = '230px';
-
- if (isVisible('bgimage_browser'))
- document.getElementById('bgimage').style.width = '210px';
-
- // Add iframe
- dom.add(document.body, 'iframe', {id : 'documentIframe', src : 'javascript:""', style : {display : 'none'}});
- doc = dom.get('documentIframe').contentWindow.document;
- h = tinyMCEPopup.getWindowArg('head_html');
-
- // Preprocess the HTML disable scripts and urls
- h = h.replace(/<script>/gi, '<script type="text/javascript">');
- h = h.replace(/type=([\"\'])?/gi, 'type=$1-mce-');
- h = h.replace(/(src=|href=)/g, '_mce_$1');
-
- // Write in the content in the iframe
- doc.write(h + '</body></html>');