MDL-53638 mod_feedback: convert to moodleforms
authorMarina Glancy <marina@moodle.com>
Fri, 11 Mar 2016 12:45:41 +0000 (20:45 +0800)
committerMarina Glancy <marina@moodle.com>
Wed, 27 Apr 2016 05:28:43 +0000 (13:28 +0800)
30 files changed:
mod/feedback/analysis.php
mod/feedback/analysis_course.php
mod/feedback/analysis_to_excel.php
mod/feedback/classes/complete_form.php [new file with mode: 0644]
mod/feedback/classes/completion.php [new file with mode: 0644]
mod/feedback/classes/event/course_module_viewed.php
mod/feedback/classes/event/response_deleted.php
mod/feedback/classes/event/response_submitted.php
mod/feedback/classes/responses_table.php
mod/feedback/classes/structure.php [new file with mode: 0644]
mod/feedback/complete.php
mod/feedback/delete_item.php
mod/feedback/delete_item_form.php [deleted file]
mod/feedback/edit.php
mod/feedback/edit_item.php
mod/feedback/lang/en/deprecated.txt
mod/feedback/lang/en/feedback.php
mod/feedback/lib.php
mod/feedback/print.php
mod/feedback/show_entries.php
mod/feedback/styles.css
mod/feedback/tests/behat/multichoice.feature
mod/feedback/tests/behat/question_types.feature
mod/feedback/tests/events_test.php
mod/feedback/upgrade.txt
mod/feedback/use_templ.php
mod/feedback/view.php
mod/feedback/yui/dragdrop/dragdrop.js
theme/bootstrapbase/less/moodle/modules.less
theme/bootstrapbase/style/moodle.css

index ac44aa1..3cf894f 100644 (file)
@@ -36,16 +36,15 @@ list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
 require_course_login($course, true, $cm);
 
 $feedback = $PAGE->activityrecord;
+$feedbackstructure = new mod_feedback_structure($feedback, $cm);
 
 $context = context_module::instance($cm->id);
 
-if (!feedback_can_view_analysis($feedback, $context)) {
+if (!$feedbackstructure->can_view_analysis()) {
     print_error('error');
 }
 
 /// Print the page header
-$strfeedbacks = get_string("modulenameplural", "feedback");
-$strfeedback  = get_string("modulename", "feedback");
 
 $PAGE->set_heading($course->fullname);
 $PAGE->set_title($feedback->name);
@@ -57,9 +56,8 @@ require('tabs.php');
 
 
 //get the groupid
-$myurl = $CFG->wwwroot.'/mod/feedback/analysis.php?id='.$cm->id.'&do_show=analysis';
 $mygroupid = groups_get_activity_group($cm, true);
-groups_print_activity_menu($cm, $myurl);
+groups_print_activity_menu($cm, $url);
 
 if ( has_capability('mod/feedback:viewreports', $context) ) {
     //button "export to excel"
@@ -69,17 +67,15 @@ if ( has_capability('mod/feedback:viewreports', $context) ) {
     echo $OUTPUT->container_end();
 }
 
-//get completed feedbacks
-$completedscount = feedback_get_completeds_group_count($feedback, $mygroupid);
+// Get completed feedbacks.
+$completedcount = $feedbackstructure->count_completed_responses($mygroupid);
 
 echo '<div class="analysis_header">';
 // Show the submissions count.
 echo '<b>'.get_string('completed_feedbacks', 'feedback').': '.$completedscount. '</b><br />';
 
-// get the items of the feedback
-$items = $DB->get_records('feedback_item',
-                          array('feedback'=>$feedback->id, 'hasvalue'=>1),
-                          'position');
+// Get the items of the feedback.
+$items = $feedbackstructure->get_items(true);
 // Show the items count.
 if (is_array($items)) {
     echo '<b>'.get_string('questions', 'feedback').': ' .count($items). ' </b><hr />';
@@ -90,30 +86,18 @@ echo '</div>';
 
 $check_anonymously = true;
 if ($mygroupid > 0 AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES) {
-    if ($completedscount < FEEDBACK_MIN_ANONYMOUS_COUNT_IN_GROUP) {
+    if ($completedcount < FEEDBACK_MIN_ANONYMOUS_COUNT_IN_GROUP) {
         $check_anonymously = false;
     }
 }
 
 echo '<div>';
 if ($check_anonymously) {
-    $itemnr = 0;
-    //print the items in an analysed form
+    // Print the items in an analysed form.
     foreach ($items as $item) {
-        if ($item->hasvalue == 0) {
-            continue;
-        }
-        echo '<table width="100%" class="generalbox">';
-
-        //get the class of item-typ
+        echo '<table class="analysis">';
         $itemobj = feedback_get_item_class($item->typ);
-
-        $itemnr++;
-        if ($feedback->autonumbering) {
-            $printnr = $itemnr.'.';
-        } else {
-            $printnr = '';
-        }
+        $printnr = ($feedback->autonumbering && $item->itemnr) ? ($item->itemnr . '.') : '';
         $itemobj->print_analysed($item, $printnr, $mygroupid);
         echo '</table>';
     }
index 7607f29..4b7e157 100644 (file)
@@ -49,26 +49,19 @@ if ($searchcourse !== '') {
 }
 $PAGE->set_url($url);
 
-if (! $cm = get_coursemodule_from_id('feedback', $id)) {
-    print_error('invalidcoursemodule');
-}
-
-if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
-    print_error('coursemisconf');
-}
-
-if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
-    print_error('invalidcoursemodule');
-}
-
+list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
 $context = context_module::instance($cm->id);
 
-require_login($course, true, $cm);
+require_course_login($course, true, $cm);
+
+$feedback = $PAGE->activityrecord;
 
 if (!($feedback->publish_stats OR has_capability('mod/feedback:viewreports', $context))) {
     print_error('error');
 }
 
+$feedbackstructure = new mod_feedback_structure($feedback, $PAGE->cm, $courseid);
+
 /// Print the page header
 $strfeedbacks = get_string("modulenameplural", "feedback");
 $strfeedback  = get_string("modulename", "feedback");
@@ -96,14 +89,13 @@ if (has_capability('mod/feedback:viewreports', $context)) {
 //lstgroupid is the choosen id
 $mygroupid = false;
 //get completed feedbacks
-$completedscount = feedback_get_completeds_group_count($feedback, $mygroupid, $courseid);
+$completedcount = $feedbackstructure->count_completed_responses();
 
 //show the count
 echo '<b>'.get_string('completed_feedbacks', 'feedback').': '.$completedscount. '</b><br />';
 
-// get the items of the feedback
-$params = array('feedback' => $feedback->id, 'hasvalue' => 1);
-$items = $DB->get_records('feedback_item', $params, 'position');
+// Get the items of the feedback.
+$items = $feedbackstructure->get_items(true);
 //show the count
 if (is_array($items)) {
     echo '<b>'.get_string('questions', 'feedback').': ' .count($items). ' </b><hr />';
@@ -123,8 +115,6 @@ if ($courseitemfilter > 0) {
         echo '<div class="clearfix">';
         echo '<table>';
         echo '<tr><th>Course</th><th>Average</th></tr>';
-        $sep_dec = get_string('separator_decimal', 'feedback');
-        $sep_thous = get_string('separator_thousand', 'feedback');
 
         foreach ($courses as $c) {
             $coursecontext = context_course::instance($c->course_id);
@@ -133,7 +123,7 @@ if ($courseitemfilter > 0) {
             echo '<tr>';
             echo '<td>'.$shortname.'</td>';
             echo '<td align="right">';
-            echo number_format(($c->sumvalue / $c->countvalue), 2, $sep_dec, $sep_thous);
+            echo format_float(($c->sumvalue / $c->countvalue), 2);
             echo '</td>';
             echo '</tr>';
         }
@@ -182,23 +172,14 @@ if ($courseitemfilter > 0) {
 
     echo '</form>';
     echo '</div>';
-    echo '<hr />';
-    $itemnr = 0;
-    //print the items in an analysed form
+
+    // Print the items in an analysed form.
     foreach ($items as $item) {
-        if ($item->hasvalue == 0) {
-            continue;
-        }
-        echo '<table>';
-        //get the class from item-typ
+        echo '<table class="analysis">';
+        echo "<tr><td colspan=\"2\" class=\"analysis_separator\"><hr></td></tr>";
         $itemobj = feedback_get_item_class($item->typ);
-        $itemnr++;
-        if ($feedback->autonumbering) {
-            $printnr = $itemnr.'.';
-        } else {
-            $printnr = '';
-        }
-        $itemobj->print_analysed($item, $printnr, $mygroupid, $courseid);
+        $printnr = ($feedback->autonumbering && $item->itemnr) ? ($item->itemnr . '.') : '';
+        $itemobj->print_analysed($item, $printnr, $mygroupid, $feedbackstructure->get_courseid());
         if (preg_match('/rated$/i', $item->typ)) {
             $url = new moodle_url('/mod/feedback/analysis_course.php', array('id' => $id,
                 'courseitemfilter' => $item->id, 'courseitemfiltertyp' => $item->typ));
index 7f423a4..83029a1 100644 (file)
@@ -54,6 +54,7 @@ if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
 $context = context_module::instance($cm->id);
 
 require_login($course, true, $cm);
+$feedbackstructure = new mod_feedback_structure($feedback, $PAGE->cm, $coursefilter);
 
 require_capability('mod/feedback:viewreports', $context);
 
@@ -78,8 +79,8 @@ $fstring->anonymous_user = get_string('anonymous_user', 'feedback');
 ob_end_clean();
 
 //get the questions (item-names)
-$params = array('feedback' => $feedback->id, 'hasvalue' => 1);
-if (!$items = $DB->get_records('feedback_item', $params, 'position')) {
+$items = $feedbackstructure->get_items(true);
+if (!$items) {
     print_error('no_items_available_yet',
                 'feedback',
                 $CFG->wwwroot.'/mod/feedback/view.php?id='.$id);
@@ -139,7 +140,7 @@ $worksheet1->write_string($row_offset1, 0, userdate(time()), $xls_formats->head1
 //print the analysed sheet
 ////////////////////////////////////////////////////////////////////////
 //get the completeds
-$completedscount = feedback_get_completeds_group_count($feedback, $mygroupid, $coursefilter);
+$completedscount = $feedbackstructure->count_completed_responses($mygroupid);
 if ($completedscount > 0) {
     //write the count of completeds
     $row_offset1++;
diff --git a/mod/feedback/classes/complete_form.php b/mod/feedback/classes/complete_form.php
new file mode 100644 (file)
index 0000000..a3562b3
--- /dev/null
@@ -0,0 +1,579 @@
+<?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/>.
+
+/**
+ * Contains class mod_feedback_complete_form
+ *
+ * @package   mod_feedback
+ * @copyright 2016 Marina Glancy
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Class mod_feedback_complete_form
+ *
+ * @package   mod_feedback
+ * @copyright 2016 Marina Glancy
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class mod_feedback_complete_form extends moodleform {
+
+    /** @var int */
+    const MODE_COMPLETE = 1;
+    /** @var int */
+    const MODE_PRINT = 2;
+    /** @var int */
+    const MODE_EDIT = 3;
+    /** @var int */
+    const MODE_VIEW_RESPONSE = 4;
+    /** @var int */
+    const MODE_VIEW_TEMPLATE = 5;
+
+    /** @var int */
+    protected $mode;
+    /** @var mod_feedback_structure|mod_feedback_completion */
+    protected $structure;
+    /** @var mod_feedback_completion */
+    protected $completion;
+    /** @var int */
+    protected $gopage;
+    /** @var bool */
+    protected $hasrequired = false;
+
+    /**
+     * Constructor
+     *
+     * @param int $mode
+     * @param mod_feedback_structure $structure
+     * @param string $formid CSS id attribute of the form
+     * @param array $customdata
+     */
+    public function __construct($mode, mod_feedback_structure $structure, $formid, $customdata = null) {
+        $this->mode = $mode;
+        $this->structure = $structure;
+        $this->gopage = isset($customdata['gopage']) ? $customdata['gopage'] : 0;
+        $isanonymous = $this->structure->is_anonymous() ? ' ianonymous' : '';
+        parent::__construct(null, $customdata, 'POST', '',
+                array('id' => $formid, 'class' => 'feedback_form' . $isanonymous), true);
+    }
+
+    /**
+     * Form definition
+     */
+    public function definition() {
+        $mform = $this->_form;
+        $mform->addElement('hidden', 'id', $this->get_cm()->id);
+        $mform->setType('id', PARAM_INT);
+        $mform->addElement('hidden', 'courseid', $this->get_current_course_id());
+        $mform->setType('courseid', PARAM_INT);
+        $mform->addElement('hidden', 'gopage');
+        $mform->setType('gopage', PARAM_INT);
+        $mform->addElement('hidden', 'lastpage');
+        $mform->setType('lastpage', PARAM_INT);
+        $mform->addElement('hidden', 'startitempos');
+        $mform->setType('startitempos', PARAM_INT);
+        $mform->addElement('hidden', 'lastitempos');
+        $mform->setType('lastitempos', PARAM_INT);
+
+        if (isloggedin() && !isguestuser() && $this->mode != self::MODE_EDIT && $this->mode != self::MODE_VIEW_TEMPLATE &&
+                    $this->mode != self::MODE_VIEW_RESPONSE) {
+            // Output information about the current mode (anonymous or not) in some modes.
+            if ($this->structure->is_anonymous()) {
+                $anonymousmodeinfo = get_string('anonymous', 'feedback');
+            } else {
+                $anonymousmodeinfo = get_string('non_anonymous', 'feedback');
+            }
+            $element = $mform->addElement('static', 'anonymousmode', '',
+                    get_string('mode', 'feedback') . ': ' . $anonymousmodeinfo);
+            $element->setAttributes($element->getAttributes() + ['class' => 'feedback_mode']);
+        }
+
+        // Add buttons to go to previous/next pages and submit the feedback.
+        if ($this->mode == self::MODE_COMPLETE) {
+            $buttonarray = array();
+            $buttonarray[] = &$mform->createElement('submit', 'gopreviouspage', get_string('previous_page', 'feedback'));
+            $buttonarray[] = &$mform->createElement('submit', 'gonextpage', get_string('next_page', 'feedback'),
+                    array('class' => 'form-submit'));
+            $buttonarray[] = &$mform->createElement('submit', 'savevalues', get_string('save_entries', 'feedback'),
+                    array('class' => 'form-submit'));
+            $buttonarray[] = &$mform->createElement('static', 'buttonsseparator', '', '<br>');
+            $buttonarray[] = &$mform->createElement('cancel');
+            $mform->addGroup($buttonarray, 'buttonar', '', array(' '), false);
+            $mform->closeHeaderBefore('buttonar');
+        }
+
+        // Set data.
+        $this->set_data(array('gopage' => $this->gopage));
+    }
+
+    /**
+     * This method is called after definition(), data submission and set_data().
+     * All form setup that is dependent on form values should go in here.
+     */
+    public function definition_after_data() {
+        parent::definition_after_data();
+
+        if ($this->mode == self::MODE_COMPLETE) {
+            $this->definition_after_data_complete();
+        } else {
+            $this->definition_after_data_preview();
+        }
+    }
+
+    /**
+     * Called from definition_after_data() in the completion mode
+     *
+     * This will add only items from a current page to the feedback and adjust the buttons
+     */
+    protected function definition_after_data_complete() {
+        if (!$this->structure instanceof mod_feedback_completion) {
+            // We should not really be here but just in case.
+            return;
+        }
+        $pages = $this->structure->get_pages();
+        $gopage = $this->gopage;
+        $pageitems = $pages[$gopage];
+        $hasnextpage = $gopage < count($pages) - 1; // Until we complete this page we can not trust get_next_page().
+        $hasprevpage = $gopage && ($this->structure->get_previous_page($gopage, false) !== null);
+
+        // Add elements.
+        foreach ($pageitems as $item) {
+            $itemobj = feedback_get_item_class($item->typ);
+            $itemobj->complete_form_element($item, $this);
+        }
+
+        // Remove invalid buttons (for example, no "previous page" if we are on the first page).
+        if (!$hasprevpage) {
+            $this->remove_button('gopreviouspage');
+        }
+        if (!$hasnextpage) {
+            $this->remove_button('gonextpage');
+        }
+        if ($hasnextpage) {
+            $this->remove_button('savevalues');
+        }
+    }
+
+    /**
+     * Called from definition_after_data() in all modes except for completion
+     *
+     * This will add all items to the form, including pagebreaks as horizontal rules.
+     */
+    protected function definition_after_data_preview() {
+        foreach ($this->structure->get_items() as $feedbackitem) {
+            $itemobj = feedback_get_item_class($feedbackitem->typ);
+            $itemobj->complete_form_element($feedbackitem, $this);
+        }
+    }
+
+    /**
+     * Removes the button that is not applicable for the current page
+     *
+     * @param string $buttonname
+     */
+    private function remove_button($buttonname) {
+        $el = $this->_form->getElement('buttonar');
+        foreach ($el->_elements as $idx => $button) {
+            if ($button instanceof MoodleQuickForm_submit && $button->getName() === $buttonname) {
+                unset($el->_elements[$idx]);
+                return;
+            }
+        }
+    }
+
+    /**
+     * Returns value for this element that is already stored in temporary or permanent table,
+     * usually only available when user clicked "Previous page". Null means no value is stored.
+     *
+     * @param stdClass $item
+     * @return string
+     */
+    public function get_item_value($item) {
+        if ($this->structure instanceof mod_feedback_completion) {
+            return $this->structure->get_item_value($item);
+        }
+        return null;
+    }
+
+    /**
+     * Can be used by the items to get the course id for which feedback is taken
+     *
+     * This function returns 0 for feedbacks that are located inside the courses.
+     * $this->get_feedback()->course will return the course where feedback is located.
+     * $this->get_current_course_id() will return the course where user was before taking the feedback
+     *
+     * @return int
+     */
+    public function get_course_id() {
+        return $this->structure->get_courseid();
+    }
+
+    /**
+     * Record from 'feedback' table corresponding to the current feedback
+     * @return stdClass
+     */
+    public function get_feedback() {
+        return $this->structure->get_feedback();
+    }
+
+    /**
+     * Current feedback mode, see constants on the top of this class
+     * @return int
+     */
+    public function get_mode() {
+        return $this->mode;
+    }
+
+    /**
+     * Returns whether the form is frozen, some items may prefer to change the element
+     * type in case of frozen form. For example, text or textarea element does not look
+     * nice when frozen
+     *
+     * @return bool
+     */
+    public function is_frozen() {
+        return $this->mode == self::MODE_VIEW_RESPONSE;
+    }
+
+    /**
+     * Returns the current course module
+     * @return cm_info
+     */
+    public function get_cm() {
+        return $this->structure->get_cm();
+    }
+
+    /**
+     * Returns the course where user was before taking the feedback.
+     *
+     * For feedbacks inside the course it will be the same as $this->get_feedback()->course.
+     * For feedbacks on the frontpage it will be the same as $this->get_course_id()
+     *
+     * @return int
+     */
+    public function get_current_course_id() {
+        return $this->structure->get_courseid() ?: $this->get_feedback()->course;
+    }
+
+    /**
+     * CSS class for the item
+     * @param stdClass $item
+     * @return string
+     */
+    protected function get_suggested_class($item) {
+        $class = "feedback_itemlist feedback-item-{$item->typ}";
+        if ($item->dependitem) {
+            $class .= " feedback_is_dependent";
+        }
+        if ($item->typ !== 'pagebreak') {
+            $itemobj = feedback_get_item_class($item->typ);
+            if ($itemobj->get_hasvalue()) {
+                $class .= " feedback_hasvalue";
+            }
+        }
+        return $class;
+    }
+
+    /**
+     * Adds an element to this form - to be used by items in their complete_form_element() method
+     *
+     * @param stdClass $item
+     * @param HTML_QuickForm_element|array $element either completed form element or an array that
+     *      can be passed as arguments to $this->_form->createElement() function
+     * @param bool $addrequiredrule automatically add 'required' rule
+     * @param bool $setdefaultvalue automatically set default value for element
+     * @return HTML_QuickForm_element
+     */
+    public function add_form_element($item, $element, $addrequiredrule = true, $setdefaultvalue = true) {
+        global $OUTPUT;
+        // Add element to the form.
+        if (is_array($element)) {
+            if ($this->is_frozen() && $element[0] === 'text') {
+                // Convert 'text' element to 'static' when freezing for better display.
+                $element = ['static', $element[1], $element[2]];
+            }
+            $element = call_user_func_array(array($this->_form, 'createElement'), $element);
+        }
+        $element = $this->_form->addElement($element);
+
+        // Prepend standard CSS classes to the element classes.
+        $attributes = $element->getAttributes();
+        $class = !empty($attributes['class']) ? ' ' . $attributes['class'] : '';
+        $attributes['class'] = $this->get_suggested_class($item) . $class;
+        $element->setAttributes($attributes);
+
+        // Add required rule.
+        if ($item->required && $addrequiredrule) {
+            $this->_form->addRule($element->getName(), get_string('required'), 'required', null, 'client');
+        }
+
+        // Set default value.
+        if ($setdefaultvalue && ($tmpvalue = $this->get_item_value($item))) {
+            $this->_form->setDefault($element->getName(), $tmpvalue);
+        }
+
+        // Freeze if needed.
+        if ($this->is_frozen()) {
+            $element->freeze();
+        }
+
+        // Add red asterisks on required fields.
+        if ($item->required) {
+            $required = '<img class="req" title="'.get_string('requiredelement', 'form').'" alt="'.
+                    get_string('requiredelement', 'form').'" src="'.$OUTPUT->pix_url('req') .'" />';
+            $element->setLabel($element->getLabel() . $required);
+            $this->hasrequired = true;
+        }
+
+        // Add different useful stuff to the question name.
+        $this->add_item_label($item, $element);
+        $this->add_item_dependencies($item, $element);
+        $this->add_item_number($item, $element);
+
+        if ($this->mode == self::MODE_EDIT) {
+            $this->enhance_name_for_edit($item, $element);
+        }
+
+        return $element;
+    }
+
+    /**
+     * Adds a group element to this form - to be used by items in their complete_form_element() method
+     *
+     * @param stdClass $item
+     * @param string $groupinputname name for the form element
+     * @param string $name question text
+     * @param array $elements array of arrays that can be passed to $this->_form->createElement()
+     * @param string $separator separator between group elements
+     * @param string $class additional CSS classes for the form element
+     * @return HTML_QuickForm_element
+     */
+    public function add_form_group_element($item, $groupinputname, $name, $elements, $separator,
+            $class = '') {
+        $objects = array();
+        foreach ($elements as $element) {
+            $object = call_user_func_array(array($this->_form, 'createElement'), $element);
+            $objects[] = $object;
+        }
+        $element = $this->add_form_element($item,
+                ['group', $groupinputname, $name, $objects, $separator, false],
+                false,
+                false);
+        if ($class !== '') {
+            $attributes = $element->getAttributes();
+            $attributes['class'] .= ' ' . $class;
+            $element->setAttributes($attributes);
+        }
+        return $element;
+    }
+
+    /**
+     * Adds an item number to the question name (if feedback autonumbering is on)
+     * @param stdClass $item
+     * @param HTML_QuickForm_element $element
+     */
+    protected function add_item_number($item, $element) {
+        if ($this->get_feedback()->autonumbering && !empty($item->itemnr)) {
+            $name = $element->getLabel();
+            $element->setLabel(html_writer::span($item->itemnr. '.', 'itemnr') . ' ' . $name);
+        }
+    }
+
+    /**
+     * Adds an item label to the question name
+     * @param stdClass $item
+     * @param HTML_QuickForm_element $element
+     */
+    protected function add_item_label($item, $element) {
+        if (strlen($item->label) && ($this->mode == self::MODE_EDIT || $this->mode == self::MODE_VIEW_TEMPLATE)) {
+            $name = $element->getLabel();
+            $name = '('.format_string($item->label).') '.$name;
+            $element->setLabel($name);
+        }
+    }
+
+    /**
+     * Adds a dependency description to the question name
+     * @param stdClass $item
+     * @param HTML_QuickForm_element $element
+     */
+    protected function add_item_dependencies($item, $element) {
+        $allitems = $this->structure->get_items();
+        if ($item->dependitem && ($this->mode == self::MODE_EDIT || $this->mode == self::MODE_VIEW_TEMPLATE)) {
+            if (isset($allitems[$item->dependitem])) {
+                $dependitem = $allitems[$item->dependitem];
+                $name = $element->getLabel();
+                $name .= html_writer::span(' ('.format_string($dependitem->label).'-&gt;'.$item->dependvalue.')',
+                        'feedback_depend');
+                $element->setLabel($name);
+            }
+        }
+    }
+
+    /**
+     * Returns the CSS id attribute that will be assigned by moodleform later to this element
+     * @param stdClass $item
+     * @param HTML_QuickForm_element $element
+     */
+    protected function guess_element_id($item, $element) {
+        if (!$id = $element->getAttribute('id')) {
+            $attributes = $element->getAttributes();
+            $id = $attributes['id'] = 'feedback_item_' . $item->id;
+            $element->setAttributes($attributes);
+        }
+        if ($element->getType() === 'group') {
+            return 'fgroup_' . $id;
+        }
+        return 'fitem_' . $id;
+    }
+
+    /**
+     * Adds editing actions to the question name in the edit mode
+     * @param stdClass $item
+     * @param HTML_QuickForm_element $element
+     */
+    protected function enhance_name_for_edit($item, $element) {
+        global $OUTPUT;
+        $menu = new action_menu();
+        $menu->set_owner_selector('#' . $this->guess_element_id($item, $element));
+        $menu->set_constraint('.feedback_form');
+        $menu->set_alignment(action_menu::TR, action_menu::BR);
+        $menu->set_menu_trigger(get_string('edit'));
+        $menu->do_not_enhance();
+        $menu->prioritise = true;
+
+        $itemobj = feedback_get_item_class($item->typ);
+        $actions = $itemobj->edit_actions($item, $this->get_feedback(), $this->get_cm());
+        foreach ($actions as $action) {
+            $menu->add($action);
+        }
+        $editmenu = $OUTPUT->render($menu);
+
+        $name = $element->getLabel();
+
+        $name = html_writer::span('', 'itemdd', array('id' => 'feedback_item_box_' . $item->id)) .
+                html_writer::span($name, 'itemname') .
+                html_writer::span($editmenu, 'itemactions');
+        $element->setLabel(html_writer::span($name, 'itemtitle'));
+    }
+
+    /**
+     * Sets the default value for form element - alias to $this->_form->setDefault()
+     * @param HTML_QuickForm_element|string $element
+     * @param mixed $defaultvalue
+     */
+    public function set_element_default($element, $defaultvalue) {
+        if ($element instanceof HTML_QuickForm_element) {
+            $element = $element->getName();
+        }
+        $this->_form->setDefault($element, $defaultvalue);
+    }
+
+
+    /**
+     * Sets the default value for form element - wrapper to $this->_form->setType()
+     * @param HTML_QuickForm_element|string $element
+     * @param int $type
+     */
+    public function set_element_type($element, $type) {
+        if ($element instanceof HTML_QuickForm_element) {
+            $element = $element->getName();
+        }
+        $this->_form->setType($element, $type);
+    }
+
+    /**
+     * Adds a validation rule for the given field - wrapper for $this->_form->addRule()
+     *
+     * Do not use for 'required' rule!
+     * Required * will be added automatically, if additional validation is needed
+     * use method {@link self::add_validation_rule()}
+     *
+     * @param string $element Form element name
+     * @param string $message Message to display for invalid data
+     * @param string $type Rule type, use getRegisteredRules() to get types
+     * @param string $format (optional)Required for extra rule data
+     * @param string $validation (optional)Where to perform validation: "server", "client"
+     * @param bool $reset Client-side validation: reset the form element to its original value if there is an error?
+     * @param bool $force Force the rule to be applied, even if the target form element does not exist
+     */
+    public function add_element_rule($element, $message, $type, $format = null, $validation = 'server',
+            $reset = false, $force = false) {
+        if ($element instanceof HTML_QuickForm_element) {
+            $element = $element->getName();
+        }
+        $this->_form->addRule($element, $message, $type, $format, $validation, $reset, $force);
+    }
+
+    /**
+     * Adds a validation rule to the form
+     *
+     * @param callable $callback with arguments ($values, $files)
+     */
+    public function add_validation_rule(callable $callback) {
+        if ($this->mode == self::MODE_COMPLETE) {
+            $this->_form->addFormRule($callback);
+        }
+    }
+
+    /**
+     * Returns a reference to the element - wrapper for function $this->_form->getElement()
+     *
+     * @param string $elementname Element name
+     * @return HTML_QuickForm_element reference to element
+     */
+    public function get_form_element($elementname) {
+        return $this->_form->getElement($elementname);
+    }
+
+    /**
+     * Displays the form
+     */
+    public function display() {
+        global $OUTPUT;
+        // Finalize the form definition if not yet done.
+        if (!$this->_definition_finalized) {
+            $this->_definition_finalized = true;
+            $this->definition_after_data();
+        }
+
+        $mform = $this->_form;
+
+        // Add "This form has required fields" text in the bottom of the form.
+        if (($mform->_required || $this->hasrequired) &&
+               ($this->mode == self::MODE_COMPLETE || $this->mode == self::MODE_PRINT || $this->mode == self::MODE_VIEW_TEMPLATE)) {
+            $element = $mform->addElement('static', 'requiredfields', '',
+                    get_string('somefieldsrequired', 'form',
+                            '<img alt="'.get_string('requiredelement', 'form').'" src="'.$OUTPUT->pix_url('req') .'" />'));
+            $element->setAttributes($element->getAttributes() + ['class' => 'requirednote']);
+        }
+
+        // Reset _required array so the default red * are not displayed.
+        $mform->_required = array();
+
+        // Move buttons to the end of the form.
+        if ($this->mode == self::MODE_COMPLETE) {
+            $mform->addElement('hidden', '__dummyelement');
+            $buttons = $mform->removeElement('buttonar', false);
+            $mform->insertElementBefore($buttons, '__dummyelement');
+            $mform->removeElement('__dummyelement');
+        }
+
+        $this->_form->display();
+    }
+}
diff --git a/mod/feedback/classes/completion.php b/mod/feedback/classes/completion.php
new file mode 100644 (file)
index 0000000..75096dc
--- /dev/null
@@ -0,0 +1,582 @@
+<?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/>.
+
+/**
+ * Contains class mod_feedback_completion
+ *
+ * @package   mod_feedback
+ * @copyright 2016 Marina Glancy
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Collects information and methods about feedback completion (either complete.php or show_entries.php)
+ *
+ * @package   mod_feedback
+ * @copyright 2016 Marina Glancy
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class mod_feedback_completion extends mod_feedback_structure {
+    /** @var stdClass */
+    protected $completed;
+    /** @var stdClass */
+    protected $completedtmp = null;
+    /** @var stdClass[] */
+    protected $valuestmp = null;
+    /** @var stdClass[] */
+    protected $values = null;
+    /** @var bool */
+    protected $iscompleted = false;
+
+
+    /**
+     * Constructor
+     *
+     * @param stdClass $feedback feedback object, in case of the template
+     *     this is the current feedback the template is accessed from
+     * @param cm_info $cm course module object corresponding to the $feedback
+     * @param int $courseid current course (for site feedbacks only)
+     * @param bool $iscompleted has feedback been already completed? If yes either completedid or userid must be specified.
+     * @param int $completedid id in the table feedback_completed, may be omitted if userid is specified
+     *     but it is highly recommended because the same user may have multiple responses to the same feedback
+     *     for different courses
+     * @param int $userid id of the user - if specified only non-anonymous replies will be returned. If not
+     *     specified only anonymous replies will be returned and the $completedid is mandatory.
+     */
+    public function __construct($feedback, $cm, $courseid, $iscompleted = false, $completedid = null, $userid = null) {
+        global $DB;
+        // Make sure courseid is always set for site feedback and never for course feedback.
+        if ($feedback->course == SITEID) {
+            $courseid = $courseid ?: SITEID;
+        } else {
+            $courseid = 0;
+        }
+        parent::__construct($feedback, $cm, $courseid, 0);
+        if ($iscompleted) {
+            // Retrieve information about the completion.
+            $this->iscompleted = true;
+            $params = array('feedback' => $feedback->id);
+            if (!$userid && !$completedid) {
+                throw new coding_exception('Either $completedid or $userid must be specified for completed feedbacks');
+            }
+            if ($completedid) {
+                $params['id'] = $completedid;
+            }
+            if ($userid) {
+                // We must respect the anonymousity of the reply that the user saw when they were completing the feedback,
+                // not the current state that may have been changed later by the teacher.
+                $params['anonymous_response'] = FEEDBACK_ANONYMOUS_NO;
+                $params['userid'] = $userid;
+            }
+            $this->completed = $DB->get_record('feedback_completed', $params, '*', MUST_EXIST);
+            $this->courseid = $this->completed->courseid;
+        }
+    }
+
+    /**
+     * Returns a record from 'feedback_completed' table
+     * @return stdClass
+     */
+    public function get_completed() {
+        return $this->completed;
+    }
+
+    /**
+     * Returns the temporary completion record for the current user or guest session
+     *
+     * @return stdClass|false record from feedback_completedtmp or false if not found
+     */
+    protected function get_current_completed_tmp() {
+        global $USER, $DB;
+        if ($this->completedtmp === null) {
+            $params = array('feedback' => $this->get_feedback()->id);
+            if ($courseid = $this->get_courseid()) {
+                $params['courseid'] = $courseid;
+            }
+            if (isloggedin() && !isguestuser()) {
+                $params['userid'] = $USER->id;
+            } else {
+                $params['guestid'] = sesskey();
+            }
+            $this->completedtmp = $DB->get_record('feedback_completedtmp', $params);
+        }
+        return $this->completedtmp;
+    }
+
+    /**
+     * Can the current user see the item, if dependency is met?
+     *
+     * @param stdClass $item
+     * @return bool whether user can see item or not,
+     *     null if dependency is broken or dependent question is not answered.
+     */
+    protected function can_see_item($item) {
+        if (empty($item->dependitem)) {
+            return true;
+        }
+        if ($this->dependency_has_error($item)) {
+            return null;
+        }
+        $allitems = $this->get_items();
+        $ditem = $allitems[$item->dependitem];
+        $itemobj = feedback_get_item_class($ditem->typ);
+        if ($this->iscompleted) {
+            $value = $this->get_values($ditem);
+        } else {
+            $value = $this->get_values_tmp($ditem);
+        }
+        if ($value === null) {
+            return null;
+        }
+        return $itemobj->compare_value($ditem, $value, $item->dependvalue) ? true : false;
+    }
+
+    /**
+     * Dependency condition has an error
+     * @param stdClass $item
+     * @return bool
+     */
+    protected function dependency_has_error($item) {
+        if (empty($item->dependitem)) {
+            // No dependency - no error.
+            return false;
+        }
+        $allitems = $this->get_items();
+        if (!array_key_exists($item->dependitem, $allitems)) {
+            // Looks like dependent item has been removed.
+            return true;
+        }
+        $itemids = array_keys($allitems);
+        $index1 = array_search($item->dependitem, $itemids);
+        $index2 = array_search($item->id, $itemids);
+        if ($index1 >= $index2) {
+            // Dependent item is after the current item in the feedback.
+            return true;
+        }
+        for ($i = $index1 + 1; $i < $index2; $i++) {
+            if ($allitems[$itemids[$i]]->typ === 'pagebreak') {
+                return false;
+            }
+        }
+        // There are no page breaks between dependent items.
+        return true;
+    }
+
+    /**
+     * Returns a value stored for this item in the feedback (temporary or not, depending on the mode)
+     * @param stdClass $item
+     * @return string
+     */
+    public function get_item_value($item) {
+        if ($this->iscompleted) {
+            return $this->get_values($item);
+        } else {
+            return $this->get_values_tmp($item);
+        }
+    }
+
+    /**
+     * Returns all temporary values for this feedback or just a value for an item
+     * @param stdClass $item
+     * @return array
+     */
+    protected function get_values_tmp($item = null) {
+        global $DB;
+        if ($this->valuestmp === null) {
+            $completedtmp = $this->get_current_completed_tmp();
+            if ($completedtmp) {
+                $this->valuestmp = $DB->get_records_menu('feedback_valuetmp',
+                        ['completed' => $completedtmp->id], '', 'item, value');
+            } else {
+                $this->valuestmp = array();
+            }
+        }
+        if ($item) {
+            return array_key_exists($item->id, $this->valuestmp) ? $this->valuestmp[$item->id] : null;
+        }
+        return $this->valuestmp;
+    }
+
+    /**
+     * Returns all completed values for this feedback or just a value for an item
+     * @param stdClass $item
+     * @return array
+     */
+    protected function get_values($item = null) {
+        global $DB;
+        if ($this->values === null) {
+            if ($this->completed) {
+                $this->values = $DB->get_records_menu('feedback_value',
+                        ['completed' => $this->completed->id], '', 'item, value');
+            } else {
+                $this->values = array();
+            }
+        }
+        if ($item) {
+            return array_key_exists($item->id, $this->values) ? $this->values[$item->id] : null;
+        }
+        return $this->values;
+    }
+
+    /**
+     * Splits the feedback items into pages
+     *
+     * Items that we definitely know at this stage as not applicable are excluded.
+     * Items that are dependent on something that has not yet been answered are
+     * still present, as well as items with broken dependencies.
+     *
+     * @return array array of arrays of items
+     */
+    public function get_pages() {
+        $pages = [[]]; // The first page always exists.
+        $items = $this->get_items();
+        foreach ($items as $item) {
+            if ($item->typ === 'pagebreak') {
+                $pages[] = [];
+            } else if ($this->can_see_item($item) !== false) {
+                $pages[count($pages) - 1][] = $item;
+            }
+        }
+        return $pages;
+    }
+
+    /**
+     * Returns the last page that has items with the value (i.e. not label) which have been answered
+     * as well as the first page that has items with the values that have not been answered.
+     *
+     * Either of the two return values may be null if there are no answered page or there are no
+     * unanswered pages left respectively.
+     *
+     * Two pages may not be directly following each other because there may be empty pages
+     * or pages with information texts only between them
+     *
+     * @return array array of two elements [$lastcompleted, $firstincompleted]
+     */
+    protected function get_last_completed_page() {
+        $completed = [];
+        $incompleted = [];
+        $pages = $this->get_pages();
+        foreach ($pages as $pageidx => $pageitems) {
+            foreach ($pageitems as $item) {
+                if ($item->hasvalue) {
+                    if ($this->get_values_tmp($item) !== null) {
+                        $completed[$pageidx] = true;
+                    } else {
+                        $incompleted[$pageidx] = true;
+                    }
+                }
+            }
+        }
+        $completed = array_keys($completed);
+        $incompleted = array_keys($incompleted);
+        // If some page has both completed and incompleted items it is considered incompleted.
+        $completed = array_diff($completed, $incompleted);
+        // If the completed page follows an incompleted page, it does not count.
+        $firstincompleted = $incompleted ? min($incompleted) : null;
+        if ($firstincompleted !== null) {
+            $completed = array_filter($completed, function($a) use ($firstincompleted) {
+                return $a < $firstincompleted;
+            });
+        }
+        $lastcompleted = $completed ? max($completed) : null;
+        return [$lastcompleted, $firstincompleted];
+    }
+
+    /**
+     * Get the next page for the feedback
+     *
+     * This is normally $gopage+1 but may be bigger if there are empty pages or
+     * pages without visible questions.
+     *
+     * This method can only be called when questions on the current page are
+     * already answered, otherwise it may be inaccurate.
+     *
+     * @param int $gopage current page
+     * @param bool $strictcheck when gopage is the user-input value, make sure we do not jump over unanswered questions
+     * @return int|null the index of the next page or null if this is the last page
+     */
+    public function get_next_page($gopage, $strictcheck = true) {
+        if ($strictcheck) {
+            list($lastcompleted, $firstincompleted) = $this->get_last_completed_page();
+            if ($firstincompleted !== null && $firstincompleted <= $gopage) {
+                return $firstincompleted;
+            }
+        }
+        $pages = $this->get_pages();
+        for ($pageidx = $gopage + 1; $pageidx < count($pages); $pageidx++) {
+            if (!empty($pages[$pageidx])) {
+                return $pageidx;
+            }
+        }
+        // No further pages in the feedback have any visible items.
+        return null;
+    }
+
+    /**
+     * Get the previous page for the feedback
+     *
+     * This is normally $gopage-1 but may be smaller if there are empty pages or
+     * pages without visible questions.
+     *
+     * @param int $gopage current page
+     * @param bool $strictcheck when gopage is the user-input value, make sure we do not jump over unanswered questions
+     * @return int|null the index of the next page or null if this is the first page with items
+     */
+    public function get_previous_page($gopage, $strictcheck = true) {
+        if (!$gopage) {
+            // If we are already on the first (0) page, there is definitely no previous page.
+            return null;
+        }
+        $pages = $this->get_pages();
+        $rv = null;
+        // Iterate through previous pages and find the closest one that has any items on it.
+        for ($pageidx = $gopage - 1; $pageidx >= 0; $pageidx--) {
+            if (!empty($pages[$pageidx])) {
+                $rv = $pageidx;
+                break;
+            }
+        }
+        if ($rv === null) {
+            // We are on the very first page that has items.
+            return null;
+        }
+        if ($rv > 0 && $strictcheck) {
+            // Check if this page is actually not past than first incompleted page.
+            list($lastcompleted, $firstincompleted) = $this->get_last_completed_page();
+            if ($firstincompleted !== null && $firstincompleted < $rv) {
+                return $firstincompleted;
+            }
+        }
+        return $rv;
+    }
+
+    /**
+     * Page index to resume the feedback
+     *
+     * When user abandones answering feedback and then comes back to it we should send him
+     * to the first page after the last page he fully completed.
+     * @return int
+     */
+    public function get_resume_page() {
+        list($lastcompleted, $firstincompleted) = $this->get_last_completed_page();
+        return $lastcompleted === null ? 0 : $this->get_next_page($lastcompleted, false);
+    }
+
+    /**
+     * Creates a new record in the 'feedback_completedtmp' table for the current user/guest session
+     *
+     * @return stdClass record from feedback_completedtmp or false if not found
+     */
+    protected function create_current_completed_tmp() {
+        global $USER, $DB;
+        $record = (object)['feedback' => $this->feedback->id];
+        if ($this->get_courseid()) {
+            $record->courseid = $this->get_courseid();
+        }
+        if (isloggedin() && !isguestuser()) {
+            $record->userid = $USER->id;
+        } else {
+            $record->guestid = sesskey();
+        }
+        $record->timemodified = time();
+        $record->anonymous_response = $this->feedback->anonymous;
+        $id = $DB->insert_record('feedback_completedtmp', $record);
+        $this->completedtmp = $DB->get_record('feedback_completedtmp', ['id' => $id]);
+        $this->valuestmp = null;
+        return $this->completedtmp;
+    }
+
+    /**
+     * Saves unfinished response to the temporary table
+     *
+     * This is called when user proceeds to the next/previous page in the complete form
+     * and also right after the form submit.
+     * After the form submit the {@link save_response()} is called to
+     * move response from temporary table to completion table.
+     *
+     * @param stdClass $data data from the form mod_feedback_complete_form
+     */
+    public function save_response_tmp($data) {
+        global $DB;
+        if (!$completedtmp = $this->get_current_completed_tmp()) {
+            $completedtmp = $this->create_current_completed_tmp();
+        } else {
+            $currentime = time();
+            $DB->update_record('feedback_completedtmp',
+                    ['id' => $completedtmp->id, 'timemodified' => $currentime]);
+            $completedtmp->timemodified = $currentime;
+        }
+
+        // Find all existing values.
+        $existingvalues = $DB->get_records_menu('feedback_valuetmp',
+                ['completed' => $completedtmp->id], '', 'item, id');
+
+        // Loop through all feedback items and save the ones that are present in $data.
+        $allitems = $this->get_items();
+        foreach ($allitems as $item) {
+            if (!$item->hasvalue) {
+                continue;
+            }
+            $keyname = $item->typ . '_' . $item->id;
+            if (!isset($data->$keyname)) {
+                // This item is either on another page or dependency was not met - nothing to save.
+                continue;
+            }
+
+            $newvalue = ['item' => $item->id, 'completed' => $completedtmp->id, 'course_id' => $completedtmp->courseid];
+
+            // Convert the value to string that can be stored in 'feedback_valuetmp' or 'feedback_value'.
+            $itemobj = feedback_get_item_class($item->typ);
+            $newvalue['value'] = $itemobj->create_value($data->$keyname);
+
+            // Update or insert the value in the 'feedback_valuetmp' table.
+            if (array_key_exists($item->id, $existingvalues)) {
+                $newvalue['id'] = $existingvalues[$item->id];
+                $DB->update_record('feedback_valuetmp', $newvalue);
+            } else {
+                $DB->insert_record('feedback_valuetmp', $newvalue);
+            }
+        }
+
+        // Reset valuestmp cache.
+        $this->valuestmp = null;
+    }
+
+    /**
+     * Saves the response
+     *
+     * The form data has already been stored in the temporary table in
+     * {@link save_response_tmp()}. This function copies the values
+     * from the temporary table to the completion table.
+     * It is also responsible for sending email notifications when applicable.
+     */
+    public function save_response() {
+        global $USER, $SESSION, $DB;
+
+        $feedbackcompleted = $this->find_last_completed();
+        $feedbackcompletedtmp = $this->get_current_completed_tmp();
+
+        if (feedback_check_is_switchrole()) {
+            // We do not actually save anything if the role is switched, just delete temporary values.
+            $this->delete_completedtmp();
+            return;
+        }
+
+        // Save values.
+        $completedid = feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted);
+        $this->completed = $DB->get_record('feedback_completed', array('id' => $completedid));
+
+        // Send email.
+        if ($this->feedback->anonymous == FEEDBACK_ANONYMOUS_NO) {
+            feedback_send_email($this->cm, $this->feedback, $this->cm->get_course(), $USER);
+        } else {
+            feedback_send_email_anonym($this->cm, $this->feedback, $this->cm->get_course());
+        }
+
+        unset($SESSION->feedback->is_started);
+
+        // Update completion state.
+        $completion = new completion_info($this->cm->get_course());
+        if (isloggedin() && !isguestuser() && $completion->is_enabled($this->cm) && $this->feedback->completionsubmit) {
+            $completion->update_state($this->cm, COMPLETION_COMPLETE);
+        }
+    }
+
+    /**
+     * Deletes the temporary completed and all related temporary values
+     */
+    protected function delete_completedtmp() {
+        global $DB;
+
+        if ($completedtmp = $this->get_current_completed_tmp()) {
+            $DB->delete_records('feedback_valuetmp', ['completed' => $completedtmp->id]);
+            $DB->delete_records('feedback_completedtmp', ['id' => $completedtmp->id]);
+            $this->completedtmp = null;
+        }
+    }
+
+    /**
+     * Retrieves the last completion record for the current user
+     *
+     * @return stdClass record from feedback_completed or false if not found
+     */
+    protected function find_last_completed() {
+        global $USER, $DB;
+        if (isloggedin() || isguestuser()) {
+            // Not possible to retrieve completed feedback for guests.
+            return false;
+        }
+        if ($this->is_anonymous()) {
+            // Not possible to retrieve completed anonymous feedback.
+            return false;
+        }
+        $params = array('feedback' => $this->feedback->id, 'userid' => $USER->id);
+        if ($this->get_courseid()) {
+            $params['courseid'] = $this->get_courseid();
+        }
+        $this->completed = $DB->get_record('feedback_completed', $params);
+        return $this->completed;
+    }
+
+    /**
+     * Checks if current user has capability to submit the feedback
+     *
+     * There is an exception for fully anonymous feedbacks when guests can complete
+     * feedback without the proper capability.
+     *
+     * This should be followed by checking {@link can_submit()} because even if
+     * user has capablity to complete, they may have already submitted feedback
+     * and can not re-submit
+     *
+     * @return bool
+     */
+    public function can_complete() {
+        global $CFG;
+
+        $context = context_module::instance($this->cm->id);
+        if (has_capability('mod/feedback:complete', $context)) {
+            return true;
+        }
+
+        if (!empty($CFG->feedback_allowfullanonymous)
+                    AND $this->feedback->course == SITEID
+                    AND $this->feedback->anonymous == FEEDBACK_ANONYMOUS_YES
+                    AND (!isloggedin() OR isguestuser())) {
+            // Guests are allowed to complete fully anonymous feedback without having 'mod/feedback:complete' capability.
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks if user is prevented from re-submission.
+     *
+     * This must be called after {@link can_complete()}
+     *
+     * @return bool
+     */
+    public function can_submit() {
+        if ($this->get_feedback()->multiple_submit == 0 ) {
+            if ($this->is_already_submitted()) {
+                return false;
+            }
+        }
+        return true;
+    }
+}
\ No newline at end of file
index 056a20d..39e45e5 100644 (file)
@@ -50,6 +50,29 @@ class course_module_viewed extends \core\event\course_module_viewed {
         $this->data['objecttable'] = 'feedback';
     }
 
+    /**
+     * Creates an instance from feedback record
+     *
+     * @param stdClass $feedback
+     * @param cm_info|stdClass $cm
+     * @param stdClass $course
+     * @return course_module_viewed
+     */
+    public static function create_from_record($feedback, $cm, $course) {
+        $event = self::create(array(
+            'objectid' => $feedback->id,
+            'context' => \context_module::instance($cm->id),
+            'anonymous' => ($feedback->anonymous == FEEDBACK_ANONYMOUS_YES),
+            'other' => array(
+                'anonymous' => $feedback->anonymous // Deprecated.
+            )
+        ));
+        $event->add_record_snapshot('course_modules', $cm);
+        $event->add_record_snapshot('course', $course);
+        $event->add_record_snapshot('feedback', $feedback);
+        return $event;
+    }
+
     /**
      * Define whether a user can view the event or not. Make sure no one except admin can see details of an anonymous response.
      *
index b5d583c..d0820a1 100644 (file)
@@ -54,6 +54,32 @@ class response_deleted extends \core\event\base {
         $this->data['edulevel'] = self::LEVEL_PARTICIPATING;
     }
 
+    /**
+     * Creates an instance from the record from db table feedback_completed
+     *
+     * @param stdClass $completed
+     * @param stdClass|cm_info $cm
+     * @param stdClass $feedback
+     * @return self
+     */
+    public static function create_from_record($completed, $cm, $feedback) {
+        $event = self::create(array(
+            'relateduserid' => $completed->userid,
+            'objectid' => $completed->id,
+            'courseid' => $cm->course,
+            'context' => \context_module::instance($cm->id),
+            'anonymous' => ($completed->anonymous_response == FEEDBACK_ANONYMOUS_YES),
+            'other' => array(
+                'cmid' => $cm->id,
+                'instanceid' => $feedback->id,
+                'anonymous' => $completed->anonymous_response) // Deprecated.
+        ));
+
+        $event->add_record_snapshot('feedback_completed', $completed);
+        $event->add_record_snapshot('feedback', $feedback);
+        return $event;
+    }
+
     /**
      * Returns localised general event name.
      *
index 160f7dd..f012f69 100644 (file)
@@ -57,6 +57,29 @@ class response_submitted extends \core\event\base {
         $this->data['edulevel'] = self::LEVEL_PARTICIPATING;
     }
 
+    /**
+     * Creates an instance from the record from db table feedback_completed
+     *
+     * @param stdClass $completed
+     * @param stdClass|cm_info $cm
+     * @return self
+     */
+    public static function create_from_record($completed, $cm) {
+        $event = self::create(array(
+            'relateduserid' => $completed->userid,
+            'objectid' => $completed->id,
+            'context' => \context_module::instance($cm->id),
+            'anonymous' => ($completed->anonymous_response == FEEDBACK_ANONYMOUS_YES),
+            'other' => array(
+                'cmid' => $cm->id,
+                'instanceid' => $completed->feedback,
+                'anonymous' => $completed->anonymous_response // Deprecated.
+            )
+        ));
+        $event->add_record_snapshot('feedback_completed', $completed);
+        return $event;
+    }
+
     /**
      * Returns localised general event name.
      *
index 61f4e1c..5bd0948 100644 (file)
@@ -206,6 +206,19 @@ class mod_feedback_responses_table extends table_sql {
         return $this->grandtotal;
     }
 
+    /**
+     * Defines columns
+     * @param array $columns an array of identifying names for columns. If
+     * columns are sorted then column names must correspond to a field in sql.
+     */
+    function define_columns($columns) {
+        parent::define_columns($columns);
+        foreach ($this->columns as $column => $column) {
+            // Automatically assign classes to columns.
+            $this->column_class[$column] = ' ' . $column;
+        }
+    }
+
     /**
      * Displays the table
      */
diff --git a/mod/feedback/classes/structure.php b/mod/feedback/classes/structure.php
new file mode 100644 (file)
index 0000000..ea8320f
--- /dev/null
@@ -0,0 +1,329 @@
+<?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/>.
+
+/**
+ * Contains class mod_feedback_structure
+ *
+ * @package   mod_feedback
+ * @copyright 2016 Marina Glancy
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Stores and manipulates the structure of the feedback or template (items, pages, etc.)
+ *
+ * @package   mod_feedback
+ * @copyright 2016 Marina Glancy
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class mod_feedback_structure {
+    /** @var stdClass */
+    protected $feedback;
+    /** @var cm_info */
+    protected $cm;
+    /** @var int */
+    protected $courseid = 0;
+    /** @var int */
+    protected $templateid;
+    /** @var array */
+    protected $allitems;
+    /** @var array */
+    protected $allcourses;
+
+    /**
+     * Constructor
+     *
+     * @param stdClass $feedback feedback object, in case of the template
+     *     this is the current feedback the template is accessed from
+     * @param cm_info $cm course module object corresponding to the $feedback
+     * @param int $courseid current course (for site feedbacks only)
+     * @param int $templateid template id if this class represents the template structure
+     */
+    public function __construct($feedback, $cm, $courseid = 0, $templateid = null) {
+        $this->feedback = $feedback;
+        $this->cm = $cm;
+        $this->courseid = ($feedback->course == SITEID) ? $courseid : 0;
+        $this->templateid = $templateid;
+    }
+
+    /**
+     * Current feedback
+     * @return stdClass
+     */
+    public function get_feedback() {
+        return $this->feedback;
+    }
+
+    /**
+     * Current course module
+     * @return stdClass
+     */
+    public function get_cm() {
+        return $this->cm;
+    }
+
+    /**
+     * Id of the current course (for site feedbacks only)
+     * @return stdClass
+     */
+    public function get_courseid() {
+        return $this->courseid;
+    }
+
+    /**
+     * Template id
+     * @return int
+     */
+    public function get_templateid() {
+        return $this->templateid;
+    }
+
+    /**
+     * Is this feedback open (check timeopen and timeclose)
+     * @return bool
+     */
+    public function is_open() {
+        $checktime = time();
+        return (!$this->feedback->timeopen || $this->feedback->timeopen <= $checktime) &&
+            (!$this->feedback->timeclose || $this->feedback->timeclose >= $checktime);
+    }
+
+    /**
+     * Get all items in this feedback or this template
+     * @param bool $hasvalueonly only count items with a value.
+     * @return array of objects from feedback_item with an additional attribute 'itemnr'
+     */
+    public function get_items($hasvalueonly = false) {
+        global $DB;
+        if ($this->allitems === null) {
+            if ($this->templateid) {
+                $this->allitems = $DB->get_records('feedback_item', ['template' => $this->templateid], 'position');
+            } else {
+                $this->allitems = $DB->get_records('feedback_item', ['feedback' => $this->feedback->id], 'position');
+            }
+            $idx = 1;
+            foreach ($this->allitems as $id => $item) {
+                $this->allitems[$id]->itemnr = $item->hasvalue ? ($idx++) : null;
+            }
+        }
+        if ($hasvalueonly && $this->allitems) {
+            return array_filter($this->allitems, function($item) {
+                return $item->hasvalue;
+            });
+        }
+        return $this->allitems;
+    }
+
+    /**
+     * Is the items list empty?
+     * @return bool
+     */
+    public function is_empty() {
+        $items = $this->get_items();
+        $displayeditems = array_filter($items, function($item) {
+            return $item->typ !== 'pagebreak';
+        });
+        return !$displayeditems;
+    }
+
+    /**
+     * Is this feedback anonymous?
+     * @return bool
+     */
+    public function is_anonymous() {
+        return $this->feedback->anonymous == FEEDBACK_ANONYMOUS_YES;
+    }
+
+    /**
+     * Returns the formatted text of the page after submit or null if it is not set
+     *
+     * @return string|null
+     */
+    public function page_after_submit() {
+        global $CFG;
+        require_once($CFG->libdir . '/filelib.php');
+
+        $pageaftersubmit = $this->get_feedback()->page_after_submit;
+        if (empty($pageaftersubmit)) {
+            return null;
+        }
+        $pageaftersubmitformat = $this->get_feedback()->page_after_submitformat;
+
+        $context = context_module::instance($this->get_cm()->id);
+        $output = file_rewrite_pluginfile_urls($pageaftersubmit,
+                'pluginfile.php', $context->id, 'mod_feedback', 'page_after_submit', 0);
+
+        return format_text($output, $pageaftersubmitformat, array('overflowdiv' => true));
+    }
+
+    /**
+     * Checks if current user is able to view feedback on this course.
+     *
+     * @return bool
+     */
+    public function can_view_analysis() {
+        $context = context_module::instance($this->cm->id);
+        if (has_capability('mod/feedback:viewreports', $context)) {
+            return true;
+        }
+
+        if (intval($this->feedback->publish_stats) != 1 ||
+                !has_capability('mod/feedback:viewanalysepage', $context)) {
+            return false;
+        }
+
+        if (!isloggedin() || isguestuser()) {
+            // There is no tracking for the guests, assume that they can view analysis if condition above is satisfied.
+            return $this->feedback->course == SITEID;
+        }
+
+        return $this->is_already_submitted(true);
+    }
+
+    /**
+     * check for multiple_submit = false.
+     * if the feedback is global so the courseid must be given
+     *
+     * @param bool $anycourseid if true checks if this feedback was submitted in any course, otherwise checks $this->courseid .
+     *     Applicable to frontpage feedbacks only
+     * @return bool true if the feedback already is submitted otherwise false
+     */
+    public function is_already_submitted($anycourseid = false) {
+        global $USER, $DB;
+
+        if (!isloggedin() || isguestuser()) {
+            return false;
+        }
+
+        $params = array('userid' => $USER->id, 'feedback' => $this->feedback->id);
+        if (!$anycourseid && $this->courseid) {
+            $params['courseid'] = $this->courseid;
+        }
+        return $DB->record_exists('feedback_completed', $params);
+    }
+
+    /**
+     * Check whether the feedback is mapped to the given courseid.
+     */
+    public function check_course_is_mapped() {
+        global $DB;
+        if ($this->feedback->course != SITEID) {
+            return true;
+        }
+        if ($DB->get_records('feedback_sitecourse_map', array('feedbackid' => $this->feedback->id))) {
+            $params = array('feedbackid' => $this->feedback->id, 'courseid' => $this->courseid);
+            if (!$DB->get_record('feedback_sitecourse_map', $params)) {
+                return false;
+            }
+        }
+        // No mapping means any course is mapped.
+        return true;
+    }
+
+    /**
+     * If there are any new responses to the anonymous feedback, re-shuffle all
+     * responses and assign response number to each of them.
+     */
+    public function shuffle_anonym_responses() {
+        global $DB;
+        $params = array('feedback' => $this->feedback->id,
+            'random_response' => 0,
+            'anonymous_response' => FEEDBACK_ANONYMOUS_YES);
+
+        if ($DB->count_records('feedback_completed', $params, 'random_response')) {
+            // Get all of the anonymous records, go through them and assign a response id.
+            unset($params['random_response']);
+            $feedbackcompleteds = $DB->get_records('feedback_completed', $params, 'id');
+            shuffle($feedbackcompleteds);
+            $num = 1;
+            foreach ($feedbackcompleteds as $compl) {
+                $compl->random_response = $num++;
+                $DB->update_record('feedback_completed', $compl);
+            }
+        }
+    }
+
+    /**
+     * Counts records from {feedback_completed} table for a given feedback
+     *
+     * If $groupid or $this->courseid is set, the records are filtered by the group/course
+     *
+     * @param int $groupid
+     * @return mixed array of found completeds otherwise false
+     */
+    public function count_completed_responses($groupid = 0) {
+        global $DB;
+        if (intval($groupid) > 0) {
+            $query = "SELECT COUNT(DISTINCT fbc.id)
+                        FROM {feedback_completed} fbc, {groups_members} gm
+                        WHERE fbc.feedback = :feedback
+                            AND gm.groupid = :groupid
+                            AND fbc.userid = gm.userid";
+        } else if ($this->courseid) {
+            $query = "SELECT COUNT(fbc.id)
+                        FROM {feedback_completed} fbc
+                        WHERE fbc.feedback = :feedback
+                            AND fbc.courseid = :courseid";
+        } else {
+            $query = "SELECT COUNT(fbc.id) FROM {feedback_completed} fbc WHERE fbc.feedback = :feedback";
+        }
+        $params = ['feedback' => $this->feedback->id, 'groupid' => $groupid, 'courseid' => $this->courseid];
+        return $DB->get_field_sql($query, $params);
+    }
+
+    /**
+     * For the frontpage feedback returns the list of courses with at least one completed feedback
+     *
+     * @return array id=>name pairs of courses
+     */
+    public function get_completed_courses() {
+        global $DB;
+
+        if ($this->get_feedback()->course != SITEID) {
+            return [];
+        }
+
+        if ($this->allcourses !== null) {
+            return $this->allcourses;
+        }
+
+        $courseselect = "SELECT fbc.courseid
+            FROM {feedback_completed} fbc
+            WHERE fbc.feedback = :feedbackid";
+
+        $ctxselect = context_helper::get_preload_record_columns_sql('ctx');
+
+        $sql = 'SELECT c.id, c.shortname, c.fullname, c.idnumber, c.visible, '. $ctxselect. '
+                FROM {course} c
+                JOIN {context} ctx ON c.id = ctx.instanceid AND ctx.contextlevel = :contextcourse
+                WHERE c.id IN ('. $courseselect.') ORDER BY c.sortorder';
+        $list = $DB->get_records_sql($sql, ['contextcourse' => CONTEXT_COURSE, 'feedbackid' => $this->get_feedback()->id]);
+
+        $this->allcourses = array();
+        foreach ($list as $course) {
+            context_helper::preload_from_record($course);
+            if (!$course->visible && !has_capability('moodle/course:viewhiddencourses', context_course::instance($course->id))) {
+                // Do not return courses that current user can not see.
+                continue;
+            }
+            $label = get_course_display_name_for_list($course);
+            $this->allcourses[$course->id] = $label;
+        }
+        return $this->allcourses;
+    }
+}
\ No newline at end of file
index c9f6825..dbe9cd4 100644 (file)
@@ -29,527 +29,137 @@ require_once($CFG->libdir . '/completionlib.php');
 feedback_init_feedback_session();
 
 $id = required_param('id', PARAM_INT);
-$completedid = optional_param('completedid', false, PARAM_INT);
-$preservevalues  = optional_param('preservevalues', 0,  PARAM_INT);
-$courseid = optional_param('courseid', false, PARAM_INT);
-$gopage = optional_param('gopage', -1, PARAM_INT);
-$lastpage = optional_param('lastpage', false, PARAM_INT);
-$startitempos = optional_param('startitempos', 0, PARAM_INT);
-$lastitempos = optional_param('lastitempos', 0, PARAM_INT);
-$anonymous_response = optional_param('anonymous_response', 0, PARAM_INT); //arb
-
-$highlightrequired = false;
-
-if (($formdata = data_submitted()) AND !confirm_sesskey()) {
-    print_error('invalidsesskey');
-}
-
-//if the use hit enter into a textfield so the form should not submit
-if (isset($formdata->sesskey) AND
-    !isset($formdata->savevalues) AND
-    !isset($formdata->gonextpage) AND
-    !isset($formdata->gopreviouspage)) {
-
-    $gopage = $formdata->lastpage;
-}
-
-if (isset($formdata->savevalues)) {
-    $savevalues = true;
-} else {
-    $savevalues = false;
-}
-
-if ($gopage < 0 AND !$savevalues) {
-    if (isset($formdata->gonextpage)) {
-        $gopage = $lastpage + 1;
-        $gonextpage = true;
-        $gopreviouspage = false;
-    } else if (isset($formdata->gopreviouspage)) {
-        $gopage = $lastpage - 1;
-        $gonextpage = false;
-        $gopreviouspage = true;
-    } else {
-        print_error('missingparameter');
-    }
-} else {
-    $gonextpage = $gopreviouspage = false;
-}
+$courseid = optional_param('courseid', null, PARAM_INT);
+$gopage = optional_param('gopage', 0, PARAM_INT);
 
 list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
 $feedback = $DB->get_record("feedback", array("id" => $cm->instance), '*', MUST_EXIST);
 
-$context = context_module::instance($cm->id);
-
-$feedback_complete_cap = false;
+$urlparams = array('id' => $cm->id, 'gopage' => $gopage, 'courseid' => $courseid);
+$PAGE->set_url('/mod/feedback/complete.php', $urlparams);
 
-if (has_capability('mod/feedback:complete', $context)) {
-    $feedback_complete_cap = true;
-}
+require_course_login($course, true, $cm);
+$PAGE->set_activity_record($feedback);
 
-if (!empty($CFG->feedback_allowfullanonymous)
-        AND $course->id == SITEID
-        AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES
-        AND (!isloggedin() OR isguestuser())) {
-    // Guests are allowed to complete fully anonymous feedback without having 'mod/feedback:complete' capability.
-    $feedback_complete_cap = true;
-}
+$context = context_module::instance($cm->id);
+$feedbackcompletion = new mod_feedback_completion($feedback, $cm, $courseid);
 
-//check whether the feedback is located and! started from the mainsite
-if ($course->id == SITEID AND !$courseid) {
-    $courseid = SITEID;
-}
+$courseid = $feedbackcompletion->get_courseid();
 
-//check whether the feedback is mapped to the given courseid
-if ($course->id == SITEID AND !has_capability('mod/feedback:edititems', $context)) {
-    if ($DB->get_records('feedback_sitecourse_map', array('feedbackid'=>$feedback->id))) {
-        $params = array('feedbackid'=>$feedback->id, 'courseid'=>$courseid);
-        if (!$DB->get_record('feedback_sitecourse_map', $params)) {
-            print_error('notavailable', 'feedback');
-        }
-    }
+// Check whether the feedback is mapped to the given courseid.
+if (!has_capability('mod/feedback:edititems', $context) &&
+        !$feedbackcompletion->check_course_is_mapped()) {
+    echo $OUTPUT->header();
+    echo $OUTPUT->notification(get_string('cannotaccess', 'mod_feedback'));
+    echo $OUTPUT->footer();
+    exit;
 }
 
-require_course_login($course, true, $cm);
-$PAGE->set_activity_record($feedback);
-
 //check whether the given courseid exists
 if ($courseid AND $courseid != SITEID) {
-    if ($course2 = $DB->get_record('course', array('id'=>$courseid))) {
-        require_course_login($course2); //this overwrites the object $course :-(
-        $course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround
-    } else {
-        print_error('invalidcourseid');
-    }
+    require_course_login(get_course($courseid)); // This overwrites the object $COURSE .
 }
 
-if (!$feedback_complete_cap) {
+if (!$feedbackcompletion->can_complete()) {
     print_error('error');
 }
 
-// Mark activity viewed for completion-tracking
-$completion = new completion_info($course);
-if (isloggedin() && !isguestuser()) {
-    $completion->set_module_viewed($cm);
-}
-
-/// Print the page header
-$strfeedbacks = get_string("modulenameplural", "feedback");
-$strfeedback  = get_string("modulename", "feedback");
-
-if ($course->id == SITEID) {
-    $PAGE->set_cm($cm, $course); // set's up global $COURSE
-    $PAGE->set_pagelayout('incourse');
-}
-
 $PAGE->navbar->add(get_string('feedback:complete', 'feedback'));
-$urlparams = array('id'=>$cm->id, 'gopage'=>$gopage, 'courseid'=>$course->id);
-$PAGE->set_url('/mod/feedback/complete.php', $urlparams);
 $PAGE->set_heading($course->fullname);
 $PAGE->set_title($feedback->name);
-echo $OUTPUT->header();
-
-//check, if the feedback is open (timeopen, timeclose)
-$checktime = time();
-$feedback_is_closed = ($feedback->timeopen > $checktime) ||
-                      ($feedback->timeclose < $checktime &&
-                            $feedback->timeclose > 0);
+$PAGE->set_pagelayout('incourse');
 
-if ($feedback_is_closed) {
+// Check if the feedback is open (timeopen, timeclose).
+if (!$feedbackcompletion->is_open()) {
+    echo $OUTPUT->header();
     echo $OUTPUT->heading(format_string($feedback->name));
     echo $OUTPUT->box_start('generalbox boxaligncenter');
     echo $OUTPUT->notification(get_string('feedback_is_not_open', 'feedback'));
-    echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
+    echo $OUTPUT->continue_button(course_get_url($courseid ?: $feedback->course));
     echo $OUTPUT->box_end();
     echo $OUTPUT->footer();
     exit;
 }
 
-//additional check for multiple-submit (prevent browsers back-button).
-//the main-check is in view.php
-$feedback_can_submit = true;
-if ($feedback->multiple_submit == 0 ) {
-    if (feedback_is_already_submitted($feedback->id, $courseid)) {
-        $feedback_can_submit = false;
-    }
+// Mark activity viewed for completion-tracking.
+$completion = new completion_info($course);
+if (isloggedin() && !isguestuser()) {
+    $completion->set_module_viewed($cm);
 }
-if ($feedback_can_submit) {
-    //preserving the items
-    if ($preservevalues == 1) {
+
+// Check if user is prevented from re-submission.
+$cansubmit = $feedbackcompletion->can_submit();
+
+// Initialise the form processing feedback completion.
+if (!$feedbackcompletion->is_empty() && $cansubmit) {
+    $form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_COMPLETE,
+            $feedbackcompletion, 'feedback_complete_form', array('gopage' => $gopage));
+    if ($form->is_cancelled()) {
+        // Form was cancelled - return to the course page.
+        redirect(course_get_url($courseid ?: $course));
+    } else if ($form->is_submitted() &&
+            ($form->is_validated() || optional_param('gopreviouspage', null, PARAM_RAW))) {
+        // Form was submitted (skip validation for "Previous page" button).
+        $data = $form->get_submitted_data();
         if (!isset($SESSION->feedback->is_started) OR !$SESSION->feedback->is_started == true) {
             print_error('error', '', $CFG->wwwroot.'/course/view.php?id='.$course->id);
         }
-        // Check if all required items have a value.
-        if (feedback_check_values($startitempos, $lastitempos)) {
-            $userid = $USER->id; //arb
-            if (isloggedin() && !isguestuser()) {
-                $completedid = feedback_save_values($USER->id, true);
-            } else {
-                $completedid = feedback_save_guest_values(sesskey());
-            }
-            if ($completedid) {
-                if (!$gonextpage AND !$gopreviouspage) {
-                    $preservevalues = false;// It can be stored.
-                }
-
+        $feedbackcompletion->save_response_tmp($data);
+        if (!empty($data->savevalues) || !empty($data->gonextpage)) {
+            if (($nextpage = $feedbackcompletion->get_next_page($gopage)) !== null) {
+                redirect(new moodle_url($PAGE->url, array('gopage' => $nextpage)));
             } else {
-                $savereturn = 'failed';
-                if (isset($lastpage)) {
-                    $gopage = $lastpage;
-                } else {
-                    print_error('missingparameter');
+                $feedbackcompletion->save_response();
+                if (!$feedback->page_after_submit) {
+                    \core\notification::success(get_string('entries_saved', 'feedback'));
                 }
             }
-        } else {
-            $savereturn = 'missing';
-            $highlightrequired = true;
-            if (isset($lastpage)) {
-                $gopage = $lastpage;
-            } else {
-                print_error('missingparameter');
-            }
-
-        }
-    }
-
-    //saving the items
-    if ($savevalues AND !$preservevalues) {
-        //exists there any pagebreak, so there are values in the feedback_valuetmp
-        $userid = $USER->id; //arb
-
-        if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO) {
-            $feedbackcompleted = feedback_get_current_completed($feedback->id, false, $courseid);
-        } else {
-            $feedbackcompleted = false;
-        }
-        $params = array('id' => $completedid);
-        $feedbackcompletedtmp = $DB->get_record('feedback_completedtmp', $params);
-        //fake saving for switchrole
-        $is_switchrole = feedback_check_is_switchrole();
-        if ($is_switchrole) {
-            $savereturn = 'saved';
-            feedback_delete_completedtmp($completedid);
-        } else {
-            $new_completed_id = feedback_save_tmp_values($feedbackcompletedtmp,
-                                                         $feedbackcompleted,
-                                                         $userid);
-            if ($new_completed_id) {
-                $savereturn = 'saved';
-                if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO) {
-                    feedback_send_email($cm, $feedback, $course, $userid);
-                } else {
-                    feedback_send_email_anonym($cm, $feedback, $course, $userid);
-                }
-                if (isloggedin() && !isguestuser()) {
-                    // Tracking the submit.
-                    $tracking = new stdClass();
-                    $tracking->userid = $USER->id;
-                    $tracking->feedback = $feedback->id;
-                    $tracking->completed = $new_completed_id;
-                    $DB->insert_record('feedback_tracking', $tracking);
-                }
-                unset($SESSION->feedback->is_started);
-
-                // Update completion state
-                $completion = new completion_info($course);
-                if (isloggedin() && !isguestuser() && $completion->is_enabled($cm) && $feedback->completionsubmit) {
-                    $completion->update_state($cm, COMPLETION_COMPLETE);
-                }
-
-            } else {
-                $savereturn = 'failed';
-            }
+        } else if (!empty($data->gopreviouspage)) {
+            $prevpage = $feedbackcompletion->get_previous_page($gopage);
+            redirect(new moodle_url($PAGE->url, array('gopage' => intval($prevpage))));
         }
-
-    }
-
-
-    if ($allbreaks = feedback_get_all_break_positions($feedback->id)) {
-        if ($gopage <= 0) {
-            $startposition = 0;
-        } else {
-            if (!isset($allbreaks[$gopage - 1])) {
-                $gopage = count($allbreaks);
-            }
-            $startposition = $allbreaks[$gopage - 1];
-        }
-        $ispagebreak = true;
-    } else {
-        $startposition = 0;
-        $newpage = 0;
-        $ispagebreak = false;
     }
+}
 
-    //get the feedbackitems after the last shown pagebreak
-    $select = 'feedback = ? AND position > ?';
-    $params = array($feedback->id, $startposition);
-    $feedbackitems = $DB->get_records_select('feedback_item', $select, $params, 'position');
-
-    //get the first pagebreak
-    $params = array('feedback' => $feedback->id, 'typ' => 'pagebreak');
-    if ($pagebreaks = $DB->get_records('feedback_item', $params, 'position')) {
-        $pagebreaks = array_values($pagebreaks);
-        $firstpagebreak = $pagebreaks[0];
-    } else {
-        $firstpagebreak = false;
-    }
-    $maxitemcount = $DB->count_records('feedback_item', array('feedback'=>$feedback->id));
-
-    //get the values of completeds before done. Anonymous user can not get these values.
-    if ((!isset($SESSION->feedback->is_started)) AND
-                          (!isset($savereturn)) AND
-                          ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO)) {
-
-        $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid);
-        if (!$feedbackcompletedtmp) {
-            $feedbackcompleted = feedback_get_current_completed($feedback->id, false, $courseid);
-            if ($feedbackcompleted) {
-                //copy the values to feedback_valuetmp create a completedtmp
-                $feedbackcompletedtmp = feedback_set_tmp_values($feedbackcompleted);
-            }
-        }
-    } else if (isloggedin() && !isguestuser()) {
-        $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid);
-    } else {
-        $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid, sesskey());
-    }
+// Print the page header.
+$strfeedbacks = get_string("modulenameplural", "feedback");
+$strfeedback  = get_string("modulename", "feedback");
 
-    /// Print the main part of the page
-    ///////////////////////////////////////////////////////////////////////////
-    ///////////////////////////////////////////////////////////////////////////
-    ///////////////////////////////////////////////////////////////////////////
-    $analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id'=>$id));
-    if ($courseid > 0) {
-        $analysisurl->param('courseid', $courseid);
-    }
-    echo $OUTPUT->heading(format_string($feedback->name));
+echo $OUTPUT->header();
+echo $OUTPUT->heading(format_string($feedback->name));
 
-    if (isset($savereturn) && $savereturn == 'saved') {
+if ($feedbackcompletion->is_empty()) {
+    \core\notification::error(get_string('no_items_available_yet', 'feedback'));
+} else if ($cansubmit) {
+    if (!empty($data->savevalues) || !empty($data->gonextpage)) {
+        // Display information after the submit.
         if ($feedback->page_after_submit) {
-
-            require_once($CFG->libdir . '/filelib.php');
-
-            $page_after_submit_output = file_rewrite_pluginfile_urls($feedback->page_after_submit,
-                                                                    'pluginfile.php',
-                                                                    $context->id,
-                                                                    'mod_feedback',
-                                                                    'page_after_submit',
-                                                                    0);
-
-            echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
-            echo format_text($page_after_submit_output,
-                             $feedback->page_after_submitformat,
-                             array('overflowdiv' => true));
-            echo $OUTPUT->box_end();
-        } else {
-            echo '<p align="center">';
-            echo '<b><font color="green">';
-            echo get_string('entries_saved', 'feedback');
-            echo '</font></b>';
-            echo '</p>';
+            echo $OUTPUT->box($feedbackcompletion->page_after_submit(),
+                    'generalbox boxaligncenter');
         }
-        if (feedback_can_view_analysis($feedback, $context, $courseid)) {
-            echo '<p align="center"><a href="'.$analysisurl->out().'">';
-            echo get_string('completed_feedbacks', 'feedback').'</a>';
+        if ($feedbackcompletion->can_view_analysis()) {
+            echo '<p align="center">';
+            $analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id' => $cm->id, 'courseid' => $courseid));
+            echo html_writer::link($analysisurl, get_string('completed_feedbacks', 'feedback'));
             echo '</p>';
         }
 
         if ($feedback->site_after_submit) {
             $url = feedback_encode_target_url($feedback->site_after_submit);
         } else {
-            if ($courseid) {
-                if ($courseid == SITEID) {
-                    $url = $CFG->wwwroot;
-                } else {
-                    $url = $CFG->wwwroot.'/course/view.php?id='.$courseid;
-                }
-            } else {
-                if ($course->id == SITEID) {
-                    $url = $CFG->wwwroot;
-                } else {
-                    $url = $CFG->wwwroot.'/course/view.php?id='.$course->id;
-                }
-            }
+            $url = course_get_url($courseid ?: $course->id);
         }
         echo $OUTPUT->continue_button($url);
     } else {
-        if (isset($savereturn) && $savereturn == 'failed') {
-            echo $OUTPUT->box_start('mform');
-            echo '<span class="error">'.get_string('saving_failed', 'feedback').'</span>';
-            echo $OUTPUT->box_end();
-        }
-
-        if (isset($savereturn) && $savereturn == 'missing') {
-            echo $OUTPUT->box_start('mform');
-            echo '<span class="error">'.get_string('saving_failed_because_missing_or_false_values', 'feedback').'</span>';
-            echo $OUTPUT->box_end();
-        }
-
-        //print the items
-        if (is_array($feedbackitems)) {
-            echo $OUTPUT->box_start('feedback_form');
-            echo '<form action="complete.php" class="feedback_complete" method="post">';
-            echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
-            $anonymousmodeinfo = '';
-            switch ($feedback->anonymous) {
-                case FEEDBACK_ANONYMOUS_YES:
-                    echo '<input type="hidden" name="anonymous" value="1" />';
-                    $inputvalue = 'value="'.FEEDBACK_ANONYMOUS_YES.'"';
-                    echo '<input type="hidden" name="anonymous_response" '.$inputvalue.' />';
-                    $anonymousmodeinfo = get_string('anonymous', 'feedback');
-                    break;
-                case FEEDBACK_ANONYMOUS_NO:
-                    echo '<input type="hidden" name="anonymous" value="0" />';
-                    $inputvalue = 'value="'.FEEDBACK_ANONYMOUS_NO.'"';
-                    echo '<input type="hidden" name="anonymous_response" '.$inputvalue.' />';
-                    $anonymousmodeinfo = get_string('non_anonymous', 'feedback');
-                    break;
-            }
-            if (isloggedin() && !isguestuser()) {
-                echo $OUTPUT->box(get_string('mode', 'feedback') . ': ' . $anonymousmodeinfo, 'feedback_anonymousinfo');
-            }
-            //check, if there exists required-elements
-            $params = array('feedback' => $feedback->id, 'required' => 1);
-            $countreq = $DB->count_records('feedback_item', $params);
-            if ($countreq > 0) {
-                echo '<span class="fdescription required">';
-                echo get_string('somefieldsrequired', 'form', '<img alt="'.get_string('requiredelement', 'form').
-                    '" src="'.$OUTPUT->pix_url('req') .'" class="req" />');
-                echo '</span>';
-            }
-            echo $OUTPUT->box_start('feedback_items');
-
-            unset($startitem);
-            $select = 'feedback = ? AND hasvalue = 1 AND position < ?';
-            $params = array($feedback->id, $startposition);
-            $itemnr = $DB->count_records_select('feedback_item', $select, $params);
-            $lastbreakposition = 0;
-            $align = right_to_left() ? 'right' : 'left';
-
-            foreach ($feedbackitems as $feedbackitem) {
-                if (!isset($startitem)) {
-                    //avoid showing double pagebreaks
-                    if ($feedbackitem->typ == 'pagebreak') {
-                        continue;
-                    }
-                    $startitem = $feedbackitem;
-                }
-
-                if ($feedbackitem->dependitem > 0) {
-                    //chech if the conditions are ok
-                    $fb_compare_value = feedback_compare_item_value($feedbackcompletedtmp->id,
-                                                                    $feedbackitem->dependitem,
-                                                                    $feedbackitem->dependvalue,
-                                                                    true);
-                    if (!isset($feedbackcompletedtmp->id) OR !$fb_compare_value) {
-                        $lastitem = $feedbackitem;
-                        $lastbreakposition = $feedbackitem->position;
-                        continue;
-                    }
-                }
-
-                if ($feedbackitem->dependitem > 0) {
-                    $dependstyle = ' feedback_complete_depend';
-                } else {
-                    $dependstyle = '';
-                }
-
-                echo $OUTPUT->box_start('feedback_item_box_'.$align.$dependstyle);
-                $value = '';
-                //get the value
-                $frmvaluename = $feedbackitem->typ . '_'. $feedbackitem->id;
-                if (isset($savereturn)) {
-                    $value = isset($formdata->{$frmvaluename}) ? $formdata->{$frmvaluename} : null;
-                    $value = feedback_clean_input_value($feedbackitem, $value);
-                } else {
-                    if (isset($feedbackcompletedtmp->id)) {
-                        $value = feedback_get_item_value($feedbackcompletedtmp->id,
-                                                         $feedbackitem->id,
-                                                         true);
-                    }
-                }
-                if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
-                    $itemnr++;
-                    echo $OUTPUT->box_start('feedback_item_number_'.$align);
-                    echo $itemnr;
-                    echo $OUTPUT->box_end();
-                }
-                if ($feedbackitem->typ != 'pagebreak') {
-                    echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
-                    feedback_print_item_complete($feedbackitem, $value, $highlightrequired);
-                    echo $OUTPUT->box_end();
-                }
-
-                echo $OUTPUT->box_end();
-
-                $lastbreakposition = $feedbackitem->position; //last item-pos (item or pagebreak)
-                if ($feedbackitem->typ == 'pagebreak') {
-                    break;
-                } else {
-                    $lastitem = $feedbackitem;
-                }
-            }
-            echo $OUTPUT->box_end();
-            echo '<input type="hidden" name="id" value="'.$id.'" />';
-            echo '<input type="hidden" name="feedbackid" value="'.$feedback->id.'" />';
-            echo '<input type="hidden" name="lastpage" value="'.$gopage.'" />';
-            if (isset($feedbackcompletedtmp->id)) {
-                $inputvalue = 'value="'.$feedbackcompletedtmp->id.'"';
-            } else {
-                $inputvalue = 'value=""';
-            }
-            echo '<input type="hidden" name="completedid" '.$inputvalue.' />';
-            echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
-            echo '<input type="hidden" name="preservevalues" value="1" />';
-            if (isset($startitem)) {
-                echo '<input type="hidden" name="startitempos" value="'.$startitem->position.'" />';
-                echo '<input type="hidden" name="lastitempos" value="'.$lastitem->position.'" />';
-            }
-
-            if ( $ispagebreak AND $lastbreakposition > $firstpagebreak->position) {
-                $inputvalue = 'value="'.get_string('previous_page', 'feedback').'"';
-                echo '<input name="gopreviouspage" type="submit" '.$inputvalue.' />';
-            }
-            if ($lastbreakposition < $maxitemcount) {
-                $inputvalue = 'value="'.get_string('next_page', 'feedback').'"';
-                echo '<input name="gonextpage" type="submit" '.$inputvalue.' />';
-            }
-            if ($lastbreakposition >= $maxitemcount) { //last page
-                $inputvalue = 'value="'.get_string('save_entries', 'feedback').'"';
-                echo '<input name="savevalues" type="submit" '.$inputvalue.' />';
-            }
-
-            echo '</form>';
-            echo $OUTPUT->box_end();
-
-            echo $OUTPUT->box_start('feedback_complete_cancel');
-            if ($courseid) {
-                $action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$courseid.'"';
-            } else {
-                if ($course->id == SITEID) {
-                    $action = 'action="'.$CFG->wwwroot.'"';
-                } else {
-                    $action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$course->id.'"';
-                }
-            }
-            echo '<form '.$action.' method="post" onsubmit=" ">';
-            echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
-            echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
-            echo '<button type="submit">'.get_string('cancel').'</button>';
-            echo '</form>';
-            echo $OUTPUT->box_end();
-            $SESSION->feedback->is_started = true;
-        }
+        // Print the items.
+        $SESSION->feedback->is_started = true;
+        $form->display();
     }
 } else {
-    echo $OUTPUT->heading(format_string($feedback->name));
     echo $OUTPUT->box_start('generalbox boxaligncenter');
     echo $OUTPUT->notification(get_string('this_feedback_is_already_submitted', 'feedback'));
-    echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
+    echo $OUTPUT->continue_button(course_get_url($courseid ?: $course->id));
     echo $OUTPUT->box_end();
 }
-/// Finish the page
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
 
 echo $OUTPUT->footer();
index 9b047e9..09b55ad 100644 (file)
 
 require_once("../../config.php");
 require_once("lib.php");
-require_once('delete_item_form.php');
 
-$id = required_param('id', PARAM_INT);
 $deleteitem = required_param('deleteitem', PARAM_INT);
+$item = $DB->get_record('feedback_item', array('id' => $deleteitem), '*', MUST_EXIST);
+list($course, $cm) = get_course_and_cm_from_instance($item->feedback, 'feedback');
 
-$PAGE->set_url('/mod/feedback/delete_item.php', array('id'=>$id, 'deleteitem'=>$deleteitem));
-
-if (! $cm = get_coursemodule_from_id('feedback', $id)) {
-    print_error('invalidcoursemodule');
-}
-
-if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
-    print_error('coursemisconf');
-}
-
-if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
-    print_error('invalidcoursemodule');
-}
+$PAGE->set_url('/mod/feedback/delete_item.php', array('deleteitem' => $deleteitem));
 
+require_login($course, false, $cm);
 $context = context_module::instance($cm->id);
-
-require_login($course, true, $cm);
-
 require_capability('mod/feedback:edititems', $context);
+$feedback = $PAGE->activityrecord;
 
-$mform = new mod_feedback_delete_item_form();
-$newformdata = array('id'=>$id,
-                    'deleteitem'=>$deleteitem,
-                    'confirmdelete'=>'1');
-$mform->set_data($newformdata);
-$formdata = $mform->get_data();
+$editurl = new moodle_url('/mod/feedback/edit.php', array('id' => $cm->id));
 
-if ($mform->is_cancelled()) {
-    redirect('edit.php?id='.$id);
+// Process item deletion.
+if (optional_param('confirm', 0, PARAM_BOOL) && confirm_sesskey()) {
+    feedback_delete_item($deleteitem);
+    redirect($editurl);
 }
 
-if (isset($formdata->confirmdelete) AND $formdata->confirmdelete == 1) {
-    feedback_delete_item($formdata->deleteitem);
-    redirect('edit.php?id=' . $id);
-}
-
-
 /// Print the page header
 $strfeedbacks = get_string("modulenameplural", "feedback");
 $strfeedback  = get_string("modulename", "feedback");
@@ -81,9 +59,8 @@ echo $OUTPUT->header();
 ///////////////////////////////////////////////////////////////////////////
 echo $OUTPUT->heading(format_string($feedback->name));
 echo $OUTPUT->box_start('generalbox errorboxcontent boxaligncenter boxwidthnormal');
-echo html_writer::tag('p', get_string('confirmdeleteitem', 'feedback'), array('class' => 'bold'));
-print_string('relateditemsdeleted', 'feedback');
-$mform->display();
+$continueurl = new moodle_url($PAGE->url, array('confirm' => 1, 'sesskey' => sesskey()));
+echo $OUTPUT->confirm(get_string('confirmdeleteitem', 'feedback'), $continueurl, $editurl);
 echo $OUTPUT->box_end();
 
 echo $OUTPUT->footer();
diff --git a/mod/feedback/delete_item_form.php b/mod/feedback/delete_item_form.php
deleted file mode 100644 (file)
index f9700d5..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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/>.
-
-/**
- * prints the form to confirm delete a completed
- *
- * @author Andreas Grabs
- * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
- * @package mod_feedback
- */
-
-//It must be included from a Moodle page
-if (!defined('MOODLE_INTERNAL')) {
-    die('Direct access to this script is forbidden.');
-}
-
-require_once($CFG->libdir.'/formslib.php');
-
-class mod_feedback_delete_item_form extends moodleform {
-    public function definition() {
-        $mform =& $this->_form;
-
-        // hidden elements
-        $mform->addElement('hidden', 'id');
-        $mform->setType('id', PARAM_INT);
-        $mform->addElement('hidden', 'deleteitem');
-        $mform->setType('deleteitem', PARAM_INT);
-        $mform->addElement('hidden', 'confirmdelete');
-        $mform->setType('confirmdelete', PARAM_INT);
-
-        //-------------------------------------------------------------------------------
-        // buttons
-        $this->add_action_buttons(true, get_string('yes'));
-
-    }
-}
-
index 218d566..d6c910a 100644 (file)
@@ -35,57 +35,19 @@ if (($formdata = data_submitted()) AND !confirm_sesskey()) {
 }
 
 $do_show = optional_param('do_show', 'edit', PARAM_ALPHA);
-$moveupitem = optional_param('moveupitem', false, PARAM_INT);
-$movedownitem = optional_param('movedownitem', false, PARAM_INT);
-$moveitem = optional_param('moveitem', false, PARAM_INT);
-$movehere = optional_param('movehere', false, PARAM_INT);
 $switchitemrequired = optional_param('switchitemrequired', false, PARAM_INT);
 
 $current_tab = $do_show;
 
 $url = new moodle_url('/mod/feedback/edit.php', array('id'=>$id, 'do_show'=>$do_show));
 
-if (! $cm = get_coursemodule_from_id('feedback', $id)) {
-    print_error('invalidcoursemodule');
-}
-
-if (! $course = $DB->get_record('course', array('id'=>$cm->course))) {
-    print_error('coursemisconf');
-}
-
-if (! $feedback = $DB->get_record('feedback', array('id'=>$cm->instance))) {
-    print_error('invalidcoursemodule');
-}
+list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
 
 $context = context_module::instance($cm->id);
-
-require_login($course, true, $cm);
-
+require_login($course, false, $cm);
 require_capability('mod/feedback:edititems', $context);
-
-//Move up/down items
-if ($moveupitem) {
-    $item = $DB->get_record('feedback_item', array('id'=>$moveupitem));
-    feedback_moveup_item($item);
-}
-if ($movedownitem) {
-    $item = $DB->get_record('feedback_item', array('id'=>$movedownitem));
-    feedback_movedown_item($item);
-}
-
-//Moving of items
-if ($movehere && isset($SESSION->feedback->moving->movingitem)) {
-    $item = $DB->get_record('feedback_item', array('id'=>$SESSION->feedback->moving->movingitem));
-    feedback_move_item($item, intval($movehere));
-    $moveitem = false;
-}
-if ($moveitem) {
-    $item = $DB->get_record('feedback_item', array('id'=>$moveitem));
-    $SESSION->feedback->moving->shouldmoving = 1;
-    $SESSION->feedback->moving->movingitem = $moveitem;
-} else {
-    unset($SESSION->feedback->moving);
-}
+$feedback = $PAGE->activityrecord;
+$feedbackstructure = new mod_feedback_structure($feedback, $cm);
 
 if ($switchitemrequired) {
     $item = $DB->get_record('feedback_item', array('id'=>$switchitemrequired));
@@ -156,15 +118,10 @@ echo $OUTPUT->heading(format_string($feedback->name));
 /// print the tabs
 require('tabs.php');
 
-/// Print the main part of the page.
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
+// Print the main part of the page.
 
-///////////////////////////////////////////////////////////////////////////
-///Print the template-section.
-///////////////////////////////////////////////////////////////////////////
 if ($do_show == 'templates') {
+    // Print the template-section.
     $use_template_form->display();
 
     if ($cancreatetemplates) {
@@ -187,218 +144,22 @@ if ($do_show == 'templates') {
         </p>';
     }
 }
-///////////////////////////////////////////////////////////////////////////
-///Print the Item-Edit-section.
-///////////////////////////////////////////////////////////////////////////
+
 if ($do_show == 'edit') {
+    // Print the Item-Edit-section.
 
-    $select = new single_select(new moodle_url('/mod/feedback/edit_item.php', array('cmid' => $id, 'position' => $lastposition)),
+    $select = new single_select(new moodle_url('/mod/feedback/edit_item.php',
+            array('cmid' => $id, 'position' => $lastposition, 'sesskey' => sesskey())),
         'typ', feedback_load_feedback_items_options());
     $select->label = get_string('add_item', 'mod_feedback');
     echo $OUTPUT->render($select);
 
-    if (is_array($feedbackitems)) {
-        $itemnr = 0;
-
-        $align = right_to_left() ? 'right' : 'left';
-
-        $helpbutton = $OUTPUT->help_icon('preview', 'feedback');
-
-        echo $OUTPUT->heading(get_string('preview', 'feedback').$helpbutton, 3);
-        if (isset($SESSION->feedback->moving) AND $SESSION->feedback->moving->shouldmoving == 1) {
-            $anker = '<a href="edit.php?id='.$id.'">';
-            $anker .= get_string('cancel_moving', 'feedback');
-            $anker .= '</a>';
-            echo $OUTPUT->heading($anker);
-        }
-
-        //Check, if there exists required-elements.
-        $params = array('feedback' => $feedback->id, 'required' => 1);
-        $countreq = $DB->count_records('feedback_item', $params);
-        if ($countreq > 0) {
-            echo '<div class="fdescription required">';
-            echo get_string('somefieldsrequired', 'form', '<img alt="'.get_string('requiredelement', 'form').
-                '" src="'.$OUTPUT->pix_url('req') .'" class="req" />');
-            echo '</div>';
-        }
 
-        //Use list instead a table
-        echo $OUTPUT->box_start('feedback_items');
-        if (isset($SESSION->feedback->moving) AND $SESSION->feedback->moving->shouldmoving == 1) {
-            $moveposition = 1;
-            $movehereurl = new moodle_url($url, array('movehere'=>$moveposition));
-            //Only shown if shouldmoving = 1
-            echo $OUTPUT->box_start('feedback_item_box_'.$align.' clipboard');
-            $buttonlink = $movehereurl->out();
-            $strbutton = get_string('move_here', 'feedback');
-            $src = $OUTPUT->pix_url('movehere');
-            echo '<a title="'.$strbutton.'" href="'.$buttonlink.'">
-                    <img class="movetarget" alt="'.$strbutton.'" src="'.$src.'" />
-                  </a>';
-            echo $OUTPUT->box_end();
-        }
-        //Print the inserted items
-        $itempos = 0;
-        echo '<div id="feedback_dragarea">'; //The container for the dragging area
-        echo '<ul id="feedback_draglist">'; //The list what includes the draggable items
-        foreach ($feedbackitems as $feedbackitem) {
-            $itempos++;
-            //Hiding the item to move
-            if (isset($SESSION->feedback->moving)) {
-                if ($SESSION->feedback->moving->movingitem == $feedbackitem->id) {
-                    continue;
-                }
-            }
-            //Here come the draggable items, each one in a single li-element.
-            echo '<li class="feedback_itemlist generalbox" id="feedback_item_'.$feedbackitem->id.'">';
-            echo '<span class="spinnertest"> </span>';
-            if ($feedbackitem->dependitem > 0) {
-                $dependstyle = ' feedback_depend';
-            } else {
-                $dependstyle = '';
-            }
-            echo $OUTPUT->box_start('feedback_item_box_'.$align.$dependstyle,
-                                    'feedback_item_box_'.$feedbackitem->id);
-            //Items without value only are labels
-            if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
-                $itemnr++;
-                echo $OUTPUT->box_start('feedback_item_number_'.$align);
-                echo $itemnr;
-                echo $OUTPUT->box_end();
-            }
-            echo $OUTPUT->box_start('box boxalign_'.$align);
-            echo $OUTPUT->box_start('feedback_item_commands_'.$align);
-            echo '<span class="feedback_item_commands position">';
-            echo '('.get_string('position', 'feedback').':'.$itempos .')';
-            echo '</span>';
-            //Print the moveup-button
-            if ($feedbackitem->position > 1) {
-                echo '<span class="feedback_item_command_moveup">';
-                $moveupurl = new moodle_url($url, array('moveupitem'=>$feedbackitem->id));
-                $buttonlink = $moveupurl->out();
-                $strbutton = get_string('moveup_item', 'feedback');
-                echo '<a class="icon up" title="'.$strbutton.'" href="'.$buttonlink.'">
-                        <img alt="'.$strbutton.'" src="'.$OUTPUT->pix_url('t/up') . '" />
-                      </a>';
-                echo '</span>';
-            }
-            //Print the movedown-button
-            if ($feedbackitem->position < $lastposition - 1) {
-                echo '<span class="feedback_item_command_movedown">';
-                $urlparams = array('movedownitem'=>$feedbackitem->id);
-                $movedownurl = new moodle_url($url, $urlparams);
-                $buttonlink = $movedownurl->out();
-                $strbutton = get_string('movedown_item', 'feedback');
-                echo '<a class="icon down" title="'.$strbutton.'" href="'.$buttonlink.'">
-                        <img alt="'.$strbutton.'" src="'.$OUTPUT->pix_url('t/down') . '" />
-                      </a>';
-                echo '</span>';
-            }
-            //Print the move-button
-            if (count($feedbackitems) > 1) {
-                echo '<span class="feedback_item_command_move">';
-                $moveurl = new moodle_url($url, array('moveitem'=>$feedbackitem->id));
-                $buttonlink = $moveurl->out();
-                $strbutton = get_string('move_item', 'feedback');
-                echo '<a class="editing_move" title="'.$strbutton.'" href="'.$buttonlink.'">
-                        <img alt="'.$strbutton.'" src="'.$OUTPUT->pix_url('t/move') . '" />
-                      </a>';
-                echo '</span>';
-            }
-            //Print the button to edit the item
-            if ($feedbackitem->typ != 'pagebreak') {
-                echo '<span class="feedback_item_command_edit">';
-                $editurl = new moodle_url('/mod/feedback/edit_item.php');
-                $editurl->params(array('do_show'=>$do_show,
-                                         'cmid'=>$id,
-                                         'id'=>$feedbackitem->id,
-                                         'typ'=>$feedbackitem->typ));
-
-                // In edit_item.php the param id is used for the itemid
-                // and the cmid is the id to get the module.
-                $buttonlink = $editurl->out();
-                $strbutton = get_string('edit_item', 'feedback');
-                echo '<a class="editing_update" title="'.$strbutton.'" href="'.$buttonlink.'">
-                        <img alt="'.$strbutton.'" src="'.$OUTPUT->pix_url('t/edit') . '" />
-                      </a>';
-                echo '</span>';
-            }
-
-            //Print the toggle-button to switch required yes/no
-            if ($feedbackitem->hasvalue == 1) {
-                echo '<span class="feedback_item_command_toggle">';
-                if ($feedbackitem->required == 1) {
-                    $buttontitle = get_string('switch_item_to_not_required', 'feedback');
-                    $buttonimg = $OUTPUT->pix_url('required', 'feedback');
-                } else {
-                    $buttontitle = get_string('switch_item_to_required', 'feedback');
-                    $buttonimg = $OUTPUT->pix_url('notrequired', 'feedback');
-                }
-                $urlparams = array('switchitemrequired'=>$feedbackitem->id);
-                $requiredurl = new moodle_url($url, $urlparams);
-                $buttonlink = $requiredurl->out();
-                echo '<a class="icon '.
-                        'feedback_switchrequired" '.
-                        'title="'.$buttontitle.'" '.
-                        'href="'.$buttonlink.'">'.
-                        '<img alt="'.$buttontitle.'" src="'.$buttonimg.'" />'.
-                        '</a>';
-                echo '</span>';
-            }
-
-            //Print the delete-button
-            echo '<span class="feedback_item_command_toggle">';
-            $deleteitemurl = new moodle_url('/mod/feedback/delete_item.php');
-            $deleteitemurl->params(array('id'=>$id,
-                                         'do_show'=>$do_show,
-                                         'deleteitem'=>$feedbackitem->id));
-
-            $buttonlink = $deleteitemurl->out();
-            $strbutton = get_string('delete_item', 'feedback');
-            $src = $OUTPUT->pix_url('t/delete');
-            echo '<a class="icon delete" title="'.$strbutton.'" href="'.$buttonlink.'">
-                    <img alt="'.$strbutton.'" src="'.$src.'" />
-                  </a>';
-            echo '</span>';
-            echo $OUTPUT->box_end();
-            if ($feedbackitem->typ != 'pagebreak') {
-                feedback_print_item_preview($feedbackitem);
-            } else {
-                echo $OUTPUT->box_start('feedback_pagebreak');
-                echo get_string('pagebreak', 'feedback').'<hr class="feedback_pagebreak" />';
-                echo $OUTPUT->box_end();
-            }
-            echo $OUTPUT->box_end();
-            echo $OUTPUT->box_end();
-            echo '<div class="clearer">&nbsp;</div>';
-            echo '</li>';
-            //Print out the target box if we ar moving an item
-            if (isset($SESSION->feedback->moving) AND $SESSION->feedback->moving->shouldmoving == 1) {
-                echo '<li>';
-                $moveposition++;
-                $movehereurl->param('movehere', $moveposition);
-                echo $OUTPUT->box_start('clipboard'); //Only shown if shouldmoving = 1
-                $buttonlink = $movehereurl->out();
-                $strbutton = get_string('move_here', 'feedback');
-                $src = $OUTPUT->pix_url('movehere');
-                echo '<a title="'.$strbutton.'" href="'.$buttonlink.'">
-                        <img class="movetarget" alt="'.$strbutton.'" src="'.$src.'" />
-                      </a>';
-                echo $OUTPUT->box_end();
-                echo '</li>';
-            }
-        }
-        echo $OUTPUT->box_end();
-        echo '</ul>';
-        echo '</div>';
-    } else {
-        echo $OUTPUT->box(get_string('no_items_available_yet', 'feedback'),
-                         'generalbox boxaligncenter');
-    }
+    $form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_EDIT,
+            $feedbackstructure, 'feedback_edit_form');
+    echo '<div id="feedback_dragarea">'; // The container for the dragging area.
+    $form->display();
+    echo '</div>';
 }
-/// Finish the page
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
 
 echo $OUTPUT->footer();
index 26e6b00..4ba8d12 100644 (file)
@@ -27,53 +27,36 @@ require_once("lib.php");
 
 feedback_init_feedback_session();
 
-$cmid = required_param('cmid', PARAM_INT);
-$typ = optional_param('typ', false, PARAM_ALPHA);
-$id = optional_param('id', false, PARAM_INT);
-$action = optional_param('action', false, PARAM_ALPHA);
-
-$editurl = new moodle_url('/mod/feedback/edit.php', array('id'=>$cmid));
-
-if (!$typ) {
-    redirect($editurl->out(false));
-}
-
-$url = new moodle_url('/mod/feedback/edit_item.php', array('cmid'=>$cmid));
-if ($typ !== false) {
-    $url->param('typ', $typ);
-}
-if ($id !== false) {
-    $url->param('id', $id);
-}
-$PAGE->set_url($url);
-
-// set up some general variables
-
-
-if (($formdata = data_submitted()) AND !confirm_sesskey()) {
-    print_error('invalidsesskey');
-}
-
-if (! $cm = get_coursemodule_from_id('feedback', $cmid)) {
-    print_error('invalidcoursemodule');
+$itemid = optional_param('id', false, PARAM_INT);
+if (!$itemid) {
+    $cmid = required_param('cmid', PARAM_INT);
+    $typ = required_param('typ', PARAM_ALPHA);
 }
 
-if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
-    print_error('coursemisconf');
-}
-
-if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
-    print_error('invalidcoursemodule');
+if ($itemid) {
+    $item = $DB->get_record('feedback_item', array('id' => $itemid), '*', MUST_EXIST);
+    list($course, $cm) = get_course_and_cm_from_instance($item->feedback, 'feedback');
+    $url = new moodle_url('/mod/feedback/edit_item.php', array('id' => $itemid));
+    $typ = $item->typ;
+} else {
+    $item = null;
+    list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'feedback');
+    $url = new moodle_url('/mod/feedback/edit_item.php', array('cmid' => $cm->id, 'typ' => $typ));
+    $item = (object)['id' => null, 'position' => -1, 'typ' => $typ, 'options' => ''];
 }
 
+require_login($course, true, $cm);
 $context = context_module::instance($cm->id);
+require_capability('mod/feedback:edititems', $context);
+$feedback = $PAGE->activityrecord;
 
-require_login($course, true, $cm);
+$editurl = new moodle_url('/mod/feedback/edit.php', array('id' => $cm->id));
 
-require_capability('mod/feedback:edititems', $context);
+$PAGE->set_url($url);
 
-//if the typ is pagebreak so the item will be saved directly
-if ($typ == 'pagebreak') {
+// If the typ is pagebreak so the item will be saved directly.
+if (!$item->id && $typ === 'pagebreak') {
+    require_sesskey();
     feedback_create_pagebreak($feedback->id);
     redirect($editurl->out(false));
     exit;
@@ -81,17 +64,8 @@ if ($typ == 'pagebreak') {
 
 //get the existing item or create it
 // $formdata->itemid = isset($formdata->itemid) ? $formdata->itemid : NULL;
-if ($id and $item = $DB->get_record('feedback_item', array('id'=>$id))) {
-    $typ = $item->typ;
-} else {
-    $item = new stdClass();
-    $item->id = null;
-    $item->position = -1;
-    if (!$typ) {
-        print_error('typemissing', 'feedback', $editurl->out(false));
-    }
-    $item->typ = $typ;
-    $item->options = '';
+if (!$typ || !file_exists($CFG->dirroot.'/mod/feedback/item/'.$typ.'/lib.php')) {
+    print_error('typemissing', 'feedback', $editurl->out(false));
 }
 
 require_once($CFG->dirroot.'/mod/feedback/item/'.$typ.'/lib.php');
@@ -101,13 +75,13 @@ $itemobj = feedback_get_item_class($typ);
 $itemobj->build_editform($item, $feedback, $cm);
 
 if ($itemobj->is_cancelled()) {
-    redirect($editurl->out(false));
+    redirect($editurl);
     exit;
 }
 if ($itemobj->get_data()) {
     if ($item = $itemobj->save_item()) {
         feedback_move_item($item, $item->position);
-        redirect($editurl->out(false));
+        redirect($editurl);
     }
 }
 
@@ -116,6 +90,8 @@ if ($itemobj->get_data()) {
 $strfeedbacks = get_string("modulenameplural", "feedback");
 $strfeedback  = get_string("modulename", "feedback");
 
+navigation_node::override_active_url(new moodle_url('/mod/feedback/edit.php',
+        array('id' => $cm->id, 'do_show' => 'edit')));
 if ($item->id) {
     $PAGE->navbar->add(get_string('edit_item', 'feedback'));
 } else {
@@ -129,6 +105,8 @@ echo $OUTPUT->header();
 echo $OUTPUT->heading(format_string($feedback->name));
 
 /// print the tabs
+$current_tab = 'edit';
+$id = $cm->id;
 require('tabs.php');
 
 //print errormsg
index 7f29685..bddeea5 100644 (file)
@@ -1,2 +1,28 @@
+cancel_moving,mod_feedback
+cannotunmap,mod_feedback
+cannotmapfeedback,mod_feedback
 completed,mod_feedback
+line_values,mod_feedback
 mapcourses_help,mod_feedback
+max_args_exceeded,mod_feedback
+movedown_item,mod_feedback
+move_here,mod_feedback
+moveup_item,mod_feedback
+notavailable,mod_feedback
+not_completed_yet,mod_feedback
+parameters_missing,mod_feedback
+picture,mod_feedback
+picture_file_list,mod_feedback
+picture_values,mod_feedback
+preview,mod_feedback
+preview_help,mod_feedback
+radiorated,mod_feedback
+radiobutton,mod_feedback
+radiobutton_rated,mod_feedback
+relateditemsdeleted,mod_feedback
+separator_decimal,mod_feedback
+separator_thousand,mod_feedback
+saving_failed_because_missing_or_false_values,mod_feedback
+switch_group,mod_feedback
+viewcompleted,mod_feedback
+viewcompleted_help,mod_feedback
index 35415ba..27ce175 100644 (file)
@@ -37,11 +37,8 @@ $string['autonumbering'] = 'Auto number questions';
 $string['autonumbering_help'] = 'Enables or disables automated numbers for each question';
 $string['average'] = 'Average';
 $string['bold'] = 'Bold';
-$string['cancel_moving'] = 'Cancel moving';
 $string['cannotaccess'] = 'You can only access this feedback from a course';
-$string['cannotmapfeedback'] = 'Database problem, unable to map feedback to course';
 $string['cannotsavetempl'] = 'saving templates is not allowed';
-$string['cannotunmap'] = 'Database problem, unable to unmap';
 $string['captcha'] = 'Captcha';
 $string['captchanotset'] = 'Captcha hasn\'t been set.';
 $string['completed_feedbacks'] = 'Submitted answers';
@@ -59,6 +56,7 @@ $string['creating_templates'] = 'Save these questions as a new template';
 $string['delete_entry'] = 'Delete entry';
 $string['delete_item'] = 'Delete question';
 $string['delete_old_items'] = 'Delete old items';
+$string['delete_pagebreak'] = 'Delete page break';
 $string['delete_template'] = 'Delete template';
 $string['delete_templates'] = 'Delete template...';
 $string['depending'] = 'Dependencies';
@@ -145,7 +143,6 @@ $string['item_label'] = 'Label';
 $string['item_name'] = 'Question';
 $string['label'] = 'Label';
 $string['labelcontents'] = 'Contents';
-$string['line_values'] = 'Rating';
 $string['mapcourseinfo'] = 'This is a site-wide feedback that is available to all courses using the feedback block. You can however limit the courses to which it will appear by mapping them. Search the course and map it to this feedback.';
 $string['mapcoursenone'] = 'No courses mapped. Feedback available to all courses';
 $string['mapcourse'] = 'Map feedback to courses';
@@ -154,7 +151,6 @@ and will appear in all courses using the feedback block. You can force the feedb
 $string['mapcourses'] = 'Map feedback to courses';
 $string['mappedcourses'] = 'Mapped courses';
 $string['mappingchanged'] = 'Course mapping has been changed';
-$string['max_args_exceeded'] = 'Max 6 arguments can be handled, too many arguments for';
 $string['minimal'] = 'minimum';
 $string['maximal'] = 'maximum';
 $string['messageprovider:message'] = 'Feedback reminder';
@@ -173,10 +169,7 @@ Feedback activities may be used
 * For anti-bullying surveys in which students can report incidents anonymously';
 $string['modulename_link'] = 'mod/feedback/view';
 $string['modulenameplural'] = 'Feedback';
-$string['movedown_item'] = 'Move this question down';
-$string['move_here'] = 'Move here';
 $string['move_item'] = 'Move this question';
-$string['moveup_item'] = 'Move this question up';
 $string['multichoice'] = 'Multiple choice';
 $string['multichoicerated'] = 'Multiple choice (rated)';
 $string['multichoicetype'] = 'Multiple choice type';
@@ -193,11 +186,10 @@ $string['no_items_available_yet'] = 'No questions have been set up yet';
 $string['non_anonymous'] = 'User\'s name will be logged and shown with answers';
 $string['non_anonymous_entries'] = 'Non anonymous entries ({$a})';
 $string['non_respondents_students'] = 'Non respondents students ({$a})';
-$string['notavailable'] = 'this feedback is not available';
-$string['not_completed_yet'] = 'Not completed yet';
 $string['not_started'] = 'not started';
 $string['no_templates_available_yet'] = 'No templates available yet';
 $string['not_selected'] = 'Not selected';
+$string['numberoutofrange'] = 'Number out of range';
 $string['numeric'] = 'Numeric answer';
 $string['numeric_range_from'] = 'Range from';
 $string['numeric_range_to'] = 'Range to';
@@ -210,27 +202,17 @@ $string['page'] = 'Page';
 $string['page-mod-feedback-x'] = 'Any feedback module page';
 $string['page_after_submit'] = 'Completion message';
 $string['pagebreak'] = 'Page break';
-$string['parameters_missing'] = 'Parameters missing from';
-$string['picture'] = 'Picture';
-$string['picture_file_list'] = 'List of pictures';
-$string['picture_values'] = 'Choose one or more<br />picture files from the list:';
 $string['pluginadministration'] = 'Feedback administration';
 $string['pluginname'] = 'Feedback';
 $string['position'] = 'Position';
-$string['preview'] = 'Preview';
-$string['preview_help'] = 'In the preview you can change the order of questions.';
 $string['previous_page'] = 'Previous page';
 $string['public'] = 'Public';
 $string['question'] = 'Question';
 $string['questionandsubmission'] = 'Question and submission settings';
 $string['questions'] = 'Questions';
 $string['radio'] = 'Multiple choice - single answer';
-$string['radiobutton'] = 'Multiple choice - single answer allowed (radio buttons)';
-$string['radiobutton_rated'] = 'Radiobutton (rated)';
-$string['radiorated'] = 'Radiobutton (rated)';
 $string['radio_values'] = 'Responses';
 $string['ready_feedbacks'] = 'Ready feedbacks';
-$string['relateditemsdeleted'] = 'All your user\'s responses for this question will also be deleted';
 $string['required'] = 'Required';
 $string['resetting_data'] = 'Reset feedback responses';
 $string['resetting_feedbacks'] = 'Resetting feedbacks';
@@ -242,7 +224,6 @@ $string['save_as_new_template'] = 'Save as new template';
 $string['save_entries'] = 'Submit your answers';
 $string['save_item'] = 'Save question';
 $string['saving_failed'] = 'Saving failed';
-$string['saving_failed_because_missing_or_false_values'] = 'Saving failed because missing or false values';
 $string['search:activity'] = 'Feedback activities';
 $string['search_course'] = 'Search course';
 $string['searchcourses'] = 'Search courses';
@@ -250,8 +231,6 @@ $string['searchcourses_help'] = 'Search for the code or name of the course(s) th
 $string['selected_dump'] = 'Selected indexes of $SESSION variable are dumped below:';
 $string['send'] = 'send';
 $string['send_message'] = 'send message';
-$string['separator_decimal'] = '.';
-$string['separator_thousand'] = ',';
 $string['show_all'] = 'Show all';
 $string['show_analysepage_after_submit'] = 'Show analysis page';
 $string['show_entries'] = 'Show responses';
@@ -263,9 +242,8 @@ $string['start'] = 'Start';
 $string['started'] = 'started';
 $string['stop'] = 'End';
 $string['subject'] = 'Subject';
-$string['switch_group'] = 'Switch group';
-$string['switch_item_to_not_required'] = 'switch to: answer not required';
-$string['switch_item_to_required'] = 'switch to: answer required';
+$string['switch_item_to_not_required'] = 'Set as not required';
+$string['switch_item_to_required'] = 'Set as required';
 $string['template'] = 'Template';
 $string['templates'] = 'Templates';
 $string['template_deleted'] = 'Template deleted';
@@ -282,15 +260,39 @@ $string['typemissing'] = 'missing value "type"';
 $string['update_item'] = 'Save changes to question';
 $string['url_for_continue'] = 'Link to next activity';
 $string['url_for_continue_help'] = 'After submitting the feedback, a continue button is displayed, which links to the course page. Alternatively, it may link to the next activity if the URL of the activity is entered here.';
-$string['use_one_line_for_each_value'] = '<br />Use one line for each answer!';
+$string['use_one_line_for_each_value'] = 'Use one line for each answer!';
 $string['use_this_template'] = 'Use this template';
 $string['using_templates'] = 'Use a template';
 $string['vertical'] = 'vertical';
-$string['viewcompleted'] = 'completed feedbacks';
-$string['viewcompleted_help'] = 'You may view completed feedback forms, searchable by course and/or by question.
-Feedback responses may be exported to Excel.';
 // Deprecated since Moodle 3.0.
 $string['completed'] = 'completed';
 // Deprecated since Moodle 3.1.
+$string['cannotmapfeedback'] = 'Database problem, unable to map feedback to course';
+$string['line_values'] = 'Rating';
 $string['mapcourses_help'] = 'Once you have selected the relevant course(s) from your search,
 you can associate them with this feedback using map course(s). Multiple courses may be selected by holding down the Apple or Ctrl key whilst clicking on the course names. A course may be disassociated from a feedback at any time.';
+$string['max_args_exceeded'] = 'Max 6 arguments can be handled, too many arguments for';
+$string['cancel_moving'] = 'Cancel moving';
+$string['movedown_item'] = 'Move this question down';
+$string['move_here'] = 'Move here';
+$string['moveup_item'] = 'Move this question up';
+$string['not_completed_yet'] = 'Not completed yet';
+$string['notavailable'] = 'this feedback is not available';
+$string['saving_failed_because_missing_or_false_values'] = 'Saving failed because missing or false values';
+$string['cannotunmap'] = 'Database problem, unable to unmap';
+$string['viewcompleted'] = 'completed feedbacks';
+$string['viewcompleted_help'] = 'You may view completed feedback forms, searchable by course and/or by question.
+Feedback responses may be exported to Excel.';
+$string['parameters_missing'] = 'Parameters missing from';
+$string['picture'] = 'Picture';
+$string['picture_file_list'] = 'List of pictures';
+$string['picture_values'] = 'Choose one or more<br />picture files from the list:';
+$string['preview'] = 'Preview';
+$string['preview_help'] = 'In the preview you can change the order of questions.';
+$string['switch_group'] = 'Switch group';
+$string['separator_decimal'] = '.';
+$string['separator_thousand'] = ',';
+$string['relateditemsdeleted'] = 'All your user\'s responses for this question will also be deleted';
+$string['radiorated'] = 'Radiobutton (rated)';
+$string['radiobutton'] = 'Multiple choice - single answer allowed (radio buttons)';
+$string['radiobutton_rated'] = 'Radiobutton (rated)';
index b584644..272b6d5 100644 (file)
@@ -301,9 +301,6 @@ function feedback_delete_instance($id) {
         }
     }
 
-    //deleting the referenced tracking data
-    $DB->delete_records('feedback_tracking', array('feedback'=>$id));
-
     //deleting the completeds
     $DB->delete_records("feedback_completed", array("feedback"=>$id));
 
@@ -525,7 +522,7 @@ function feedback_get_completion_state($course, $cm, $userid, $type) {
     // If completion option is enabled, evaluate it and return true/false
     if ($feedback->completionsubmit) {
         $params = array('userid'=>$userid, 'feedback'=>$feedback->id);
-        return $DB->record_exists('feedback_tracking', $params);
+        return $DB->record_exists('feedback_completed', $params);
     } else {
         // Completion option is not enabled so just return $type
         return $type;
@@ -645,7 +642,7 @@ function feedback_reset_userdata($data) {
     //reset the selected feedbacks
     foreach ($resetfeedbacks as $id) {
         $feedback = $DB->get_record('feedback', array('id'=>$id));
-        feedback_delete_all_completeds($id);
+        feedback_delete_all_completeds($feedback);
         $status[] = array('component'=>$componentstr.':'.$feedback->name,
                         'item'=>get_string('resetting_data', 'feedback'),
                         'error'=>false);
@@ -826,11 +823,14 @@ function feedback_delete_course_module($id) {
 /**
  * returns the context-id related to the given coursemodule-id
  *
+ * @deprecated since 3.1
  * @staticvar object $context
  * @param int $cmid the coursemodule-id
  * @return object $context
  */
 function feedback_get_context($cmid) {
+    debugging('Function feedback_get_context() is deprecated because it was not used.',
+            DEBUG_DEVELOPER);
     static $context;
 
     if (isset($context)) {
@@ -1024,31 +1024,6 @@ function feedback_get_complete_users($cm,
     return $DB->get_records_sql($sql, $params, $startpage, $pagecount);
 }
 
-/**
- * If there are any new responses to the anonymous feedback, re-shuffle all
- * responses and assign response number to each of them.
- *
- * @param stdClass $feedback
- */
-function feedback_shuffle_anonym_responses($feedback) {
-    global $DB;
-    $params = array('feedback' => $feedback->id,
-                    'random_response' => 0,
-                    'anonymous_response' => FEEDBACK_ANONYMOUS_YES);
-
-    if ($DB->count_records('feedback_completed', $params, 'random_response')) {
-        // Get all of the anonymous records, go through them and assign a response id.
-        unset($params['random_response']);
-        $feedbackcompleteds = $DB->get_records('feedback_completed', $params, 'id');
-        shuffle($feedbackcompleteds);
-        $num = 1;
-        foreach ($feedbackcompleteds as $compl) {
-            $compl->random_response = $num++;
-            $DB->update_record('feedback_completed', $compl);
-        }
-    }
-}
-
 /**
  * get users which have the viewreports-capability
  *
@@ -1277,8 +1252,6 @@ function feedback_items_from_template($feedback, $templateid, $deleteold = false
             foreach ($feedbackitems as $item) {
                 feedback_delete_item($item->id, false);
             }
-            //delete tracking-data
-            $DB->delete_records('feedback_tracking', array('feedback'=>$feedback->id));
 
             $params = array('feedback'=>$feedback->id);
             if ($completeds = $DB->get_records('feedback_completed', $params)) {
@@ -1386,9 +1359,8 @@ function feedback_get_template_list($course, $onlyownorpublic = '') {
 /**
  * load the lib.php from item-plugin-dir and returns the instance of the itemclass
  *
- * @global object
- * @param object $item
- * @return object the instanz of itemclass
+ * @param string $typ
+ * @return feedback_item_base the instance of itemclass
  */
 function feedback_get_item_class($typ) {
     global $CFG;
@@ -1485,11 +1457,13 @@ function feedback_get_depend_candidates_for_item($feedback, $item) {
 /**
  * creates a new item-record
  *
- * @global object
+ * @deprecated since 3.1
  * @param object $data the data from edit_item_form
  * @return int the new itemid
  */
 function feedback_create_item($data) {
+    debugging('Function feedback_create_item() is deprecated because it was not used.',
+            DEBUG_DEVELOPER);
     global $DB;
 
     $item = new stdClass();
@@ -1799,57 +1773,43 @@ function feedback_move_item($moveitem, $pos) {
  * prints the given item as a preview.
  * each item-class has an own print_item_preview function implemented.
  *
+ * @deprecated since Moodle 3.1
  * @global object
  * @param object $item the item what we want to print out
  * @return void
  */
 function feedback_print_item_preview($item) {
-    global $CFG;
-    if ($item->typ == 'pagebreak') {
-        return;
-    }
-    //get the instance of the item-class
-    $itemobj = feedback_get_item_class($item->typ);
-    $itemobj->print_item_preview($item);
+    debugging('Function feedback_print_item_preview() is deprecated and does nothing. '
+            . 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
 }
 
 /**
  * prints the given item in the completion form.
  * each item-class has an own print_item_complete function implemented.
  *
+ * @deprecated since Moodle 3.1
  * @param object $item the item what we want to print out
  * @param mixed $value the value
  * @param boolean $highlightrequire if this set true and the value are false on completing so the item will be highlighted
  * @return void
  */
 function feedback_print_item_complete($item, $value = false, $highlightrequire = false) {
-    global $CFG;
-    if ($item->typ == 'pagebreak') {
-        return;
-    }
-
-    //get the instance of the item-class
-    $itemobj = feedback_get_item_class($item->typ);
-    $itemobj->print_item_complete($item, $value, $highlightrequire);
+    debugging('Function feedback_print_item_complete() is deprecated and does nothing. '
+            . 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
 }
 
 /**
  * prints the given item in the show entries page.
  * each item-class has an own print_item_show_value function implemented.
  *
+ * @deprecated since Moodle 3.1
  * @param object $item the item what we want to print out
  * @param mixed $value
  * @return void
  */
 function feedback_print_item_show_value($item, $value = false) {
-    global $CFG;
-    if ($item->typ == 'pagebreak') {
-        return;
-    }
-
-    //get the instance of the item-class
-    $itemobj = feedback_get_item_class($item->typ);
-    $itemobj->print_item_show_value($item, $value);
+    debugging('Function feedback_print_item_show_value() is deprecated and does nothing. '
+            . 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
 }
 
 /**
@@ -1862,6 +1822,8 @@ function feedback_print_item_show_value($item, $value = false) {
  */
 function feedback_set_tmp_values($feedbackcompleted) {
     global $DB;
+    debugging('Function feedback_set_tmp_values() is deprecated and since it is '
+            . 'no longer used in mod_feedback', DEBUG_DEVELOPER);
 
     //first we create a completedtmp
     $tmpcpl = new stdClass();
@@ -1889,10 +1851,9 @@ function feedback_set_tmp_values($feedbackcompleted) {
  * @global object
  * @param object $feedbackcompletedtmp the temporary completed
  * @param object $feedbackcompleted the target completed
- * @param int $userid
  * @return int the id of the completed
  */
-function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $userid) {
+function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted) {
     global $DB;
 
     $tmpcplid = $feedbackcompletedtmp->id;
@@ -1905,23 +1866,22 @@ function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $us
     } else {
         $feedbackcompleted = clone($feedbackcompletedtmp);
         $feedbackcompleted->id = '';
-        $feedbackcompleted->userid = $userid;
         $feedbackcompleted->timemodified = time();
         $feedbackcompleted->id = $DB->insert_record('feedback_completed', $feedbackcompleted);
     }
 
+    $allitems = $DB->get_records('feedback_item', array('feedback' => $feedbackcompleted->feedback));
+
     //save all the new values from feedback_valuetmp
     //get all values of tmp-completed
     $params = array('completed'=>$feedbackcompletedtmp->id);
-    if (!$values = $DB->get_records('feedback_valuetmp', $params)) {
-        return false;
-    }
+    $values = $DB->get_records('feedback_valuetmp', $params);
     foreach ($values as $value) {
         //check if there are depend items
         $item = $DB->get_record('feedback_item', array('id'=>$value->item));
-        if ($item->dependitem > 0) {
+        if ($item->dependitem > 0 && isset($allitems[$item->dependitem])) {
             $check = feedback_compare_item_value($tmpcplid,
-                                        $item->dependitem,
+                                        $allitems[$item->dependitem],
                                         $item->dependvalue,
                                         true);
         } else {
@@ -1939,20 +1899,7 @@ function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $us
 
     // Trigger event for the delete action we performed.
     $cm = get_coursemodule_from_instance('feedback', $feedbackcompleted->feedback);
-    $event = \mod_feedback\event\response_submitted::create(array(
-        'relateduserid' => $userid,
-        'objectid' => $feedbackcompleted->id,
-        'context' => context_module::instance($cm->id),
-        'anonymous' => ($feedbackcompleted->anonymous_response == FEEDBACK_ANONYMOUS_YES),
-        'other' => array(
-            'cmid' => $cm->id,
-            'instanceid' => $feedbackcompleted->feedback,
-            'anonymous' => $feedbackcompleted->anonymous_response // Deprecated.
-        )
-    ));
-
-    $event->add_record_snapshot('feedback_completed', $feedbackcompleted);
-
+    $event = \mod_feedback\event\response_submitted::create_from_record($feedbackcompleted, $cm);
     $event->trigger();
     return $feedbackcompleted->id;
 
@@ -1961,13 +1908,17 @@ function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $us
 /**
  * deletes the given temporary completed and all related temporary values
  *
- * @global object
+ * @deprecated since Moodle 3.1
+ *
  * @param int $tmpcplid
  * @return void
  */
 function feedback_delete_completedtmp($tmpcplid) {
     global $DB;
 
+    debugging('Function feedback_delete_completedtmp() is deprecated because it is no longer used',
+            DEBUG_DEVELOPER);
+
     $DB->delete_records('feedback_valuetmp', array('completed'=>$tmpcplid));
     $DB->delete_records('feedback_completedtmp', array('id'=>$tmpcplid));
 }
@@ -2047,6 +1998,7 @@ function feedback_get_last_break_position($feedbackid) {
 /**
  * this returns the position where the user can continue the completing.
  *
+ * @deprecated since Moodle 3.1
  * @global object
  * @global object
  * @global object
@@ -2058,6 +2010,9 @@ function feedback_get_last_break_position($feedbackid) {
 function feedback_get_page_to_continue($feedbackid, $courseid = false, $guestid = false) {
     global $CFG, $USER, $DB;
 
+    debugging('Function feedback_get_page_to_continue() is deprecated and since it is '
+            . 'no longer used in mod_feedback', DEBUG_DEVELOPER);
+
     //is there any break?
 
     if (!$allbreaks = feedback_get_all_break_positions($feedbackid)) {
@@ -2112,12 +2067,13 @@ function feedback_get_page_to_continue($feedbackid, $courseid = false, $guestid
 /**
  * cleans the userinput while submitting the form.
  *
+ * @deprecated since Moodle 3.1
  * @param mixed $value
  * @return mixed
  */
 function feedback_clean_input_value($item, $value) {
-    $itemobj = feedback_get_item_class($item->typ);
-    return $itemobj->clean_input_value($value);
+    debugging('Function feedback_clean_input_value() is deprecated and does nothing. '
+            . 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
 }
 
 /**
@@ -2126,16 +2082,20 @@ function feedback_clean_input_value($item, $value) {
  * if there is already a completed and the userid is set so the values are updated.
  * on all other things new value records will be created.
  *
- * @global object
- * @param int $userid
+ * @deprecated since Moodle 3.1
+ *
+ * @param int $usrid
  * @param boolean $tmp
  * @return mixed false on error or the completeid
  */
 function feedback_save_values($usrid, $tmp = false) {
     global $DB;
 
-    $completedid = optional_param('completedid', 0, PARAM_INT);
+    debugging('Function feedback_save_values() was deprecated because it did not have '.
+            'enough arguments, was not suitable for non-temporary table and was taking '.
+            'data directly from input', DEBUG_DEVELOPER);
 
+    $completedid = optional_param('completedid', 0, PARAM_INT);
     $tmpstr = $tmp ? 'tmp' : '';
     $time = time();
     $timemodified = mktime(0, 0, 0, date('m', $time), date('d', $time), date('Y', $time));
@@ -2155,13 +2115,18 @@ function feedback_save_values($usrid, $tmp = false) {
 /**
  * this saves the values from anonymous user such as guest on the main-site
  *
- * @global object
+ * @deprecated since Moodle 3.1
+ *
  * @param string $guestid the unique guestidentifier
  * @return mixed false on error or the completeid
  */
 function feedback_save_guest_values($guestid) {
     global $DB;
 
+    debugging('Function feedback_save_guest_values() was deprecated because it did not have '.
+            'enough arguments, was not suitable for non-temporary table and was taking '.
+            'data directly from input', DEBUG_DEVELOPER);
+
     $completedid = optional_param('completedid', false, PARAM_INT);
 
     $timemodified = time();
@@ -2196,23 +2161,21 @@ function feedback_get_item_value($completedid, $itemid, $tmp = false) {
  * this is used if a depend item is set.
  * the value can come as temporary or as permanently value. the deciding is done by $tmp.
  *
- * @global object
- * @global object
- * @param int $completeid
- * @param int $itemid
+ * @param int $completedid
+ * @param stdClass|int $item
  * @param mixed $dependvalue
- * @param boolean $tmp
+ * @param bool $tmp
  * @return bool
  */
-function feedback_compare_item_value($completedid, $itemid, $dependvalue, $tmp = false) {
-    global $DB, $CFG;
+function feedback_compare_item_value($completedid, $item, $dependvalue, $tmp = false) {
+    global $DB;
 
-    $dbvalue = feedback_get_item_value($completedid, $itemid, $tmp);
+    if (is_int($item)) {
+        $item = $DB->get_record('feedback_item', array('id' => $item));
+    }
 
-    //get the class of the given item-typ
-    $item = $DB->get_record('feedback_item', array('id'=>$itemid));
+    $dbvalue = feedback_get_item_value($completedid, $item->id, $tmp);
 
-    //get the instance of the item-class
     $itemobj = feedback_get_item_class($item->typ);
     return $itemobj->compare_value($item, $dbvalue, $dependvalue); //true or false
 }
@@ -2229,66 +2192,8 @@ function feedback_compare_item_value($completedid, $itemid, $dependvalue, $tmp =
  * @return boolean
  */
 function feedback_check_values($firstitem, $lastitem) {
-    global $DB, $CFG;
-
-    $feedbackid = optional_param('feedbackid', 0, PARAM_INT);
-
-    //get all items between the first- and lastitem
-    $select = "feedback = ?
-                    AND position >= ?
-                    AND position <= ?
-                    AND hasvalue = 1";
-    $params = array($feedbackid, $firstitem, $lastitem);
-    if (!$feedbackitems = $DB->get_records_select('feedback_item', $select, $params)) {
-        //if no values are given so no values can be wrong ;-)
-        return true;
-    }
-
-    foreach ($feedbackitems as $item) {
-        //get the instance of the item-class
-        $itemobj = feedback_get_item_class($item->typ);
-
-        //the name of the input field of the completeform is given in a special form:
-        //<item-typ>_<item-id> eg. numeric_234
-        //this is the key to get the value for the correct item
-        $formvalname = $item->typ . '_' . $item->id;
-
-        if ($itemobj->value_is_array()) {
-            //get the raw value here. It is cleaned after that by the object itself
-            $value = optional_param_array($formvalname, null, PARAM_RAW);
-        } else {
-            //get the raw value here. It is cleaned after that by the object itself
-            $value = optional_param($formvalname, null, PARAM_RAW);
-        }
-        $value = $itemobj->clean_input_value($value);
-
-        // If the item is not visible due to its dependency so it shouldn't be required.
-        // Many thanks to Pau Ferrer OcaƱa.
-        if ($item->dependitem > 0 AND $item->required == 1) {
-            $comparevalue = false;
-            if ($feedbackcompletedtmp = feedback_get_current_completed($item->feedback, true)) {
-                $comparevalue = feedback_compare_item_value($feedbackcompletedtmp->id,
-                                                            $item->dependitem,
-                                                            $item->dependvalue,
-                                                            true);
-            }
-
-            if (!$comparevalue) {
-                $item->required = 0; // Override the required property.
-            }
-        }
-
-        //check if the value is set
-        if (is_null($value) AND $item->required == 1) {
-            return false;
-        }
-
-        //now we let check the value by the item-class
-        if (!$itemobj->check_value($value, $item)) {
-            return false;
-        }
-    }
-    //if no wrong values so we can return true
+    debugging('Function feedback_check_values() is deprecated and does nothing. '
+            . 'Items must implement complete_form_element()', DEBUG_DEVELOPER);
     return true;
 }
 
@@ -2296,7 +2201,8 @@ function feedback_check_values($firstitem, $lastitem) {
  * this function create a complete-record and the related value-records.
  * depending on the $tmp (true/false) the values are saved temporary or permanently
  *
- * @global object
+ * @deprecated since Moodle 3.1
+ *
  * @param int $userid
  * @param int $timemodified
  * @param boolean $tmp
@@ -2306,9 +2212,9 @@ function feedback_check_values($firstitem, $lastitem) {
 function feedback_create_values($usrid, $timemodified, $tmp = false, $guestid = false) {
     global $DB;
 
-    $feedbackid = optional_param('feedbackid', false, PARAM_INT);
-    $anonymous_response = optional_param('anonymous_response', false, PARAM_INT);
-    $courseid = optional_param('courseid', false, PARAM_INT);
+    debugging('Function feedback_create_values() was deprecated because it did not have '.
+            'enough arguments, was not suitable for non-temporary table and was taking '.
+            'data directly from input', DEBUG_DEVELOPER);
 
     $tmpstr = $tmp ? 'tmp' : '';
     //first we create a new completed record
@@ -2339,10 +2245,10 @@ function feedback_create_values($usrid, $timemodified, $tmp = false, $guestid =
 
         $keyname = $item->typ.'_'.$item->id;
 
-        if ($itemobj->value_is_array()) {
-            $itemvalue = optional_param_array($keyname, null, $itemobj->value_type());
+        if ($item->typ === 'multichoice') {
+            $itemvalue = optional_param_array($keyname, null, PARAM_INT);
         } else {
-            $itemvalue = optional_param($keyname, null, $itemobj->value_type());
+            $itemvalue = optional_param($keyname, null, PARAM_NOTAGS);
         }
 
         if (is_null($itemvalue)) {
@@ -2374,6 +2280,10 @@ function feedback_create_values($usrid, $timemodified, $tmp = false, $guestid =
 function feedback_update_values($completed, $tmp = false) {
     global $DB;
 
+    debugging('Function feedback_update_values() was deprecated because it did not have '.
+            'enough arguments, was not suitable for non-temporary table and was taking '.
+            'data directly from input', DEBUG_DEVELOPER);
+
     $courseid = optional_param('courseid', false, PARAM_INT);
     $tmpstr = $tmp ? 'tmp' : '';
 
@@ -2394,10 +2304,10 @@ function feedback_update_values($completed, $tmp = false) {
 
         $keyname = $item->typ.'_'.$item->id;
 
-        if ($itemobj->value_is_array()) {
-            $itemvalue = optional_param_array($keyname, null, $itemobj->value_type());
+        if ($item->typ === 'multichoice') {
+            $itemvalue = optional_param_array($keyname, null, PARAM_INT);
         } else {
-            $itemvalue = optional_param($keyname, null, $itemobj->value_type());
+            $itemvalue = optional_param($keyname, null, PARAM_NOTAGS);
         }
 
         //is the itemvalue set (could be a subset of items because pagebreak)?
@@ -2516,19 +2426,15 @@ function feedback_get_group_values($item,
 function feedback_is_already_submitted($feedbackid, $courseid = false) {
     global $USER, $DB;
 
-    $params = array('userid'=>$USER->id, 'feedback'=>$feedbackid);
-    if (!$trackings = $DB->get_records_menu('feedback_tracking', $params, '', 'id, completed')) {
+    if (!isloggedin() || isguestuser()) {
         return false;
     }
 
+    $params = array('userid' => $USER->id, 'feedback' => $feedbackid);
     if ($courseid) {
-        $select = 'completed IN ('.implode(',', $trackings).') AND course_id = ?';
-        if (!$values = $DB->get_records_select('feedback_value', $select, array($courseid))) {
-            return false;
-        }
+        $params['courseid'] = $courseid;
     }
-
-    return true;
+    return $DB->record_exists('feedback_completed', $params);
 }
 
 /**
@@ -2536,9 +2442,7 @@ function feedback_is_already_submitted($feedbackid, $courseid = false) {
  * by pagebreak or by multiple submit so the complete must be found.
  * if the param $tmp is set true so all things are related to temporary completeds
  *
- * @global object
- * @global object
- * @global object
+ * @deprecated since Moodle 3.1
  * @param int $feedbackid
  * @param boolean $tmp
  * @param int $courseid
@@ -2550,6 +2454,10 @@ function feedback_get_current_completed($feedbackid,
                                         $courseid = false,
                                         $guestid = false) {
 
+    debugging('Function feedback_get_current_completed() is deprecated. Please use either '.
+            'feedback_get_current_completed_tmp() or feedback_get_last_completed()',
+            DEBUG_DEVELOPER);
+
     global $USER, $CFG, $DB;
 
     $tmpstr = $tmp ? 'tmp' : '';
@@ -2674,18 +2582,32 @@ function feedback_get_completeds_group_count($feedback, $groupid = false, $cours
  * deletes all completed-recordsets from a feedback.
  * all related data such as values also will be deleted
  *
- * @global object
- * @param int $feedbackid
+ * @param stdClass|int $feedback
+ * @param stdClass|cm_info $cm
+ * @param stdClass $course
  * @return void
  */
-function feedback_delete_all_completeds($feedbackid) {
+function feedback_delete_all_completeds($feedback, $cm = null, $course = null) {
     global $DB;
 
-    if (!$completeds = $DB->get_records('feedback_completed', array('feedback'=>$feedbackid))) {
+    if (is_int($feedback)) {
+        $feedback = $DB->get_record('feedback', array('id' => $feedback));
+    }
+
+    if (!$completeds = $DB->get_records('feedback_completed', array('feedback' => $feedback->id))) {
         return;
     }
+
+    if (!$course && !($course = $DB->get_record('course', array('id' => $feedback->course)))) {
+        return false;
+    }
+
+    if (!$cm && !($cm = get_coursemodule_from_instance('feedback', $feedback->id))) {
+        return false;
+    }
+
     foreach ($completeds as $completed) {
-        feedback_delete_completed($completed->id);
+        feedback_delete_completed($completed, $feedback, $cm, $course);
     }
 }
 
@@ -2693,38 +2615,36 @@ function feedback_delete_all_completeds($feedbackid) {
  * deletes a completed given by completedid.
  * all related data such values or tracking data also will be deleted
  *
- * @global object
- * @param int $completedid
+ * @param int|stdClass $completed
+ * @param stdClass $feedback
+ * @param stdClass|cm_info $cm
+ * @param stdClass $course
  * @return boolean
  */
-function feedback_delete_completed($completedid) {
+function feedback_delete_completed($completed, $feedback = null, $cm = null, $course = null) {
     global $DB, $CFG;
     require_once($CFG->libdir.'/completionlib.php');
 
-    if (!$completed = $DB->get_record('feedback_completed', array('id'=>$completedid))) {
-        return false;
+    if (!isset($completed->id)) {
+        if (!$completed = $DB->get_record('feedback_completed', array('id' => $completed))) {
+            return false;
+        }
     }
 
-    if (!$feedback = $DB->get_record('feedback', array('id'=>$completed->feedback))) {
+    if (!$feedback && !($feedback = $DB->get_record('feedback', array('id' => $completed->feedback)))) {
         return false;
     }
 
-    if (!$course = $DB->get_record('course', array('id'=>$feedback->course))) {
+    if (!$course && !($course = $DB->get_record('course', array('id' => $feedback->course)))) {
         return false;
     }
 
-    if (!$cm = get_coursemodule_from_instance('feedback', $feedback->id)) {
+    if (!$cm && !($cm = get_coursemodule_from_instance('feedback', $feedback->id))) {
         return false;
     }
 
     //first we delete all related values
-    $DB->delete_records('feedback_value', array('completed'=>$completed->id));
-
-    //now we delete all tracking data
-    $params = array('completed'=>$completed->id, 'feedback'=>$completed->feedback);
-    if ($tracking = $DB->get_record('feedback_tracking', $params)) {
-        $DB->delete_records('feedback_tracking', array('completed'=>$completed->id));
-    }
+    $DB->delete_records('feedback_value', array('completed' => $completed->id));
 
     // Update completion state
     $completion = new completion_info($course);
@@ -2732,25 +2652,10 @@ function feedback_delete_completed($completedid) {
         $completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid);
     }
     // Last we delete the completed-record.
-    $return = $DB->delete_records('feedback_completed', array('id'=>$completed->id));
+    $return = $DB->delete_records('feedback_completed', array('id' => $completed->id));
 
     // Trigger event for the delete action we performed.
-    $event = \mod_feedback\event\response_deleted::create(array(
-        'relateduserid' => $completed->userid,
-        'objectid' => $completedid,
-        'courseid' => $course->id,
-        'context' => context_module::instance($cm->id),
-        'anonymous' => ($completed->anonymous_response == FEEDBACK_ANONYMOUS_YES),
-        'other' => array(
-            'cmid' => $cm->id,
-            'instanceid' => $feedback->id,
-            'anonymous' => $completed->anonymous_response) // Deprecated.
-    ));
-
-    $event->add_record_snapshot('feedback_completed', $completed);
-    $event->add_record_snapshot('course', $course);
-    $event->add_record_snapshot('feedback', $feedback);
-
+    $event = \mod_feedback\event\response_deleted::create_from_record($completed, $cm, $feedback);
     $event->trigger();
 
     return $return;
@@ -2765,12 +2670,14 @@ function feedback_delete_completed($completedid) {
 /**
  * checks if the course and the feedback is in the table feedback_sitecourse_map.
  *
- * @global object
+ * @deprecated since 3.1
  * @param int $feedbackid
  * @param int $courseid
  * @return int the count of records
  */
 function feedback_is_course_in_sitecourse_map($feedbackid, $courseid) {
+    debugging('Function feedback_is_course_in_sitecourse_map() is deprecated because it was not used.',
+            DEBUG_DEVELOPER);
     global $DB;
     $params = array('feedbackid'=>$feedbackid, 'courseid'=>$courseid);
     return $DB->count_records('feedback_sitecourse_map', $params);
@@ -2779,11 +2686,13 @@ function feedback_is_course_in_sitecourse_map($feedbackid, $courseid) {
 /**
  * checks if the feedback is in the table feedback_sitecourse_map.
  *
- * @global object
+ * @deprecated since 3.1
  * @param int $feedbackid
  * @return boolean
  */
 function feedback_is_feedback_in_sitecourse_map($feedbackid) {
+    debugging('Function feedback_is_feedback_in_sitecourse_map() is deprecated because it was not used.',
+            DEBUG_DEVELOPER);
     global $DB;
     return $DB->record_exists('feedback_sitecourse_map', array('feedbackid'=>$feedbackid));
 }
@@ -2895,11 +2804,14 @@ function feedback_update_sitecourse_map($feedback, $courses) {
  * it shouldn't be called all too often
  * a good place for it could be the mapcourse.php or unmapcourse.php
  *
+ * @deprecated since 3.1
  * @global object
  * @return void
  */
 function feedback_clean_up_sitecourse_map() {
     global $DB;
+    debugging('Function feedback_clean_up_sitecourse_map() is deprecated because it was not used.',
+            DEBUG_DEVELOPER);
 
     $maps = $DB->get_records('feedback_sitecourse_map');
     foreach ($maps as $map) {
@@ -2925,6 +2837,7 @@ function feedback_clean_up_sitecourse_map() {
 
 /**
  * prints the option items of a selection-input item (dropdownlist).
+ * @deprecated since 3.1
  * @param int $startval the first value of the list
  * @param int $endval the last value of the list
  * @param int $selectval which item should be selected
@@ -2932,6 +2845,8 @@ function feedback_clean_up_sitecourse_map() {
  * @return void
  */
 function feedback_print_numeric_option_list($startval, $endval, $selectval = '', $interval = 1) {
+    debugging('Function feedback_print_numeric_option_list() is deprecated because it was not used.',
+            DEBUG_DEVELOPER);
     for ($i = $startval; $i <= $endval; $i += $interval) {
         if ($selectval == ($i)) {
             $selected = 'selected="selected"';
@@ -2952,17 +2867,19 @@ function feedback_print_numeric_option_list($startval, $endval, $selectval = '',
  * @param object $cm the coursemodule-record
  * @param object $feedback
  * @param object $course
- * @param int $userid
+ * @param stdClass|int $user
  * @return void
  */
-function feedback_send_email($cm, $feedback, $course, $userid) {
+function feedback_send_email($cm, $feedback, $course, $user) {
     global $CFG, $DB;
 
     if ($feedback->email_notification == 0) {  // No need to do anything
         return;
     }
 
-    $user = $DB->get_record('user', array('id'=>$userid));
+    if (is_int($user)) {
+        $user = $DB->get_record('user', array('id' => $user));
+    }
 
     if (isset($cm->groupmode) && empty($course->groupmodeforce)) {
         $groupmode =  $cm->groupmode;
@@ -2976,7 +2893,7 @@ function feedback_send_email($cm, $feedback, $course, $userid) {
                                               WHERE g.courseid = ?
                                                     AND g.id = m.groupid
                                                     AND m.userid = ?
-                                           ORDER BY name ASC", array($course->id, $userid));
+                                           ORDER BY name ASC", array($course->id, $user->id));
         $groups = array_values($groups);
 
         $teachers = feedback_get_receivemail_users($cm->id, $groups);
@@ -3001,7 +2918,7 @@ function feedback_send_email($cm, $feedback, $course, $userid) {
             $info->feedback = format_string($feedback->name, true);
             $info->url = $CFG->wwwroot.'/mod/feedback/show_entries.php?'.
                             'id='.$cm->id.'&'.
-                            'userid=' . $userid;
+                            'userid=' . $user->id;
 
             $a = array('username' => $info->username, 'feedbackname' => $feedback->name);
 
index 9a79dcf..d9448fd 100644 (file)
@@ -34,10 +34,11 @@ list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
 require_course_login($course, true, $cm);
 
 $feedback = $PAGE->activityrecord;
+$feedbackstructure = new mod_feedback_structure($feedback, $cm, $courseid);
 
-$PAGE->set_pagelayout('embedded');
+$PAGE->set_pagelayout('popup');
 
-/// Print the page header
+// Print the page header.
 $strfeedbacks = get_string("modulenameplural", "feedback");
 $strfeedback  = get_string("modulename", "feedback");
 
@@ -49,68 +50,20 @@ $PAGE->set_title($feedback->name);
 $PAGE->set_heading($course->fullname);
 echo $OUTPUT->header();
 
-/// Print the main part of the page
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-echo $OUTPUT->heading(format_text($feedback->name));
+// Print the main part of the page.
+echo $OUTPUT->heading(format_string($feedback->name));
 
 $continueurl = new moodle_url('/mod/feedback/view.php', array('id' => $id));
 if ($courseid) {
     $continueurl->param('courseid', $courseid);
 }
 
-$feedbackitems = $DB->get_records('feedback_item', array('feedback'=>$feedback->id), 'position');
-echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
+$form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_PRINT,
+        $feedbackstructure, 'feedback_print_form');
 echo $OUTPUT->continue_button($continueurl);
-if (is_array($feedbackitems)) {
-    $itemnr = 0;
-    $align = right_to_left() ? 'right' : 'left';
-
-    echo $OUTPUT->box_start('feedback_items printview');
-    //check, if there exists required-elements
-    $params = array('feedback'=>$feedback->id, 'required'=>1);
-    $countreq = $DB->count_records('feedback_item', $params);
-    if ($countreq > 0) {
-        echo '<div class="fdescription required">';
-        echo get_string('somefieldsrequired', 'form', '<img alt="'.get_string('requiredelement', 'form').
-            '" src="'.$OUTPUT->pix_url('req') .'" class="req" />');
-        echo '</div>';
-    }
-    //print the inserted items
-    $itempos = 0;
-    foreach ($feedbackitems as $feedbackitem) {
-        echo $OUTPUT->box_start('feedback_item_box_'.$align);
-        $itempos++;
-        //Items without value only are labels
-        if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
-            $itemnr++;
-                echo $OUTPUT->box_start('feedback_item_number_'.$align);
-                echo $itemnr;
-                echo $OUTPUT->box_end();
-        }
-        echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
-        if ($feedbackitem->typ != 'pagebreak') {
-            feedback_print_item_complete($feedbackitem, false, false);
-        } else {
-            echo $OUTPUT->box_start('feedback_pagebreak');
-            echo '<hr class="feedback_pagebreak" />';
-            echo $OUTPUT->box_end();
-        }
-        echo $OUTPUT->box_end();
-        echo $OUTPUT->box_end();
-    }
-    echo $OUTPUT->box_end();
-} else {
-    echo $OUTPUT->box(get_string('no_items_available_yet', 'feedback'),
-                    'generalbox boxaligncenter boxwidthwide');
-}
+$form->display();
 echo $OUTPUT->continue_button($continueurl);
-echo $OUTPUT->box_end();
-/// Finish the page
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
 
+// Finish the page.
 echo $OUTPUT->footer();
 
index 577fbd0..794a199 100644 (file)
@@ -24,7 +24,6 @@
 
 require_once("../../config.php");
 require_once("lib.php");
-require_once($CFG->libdir.'/tablelib.php');
 
 ////////////////////////////////////////////////////////
 //get the params
@@ -51,18 +50,24 @@ $feedback = $PAGE->activityrecord;
 
 require_capability('mod/feedback:viewreports', $context);
 
-// Process delete template result.
-if ($deleteid && optional_param('confirm', 0, PARAM_BOOL) && confirm_sesskey()) {
+if ($deleteid) {
+    // This is a request to delete a reponse.
     require_capability('mod/feedback:deletesubmissions', $context);
-    $completed = $DB->get_record('feedback_completed', array('id' => $deleteid), '*', MUST_EXIST);
-    feedback_delete_completed($deleteid);
-    redirect($baseurl);
+    $feedbackstructure = new mod_feedback_completion($feedback, $cm, 0, true, $deleteid);
+    if (optional_param('confirm', 0, PARAM_BOOL) && confirm_sesskey()) {
+        // Process delete template result.
+        feedback_delete_completed($feedbackstructure->get_completed(), $feedback, $cm);
+        redirect($baseurl);
+    }
+} else if ($showcompleted || $userid) {
+    // Viewing individual response.
+    $feedbackstructure = new mod_feedback_completion($feedback, $cm, 0, true, $showcompleted, $userid);
+} else {
+    // Viewing list of reponses.
+    $feedbackstructure = new mod_feedback_structure($feedback, $cm);
 }
 
-/// Print the page header
-$strfeedbacks = get_string("modulenameplural", "feedback");
-$strfeedback  = get_string("modulename", "feedback");
-
+// Print the page header.
 navigation_node::override_active_url($baseurl);
 $PAGE->set_heading($course->fullname);
 $PAGE->set_title($feedback->name);
@@ -77,109 +82,62 @@ require('tabs.php');
 ///////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////
 
-// Print the list of responses.
-if (!$showcompleted && !$deleteid && !$userid) {
-    // Show non-anonymous responses.
-    $responsestable = new mod_feedback_responses_table($cm);
-    $totalrows = $responsestable->get_total_responses_count();
-    if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO || $totalrows) {
-        echo $OUTPUT->heading(get_string('non_anonymous_entries', 'feedback', $totalrows), 4);
-
-
-        $responsestable->display();
-    }
-
-    // Show anonymous responses.
-    feedback_shuffle_anonym_responses($feedback);
-    $anonresponsestable = new mod_feedback_responses_anon_table($cm);
-    $totalrows = $anonresponsestable->get_total_responses_count();
-    if ($feedback->anonymous == FEEDBACK_ANONYMOUS_YES || $totalrows) {
-        echo $OUTPUT->heading(get_string('anonymous_entries', 'feedback', $totalrows), 4);
-        $anonresponsestable->display();
-    }
-
-}
-
-// Print the response of the given user.
-if ($userid || $showcompleted) {
-    //get the feedbackitems
-    $feedbackitems = $DB->get_records('feedback_item', array('feedback' => $feedback->id), 'position');
+if ($deleteid) {
+    // Print confirmation form to delete a response.
+    $continueurl = new moodle_url($baseurl, array('delete' => $deleteid, 'confirm' => 1, 'sesskey' => sesskey()));
+    echo $OUTPUT->confirm(get_string('confirmdeleteentry', 'feedback'), $continueurl, $baseurl);
+} else if ($userid || $showcompleted) {
+    // Print the response of the given user.
+    $completedrecord = $feedbackstructure->get_completed();
 
     if ($userid) {
-        $user = $DB->get_record('user', array('id' => $userid, 'deleted' => 0), '*', MUST_EXIST);
-        $params = ['feedback' => $feedback->id, 'userid' => $userid, 'anonymous_response' => FEEDBACK_ANONYMOUS_NO];
-        if ($showcompleted) {
-            $params['id'] = $showcompleted;
-        }
-        $feedbackcompleted = $DB->get_record('feedback_completed', $params);
-        $responsetitle = userdate($feedbackcompleted->timemodified) . ' (' . fullname($user) . ')';
-    } else if ($showcompleted) {
-        $feedbackcompleted = $DB->get_record('feedback_completed',
-                array('feedback' => $feedback->id, 'id' => $showcompleted,
-                    'anonymous_response' => FEEDBACK_ANONYMOUS_YES), '*', MUST_EXIST);
+        $usr = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
+        $responsetitle = userdate($completedrecord->timemodified) . ' (' . fullname($usr) . ')';
+    } else {
         $responsetitle = get_string('response_nr', 'feedback') . ': ' .
-            $feedbackcompleted->random_response . ' (' . get_string('anonymous', 'feedback') . ')';
+                $completedrecord->random_response . ' (' . get_string('anonymous', 'feedback') . ')';
     }
 
     echo $OUTPUT->heading($responsetitle, 4);
 
-    // Print the items.
-    if (is_array($feedbackitems)) {
-        $align = right_to_left() ? 'right' : 'left';
-
-        echo $OUTPUT->box_start('feedback_items');
-        $itemnr = 0;
-        foreach ($feedbackitems as $feedbackitem) {
-            //get the values
-            $params = array('completed'=>$feedbackcompleted->id, 'item'=>$feedbackitem->id);
-            $value = $DB->get_record('feedback_value', $params);
-            echo $OUTPUT->box_start('feedback_item_box_'.$align);
-            if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
-                $itemnr++;
-                echo $OUTPUT->box_start('feedback_item_number_'.$align);
-                echo $itemnr;
-                echo $OUTPUT->box_end();
-            }
-
-            if ($feedbackitem->typ != 'pagebreak') {
-                echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
-                if (isset($value->value)) {
-                    feedback_print_item_show_value($feedbackitem, $value->value);
-                } else {
-                    feedback_print_item_show_value($feedbackitem, false);
-                }
-                echo $OUTPUT->box_end();
-            }
-            echo $OUTPUT->box_end();
-        }
-        echo $OUTPUT->box_end();
-    }
+    $form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_VIEW_RESPONSE,
+            $feedbackstructure, 'feedback_viewresponse_form');
+    $form->display();
 
-    // Show navigation to previous/next reponse.
     if ($userid) {
         $responsestable = new mod_feedback_responses_table($cm);
     } else {
         $responsestable = new mod_feedback_responses_anon_table($cm);
     }
-    list($prevresponseurl, $returnurl, $nextresponseurl) = $responsestable->get_reponse_navigation_links($feedbackcompleted);
+    list($prevresponseurl, $returnurl, $nextresponseurl) = $responsestable->get_reponse_navigation_links($completedrecord);
 
     echo html_writer::start_div('response_navigation');
     echo $prevresponseurl ? html_writer::link($prevresponseurl, get_string('prev'), ['class' => 'prev_response']) : '';
     echo html_writer::link($returnurl, get_string('back'), ['class' => 'back_to_list']);
     echo $nextresponseurl ? html_writer::link($nextresponseurl, get_string('next'), ['class' => 'next_response']) : '';
     echo html_writer::end_div();
-}
+} else {
+    // Print the list of responses.
 
-// Print confirmation form to delete a response.
-if ($deleteid) {
-    $continueurl = new moodle_url($baseurl, array('delete' => $deleteid, 'confirm' => 1, 'sesskey' => sesskey()));
-    echo $OUTPUT->confirm(get_string('confirmdeleteentry', 'feedback'), $continueurl, $baseurl);
-}
+    // Show non-anonymous responses (always retrieve them even if current feedback is anonymous).
+    $responsestable = new mod_feedback_responses_table($cm);
+    $totalrows = $responsestable->get_total_responses_count();
+    if (!$feedbackstructure->is_anonymous() || $totalrows) {
+        echo $OUTPUT->heading(get_string('non_anonymous_entries', 'feedback', $totalrows), 4);
+        $responsestable->display();
+    }
 
-/// Finish the page
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
+    // Show anonymous responses (always retrieve them even if current feedback is not anonymous).
+    $feedbackstructure->shuffle_anonym_responses();
+    $anonresponsestable = new mod_feedback_responses_anon_table($cm);
+    $totalrows = $anonresponsestable->get_total_responses_count();
+    if ($feedbackstructure->is_anonymous() || $totalrows) {
+        echo $OUTPUT->heading(get_string('anonymous_entries', 'feedback', $totalrows), 4);
+        $anonresponsestable->display();
+    }
+
+}
 
+// Finish the page.
 echo $OUTPUT->footer();
 
index c2175f5..a13708f 100644 (file)
 /* styles using by feedback */
-.feedback_switchrequired img{
+.path-mod-feedback span.feedback_info {
+    font-weight:bold;
 }
 
-span.feedback_info {
-    font-weight:bold;
+.path-mod-feedback div.feedback_is_dependent {
+    background:#DDDDDD;
 }
-div.feedback_item_box_left, div.feedback_item_box_right {
+
+.path-mod-feedback span.feedback_depend {
+    color:#ff0000;
 }
 
-div.feedback_item_box_left div.feedback_item_label_left, div.feedback_item_box_left div.feedback_item_presentation_left {
-    margin-left: 15px;
+.path-mod-feedback hr.feedback_pagebreak {
+    height:4px;
+    color:#aaaaaa;
+    background-color:#aaaaaa;
+    border: 0;
+    margin: 0;
 }
 
-div.feedback_item_box_right div.feedback_item_label_right, div.feedback_item_box_right div.feedback_item_presentation_right {
-    margin-right: 15px;
+.path-mod-feedback .drag_target_active {
+    opacity: .25;
 }
 
-div.feedback_depend {
-    background:#DDDDDD;
+.path-mod-feedback .drag_item_active {
+    opacity: .5;
 }
 
-div.feedback_complete_depend {
-    background:#EEEEEE;
+.path-mod-feedback .feedback_bar_image {
+    height: 10px;
 }
 
-span.feedback_depend {
-    color:#ff0000;
+.path-mod-feedback #analysis-form label { display: inline; }
+
+.path-mod-feedback .mform.feedback_form .fitem .fitemtitle {
+    display: block;
+    margin-top: 4px;
+    margin-bottom: 4px;
+    text-align: left;
+    width: 100%;
 }
 
-div.feedback_item_number_left, div.feedback_item_left {
-    float:left;
+.path-mod-feedback .mform.feedback_form .fitem .felement {
+    margin-left: 0;
+    width: 100%;
+    float: left;
+    padding-left: 0;
+    padding-right: 0;
 }
-div.feedback_item_number_right, div.feedback_item_right {
-    float:right;
+
+.path-mod-feedback .mform.feedback_form .fitem .fstatic:empty {
+    display: none;
 }
 
-div.feedback_item_commands_left {
-    float:right;
-    text-align:right;
+.path-mod-feedback .mform.feedback_form .fitem .fcheckbox > span,
+.path-mod-feedback .mform.feedback_form .fitem .fradio > span,
+.path-mod-feedback .mform.feedback_form .fitem .fgroup > span {
+    margin-top: 4px;
 }
 
-div.feedback_item_commands_right {
-    float:left;
-    text-align:left;
+body.path-mod-feedback #region-main .mform.feedback_form .femptylabel .fitemtitle {
+    display: inline-block;
+    width: auto;
+    margin-right: 0;
+}
+
+.path-mod-feedback .mform.feedback_form .femptylabel .felement {
+    display: inline-block;
+    margin-top: 4px;
+    padding-top: 5px;
+    width: auto;
 }
 
-li.feedback_item_check_h_left,
-li.feedback_item_check_h_right,
-li.feedback_item_radio_h_left,
-li.feedback_item_radio_h_right {
-    list-style-type:none;
-    display:inline;
+body.path-mod-feedback #region-main .mform.feedback_form .feedback-item-pagebreak .felement {
+    width: 100%;
 }
 
-div.feedback_item_select_h_left,
-div.feedback_item_select_h_right {
-    display:block;
+.path-mod-feedback .mform.feedback_form .fitem_fcheckbox .fitemtitle,
+.path-mod-feedback .mform.feedback_form .fitem_fcheckbox .felement {
+    display: inline-block;
+    width: auto;
 }
 
-li.feedback_item_check_v_left,
-li.feedback_item_check_v_right,
-li.feedback_item_radio_v_left,
-li.feedback_item_radio_v_right {
-    list-style-type:none;
-    display:block;
+.path-mod-feedback .mform.feedback_form .fitem_fcheckbox .felement {
+    padding: 6px;
 }
 
-div.feedback_item_select_v_left,
-div.feedback_item_select_v_right {
-    display:block;
+body.dir-rtl.path-mod-feedback #region-main .mform.feedback_form .femptylabel .fitemtitle {
+    margin-right: 0px;
+    margin-left: 0;
 }
 
-div.feedback_items label{
-    display: inline;
+.dir-rtl.path-mod-feedback .mform.feedback_form .fitem .fitemtitle {
+    text-align: right;
 }
 
-div.feedback_item_captcha_text_left,
-div.feedback_item_captcha_img_left {
-    display:inline;
-    margin: 5px;
+.dir-rtl.path-mod-feedback .mform.feedback_form .fitem .felement {
+    margin-right: 0;
+    float: right;
+    padding-right: 0;
+    padding-left: 0;
 }
-div.feedback_item_captcha_text_right,
-div.feedback_item_captcha_img_right {
-    display:inline;
-    margin: 5px;
+
+.dir-rtl.path-mod-feedback .mform.feedback_form .fitem_fcheckbox .felement {
+    float: right;
 }
 
-hr.feedback_pagebreak {
-    height:8px;
-    color:#aaaaaa;
-    background-color:#aaaaaa;
-    border:0px;
+.path-mod-feedback .mform.feedback_form#feedback_viewresponse_form .fitem.feedback_hasvalue:not(.feedback-item-captcha) .felement {
+    background: #FBFBF1;
+    min-height: 1em;
+    box-sizing: border-box;
+    padding: 3px;
+    border: 1px solid #ddd
 }
 
-.drag_target_active {
-        opacity: .25;
+.path-mod-feedback .mform.feedback_form .fitem.feedback_hasvalue .fstatic:empty {
+    display: inherit;
 }
 
-.drag_item_active {
-        opacity: .5;
+.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem:hover {
+    background: #f5f5f5;
 }
 
-ul#feedback_draglist {
-        list-style: none;
-        padding: 0;
-        margin: 0;
+.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle label {
+    width: 100%;
 }
 
-div#feedback_dragarea {
-    width:95%;
+.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle .itemtitle {
+    position: relative;
+    width: 100%;
 }
 
-div img.feedback_bar_image {
-    height: 10px;
+.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle .itemtitle .itemdd,
+.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle .itemtitle .itemname {
+    float: left;
 }
 
-.path-mod-feedback input,
-.path-mod-feedback textarea,
-.path-mod-feedback .uneditable-input {
-    width: auto;
+.path-mod-feedback .mform.feedback_form#feedback_edit_form .fitem .fitemtitle .itemtitle .itemactions {
+    float: right;
 }
 
-.path-mod-feedback #analysis-form label { display: inline; }
+.path-mod-feedback table.analysis {
+    width: 100%;
+}
 
 .path-mod-feedback .templateslist td.cell.action,
 .path-mod-feedback .templateslist th.header.action {
     width: 10%;
 }
 
+.path-mod-feedback #showentrytable td.cell.completed_timemodified,
+.path-mod-feedback #showentryanontable td.cell.random_response {
+    font-weight: bold;
+}
+
+.path-mod-feedback #showentrytable td.cell.userpic,
+.path-mod-feedback #showentrytable td.cell.deleteentry,
+.path-mod-feedback #showentryanontable td.cell.deleteentry {
+    width: 10px;
+}
+
 /* Responses navigation */
 .path-mod-feedback .response_navigation {
     margin: .5em 0;
index c699ac8..6d7d16c 100644 (file)
@@ -86,7 +86,7 @@ Feature: Testing multichoice questions in feedback
     And I should not see "this is the third page of the feedback"
     And I press "Next page"
     # We are still on the second page because the field is required
-    And I should see "Saving failed because missing or false values" in the ".error" "css_element"
+    And I should see "Required" in the ".error" "css_element"
     And I should see "this is the second page of the feedback"
     And I set the field "option e" to "1"
     And the following fields match these values:
@@ -155,7 +155,7 @@ Feature: Testing multichoice questions in feedback
     And I should see "1 (100.00 %)" in the "option i:" "table_row"
     # Change the settings so we don't analyse empty submits
     And I follow "Edit questions"
-    And I click on "Edit question" "link" in the "//li[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
+    And I click on "Edit question" "link" in the "//div[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
     And I set the field "Do not analyse empty submits" to "Yes"
     And I press "Save changes to question"
     And I follow "Analysis"
@@ -164,6 +164,7 @@ Feature: Testing multichoice questions in feedback
     And I should not see "%" in the "option c:" "table_row"
     And I log out
 
+  @javascript
   Scenario: Non-rated multiple-answers multiple choice questions in feedback
     # Create a feedback with three pages, required and dependent questions.
     When I add a "Multiple choice" question to the feedback with:
@@ -223,7 +224,7 @@ Feature: Testing multichoice questions in feedback
     And I should not see "this is the third page of the feedback"
     And I press "Next page"
     # We are still on the second page because the field is required
-    And I should see "Saving failed because missing or false values" in the ".error" "css_element"
+    And I should see "Required" in the ".error" "css_element"
     And I should see "this is the second page of the feedback"
     And I set the field "option e" to "1"
     And I set the field "option f" to "1"
@@ -293,7 +294,7 @@ Feature: Testing multichoice questions in feedback
     And I should see "1 (100.00 %)" in the "option i:" "table_row"
     # Change the settings so we don't analyse empty submits
     And I follow "Edit questions"
-    And I click on "Edit question" "link" in the "//li[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
+    And I click on "Edit question" "link" in the "//div[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
     And I set the field "Do not analyse empty submits" to "Yes"
     And I press "Save changes to question"
     And I follow "Analysis"
@@ -353,7 +354,7 @@ Feature: Testing multichoice questions in feedback
     And I should not see "this is the third page of the feedback"
     And I press "Next page"
     # We are still on the second page because the field is required
-    And I should see "Saving failed because missing or false values" in the ".error" "css_element"
+    And I should see "Required" in the ".error" "css_element"
     And I should see "this is the second page of the feedback"
     And I set the field "this is a multiple choice 2" to "option e"
     And I press "Next page"
@@ -410,7 +411,7 @@ Feature: Testing multichoice questions in feedback
     And I should see "1 (100.00 %)" in the "option i:" "table_row"
     # Change the settings so we don't analyse empty submits
     And I follow "Edit questions"
-    And I click on "Edit question" "link" in the "//li[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
+    And I click on "Edit question" "link" in the "//div[contains(@class, 'feedback_itemlist') and contains(.,'multichoice1')]" "xpath_element"
     And I set the field "Do not analyse empty submits" to "Yes"
     And I press "Save changes to question"
     And I follow "Analysis"
index 13ee16c..4e8235f 100644 (file)
@@ -116,10 +116,10 @@ Feature: Test creating different types of feedback questions
     And I should not see "%" in the "option g:" "table_row"
     And I should see "1 (50.00 %)" in the "option h:" "table_row"
     And I should see "1 (50.00 %)" in the "option i:" "table_row"
-    And I should see "0" in the "option k (0):" "table_row"
-    And I should not see "%" in the "option k (0):" "table_row"
-    And I should see "1 (50.00 %)" in the "option l (1):" "table_row"
-    And I should see "1 (50.00 %)" in the "option m (5):" "table_row"
+    And I should see "0" in the "(0) option k" "table_row"
+    And I should not see "%" in the "(0) option k" "table_row"
+    And I should see "1 (50.00 %)" in the "(1) option l" "table_row"
+    And I should see "1 (50.00 %)" in the "(5) option m:" "table_row"
     And I should see "Average: 3.00" in the "(multichoice4)" "table"
     And I should see "35" in the "(numeric)" "table"
     And I should see "71" in the "(numeric)" "table"
index 8413388..a7dcf4c 100644 (file)
@@ -218,7 +218,7 @@ class mod_feedback_events_testcase extends advanced_testcase {
 
         // Save the feedback.
         $sink = $this->redirectEvents();
-        $id = feedback_save_tmp_values($completed, false, $USER->id);
+        $id = feedback_save_tmp_values($completed, false);
         $events = $sink->get_events();
         $event = array_pop($events); // Response submitted feedback event.
         $sink->close();
@@ -257,14 +257,14 @@ class mod_feedback_events_testcase extends advanced_testcase {
 
         // Save the feedback.
         $sink = $this->redirectEvents();
-        feedback_save_tmp_values($completed, false, $USER->id);
+        feedback_save_tmp_values($completed, false);
         $events = $sink->get_events();
         $event = array_pop($events); // Response submitted feedback event.
         $sink->close();
 
         // Test legacy data.
         $arr = array($this->eventcourse->id, 'feedback', 'submit', 'view.php?id=' . $this->eventcm->id, $this->eventfeedback->id,
-                     $this->eventcm->id, $USER->id);
+                     $this->eventcm->id, $this->eventuser->id);
         $this->assertEventLegacyLogData($arr, $event);
 
         // Test can_view().
index b9826d9..c8522d1 100644 (file)
@@ -1,6 +1,30 @@
 === 3.1 ===
 
 * feedback_get_courses_from_sitecourse_map() now returns course id as 'id' attribute
+* Base class for feedback items - feedback_item_base - has been significantly changed, all item types now
+  must implement method complete_form_element() instead of print_item_preview(), print_item_complete(),
+  print_item_show_value(), check_values(), clean_input_value() and value_is_array(). Rendering the items
+  on complete form, feedback preview, feedback edit and when viewing response is done using moodleform.
+* The following functions have been deprecated:
+  * feedback_print_item_preview()
+  * feedback_print_item_complete()
+  * feedback_print_item_show_value
+  * feedback_check_values()
+  * feedback_clean_input_value()
+  * feedback_get_context()
+  * feedback_create_item()
+  * feedback_set_tmp_values()
+  * feedback_delete_completedtmp()
+  * feedback_get_page_to_continue()
+  * feedback_save_values()
+  * feedback_save_guest_values()
+  * feedback_create_values()
+  * feedback_update_values()
+  * feedback_get_current_completed()
+  * feedback_is_course_in_sitecourse_map()
+  * feedback_is_feedback_in_sitecourse_map()
+  * feedback_clean_up_sitecourse_map()
+  * feedback_print_numeric_option_list()
 
 === 2.7 ===
 
index 08dab5f..3fb38f8 100644 (file)
@@ -42,6 +42,7 @@ $context = context_module::instance($cm->id);
 require_login($course, true, $cm);
 
 $feedback = $PAGE->activityrecord;
+$feedbackstructure = new mod_feedback_structure($feedback, $cm, 0, $templateid);
 
 require_capability('mod/feedback:edititems', $context);
 
@@ -75,40 +76,9 @@ echo $OUTPUT->heading(get_string('confirmusetemplate', 'feedback'), 4);
 
 $mform->display();
 
-$templateitems = $DB->get_records('feedback_item', array('template'=>$templateid), 'position');
-if (is_array($templateitems)) {
-    $templateitems = array_values($templateitems);
-}
-
-if (is_array($templateitems)) {
-    $itemnr = 0;
-    $align = right_to_left() ? 'right' : 'left';
-    echo $OUTPUT->box_start('feedback_items');
-    foreach ($templateitems as $templateitem) {
-        echo $OUTPUT->box_start('feedback_item_box_'.$align);
-        if ($templateitem->hasvalue == 1 AND $feedback->autonumbering) {
-            $itemnr++;
-            echo $OUTPUT->box_start('feedback_item_number_'.$align);
-            echo $itemnr;
-            echo $OUTPUT->box_end();
-        }
-        echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
-        if ($templateitem->typ != 'pagebreak') {
-            // echo '<div class="feedback_item_'.$align.'">';
-            feedback_print_item_preview($templateitem);
-        } else {
-            echo $OUTPUT->box_start('feedback_pagebreak');
-            echo get_string('pagebreak', 'feedback').'<hr class="feedback_pagebreak" />';
-            echo $OUTPUT->box_end();
-        }
-        echo $OUTPUT->box_end();
-        echo $OUTPUT->box_end();
-    }
-    echo $OUTPUT->box_end();
-} else {
-    echo $OUTPUT->box(get_string('no_items_available_at_this_template', 'feedback'),
-                    'generalbox boxaligncenter boxwidthwide');
-}
+$form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_VIEW_TEMPLATE,
+        $feedbackstructure, 'feedback_preview_form', ['templateid' => $templateid]);
+$form->display();
 
 echo $OUTPUT->footer();
 
index 69ecb9e..5785cf0 100644 (file)
  * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
  * @package mod_feedback
  */
-require_once("../../config.php");
-require_once("lib.php");
+require_once(__DIR__ . '/../../config.php');
+require_once($CFG->dirroot . '/mod/feedback/lib.php');
 
 $id = required_param('id', PARAM_INT);
 $courseid = optional_param('courseid', false, PARAM_INT);
 
 $current_tab = 'view';
 
-if (! $cm = get_coursemodule_from_id('feedback', $id)) {
-    print_error('invalidcoursemodule');
-}
-
-if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
-    print_error('coursemisconf');
-}
+list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
+require_course_login($course, true, $cm);
+$feedback = $PAGE->activityrecord;
 
-if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
-    print_error('invalidcoursemodule');
-}
+$feedbackcompletion = new mod_feedback_completion($feedback, $cm, $courseid);
 
 $context = context_module::instance($cm->id);
 
-$feedback_complete_cap = false;
-
-if (has_capability('mod/feedback:complete', $context)) {
-    $feedback_complete_cap = true;
-}
-
-if (!empty($CFG->feedback_allowfullanonymous)
-            AND $course->id == SITEID
-            AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES
-            AND (!isloggedin() OR isguestuser())) {
-    // Guests are allowed to complete fully anonymous feedback without having 'mod/feedback:complete' capability.
-    $feedback_complete_cap = true;
-}
-
-//check whether the feedback is located and! started from the mainsite
-if ($course->id == SITEID AND !$courseid) {
-    $courseid = SITEID;
-}
-
-require_course_login($course, true, $cm);
-
 if ($course->id == SITEID) {
-    $PAGE->set_context($context);
-    $PAGE->set_cm($cm, $course);
     $PAGE->set_pagelayout('incourse');
 }
 $PAGE->set_url('/mod/feedback/view.php', array('id' => $cm->id));
 $PAGE->set_title($feedback->name);
 $PAGE->set_heading($course->fullname);
 
-// Check whether the feedback is mapped to the given courseid.
-if ($course->id == SITEID AND !has_capability('mod/feedback:edititems', $context)) {
-    if ($DB->get_records('feedback_sitecourse_map', array('feedbackid' => $feedback->id))) {
-        $params = array('feedbackid' => $feedback->id, 'courseid' => $courseid);
-        if (!$DB->get_record('feedback_sitecourse_map', $params)) {
-            if ($courseid == SITEID) {
-                echo $OUTPUT->header();
-                echo $OUTPUT->notification(get_string('cannotaccess', 'mod_feedback'));
-                echo $OUTPUT->footer();
-                exit;
-            } else {
-                print_error('invalidcoursemodule');
-            }
-        }
-    }
+// Check access to the given courseid.
+if ($courseid AND $courseid != SITEID) {
+    require_course_login(get_course($courseid)); // This overwrites the object $COURSE .
 }
 
-//check whether the given courseid exists
-if ($courseid AND $courseid != SITEID) {
-    if ($course2 = $DB->get_record('course', array('id'=>$courseid))) {
-        require_course_login($course2); //this overwrites the object $course :-(
-        $course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround
-    } else {
-        print_error('invalidcourseid');
-    }
+// Check whether the feedback is mapped to the given courseid.
+if (!has_capability('mod/feedback:edititems', $context) &&
+        !$feedbackcompletion->check_course_is_mapped()) {
+    echo $OUTPUT->header();
+    echo $OUTPUT->notification(get_string('cannotaccess', 'mod_feedback'));
+    echo $OUTPUT->footer();
+    exit;
 }
 
 // Trigger module viewed event.
-$event = \mod_feedback\event\course_module_viewed::create(array(
-    'objectid' => $feedback->id,
-    'context' => $context,
-    'anonymous' => ($feedback->anonymous == FEEDBACK_ANONYMOUS_YES),
-    'other' => array(
-        'anonymous' => $feedback->anonymous // Deprecated.
-    )
-));
-$event->add_record_snapshot('course_modules', $cm);
-$event->add_record_snapshot('course', $course);
-$event->add_record_snapshot('feedback', $feedback);
+$event = \mod_feedback\event\course_module_viewed::create_from_record($feedback, $cm, $course);
 $event->trigger();
 
 /// Print the page header
-$strfeedbacks = get_string("modulenameplural", "feedback");
-$strfeedback  = get_string("modulename", "feedback");
 echo $OUTPUT->header();
 
 /// Print the main part of the page
@@ -164,7 +110,7 @@ if (has_capability('mod/feedback:edititems', $context)) {
     echo $OUTPUT->box_end();
 
     $params = array('feedback'=>$feedback->id, 'hasvalue'=>1);
-    $itemscount = $DB->count_records('feedback_item', $params);
+    $itemscount = count($feedbackcompletion->get_items(true));
     echo $OUTPUT->box_start('feedback_info');
     echo '<span class="feedback_info">';
     echo get_string('questions', 'feedback').': ';
@@ -195,36 +141,21 @@ if (has_capability('mod/feedback:edititems', $context)) {
         echo $OUTPUT->box_end();
     }
     echo $OUTPUT->box_end();
-}
-
-if (has_capability('mod/feedback:edititems', $context)) {
-    require_once($CFG->libdir . '/filelib.php');
 
-    $page_after_submit_output = file_rewrite_pluginfile_urls($feedback->page_after_submit,
-                                                            'pluginfile.php',
-                                                            $context->id,
-                                                            'mod_feedback',
-                                                            'page_after_submit',
-                                                            0);
-
-    echo $OUTPUT->heading(get_string("page_after_submit", "feedback"), 3);
-    echo $OUTPUT->box_start('generalbox feedback_after_submit');
-    echo format_text($page_after_submit_output,
-                     $feedback->page_after_submitformat,
-                     array('overflowdiv'=>true));
-
-    echo $OUTPUT->box_end();
+    if ($pageaftersubmit = $feedbackcompletion->page_after_submit()) {
+        echo $OUTPUT->heading(get_string("page_after_submit", "feedback"), 3);
+        echo $OUTPUT->box($pageaftersubmit, 'generalbox feedback_after_submit');
+    }
 }
 
 if (!has_capability('mod/feedback:viewreports', $context) &&
-        feedback_can_view_analysis($feedback, $context, $courseid)) {
+        $feedbackcompletion->can_view_analysis()) {
     $analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id' => $id));
     echo '<div class="mdl-align"><a href="'.$analysisurl->out().'">';
     echo get_string('completed_feedbacks', 'feedback').'</a>';
     echo '</div>';
 }
 
-//####### mapcourse-start
 if (has_capability('mod/feedback:mapcourse', $context) && $feedback->course == SITEID) {
     echo $OUTPUT->box_start('generalbox feedback_mapped_courses');
     echo $OUTPUT->heading(get_string("mappedcourses", "feedback"), 3);
@@ -233,65 +164,31 @@ if (has_capability('mod/feedback:mapcourse', $context) && $feedback->course == S
     echo '<p class="mdl-align">' . html_writer::link($mapurl, get_string('mapcourses', 'feedback')) . '</p>';
     echo $OUTPUT->box_end();
 }
-//####### mapcourse-end
-
-//####### completed-start
-if ($feedback_complete_cap) {
-    echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
-    //check, whether the feedback is open (timeopen, timeclose)
-    $checktime = time();
-    if (($feedback->timeopen > $checktime) OR
-            ($feedback->timeclose < $checktime AND $feedback->timeclose > 0)) {
 
+if ($feedbackcompletion->can_complete()) {
+    echo $OUTPUT->box_start('generalbox boxaligncenter');
+    if (!$feedbackcompletion->is_open()) {
+        // Feedback is not yet open or is already closed.
         echo $OUTPUT->notification(get_string('feedback_is_not_open', 'feedback'));
-        echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
-        echo $OUTPUT->box_end();
-        echo $OUTPUT->footer();
-        exit;
-    }
-
-    //check multiple Submit
-    $feedback_can_submit = true;
-    if ($feedback->multiple_submit == 0 ) {
-        if (feedback_is_already_submitted($feedback->id, $courseid)) {
-            $feedback_can_submit = false;
-        }
-    }
-    if ($feedback_can_submit) {
-        //if the user is not known so we cannot save the values temporarly
-        if (!isloggedin() or isguestuser()) {
-            $guestid = sesskey();
-        } else {
-            $guestid = false;
-        }
-        $url_params = array('id'=>$id, 'courseid'=>$courseid, 'gopage'=>0);
-        $completeurl = new moodle_url('/mod/feedback/complete.php', $url_params);
-
-        $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid, $guestid);
-        if ($feedbackcompletedtmp) {
-            if ($startpage = feedback_get_page_to_continue($feedback->id, $courseid, $guestid)) {
-                $completeurl->param('gopage', $startpage);
-            }
-            echo '<a href="'.$completeurl->out().'">'.get_string('continue_the_form', 'feedback').'</a>';
+        echo $OUTPUT->continue_button(course_get_url($courseid ?: $course->id));
+    } else if ($feedbackcompletion->can_submit()) {
+        // Display a link to complete feedback or resume.
+        $completeurl = new moodle_url('/mod/feedback/complete.php',
+                ['id' => $id, 'courseid' => $courseid]);
+        if ($startpage = $feedbackcompletion->get_resume_page()) {
+            $completeurl->param('gopage', $startpage);
+            $label = get_string('continue_the_form', 'feedback');
         } else {
-            echo '<a href="'.$completeurl->out().'">'.get_string('complete_the_form', 'feedback').'</a>';
+            $label = get_string('complete_the_form', 'feedback');
         }
+        echo html_writer::div(html_writer::link($completeurl, $label), 'complete-feedback');
     } else {
+        // Feedback was already submitted.
         echo $OUTPUT->notification(get_string('this_feedback_is_already_submitted', 'feedback'));
-        if ($courseid) {
-            echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$courseid);
-        } else {
-            echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
-        }
+        $OUTPUT->continue_button(course_get_url($courseid ?: $course->id));
     }
     echo $OUTPUT->box_end();
 }
-//####### completed-end
-
-/// Finish the page
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
 
 echo $OUTPUT->footer();
 
index eee52ac..7ade1ea 100644 (file)
@@ -1,13 +1,10 @@
 YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
     var DRAGDROPNAME = 'mod_feedback_dragdrop';
     var CSS = {
-        OLDMOVE : 'span.feedback_item_command_move',
-        OLDMOVEUP : 'span.feedback_item_command_moveup',
-        OLDMOVEDOWN : 'span.feedback_item_command_movedown',
         DRAGAREA : '#feedback_dragarea',
-        DRAGITEM : 'li.feedback_itemlist',
-        DRAGLIST : '#feedback_dragarea ul#feedback_draglist',
-        POSITIONLABEL : '.feedback_item_commands.position',
+        DRAGITEMCLASS : 'feedback_itemlist',
+        DRAGITEM : 'div.feedback_itemlist',
+        DRAGLIST : '#feedback_dragarea form > fieldset > div',
         ITEMBOX : '#feedback_item_box_',
         DRAGHANDLE : 'itemhandle'
     };
@@ -31,9 +28,9 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
             //Get the list of li's in the lists and add the drag handle.
             basenode = Y.Node.one(CSS.DRAGLIST);
             listitems = basenode.all(CSS.DRAGITEM).each(function(v) {
-                item_id = this.get_node_id(v.get('id')); //Get the id of the feedback item.
-                item_box = Y.Node.one(CSS.ITEMBOX + item_id); //Get the current item box so we can add the drag handle.
-                v.insert(this.mydraghandle.cloneNode(true), item_box); //Insert the new handle into the item box.
+                var item_id = this.get_node_id(v.get('id')); //Get the id of the feedback item.
+                var item_box = Y.Node.one(CSS.ITEMBOX + item_id); //Get the current item box so we can add the drag handle.
+                item_box.append(this.mydraghandle.cloneNode(true)); // Insert the new handle into the item box.
             }, this);
 
             //We use a delegate to make all items draggable
@@ -72,11 +69,6 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
             //Listen for all drag:dropmiss events
             del.on('drag:dropmiss',  this.drag_dropmiss_handler, this);
 
-            // Remove all legacy move icons.
-            Y.all(CSS.OLDMOVEUP).remove();
-            Y.all(CSS.OLDMOVEDOWN).remove();
-            Y.all(CSS.OLDMOVE).remove();
-
             //Create targets for drop.
             var droparea = Y.Node.one(CSS.DRAGLIST);
             var tar = new Y.DD.Drop({
@@ -98,7 +90,7 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
                 drop = e.drop.get('node');
 
             //Are we dropping on an li node?
-            if (drop.get('tagName').toLowerCase() === 'li') {
+            if (drop.hasClass(CSS.DRAGITEMCLASS)) {
                 //Are we not going up?
                 if (!this.goingUp) {
                     drop = drop.get('nextSibling');
@@ -173,19 +165,13 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
             var drop = e.drop.get('node'),
                 drag = e.drag.get('node');
             dragnode = Y.one(drag);
-            //If we are not on an li, we must have been dropped on a ul.
-            if (drop.get('tagName').toLowerCase() !== 'li') {
+            if (!drop.hasClass(CSS.DRAGITEMCLASS)) {
                 if (!drop.contains(drag)) {
                     drop.appendChild(drag);
                 }
                 myElements = '';
-                counter = 1;
-                drop.get('children').each(function(v) {
-                    poslabeltext = '(' + M.util.get_string('position', 'feedback') + ':' + counter + ')';
-                    poslabel = v.one(CSS.POSITIONLABEL);
-                    poslabel.setHTML(poslabeltext);
+                drop.all(CSS.DRAGITEM).each(function(v) {
                     myElements = myElements + ',' + this.get_node_id(v.get('id'));
-                    counter++;
                 }, this);
                 var spinner = M.util.add_spinner(Y, dragnode);
                 this.save_item_order(this.cmid, myElements, spinner);
@@ -245,7 +231,7 @@ YUI.add('moodle-mod_feedback-dragdrop', function(Y) {
          * @return int
          */
         get_node_id : function(id) {
-            return Number(id.replace(/feedback_item_/i, ''));
+            return Number(id.replace(/^.*feedback_item_/i, ''));
         }
 
     }, {
index a72603a..253ec34 100644 (file)
@@ -73,10 +73,6 @@ select {
     }
 }
 
-.path-mod-feedback .feedback_bar_image {
-    height: 5px; // we should remove the bar height specification in core
-}
-
 .forumpost {
     .well;
     padding: 6px;
index 2863017..a7de951 100644 (file)
@@ -6,4 +6,4 @@
  * http://www.apache.org/licenses/LICENSE-2.0
  *
  * Designed and built with all the love in the world by @mdo and @fat.
- */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}.img-responsive{max-width:100%;width:auto\9;height:auto;-ms-interpolation-mode:bicubic}img{vertical-align:middle;border:0}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#0070a8;text-decoration:none}a:hover,a:focus{color:#003d5c;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:"";line-height:0}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.12765957%;*margin-left:2.07446809%}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.12765957%}.row-fluid .span12{width:100%;*width:99.94680851%}.row-fluid .span11{width:91.4893617%;*width:91.43617021%}.row-fluid .span10{width:82.9787234%;*width:82.92553191%}.row-fluid .span9{width:74.46808511%;*width:74.41489362%}.row-fluid .span8{width:65.95744681%;*width:65.90425532%}.row-fluid .span7{width:57.44680851%;*width:57.39361702%}.row-fluid .span6{width:48.93617021%;*width:48.88297872%}.row-fluid .span5{width:40.42553191%;*width:40.37234043%}.row-fluid .span4{width:31.91489362%;*width:31.86170213%}.row-fluid .span3{width:23.40425532%;*width:23.35106383%}.row-fluid .span2{width:14.89361702%;*width:14.84042553%}.row-fluid .span1{width:6.38297872%;*width:6.32978723%}.row-fluid .offset12{margin-left:104.25531915%;*margin-left:104.14893617%}.row-fluid .offset12:first-child{margin-left:102.12765957%;*margin-left:102.0212766%}.row-fluid .offset11{margin-left:95.74468085%;*margin-left:95.63829787%}.row-fluid .offset11:first-child{margin-left:93.61702128%;*margin-left:93.5106383%}.row-fluid .offset10{margin-left:87.23404255%;*margin-left:87.12765957%}.row-fluid .offset10:first-child{margin-left:85.10638298%;*margin-left:85%}.row-fluid .offset9{margin-left:78.72340426%;*margin-left:78.61702128%}.row-fluid .offset9:first-child{margin-left:76.59574468%;*margin-left:76.4893617%}.row-fluid .offset8{margin-left:70.21276596%;*margin-left:70.10638298%}.row-fluid .offset8:first-child{margin-left:68.08510638%;*margin-left:67.9787234%}.row-fluid .offset7{margin-left:61.70212766%;*margin-left:61.59574468%}.row-fluid .offset7:first-child{margin-left:59.57446809%;*margin-left:59.46808511%}.row-fluid .offset6{margin-left:53.19148936%;*margin-left:53.08510638%}.row-fluid .offset6:first-child{margin-left:51.06382979%;*margin-left:50.95744681%}.row-fluid .offset5{margin-left:44.68085106%;*margin-left:44.57446809%}.row-fluid .offset5:first-child{margin-left:42.55319149%;*margin-left:42.44680851%}.row-fluid .offset4{margin-left:36.17021277%;*margin-left:36.06382979%}.row-fluid .offset4:first-child{margin-left:34.04255319%;*margin-left:33.93617021%}.row-fluid .offset3{margin-left:27.65957447%;*margin-left:27.55319149%}.row-fluid .offset3:first-child{margin-left:25.53191489%;*margin-left:25.42553191%}.row-fluid .offset2{margin-left:19.14893617%;*margin-left:19.04255319%}.row-fluid .offset2:first-child{margin-left:17.0212766%;*margin-left:16.91489362%}.row-fluid .offset1{margin-left:10.63829787%;*margin-left:10.53191489%}.row-fluid .offset1:first-child{margin-left:8.5106383%;*margin-left:8.40425532%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;*zoom:1;padding-left:5px;padding-right:5px}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:180px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:200px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;border:1px solid #ccc;background-color:#fff}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#8a6d3b}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#8a6d3b}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:180px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:200px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:200px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:200px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("[[pix:theme|glyphicons-halflings]]");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("[[pix:theme|glyphicons-halflings-white]]")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{background-position:-216px -120px;width:16px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px;width:16px}.icon-folder-open{background-position:-408px -120px;width:16px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#00699e;background-image:-moz-linear-gradient(top, #0070a8, #005f8f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0070a8), to(#005f8f));background-image:-webkit-linear-gradient(top, #0070a8, #005f8f);background-image:-o-linear-gradient(top, #0070a8, #005f8f);background-image:linear-gradient(to bottom, #0070a8, #005f8f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0070a8', endColorstr='#ff005f8f', GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#00699e;background-image:-moz-linear-gradient(top, #0070a8, #005f8f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0070a8), to(#005f8f));background-image:-webkit-linear-gradient(top, #0070a8, #005f8f);background-image:-o-linear-gradient(top, #0070a8, #005f8f);background-image:linear-gradient(to bottom, #0070a8, #005f8f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0070a8', endColorstr='#ff005f8f', GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #fff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #fff, #e6e6e6);background-image:-o-linear-gradient(top, #fff, #e6e6e6);background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#005aa8;background-image:-moz-linear-gradient(top, #0070a8, #0038a8);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0070a8), to(#0038a8));background-image:-webkit-linear-gradient(top, #0070a8, #0038a8);background-image:-o-linear-gradient(top, #0070a8, #0038a8);background-image:linear-gradient(to bottom, #0070a8, #0038a8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0070a8', endColorstr='#ff0038a8', GradientType=0);border-color:#0038a8 #0038a8 #001e5c;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#0038a8;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#0038a8;*background-color:#002f8f}.btn-primary:active,.btn-primary.active{background-color:#002775 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444, #222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444), to(#222));background-image:-webkit-linear-gradient(top, #444, #222);background-image:-o-linear-gradient(top, #444, #222);background-image:linear-gradient(to bottom, #444, #222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{border-color:transparent;cursor:pointer;color:#0070a8;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#003d5c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px}.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#0038a8}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#8a6d3b}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success h4{color:#468847}.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-left:0;margin-bottom:20px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#0070a8}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#0070a8}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{border-top-color:#0070a8;border-bottom-color:#0070a8;margin-top:6px}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#003d5c;border-bottom-color:#003d5c}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default}.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2}.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065);*zoom:1}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #ffffff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #ffffff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333;text-decoration:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e5e5e5;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #fff;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#fff}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15);outline:0}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #fff}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;background-color:transparent;cursor:default}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1}.pager:before,.pager:after{display:table;content:"";line-height:0}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:default}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;overflow-y:auto;max-height:400px;padding:15px}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#0070a8;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.progress .bar{width:0;height:100%;color:#fff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,0.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,0.15)), color-stop(.75, rgba(255,255,255,0.15)), color-stop(.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,0.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,0.15)), color-stop(.75, rgba(255,255,255,0.15)), color-stop(.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,0.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,0.15)), color-stop(.75, rgba(255,255,255,0.15)), color-stop(.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,0.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,0.15)), color-stop(.75, rgba(255,255,255,0.15)), color-stop(.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,0.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,0.15)), color-stop(.75, rgba(255,255,255,0.15)), color-stop(.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{overflow:hidden;width:100%;position:relative}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{left:auto;right:15px}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{color:#fff;line-height:20px}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}h1{font-size:32px}h2{font-size:28px}h3{font-size:24px}h4{font-size:20px}h5{font-size:16px}h6{font-size:12px}h1 small{font-size:24px}h2 small{font-size:20px}h3 small{font-size:16px}h4 small{font-size:12px}@media print{a[href]:after{content:""}}legend{border-bottom-color:#ddd;color:#333}.breadcrumb{background-color:#f5f5f5}.well{border-color:#e3e3e3}sup{vertical-align:super}sub{vertical-align:sub}.dropdown-backdrop{position:static}li.activity.label,.file-picker td.label{background:inherit;color:inherit;border:inherit;text-shadow:none;padding:8px;white-space:normal;display:block;font-size:inherit;line-height:inherit}.file-picker td.label{display:table-cell;text-align:right}.choosercontainer #chooseform .option label{font-size:12px}li.section.hidden,.block.hidden,.block.invisible{visibility:visible;display:block}#turnitintool_style .row,.forumpost .row{margin-left:0 !important}#turnitintool_style .row:before,#turnitintool_style .row:after,.forumpost .row:before,.forumpost .row:after{content:none}fieldset.hidden{display:inherit;visibility:inherit}div.c1.btn{display:block;padding:0;margin-bottom:0;font-size:inherit;line-height:inherit;text-align:inherit;vertical-align:inherit;cursor:default;color:inherit;text-shadow:inherit;background-color:inherit;background-image:none;background-repeat:none;border:none;border-radius:none;box-shadow:none}#questionbank+.container{width:auto}img.hide{display:inherit}.icon-bar,img.icon-post,img.icon-info,img.icon-warn,img.icon-pre{background-image:none}.loginbox.twocolumns .signuppanel,.loginbox.twocolumns .signuppanel,.loginbox.twocolumns .loginpanel,.loginbox.twocolumns .loginpanel{padding:0;margin:0}.tooltip{opacity:1;filter:alpha(opacity=100);display:inline}body:not(.jsenabled) .dropdown:hover>.dropdown-menu{display:block;margin-top:-6px}body:not(.jsenabled) .langmenu:hover>.dropdown-menu,.langmenu.open>.dropdown-menu{display:block;max-height:150px;overflow-y:auto}ol{margin:0 0 10px 2.5em}.dir-rtl ol{margin:0 2.5em 10px 0}body{padding-top:60px}.block{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);border-color:#e3e3e3;padding:8px 0}.block blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.block .header h2{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase;font-size:1.1em;word-wrap:break-word;margin:0}.block .header .block_action{padding:3px 15px;float:right}.block .header .block_action>*{margin-left:3px}.block .header .block_action .block-hider-show,.block .header .block_action .block-hider-hide{cursor:pointer}.block .header .block_action .block-hider-show{display:none}.block .content{padding:4px 14px;word-wrap:break-word}.block .content h3{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase;font-size:1.1em}.block .content hr{margin:5px 0}.block .content .userpicture{width:16px;height:16px;margin-right:6px}.block .content .list li.listentry{clear:both}.block .content .list .c0{display:inline}.block .content .list .c1{margin-left:5px;display:inline}.block .footer{margin-bottom:4px;display:block;padding:3px 5px}.block.beingmoved{border-width:2px;border-style:dashed}.block.invisible .header h2{opacity:.5;filter:alpha(opacity=50)}.block.hidden .header .block_action .block-hider-hide{display:none}.block.hidden .header .block_action .block-hider-show{display:inline}.block.list_block .unlist>li>.column{display:inline-block;*display:inline;*zoom:1}.editing .block .header .commands{clear:both;text-align:right;display:block;padding:3px 15px}.editing .block .header .commands>a{margin:0 3px}.editing .block .header .commands .icon img{width:12px;height:12px}.editing .block .header .commands img.actionmenu{width:auto}.dir-rtl.editing .block .header .commands{text-align:left}.jsenabled .block.hidden .content{display:none}.blockmovetarget{border-width:2px;border-style:dashed;display:block;height:1em;margin-bottom:20px}.blockannotation{position:relative;top:-10px;margin-bottom:10px}.block_blog_menu #blogsearchquery{max-width:92%}.block_settings #adminsearchquery{max-width:92%}.block_search_forums #searchform_search{width:auto;max-width:92%}.block_calendar_upcoming .content .date{padding-left:22px}.block_calendar_upcoming .content .footer{margin-top:.5em;padding-top:10px;padding-left:0}.block_rss_client .content li{margin-bottom:10px;padding:5px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.block_rss_client .content li .link{font-weight:inherit}.block_rss_client .list li:first-child{border-top-width:1px}.block_news_items .content .newlink{padding-bottom:10px}.block_news_items .content ul li{border-top:1px rgba(0,0,0,0.05) solid;padding:2px;display:table;width:100%}.block_news_items .content ul li .info{display:table-header-group}.block_news_items .content ul li .date{font-size:11.9px;display:inline}.block_news_items .content ul li .name{font-size:11.9px;padding-left:1ex;display:inline}.block_news_items .content .footer{padding-top:10px;padding-left:0}.block_login input#login_username,.block_login input#login_password{width:95%}.block_login .content{margin-left:auto;margin-right:auto;max-width:280px}.block_login input[type="submit"]{margin:10px 0}.block_adminblock .content{display:block;padding:3px 5px}.block_adminblock select{max-width:92%}.dir-rtl .block .header{text-align:right}.dir-rtl .block .header h2{text-align:right}.dir-rtl .block .header .block_action{float:left}.dir-rtl .block .header .block_action>*{margin-left:0;margin-right:3px}.dir-rtl .block_calendar_upcoming .content .date{padding-right:22px}.dir-rtl .block_calendar_upcoming .content .footer{padding-right:0}.dir-rtl .block_news_items .content ul li .name{padding-right:1ex}.dir-rtl .block_news_items .content .footer{padding-left:0}form{margin:0}.mform fieldset .advancedbutton{text-align:right}.jsenabled .mform .containsadvancedelements .advanced{display:none}.mform .containsadvancedelements .advanced.show{display:block}.mform fieldset.group{margin-bottom:0}.mform fieldset.error{border:1px solid #b94a48}.mform span.error,#adminsettings span.error{display:inline-block;border:1px solid #eed3d7;border-radius:4px;background-color:#f2dede;padding:4px;margin-bottom:4px}.mform fieldset.collapsible legend a.fheader{padding:0 5px 0 20px;margin-left:-20px;background:url([[pix:t/expanded]]) 2px center no-repeat}.dir-rtl .mform fieldset.collapsible legend a.fheader{padding:0 20px 0 5px;margin-right:-20px;margin-left:0;background-position:right center}.mform fieldset.collapsed legend a.fheader{background-image:url([[pix:t/collapsed]])}.dir-rtl .mform fieldset.collapsed legend a.fheader{background-image:url([[pix:t/collapsed_rtl]])}.jsenabled .mform .collapsed .fcontainer{display:none}.mform .fitem .fitemtitle div{display:inline}#adminsettings .error,.loginpanel .error,.mform .error{color:#b94a48}.mform .fdescription.required{margin-left:200px}.mform .fpassword .unmask{display:inline-block;margin-left:.5em}.mform .fpassword .unmask>input{margin:0}.mform .fpassword .unmask>label{display:inline-block}.mform label{display:inline-block}.mform .iconhelp{margin-left:4px}.dir-rtl .mform .iconhelp{margin-right:4px}.mform .ftextarea #id_alltext{width:100%}.mform ul.file-list{padding:0;margin:0;list-style:none}.mform label .req,.mform label .adv{cursor:help}.mform .fcheckbox input{margin-left:0}.mform .fcheckbox>span,.mform .fradio>span,.mform .fgroup>span{display:inline-block;margin-top:5px}.mform .fitem fieldset.fgroup label,.mform fieldset.fdate_selector label{display:inline;float:none;width:auto}.mform .ftags label.accesshide{display:block;position:static}.mform .ftags select{margin-bottom:.7em;min-width:22em}.mform .helplink img{margin:0 .45em;padding:0}.mform legend .helplink img{margin:0 .2em}.singleselect label{margin-right:.3em}.dir-rtl .singleselect label{margin-left:.3em;margin-right:0}input#id_externalurl{direction:ltr}#portfolio-add-button{display:inline}.form-item,.mform .fitem{margin-bottom:20px;*zoom:1;margin-bottom:10px}.form-item:before,.mform .fitem:before,.form-item:after,.mform .fitem:after{display:table;content:"";line-height:0}.form-item:after,.mform .fitem:after{clear:both}.form-item .form-label,.mform .fitem div.fitemtitle{float:left;width:180px;padding-top:5px;text-align:right}.dir-rtl .form-item .form-label,.dir-rtl .mform .fitem div.fitemtitle{float:right;text-align:left}.form-defaultinfo,.form-label .form-shortname{color:#999}.form-label .form-shortname{font-size:10.5px;display:block}.dir-rtl .form-label .form-shortname{text-align:left}.form-item .form-setting,.form-item .form-description,.mform .fitem .felement,#page-mod-forum-search .c1{*display:inline-block;*padding-left:20px;margin-left:200px;*margin-left:0}.form-item .form-setting:first-child,.form-item .form-description:first-child,.mform .fitem .felement:first-child,#page-mod-forum-search .c1:first-child{*padding-left:200px}.formsettingheading{margin-bottom:0}.form-item .form-description,.felement.fstatic{color:#595959;display:block;margin-bottom:10px;padding-top:5px}.form-item .form-description{padding-top:0}.fitem .fstaticlabel{font-weight:bold}table#form td.submit,.form-buttons,.path-admin .buttons,#fitem_id_submitbutton,.fp-content-center form+div,div.backup-section+form,#fgroup_id_buttonar{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;padding-left:0}table#form td.submit:before,.form-buttons:before,.path-admin .buttons:before,#fitem_id_submitbutton:before,.fp-content-center form+div:before,div.backup-section+form:before,#fgroup_id_buttonar:before,table#form td.submit:after,.form-buttons:after,.path-admin .buttons:after,#fitem_id_submitbutton:after,.fp-content-center form+div:after,div.backup-section+form:after,#fgroup_id_buttonar:after{display:table;content:"";line-height:0}table#form td.submit:after,.form-buttons:after,.path-admin .buttons:after,#fitem_id_submitbutton:after,.fp-content-center form+div:after,div.backup-section+form:after,#fgroup_id_buttonar:after{clear:both}.path-admin .buttons,.form-buttons{padding-left:200px}.dir-rtl table#form td.submit,.dir-rtl .form-buttons,.dir-rtl .path-admin .buttons,.dir-rtl #fitem_id_submitbutton,.dir-rtl .fp-content-center form+div,.dir-rtl div.backup-section+form,.dir-rtl #fgroup_id_buttonar{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;padding-right:0}.dir-rtl table#form td.submit:before,.dir-rtl .form-buttons:before,.dir-rtl .path-admin .buttons:before,.dir-rtl #fitem_id_submitbutton:before,.dir-rtl .fp-content-center form+div:before,.dir-rtl div.backup-section+form:before,.dir-rtl #fgroup_id_buttonar:before,.dir-rtl table#form td.submit:after,.dir-rtl .form-buttons:after,.dir-rtl .path-admin .buttons:after,.dir-rtl #fitem_id_submitbutton:after,.dir-rtl .fp-content-center form+div:after,.dir-rtl div.backup-section+form:after,.dir-rtl #fgroup_id_buttonar:after{display:table;content:"";line-height:0}.dir-rtl table#form td.submit:after,.dir-rtl .form-buttons:after,.dir-rtl .path-admin .buttons:after,.dir-rtl #fitem_id_submitbutton:after,.dir-rtl .fp-content-center form+div:after,.dir-rtl div.backup-section+form:after,.dir-rtl #fgroup_id_buttonar:after{clear:both}.dir-rtl .path-admin .buttons,.dir-rtl .form-buttons{padding-right:200px}.form-item .form-setting .form-checkbox.defaultsnext{margin-top:5px;display:inline-block}#adminsettings h3{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}.mform legend a,.mform legend a:hover{color:#333;text-decoration:none}.dir-rtl .mform .fitem .felement{margin-right:30%;margin-left:auto;text-align:right}.dir-rtl .mform .fitem .felement input[name=email],.dir-rtl .mform .fitem .felement input[name=email2],.dir-rtl .mform .fitem .felement input[name=url],.dir-rtl .mform .fitem .felement input[name=idnumber],.dir-rtl .mform .fitem .felement input[name=phone1],.dir-rtl .mform .fitem .felement input[name=phone2]{text-align:left;direction:ltr}.dir-rtl #id_s__pathtodu,.dir-rtl #id_s__aspellpath,.dir-rtl #id_s__pathtodot,.dir-rtl #id_s__supportemail,.dir-rtl #id_s__supportpage,.dir-rtl #id_s__sessioncookie,.dir-rtl #id_s__sessioncookiepath,.dir-rtl #id_s__sessioncookiedomain,.dir-rtl #id_s__proxyhost,.dir-rtl #id_s__proxyuser,.dir-rtl #id_s__proxypassword,.dir-rtl #id_s__proxybypass,.dir-rtl #id_s__jabberhost,.dir-rtl #id_s__jabberserver,.dir-rtl #id_s__jabberusername,.dir-rtl #id_s__jabberpassword,.dir-rtl #id_s__additionalhtmlhead,.dir-rtl #id_s__additionalhtmltopofbody,.dir-rtl #id_s__additionalhtmlfooter,.dir-rtl #id_s__docroot,.dir-rtl #id_s__filter_tex_latexpreamble,.dir-rtl #id_s__filter_tex_latexbackground,.dir-rtl #id_s__filter_tex_pathlatex,.dir-rtl #id_s__filter_tex_pathdvips,.dir-rtl #id_s__filter_tex_pathconvert,.dir-rtl #id_s__blockedip,.dir-rtl #id_s__pathtoclam,.dir-rtl #id_s__quarantinedir,.dir-rtl #id_s__sitepolicy,.dir-rtl #id_s__sitepolicyguest,.dir-rtl #id_s__cronremotepassword,.dir-rtl #id_s__allowedip,.dir-rtl #id_s__blockedip,.dir-rtl #id_s_enrol_meta_nosyncroleids,.dir-rtl #id_s_enrol_ldap_host_url,.dir-rtl #id_s_enrol_ldap_ldapencoding,.dir-rtl #id_s_enrol_ldap_bind_dn,.dir-rtl #id_s_enrol_ldap_bind_pw,.dir-rtl #admin-emoticons .form-text,.dir-rtl #admin-role_mapping input[type=text],.dir-rtl #id_s_enrol_paypal_paypalbusiness,.dir-rtl #id_s_enrol_flatfile_location,#page-admin-setting-enrolsettingsflatfile.dir-rtl input[type=text],#page-admin-setting-enrolsettingsdatabase.dir-rtl input[type=text],#page-admin-auth-db.dir-rtl input[type=text]{direction:ltr}#page-admin-setting-enrolsettingsflatfile.dir-rtl .informationbox{direction:ltr;text-align:left}#page-admin-grade-edit-scale-edit.dir-rtl .error input#id_name{margin-right:170px}#page-grade-edit-outcome-course .courseoutcomes{margin-left:auto;margin-right:auto;width:100%}#page-grade-edit-outcome-course .courseoutcomes td{text-align:center}#installform #id_wwwroot,#installform #id_dirroot,#installform #id_dataroot,#installform #id_dbhost,#installform #id_dbname,#installform #id_dbuser,#installform #id_dbpass,#installform #id_prefix{direction:ltr}.mdl-right>label{display:inline-block}input[type="radio"]+label,input[type="checkbox"]+label{display:inline;padding-left:.2em}input[type="radio"],input[type="checkbox"]{margin-top:-4px;margin-right:7px}.dir-rtl input[type="radio"],.dir-rtl input[type="checkbox"]{margin-left:7px;margin-right:auto}.singleselect{display:inline-block}.singleselect form,.singleselect select{margin:0}.form-item .form-label label{margin-bottom:0}.dir-rtl .form-item .form-label label{text-align:left}.felement.ffilepicker{margin-top:5px}div#dateselector-calendar-panel{z-index:3100}fieldset.coursesearchbox label{display:inline}#region-main .mform:not(.unresponsive) .fitem .fitemtitle label{font-weight:bold}@media (max-width:1199px){body #region-main .mform:not(.unresponsive) .fitem .fitemtitle{display:block;margin-top:4px;margin-bottom:4px;text-align:left;width:100%}body #region-main .mform:not(.unresponsive) .fitem .felement{margin-left:0;width:100%;float:left;padding-left:0;padding-right:0}body #region-main .mform:not(.unresponsive) .fitem .fstatic:empty{display:none}body #region-main .mform:not(.unresponsive) .fitem .fcheckbox>span,body #region-main .mform:not(.unresponsive) .fitem .fradio>span,body #region-main .mform:not(.unresponsive) .fitem .fgroup>span{margin-top:4px}body #region-main .mform:not(.unresponsive) .femptylabel .fitemtitle{display:inline-block;width:auto;margin-right:8px}body #region-main .mform:not(.unresponsive) .femptylabel .felement{display:inline-block;margin-top:4px;padding-top:5px;width:auto}body #region-main .mform:not(.unresponsive) .fitem_fcheckbox .fitemtitle,body #region-main .mform:not(.unresponsive) .fitem_fcheckbox .felement{display:inline-block;width:auto}body #region-main .mform:not(.unresponsive) .fitem_fcheckbox .felement{padding:6px}body.dir-rtl #region-main .mform:not(.unresponsive) .femptylabel .fitemtitle{margin-right:0;margin-left:8px}body.dir-rtl #region-main .mform:not(.unresponsive) .fitem .fitemtitle{text-align:right}body.dir-rtl #region-main .mform:not(.unresponsive) .fitem .felement{margin-right:0;float:right;padding-right:0;padding-left:0}body.dir-rtl #region-main .mform:not(.unresponsive) .fitem_fcheckbox .felement{float:right}}@media (max-width:1474px){.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .fitem .fitemtitle{display:block;margin-top:4px;margin-bottom:4px;text-align:left;width:100%}.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .fitem .felement{margin-left:0;width:100%;float:left;padding-left:0;padding-right:0}.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .fitem .fstatic:empty{display:none}.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .fitem .fcheckbox>span,.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .fitem .fradio>span,.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .fitem .fgroup>span{margin-top:4px}.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .femptylabel .fitemtitle{display:inline-block;width:auto;margin-right:8px}.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .femptylabel .felement{display:inline-block;margin-top:4px;padding-top:5px;width:auto}.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .fitem_fcheckbox .fitemtitle,.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .fitem_fcheckbox .felement{display:inline-block;width:auto}.used-region-side-pre.used-region-side-post #region-main .mform:not(.unresponsive) .fitem_fcheckbox .felement{padding:6px}.used-region-side-pre.used-region-side-post.dir-rtl #region-main .mform:not(.unresponsive) .femptylabel .fitemtitle{margin-right:0;margin-left:8px}.used-region-side-pre.used-region-side-post.dir-rtl #region-main .mform:not(.unresponsive) .fitem .fitemtitle{text-align:right}.used-region-side-pre.used-region-side-post.dir-rtl #region-main .mform:not(.unresponsive) .fitem .felement{margin-right:0;float:right;padding-right:0;padding-left:0}.used-region-side-pre.used-region-side-post.dir-rtl #region-main .mform:not(.unresponsive) .fitem_fcheckbox .felement{float:right}}#fitem_id_availabilityconditionsjson *[aria-hidden=true]{display:none}#fitem_id_availabilityconditionsjson select,#fitem_id_availabilityconditionsjson input[type=text]{position:relative;top:4px}#fitem_id_availabilityconditionsjson label{display:inline}#fitem_id_availabilityconditionsjson .availability-group{margin-right:8px}#fitem_id_availabilityconditionsjson .availability-item{margin-bottom:6px}#fitem_id_availabilityconditionsjson .availability-none{margin-left:20px;margin-bottom:4px}#fitem_id_availabilityconditionsjson .availability-plugincontrols{padding:2px 0 0 4px;background:none repeat scroll 0 0 #f5f5f5;border:1px solid #eee;border-radius:4px;display:inline-block;margin-right:8px}#fitem_id_availabilityconditionsjson .availability-eye,#fitem_id_availabilityconditionsjson .availability-delete{margin-right:8px}#fitem_id_availabilityconditionsjson .availability-eye[aria-hidden=true]{display:inline;visibility:hidden}#fitem_id_availabilityconditionsjson .availability-list>.availability-eye img{vertical-align:top;margin-top:12px}#fitem_id_availabilityconditionsjson .availability-button{margin-left:15px}#fitem_id_availabilityconditionsjson .availability-childlist>.availability-inner{display:inline-block;background:#f5f5f5;border:1px solid #eee;border-radius:4px;padding:6px;margin-bottom:6px}#fitem_id_availabilityconditionsjson .availability-childlist .availability-childlist>.availability-inner{background:white}#fitem_id_availabilityconditionsjson .availability-connector{margin-left:20px;margin-bottom:6px}.dir-rtl #fitem_id_availabilityconditionsjson .availability-group{margin-right:0;margin-left:8px}.dir-rtl #fitem_id_availabilityconditionsjson .availability-none{margin-right:20px;margin-left:0}.dir-rtl #fitem_id_availabilityconditionsjson .availability-plugincontrols{padding-right:4px;padding-left:0;margin-right:0;margin-left:8px}.dir-rtl #fitem_id_availabilityconditionsjson .availability-eye,.dir-rtl #fitem_id_availabilityconditionsjson .availability-delete{margin-left:8px;margin-right:0}.dir-rtl #fitem_id_availabilityconditionsjson .availability-button{margin-right:15px;margin-left:0}.dir-rtl #fitem_id_availabilityconditionsjson .availability-connector{margin-right:20px;margin-left:0}.mform .error .availability-field{color:#333}.availability-dialogue .moodle-dialogue .moodle-dialogue-bd{padding-left:0;padding-right:0;padding-bottom:2px}.availability-dialogue ul{display:block;margin:0}.availability-dialogue li{display:block;list-style-type:none;padding:0 0 4px;clear:both;border-bottom:1px solid #eee;margin-bottom:4px}.availability-dialogue ul button{float:left;margin-left:1em;min-width:140px;margin-top:4px}.availability-dialogue label{margin-left:170px;margin-right:1em;margin-bottom:0}.availability-dialogue .availability-buttons button{margin-left:1em;margin-right:1em;margin-top:4px}.dir-rtl .availability-dialogue ul button{float:right;margin-right:1em;margin-left:0}.dir-rtl .availability-dialogue label{margin-right:170px;margin-left:1em}textarea[cols],input[size]{width:auto}.form-autocomplete-selection{margin:.2em;min-height:21px}.form-autocomplete-multiple [role=listitem]{cursor:pointer}.form-autocomplete-suggestions{position:absolute;background-color:white;border:2px solid #eee;border-radius:3px;min-width:206px;max-height:20em;overflow:auto;margin:0;padding:0;margin-top:-0.2em;z-index:1}.form-autocomplete-suggestions li{list-style-type:none;padding:.2em;margin:0;cursor:pointer;color:#333}.form-autocomplete-suggestions li:hover{background-color:#00a3f4;color:#fff}.form-autocomplete-suggestions li[aria-selected=true]{background-color:#e5e5e5;color:#555}.form-autocomplete-downarrow{color:#333;position:relative;top:-0.3em;left:-1.5em;cursor:pointer}.dir-rtl .form-autocomplete-downarrow{right:-1.5em;left:inherit}.form-autocomplete-selection:focus{outline:none}.form-autocomplete-selection [data-active-selection=true]{padding:.5em;font-size:large}select{width:auto}.path-mod-forum .forumsearch input,.path-mod-forum .forumsearch .helptooltip{margin:0 3px}.path-mod-forum .forumheaderlist,.path-mod-forum .forumheaderlist td{border:none}.path-mod-forum .forumheaderlist thead .header,.path-mod-forum .forumheaderlist tbody .discussion td{white-space:normal;vertical-align:top;padding-left:.5em;padding-right:.5em}.path-mod-forum .forumheaderlist thead .header{white-space:normal;vertical-align:top}.path-mod-forum .forumheaderlist thead .header.replies{text-align:center}.path-mod-forum .forumheaderlist thead .header.lastpost{text-align:right}.path-mod-forum .forumheaderlist thead .header th.discussionsubscription,.path-mod-forum .forumheaderlist tbody .discussion td.discussionsubscription{width:16px;padding-left:.5em;padding-right:.5em}.path-mod-forum .forumheaderlist .discussion .author,.path-mod-forum .forumheaderlist .discussion .replies,.path-mod-forum .forumheaderlist .discussion .lastpost{white-space:normal}.path-mod-forum .forumheaderlist .discussion .discussionsubscription,.path-mod-forum .forumheaderlist .discussion .replies{text-align:center}.path-mod-forum .forumheaderlist .discussion .topic,.path-mod-forum .forumheaderlist .discussion .discussionsubscription,.path-mod-forum .forumheaderlist .discussion .topic.starter,.path-mod-forum .forumheaderlist .discussion .picture,.path-mod-forum .forumheaderlist .discussion .author,.path-mod-forum .forumheaderlist .discussion .replies,.path-mod-forum .forumheaderlist .discussion .lastpost{vertical-align:top}.path-mod-feedback .feedback_bar_image{height:5px}.forumpost{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);border-color:#e3e3e3;padding:6px}.forumpost blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.forumpost .header{margin-bottom:3px}.forumpost .picture img{margin:3px}.forumpost .picture img.userpicture{margin-left:3px;margin-right:10px}.forumpost .content .posting.fullpost{margin-top:8px}.forumpost .row .topic,.forumpost .row .content-mask,.forumpost .row .options{margin-left:48px}.forumpost .row.side{clear:both}.dir-rtl .forumpost .picture img.userpicture{margin-left:10px;margin-right:3px}.dir-rtl .forumpost .row .topic,.dir-rtl .forumpost .row .content-mask,.dir-rtl .forumpost .row .options{margin-left:0;margin-right:48px}.forumpost .row .left{width:48px}.forumpost .options .commands{margin-left:0}.forumpost .subject{font-weight:bold}.forumsearch input[type=text]{margin-bottom:0 !important}#page-mod-forum-discuss .discussioncontrols{width:auto;margin:0}#page-footer{margin-top:1em;padding:1em 0;border-top:2px solid #ddd}.maincalendar .calendarmonth td,.maincalendar .calendarmonth th{border:1px dotted #ddd}.path-grade-report-grader h1{text-align:inherit}#page-mod-chat-gui_basic input#message{max-width:100%}#page-mod-data-view #singleimage{width:auto}.path-mod-data form{margin-top:10px}.template_heading{margin-top:10px}.breadcrumb-button{float:right;margin-top:4px}.breadcrumb-button .singlebutton{float:left;margin-left:4px}.dir-rtl .nav-tabs>li,.dir-rtl .nav-pills>li{float:right}.dir-rtl .navbar .brand{padding:10px 0 10px 20px;float:right}.navbar-inverse .logininfo a{color:#999}.navbar-inverse .logininfo a:hover{background-color:transparent;color:#fff}.navbar-fixed-top,.navbar-fixed-bottom{z-index:4030}.dir-rtl .breadcrumb-button,.dir-rtl .navbar .btn-navbar{float:left}.dir-rtl .breadcrumb-button .singlebutton{float:right;margin-right:4px;margin-left:0}.dir-rtl .breadcrumb-button .singlebutton div,.dir-rtl .breadcrumb-button .singlebutton div input[type="submit"]{margin-right:5px;margin-left:0}.ie .row-fluid .desktop-first-column{margin-left:0}.langmenu form{margin:0}.container-fluid{max-width:1680px;margin:0 auto}canvas{-ms-touch-action:auto}div#dock{display:none}.path-mod-choice .horizontal .choices{margin:0}.path-mod-choice .horizontal .choices .option{display:inline-block;padding:10px}.path-mod-choice .results .data{white-space:normal}.path-mod-lesson .firstpageoptions{margin:auto;min-width:280px;width:60%}.path-mod-lesson .centerpadded{padding:5px;text-align:center}.path-mod-wiki .wiki_headingtitle,.path-mod-wiki .midpad,.path-mod-wiki .wiki_headingtime{text-align:inherit}.path-mod-wiki .wiki_contentbox{width:100%}.dropdown-menu>li>a{padding:3px 20px 3px 8px}.dir-rtl .dropdown-menu>li>a{padding:3px 8px 3px 20px}.dir-rtl .dropdown-submenu>.dropdown-menu{-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.path-mod-survey .surveytable>tbody>tr:nth-of-type(odd){background-color:transparent}.path-mod-survey .surveytable>tbody>tr:nth-of-type(even){background-color:#f9f9f9}.path-mod-survey .surveytable .rblock label{text-align:center}.path-mod-survey .resultgraph,.path-mod-survey .reportsummary,.path-mod-survey .studentreport,.path-mod-survey .reportbuttons,.path-mod-survey .centerpara{text-align:center}.dir-rtl.path-mod-forum .forumheaderlist thead .header.lastpost{text-align:left}.dir-rtl.path-mod-forum .forumheaderlist .discussion .lastpost{text-align:left}.nav .caret{margin-left:4px}.dir-rtl .nav .caret{margin-right:4px}.nav .divider{overflow:hidden;width:0;height:40px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff}.navbar-inverse .nav .divider{border-left-color:#111111;border-right-color:#515151}.dropdown-menu .divider{width:auto;height:1px;border-left:0 none;border-right:0 none}.usermenu .login{color:#777;line-height:40px}.usermenu .login a{color:#0070a8}.usermenu .login a:hover,.usermenu .login a:focus{color:#003d5c;text-decoration:underline}.usermenu .moodle-actionmenu .toggle-display{display:block;opacity:1;color:#777;line-height:40px;height:40px}.usermenu .moodle-actionmenu .toggle-display:hover{color:#333}.usermenu .moodle-actionmenu .toggle-display .userbutton{height:40px;line-height:40px}.usermenu .moodle-actionmenu .toggle-display .userbutton .avatars{display:inline-block;height:36px;width:36px;vertical-align:middle;margin-right:6px;margin-left:6px}.usermenu .moodle-actionmenu .toggle-display .userbutton .avatars .avatar,.usermenu .moodle-actionmenu .toggle-display .userbutton .avatars img{display:block}.usermenu .moodle-actionmenu .toggle-display .userbutton .usertext{display:inline-block;vertical-align:middle;line-height:1em;color:inherit}.usermenu .moodle-actionmenu .toggle-display .userbutton .usertext .meta,.usermenu .moodle-actionmenu .toggle-display .userbutton .usertext .role{display:block;font-size:12px}.usermenu .moodle-actionmenu .toggle-display .userbutton .usertext .meta .value,.usermenu .moodle-actionmenu .toggle-display .userbutton .usertext .role .value{font-weight:bold}.usermenu .moodle-actionmenu .toggle-display .userbutton .usertext .role{font-weight:bold}.usermenu .moodle-actionmenu .toggle-display .caret{display:none}.usermenu .moodle-actionmenu .menu .menu-action.icon img{border-radius:0;background:transparent;box-shadow:none}.usermenu .moodle-actionmenu .menu .menu-action.icon:hover img{background:#fff;border-radius:4px;box-shadow:0 0 16px rgba(0,0,0,0.125)}.usermenu .moodle-actionmenu[data-enhanced] .menu .menu-action.icon img,.usermenu .moodle-actionmenu[data-enhanced] .menu .menu-action.icon:hover img{border-radius:0;background:transparent;box-shadow:none}.navbar-inverse .usermenu .login{color:#999}.navbar-inverse .usermenu .login a{color:#999}.navbar-inverse .usermenu .login a:hover{color:#fff}.navbar-inverse .usermenu .moodle-actionmenu .toggle-display{color:#999}.navbar-inverse .usermenu .moodle-actionmenu .userbutton .usertext{color:#999}.navbar-inverse .usermenu .moodle-actionmenu .userbutton .usertext .meta{color:#999}.navbar-inverse .usermenu .moodle-actionmenu .userbutton .usertext .meta .value{color:#999}.navbar-inverse .usermenu .moodle-actionmenu:hover .usertext{color:#fff}.navbar-inverse .usermenu .moodle-actionmenu:hover .usertext .meta{color:#999}.navbar-inverse .usermenu .moodle-actionmenu:hover .usertext .meta .value{color:#fff}.navbar-inverse .usermenu .moodle-actionmenu[data-enhanced] .toggle-display.textmenu .caret{border-top-color:#fff}.navbar-inverse .usermenu .moodle-actionmenu .menu .menu-action.icon img{border-radius:0;background:transparent;box-shadow:none}.navbar-inverse .usermenu .moodle-actionmenu .menu .menu-action.icon:hover img{background:#333;border-radius:4px;box-shadow:0 0 16px #fff}.navbar-inverse .usermenu .moodle-actionmenu[data-enhanced] .menu .menu-action.icon img,.navbar-inverse .usermenu .moodle-actionmenu[data-enhanced] .menu .menu-action.icon:hover img{border-radius:0;background:transparent;box-shadow:none}.jsenabled .usermenu .moodle-actionmenu .toggle-display{display:block}.jsenabled .usermenu .moodle-actionmenu .toggle-display.textmenu{padding-left:8px;padding-right:8px}.jsenabled .usermenu .moodle-actionmenu .toggle-display .caret{display:inline-block;position:relative;top:9px}.jsenabled .usermenu .moodle-actionmenu>.menubar{display:block;margin:0 0 2px 0}.jsenabled .usermenu .moodle-actionmenu>.menu{min-width:160px}.jsenabled .usermenu .moodle-actionmenu>.menu .filler{display:block;*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.jsenabled .usermenu .moodle-actionmenu.show{background-color:#e5e5e5}.jsenabled .usermenu .moodle-actionmenu.show .menu{padding:5px 0;margin:2px 0 0;background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.jsenabled .usermenu .moodle-actionmenu.show .menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px}.jsenabled .usermenu .moodle-actionmenu.show .menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px}.jsenabled .usermenu .moodle-actionmenu.show .menu a{border-radius:0}.jsenabled .usermenu .moodle-actionmenu.show .menu a:focus{text-decoration:none}.jsenabled .usermenu .moodle-actionmenu.show .menu a:hover{text-decoration:none;background-color:#00699e;background-image:-moz-linear-gradient(top, #0070a8, #005f8f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0070a8), to(#005f8f));background-image:-webkit-linear-gradient(top, #0070a8, #005f8f);background-image:-o-linear-gradient(top, #0070a8, #005f8f);background-image:linear-gradient(to bottom, #0070a8, #005f8f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0070a8', endColorstr='#ff005f8f', GradientType=0)}.jsenabled .usermenu .moodle-actionmenu.show .menu.align-tr-br{margin-top:2px}.jsenabled .navbar-inverse .usermenu .moodle-actionmenu.show{background-color:#111111}.dir-ltr .usermenu{float:right}.dir-ltr .usermenu>.moodle-actionmenu>.menu:before{right:9px}.dir-ltr .usermenu>.moodle-actionmenu>.menu:after{right:10px}.dir-ltr .usermenu>.moodle-actionmenu>.menubar li a{text-align:right}.dir-ltr.userloggedinas .usermenu .userbutton .avatars .avatar.current{left:16px}.dir-rtl .usermenu{float:left}.dir-rtl .usermenu>.moodle-actionmenu>.menu{margin-right:0}.dir-rtl .usermenu>.moodle-actionmenu>.menu:before{left:9px}.dir-rtl .usermenu>.moodle-actionmenu>.menu:after{left:10px}.dir-rtl .usermenu>.moodle-actionmenu>.menubar li a{text-align:left}.dir-rtl.userloggedinas .usermenu .userbutton .avatars .avatar.current{left:-14px}.userloggedinas .usermenu .userbutton .avatars .avatar{overflow:hidden}.userloggedinas .usermenu .userbutton .avatars .avatar.current{position:relative;top:4px;left:4px;width:20px;height:20px;margin-top:11px;margin-bottom:-34px;border:1px solid #fff;border-radius:50%;box-shadow:-2px -2px 16px rgba(0,0,0,0.25)}.userloggedinas .usermenu .userbutton .avatars .avatar img{width:inherit;height:inherit}.path-mod-quiz #mod_quiz_navblock .qnbutton{text-decoration:none;font-size:14px;line-height:20px;font-weight:normal;background-color:#fff;background-image:none;height:40px;width:30px;border-radius:3px;border:0;overflow:visible;margin:0 6px 6px 0}.path-mod-quiz #mod_quiz_navblock span.qnbutton{cursor:default;background-color:#eee;color:#555}.path-mod-quiz #mod_quiz_navblock a.qnbutton:hover,.path-mod-quiz #mod_quiz_navblock a.qnbutton:active,.path-mod-quiz #mod_quiz_navblock a.qnbutton:focus{text-decoration:underline}.path-mod-quiz #mod_quiz_navblock .qnbutton .thispageholder{border:1px solid;border-radius:3px;z-index:1}.path-mod-quiz #mod_quiz_navblock .qnbutton.thispage .thispageholder{border-width:3px}.path-mod-quiz #mod_quiz_navblock .allquestionsononepage .qnbutton.thispage .thispageholder{border-width:1px}.path-mod-quiz #mod_quiz_navblock .qnbutton.flagged .thispageholder{background:transparent url([[pix:theme|mod/quiz/flag-on]]) 15px 0 no-repeat}.path-mod-quiz #mod_quiz_navblock .qnbutton .trafficlight{border:0;background:#fff none center / 10px no-repeat scroll;height:20px;margin-top:20px;border-radius:0 0 3px 3px}.path-mod-quiz #mod_quiz_navblock .qnbutton.notyetanswered .trafficlight,.path-mod-quiz #mod_quiz_navblock .qnbutton.invalidanswer .trafficlight{background-color:#fff}.path-mod-quiz #mod_quiz_navblock .qnbutton.invalidanswer .trafficlight{background-image:url([[pix:theme|mod/quiz/warningtriangle]])}.path-mod-quiz #mod_quiz_navblock .qnbutton.correct .trafficlight{background-image:url([[pix:theme|mod/quiz/checkmark]]);background-color:#468847}.path-mod-quiz #mod_quiz_navblock .qnbutton.blocked .trafficlight{background-image:url([[pix:core|t/locked]]);background-color:#eee}.path-mod-quiz #mod_quiz_navblock .qnbutton.notanswered .trafficlight,.path-mod-quiz #mod_quiz_navblock .qnbutton.incorrect .trafficlight{background-color:#b94a48}.path-mod-quiz #mod_quiz_navblock .qnbutton.partiallycorrect .trafficlight{background-image:url([[pix:theme|mod/quiz/whitecircle]]);background-color:#f89406}.path-mod-quiz #mod_quiz_navblock .qnbutton.complete .trafficlight,.path-mod-quiz #mod_quiz_navblock .qnbutton.answersaved .trafficlight,.path-mod-quiz #mod_quiz_navblock .qnbutton.requiresgrading .trafficlight{background-color:#999}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax{background-color:#fff}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit div.yui-layout-bd-nohd,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit div.yui-layout-bd-noft,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit div.yui-layout-bd,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit-right,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit-bottom{border:0}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit-right,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit-bottom{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);border-color:#e3e3e3;border-radius:0}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit-right blockquote,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit-bottom blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax .yui-layout-unit div.yui-layout-bd{background-color:transparent}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-input-area table.generaltable,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-input-area table.generaltable td.cell{border:0;padding:3px 15px;white-space:nowrap}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-input-area table.generaltable input,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-input-area table.generaltable td.cell input{margin:0 10px}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-input-area table.generaltable input#input-message,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-input-area table.generaltable td.cell input#input-message{width:45%;margin:auto}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-input-area table.generaltable a,.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-input-area table.generaltable td.cell a{margin:0 5px}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-userlist{padding:10px 5px}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-userlist #users-list{border-top:1px solid #ddd;border-bottom:1px solid #fff}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-userlist #users-list li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:5px 10px}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-userlist #users-list img{margin-right:8px;border:1px solid #ccc;border-radius:4px;max-width:none}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-messages{margin:20px 25px}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-messages .chat-event.course-theme{text-align:center;margin:10px 0;font-size:11.9px;color:#777}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-messages .chat-message.course-theme{background-color:#fff;border:1px dotted #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:4px 10px;margin:10px 0}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-messages .chat-message.course-theme .time{float:right;font-size:11px;color:#777}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-messages .mdl-chat-my-entry .chat-message.course-theme{background-color:#f6f6f6}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax #chat-messages .mdl-chat-my-entry .chat-message.course-theme .user{font-weight:bold}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax.dir-rtl .yui-layout-unit-right{padding:0}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax.dir-rtl .yui-layout-unit div.yui-layout-bd{text-align:right}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax.dir-rtl #chat-userlist #users-list img{margin-left:8px}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax.dir-rtl #chat-messages .chat-message.course-theme .time{float:left}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax.dir-rtl #chat-messages .chat-message.course-theme .user{float:right}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax.dir-rtl #chat-messages .chat-message.course-theme .chat-message-meta{height:20px}.yui-skin-sam .yui-layout.path-mod-chat-gui_ajax.dir-rtl #chat-messages .chat-message.course-theme .text{text-align:right}#page-report-participation-index .participationselectform div label{display:inline;margin:0 5px}#page-report-participation-index.dir-ltr .participationselectform div label[for=menuinstanceid]{margin-left:0}#page-report-participation-index.dir-rtl .participationselectform div label[for=menuinstanceid]{margin-right:0}.path-backup .mform .grouped_settings.section_level{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);border-color:#e3e3e3;padding:10px 0 0 0;clear:both}.path-backup .mform .grouped_settings.section_level blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.path-backup .mform .grouped_settings{clear:both;overflow:hidden}.path-backup .include_setting,.path-backup .grouped_settings .normal_setting{display:inline-block}.path-backup .include_setting.section_level label{font-weight:bold}.path-backup .mform .fitem .fitemtitle{width:260px}.path-backup .mform .fitem .felement{margin-left:280px}.path-backup .notification.dependencies_enforced{text-align:center;color:#b94a48;font-weight:bold}.path-backup .backup_progress{text-align:center}.path-backup .backup_progress .backup_stage{color:#999}.path-backup .backup_progress .backup_stage.backup_stage_current{font-weight:bold;color:inherit}.path-backup .backup_progress span.backup_stage.backup_stage_complete{color:inherit}#page-backup-restore .filealiasesfailures{background-color:#f2dede}#page-backup-restore .filealiasesfailures .aliaseslist{width:90%;margin:.8em auto;background-color:#fff;border:1px dotted #666}.path-backup .fitem .smallicon{vertical-align:text-bottom}.backup-restore .backup-section>h2.header,.backup-restore .backup-section .backup-sub-section h3{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}.backup-restore .backup-section .noticebox{margin:1em auto;width:60%;text-align:center}.backup-restore .backup-section.settings-section .detail-pair{width:50%;display:inline-block;*display:inline;*zoom:1}.backup-restore .backup-section.settings-section .detail-pair-label{width:65%}.backup-restore .backup-section.settings-section .detail-pair-value{width:25%}.backup-restore .activitytable{min-width:500px}.backup-restore .activitytable .modulename{width:100px}.backup-restore .activitytable .moduleincluded{width:50px}.backup-restore .activitytable .userinfoincluded{width:50px}.backup-restore .detail-pair-label{display:inline-block;*display:inline;*zoom:1;width:25%;padding:8px;margin:0;text-align:right;font-weight:bold;vertical-align:top}.backup-restore .detail-pair-value{display:inline-block;*display:inline;*zoom:1;width:65%;padding:8px;margin:0}.backup-restore .detail-pair-value>.sub-detail{display:block;font-size:11.9px;color:#999}.backup-restore>.singlebutton{text-align:right}.path-backup .mform .fgroup .proceedbutton{float:right;margin-right:5%}.path-backup .mform .fgroup .oneclickbackup{float:right}.restore-course-search .rcs-results{width:70%;min-width:400px}.restore-course-search .rcs-results table{width:100%;margin:0;border-width:0}.restore-course-search .rcs-results table .no-overflow{max-width:600px}.restore-course-search .rcs-results .paging{text-align:left;margin:0;background-color:#eee;padding:3px}.restore-course-category .rcs-results{width:70%;min-width:400px;border:1px solid #ddd;margin:5px 0}.restore-course-category .rcs-results table{width:100%;margin:0;border-width:0}.restore-course-category .rcs-results table .no-overflow{max-width:600px}.restore-course-category .rcs-results .paging{text-align:left;margin:0;background-color:#eee;padding:3px}.path-backup .wibbler{width:500px;margin:0 auto 10px;border-bottom:1px solid black;border-right:1px solid black;border-left:1px solid black;position:relative;min-height:4px}.path-backup .wibbler .wibble{position:absolute;left:0;right:0;top:0;height:4px}.path-backup .wibbler .state0{background:#eee}.path-backup .wibbler .state1{background:#ddd}.path-backup .wibbler .state2{background:#ccc}.path-backup .wibbler .state3{background:#bbb}.path-backup .wibbler .state4{background:#aaa}.path-backup .wibbler .state5{background:#999}.path-backup .wibbler .state6{background:#888}.path-backup .wibbler .state7{background:#777}.path-backup .wibbler .state8{background:#666}.path-backup .wibbler .state9{background:#555}.path-backup .wibbler .state10{background:#444}.path-backup .wibbler .state11{background:#333}.path-backup .wibbler .state12{background:#222}.path-backup .backup_log{margin-top:2em}.path-backup .backup_log h2{font-size:1em}.path-backup .backup_log_contents{border:1px solid #ddd;padding:10px;height:300px;overflow-y:scroll}.dir-rtl.path-backup .mform .fgroup .proceedbutton{float:left;margin-left:5%;margin-right:0}.dir-rtl.path-backup .mform .fgroup .oneclickbackup{float:left}table.flexible,.generaltable{width:100%;margin-bottom:20px}table.flexible th,.generaltable th,table.flexible td,.generaltable td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}table.flexible th,.generaltable th{font-weight:bold}table.flexible thead th,.generaltable thead th{vertical-align:bottom}table.flexible caption+thead tr:first-child th,.generaltable caption+thead tr:first-child th,table.flexible caption+thead tr:first-child td,.generaltable caption+thead tr:first-child td,table.flexible colgroup+thead tr:first-child th,.generaltable colgroup+thead tr:first-child th,table.flexible colgroup+thead tr:first-child td,.generaltable colgroup+thead tr:first-child td,table.flexible thead:first-child tr:first-child th,.generaltable thead:first-child tr:first-child th,table.flexible thead:first-child tr:first-child td,.generaltable thead:first-child tr:first-child td{border-top:0}table.flexible tbody+tbody,.generaltable tbody+tbody{border-top:2px solid #ddd}table.flexible .table,.generaltable .table{background-color:#fff}.singlebutton div{display:inline-block;margin-right:5px;margin-bottom:5px;margin-left:5px}#notice .buttons .singlebutton{display:inline-block}.continuebutton{text-align:center}p.arrow_button{margin-top:5em;text-align:center}p.arrow_button #remove{margin:3em auto 5em}p.arrow_button input{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#addcontrols{margin-top:30px;text-align:center;margin-bottom:3em}#addcontrols label{display:inline}#addcontrols input,#removecontrols input{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:auto}.btn-lineup{margin:0 0 10px 5px}input[name="searchwikicontent"]+input[type="submit"],select+input[type="submit"],input[type="text"]+input[type="button"],input[type="password"]+input[type="submit"],input[type="text"]+button,input[type="text"]+input[type="submit"]{margin:0 0 10px 5px}button,input.form-submit,input[type="button"],input[type="submit"],input[type="reset"]{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #fff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #fff, #e6e6e6);background-image:-o-linear-gradient(top, #fff, #e6e6e6);background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)}button:hover,input.form-submit:hover,input[type="button"]:hover,input[type="submit"]:hover,input[type="reset"]:hover,button:focus,input.form-submit:focus,input[type="button"]:focus,input[type="submit"]:focus,input[type="reset"]:focus,button:active,input.form-submit:active,input[type="button"]:active,input[type="submit"]:active,input[type="reset"]:active,button.active,input.form-submit.active,input[type="button"].active,input[type="submit"].active,input[type="reset"].active,button.disabled,input.form-submit.disabled,input[type="button"].disabled,input[type="submit"].disabled,input[type="reset"].disabled,button[disabled],input.form-submit[disabled],input[type="button"][disabled],input[type="submit"][disabled],input[type="reset"][disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}button:active,input.form-submit:active,input[type="button"]:active,input[type="submit"]:active,input[type="reset"]:active,button.active,input.form-submit.active,input[type="button"].active,input[type="submit"].active,input[type="reset"].active{background-color:#ccc \9}button:first-child,input.form-submit:first-child,input[type="button"]:first-child,input[type="submit"]:first-child,input[type="reset"]:first-child{*margin-left:0}button:hover,input.form-submit:hover,input[type="button"]:hover,input[type="submit"]:hover,input[type="reset"]:hover,button:focus,input.form-submit:focus,input[type="button"]:focus,input[type="submit"]:focus,input[type="reset"]:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}button:focus,input.form-submit:focus,input[type="button"]:focus,input[type="submit"]:focus,input[type="reset"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}button.active,input.form-submit.active,input[type="button"].active,input[type="submit"].active,input[type="reset"].active,button:active,input.form-submit:active,input[type="button"]:active,input[type="submit"]:active,input[type="reset"]:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}button.disabled,input.form-submit.disabled,input[type="button"].disabled,input[type="submit"].disabled,input[type="reset"].disabled,button[disabled],input.form-submit[disabled],input[type="button"][disabled],input[type="submit"][disabled],input[type="reset"][disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}button .label,input.form-submit .label,input[type="button"] .label,input[type="submit"] .label,input[type="reset"] .label,button .badge,input.form-submit .badge,input[type="button"] .badge,input[type="submit"] .badge,input[type="reset"] .badge{position:relative;top:-1px}button,input.form-submit,input[type="button"],input[type="submit"],input[type="reset"]{margin:0 0 10px 5px}button.yui3-button.closebutton{background-position:0 0}button.yui3-button.closebutton:hover{background-position:0 0}input.fp-btn-choose{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.user-enroller-panel .uep-search-results .user .options .enrol,.user-enroller-panel .uep-search-results .cohort .options .enrol{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.user-enroller-panel .uep-search-results .user .options .enrol .label,.user-enroller-panel .uep-search-results .cohort .options .enrol .label,.user-enroller-panel .uep-search-results .user .options .enrol .badge,.user-enroller-panel .uep-search-results .cohort .options .enrol .badge{top:0}.gradetreebox h4{font-size:14px}.gradetreebox th.cell,.gradetreebox input[type=text]{width:auto}.gradetreebox input[type=text],.gradetreebox select{margin-bottom:0}.core_grades_notices .singlebutton{display:inline-block}#page-grade-grading-manage #activemethodselector label{display:inline-block}#page-grade-grading-manage #activemethodselector .helptooltip{margin-right:.5em}#page-grade-grading-manage .actions{display:block;text-align:center;margin-bottom:1em}#page-grade-grading-manage .actions .action{*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #fff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #fff, #e6e6e6);background-image:-o-linear-gradient(top, #fff, #e6e6e6);background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;display:inline-block;position:relative;vertical-align:top;width:150px;text-align:center;overflow:hidden;margin:.5em;padding:1em;border:1px solid #aaa}#page-grade-grading-manage .actions .action:hover,#page-grade-grading-manage .actions .action:focus,#page-grade-grading-manage .actions .action:active,#page-grade-grading-manage .actions .action.active,#page-grade-grading-manage .actions .action.disabled,#page-grade-grading-manage .actions .action[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}#page-grade-grading-manage .actions .action:active,#page-grade-grading-manage .actions .action.active{background-color:#ccc \9}#page-grade-grading-manage .actions .action:first-child{*margin-left:0}#page-grade-grading-manage .actions .action:hover,#page-grade-grading-manage .actions .action:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}#page-grade-grading-manage .actions .action:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#page-grade-grading-manage .actions .action.active,#page-grade-grading-manage .actions .action:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}#page-grade-grading-manage .actions .action.disabled,#page-grade-grading-manage .actions .action[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}#page-grade-grading-manage .actions .action .label,#page-grade-grading-manage .actions .action .badge{position:relative;top:-1px}#page-grade-grading-manage .actions .action .action-icon{display:inline-block;position:relative;height:64px;width:64px}#page-grade-grading-manage .actions .action .action-text{position:relative;top:.4em;font-size:14px}#page-grade-grading-form-rubric-edit .gradingform_rubric_editform .status{font-size:70%}.gradingform_rubric.editor .addlevel input,.gradingform_rubric.editor .addcriterion input{background:#fff none no-repeat top left}.dir-rtl #rubric-rubric.gradingform_rubric #rubric-criteria .criterion .level .score{text-align:right;float:right;margin-left:28px;margin-right:0}.dir-rtl #rubric-rubric.gradingform_rubric #rubric-criteria .criterion .level .delete{float:left}.dir-rtl #rubric-rubric.gradingform_rubric #rubric-criteria .criterion .level .delete input{left:0;right:auto}.dir-rtl #rubric-rubric.gradingform_rubric .addcriterion{margin-right:5px;margin-left:0}.dir-rtl #rubric-rubric.gradingform_rubric .addcriterion input{padding-right:26px;padding-left:10px;background-position:right 8px top 8px}.dir-rtl #rubric-rubric.gradingform_rubric .options .option .value{margin-left:0;margin-right:5px}.dir-rtl #rubric-rubric.gradingform_rubric .options .option input{margin-left:12px;margin-right:5px}#rubric-rubric.gradingform_rubric #rubric-criteria{margin-bottom:1em}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .description{vertical-align:top;padding:6px}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .description textarea{margin-bottom:0;height:115px}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .definition textarea{width:80%;margin-bottom:0}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .score{position:relative;float:left;margin-right:28px}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .score input{margin-bottom:0}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .level{vertical-align:top;padding:6px}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .level .delete{position:relative;width:32px;height:32px;margin-top:-32px;clear:both;float:right}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .level .delete input{display:block;position:absolute;right:0;bottom:0;height:24px;width:24px;margin:0}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .level .delete input:hover{background-color:#ddd}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .scorevalue input{float:none;width:2em}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .scorevalue input.hiddenelement,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .scorevalue input.pseudotablink{width:0}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel{vertical-align:middle}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #fff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #fff, #e6e6e6);background-image:-o-linear-gradient(top, #fff, #e6e6e6);background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);background-position:0 0;height:30px;margin-right:5px}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input:hover,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input:focus,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input:active,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input.active,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input.disabled,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input:active,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input.active{background-color:#ccc \9}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input:first-child{*margin-left:0}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input:hover,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input.active,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input.disabled,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input .label,#rubric-rubric.gradingform_rubric #rubric-criteria .criterion .addlevel input .badge{position:relative;top:-1px}#rubric-rubric.gradingform_rubric .addcriterion{margin-left:5px;display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #fff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #fff, #e6e6e6);background-image:-o-linear-gradient(top, #fff, #e6e6e6);background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);padding:0;margin-bottom:1em}#rubric-rubric.gradingform_rubric .addcriterion:hover,#rubric-rubric.gradingform_rubric .addcriterion:focus,#rubric-rubric.gradingform_rubric .addcriterion:active,#rubric-rubric.gradingform_rubric .addcriterion.active,#rubric-rubric.gradingform_rubric .addcriterion.disabled,#rubric-rubric.gradingform_rubric .addcriterion[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}#rubric-rubric.gradingform_rubric .addcriterion:active,#rubric-rubric.gradingform_rubric .addcriterion.active{background-color:#ccc \9}#rubric-rubric.gradingform_rubric .addcriterion:first-child{*margin-left:0}#rubric-rubric.gradingform_rubric .addcriterion:hover,#rubric-rubric.gradingform_rubric .addcriterion:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}#rubric-rubric.gradingform_rubric .addcriterion:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#rubric-rubric.gradingform_rubric .addcriterion.active,#rubric-rubric.gradingform_rubric .addcriterion:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}#rubric-rubric.gradingform_rubric .addcriterion.disabled,#rubric-rubric.gradingform_rubric .addcriterion[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}#rubric-rubric.gradingform_rubric .addcriterion .label,#rubric-rubric.gradingform_rubric .addcriterion .badge{position:relative;top:-1px}#rubric-rubric.gradingform_rubric .addcriterion input{margin:0;color:inherit;text-shadow:inherit;border:0 none;line-height:inherit;background:transparent url([[pix:t/add]]) no-repeat 7px 8px;padding-left:26px}#rubric-rubric.gradingform_rubric .options{clear:both}#rubric-rubric.gradingform_rubric .options .option label{margin:0;padding:0;font-size:inherit;font-weight:normal;line-height:2em;color:inherit;text-shadow:none;background-color:transparent}#rubric-rubric.gradingform_rubric .options .option input{margin-left:5px;margin-right:12px}.path-grade-edit-tree .setup-grades h4{margin:0}.path-grade-edit-tree .setup-grades .column-rowspan{padding:0;width:24px;min-width:24px;max-width:24px}.path-grade-edit-tree .setup-grades .category td.column-name{padding-left:0}.path-grade-edit-tree .setup-grades td.column-name{padding-left:24px}.path-grade-edit-tree .setup-grades .column-name h4 img.icon{padding-left:0}.path-grade-edit-tree .setup-grades .category input[type="text"],.path-grade-edit-tree .setup-grades .category .column-range,.path-grade-edit-tree .setup-grades .categoryitem,.path-grade-edit-tree .setup-grades .courseitem{font-weight:bold}.path-grade-edit-tree .setup-grades .emptyrow{display:none}.path-grade-edit-tree .setup-grades .gradeitemdescription{font-weight:normal;padding-left:24px}.path-grade-edit-tree .setup-grades .column-weight{white-space:nowrap}.path-grade-edit-tree .setup-grades .column-weight.level3{padding-left:37px}.path-grade-edit-tree .setup-grades .column-weight.level4{padding-left:66px}.path-grade-edit-tree .setup-grades .column-weight.level5{padding-left:95px}.path-grade-edit-tree .setup-grades .column-weight.level6{padding-left:124px}.path-grade-edit-tree .setup-grades .column-weight.level7{padding-left:153px}.path-grade-edit-tree .setup-grades .column-weight.level8{padding-left:182px}.path-grade-edit-tree .setup-grades .column-weight.level9{padding-left:211px}.path-grade-edit-tree .setup-grades .column-weight.level10{padding-left:240px}.path-grade-edit-tree .setup-grades .column-range.level2{padding-left:37px}.path-grade-edit-tree .setup-grades .column-range.level3{padding-left:66px}.path-grade-edit-tree .setup-grades .column-range.level4{padding-left:95px}.path-grade-edit-tree .setup-grades .column-range.level5{padding-left:124px}.path-grade-edit-tree .setup-grades .column-range.level6{padding-left:153px}.path-grade-edit-tree .setup-grades .column-range.level7{padding-left:182px}.path-grade-edit-tree .setup-grades .column-range.level8{padding-left:211px}.path-grade-edit-tree .setup-grades .column-range.level9{padding-left:240px}.path-grade-edit-tree .setup-grades .column-range.level10{padding-left:269px}.path-grade-edit-tree .setup-grades.generaltable .levelodd{background-color:#f9f9f9}.path-grade-edit-tree .setup-grades.generaltable .leveleven{background-color:transparent}.dir-rtl.path-grade-edit-tree .setup-grades .category td.column-name{padding-right:0}.dir-rtl.path-grade-edit-tree .setup-grades td.column-name{padding-right:24px}.dir-rtl.path-grade-edit-tree .setup-grades .column-name h4 img.icon{padding-left:4px}.dir-rtl.path-grade-edit-tree .setup-grades .gradeitemdescription{padding-left:0;padding-right:24px}.dir-rtl.path-grade-edit-tree .setup-grades .column-weight.level3{padding-left:0;padding-right:37px}.dir-rtl.path-grade-edit-tree .setup-grades .column-weight.level4{padding-left:0;padding-right:66px}.dir-rtl.path-grade-edit-tree .setup-grades .column-weight.level5{padding-left:0;padding-right:95px}.dir-rtl.path-grade-edit-tree .setup-grades .column-weight.level6{padding-left:0;padding-right:124px}.dir-rtl.path-grade-edit-tree .setup-grades .column-weight.level7{padding-left:0;padding-right:153px}.dir-rtl.path-grade-edit-tree .setup-grades .column-weight.level8{padding-left:0;padding-right:182px}.dir-rtl.path-grade-edit-tree .setup-grades .column-weight.level9{padding-left:0;padding-right:211px}.dir-rtl.path-grade-edit-tree .setup-grades .column-weight.level10{padding-left:0;padding-right:240px}.dir-rtl.path-grade-edit-tree .setup-grades .column-range.level2{padding-left:0;padding-right:37px}.dir-rtl.path-grade-edit-tree .setup-grades .column-range.level3{padding-left:0;padding-right:66px}.dir-rtl.path-grade-edit-tree .setup-grades .column-range.level4{padding-left:0;padding-right:95px}.dir-rtl.path-grade-edit-tree .setup-grades .column-range.level5{padding-left:0;padding-right:124px}.dir-rtl.path-grade-edit-tree .setup-grades .column-range.level6{padding-left:0;padding-right:153px}.dir-rtl.path-grade-edit-tree .setup-grades .column-range.level7{padding-left:0;padding-right:182px}.dir-rtl.path-grade-edit-tree .setup-grades .column-range.level8{padding-left:0;padding-right:211px}.dir-rtl.path-grade-edit-tree .setup-grades .column-range.level9{padding-left:0;padding-right:240px}.dir-rtl.path-grade-edit-tree .setup-grades .column-range.level10{padding-left:0;padding-right:269px}.path-grade-report .gradeparent table{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.path-grade-report .gradeparent tr .cell{background-color:#fff}.path-grade-report .gradeparent table,.path-grade-report .gradeparent .cell{border-color:#ddd}.path-grade-report .gradeparent tr:nth-of-type(even) .cell,.path-grade-report .gradeparent .floater .cell,.path-grade-report .gradeparent .avg{background-color:#f9f9f9}.path-grade-report .gradeparent table .clickable{cursor:pointer}.path-grade-report-user .user-grade{border:none}.path-grade-report-user .user-grade.generaltable .levelodd{background-color:#f9f9f9}.path-grade-report-user .user-grade.generaltable .leveleven{background-color:transparent}.has_dock.path-grade-report-grader .gradeparent .sideonly.floating>.cell,.has_dock.path-grade-report-grader .gradeparent .sideonly.floating>.cell,.has_dock.path-grade-report-grader .gradeparent .sideonly.floating>.cell{padding-left:47px}.has_dock.path-grade-report-grader.dir-rtl .gradeparent .sideonly.floating>.cell,.has_dock.path-grade-report-grader.dir-rtl .gradeparent .sideonly.floating>.cell,.has_dock.path-grade-report-grader.dir-rtl .gradeparent .sideonly.floating>.cell{padding-left:5px;padding-right:47px}.content-only.path-grade-report-grader .gradeparent table{margin-left:42px}.content-only.path-grade-report-grader.dir-rtl .gradeparent table{margin-left:0;margin-right:42px}.transform-test-heading{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:11px;line-height:36px;text-align:center;font-weight:bold;margin:0;padding:0}body.has_dock #page{padding-left:45px;padding-right:20px}body.has_dock div#dock{display:inline}#dock{z-index:12000;width:42px;position:fixed;top:0;left:0;height:100%;background-color:transparent;border-right:0 none}#dock .nothingdocked{visibility:hidden;display:none}#dock .dockeditem_container{margin-top:68px}#dock .dockeditem .firstdockitem{margin-top:1em}#dock .dockedtitle{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #fff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #fff, #e6e6e6);background-image:-o-linear-gradient(top, #fff, #e6e6e6);background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);display:block;width:36px;margin:3px;padding:0;cursor:pointer}#dock .dockedtitle:hover,#dock .dockedtitle:focus,#dock .dockedtitle:active,#dock .dockedtitle.active,#dock .dockedtitle.disabled,#dock .dockedtitle[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}#dock .dockedtitle:active,#dock .dockedtitle.active{background-color:#ccc \9}#dock .dockedtitle:first-child{*margin-left:0}#dock .dockedtitle:hover,#dock .dockedtitle:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}#dock .dockedtitle:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#dock .dockedtitle.active,#dock .dockedtitle:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}#dock .dockedtitle.disabled,#dock .dockedtitle[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}#dock .dockedtitle .label,#dock .dockedtitle .badge{position:relative;top:-1px}#dock .dockedtitle h2{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:11px;line-height:36px;text-align:center;font-weight:bold;margin:0;padding:0}#dock .dockedtitle .filterrotate{margin-left:8px}#dock .controls{position:absolute;bottom:1em;text-align:center;width:100%}#dock .controls img{cursor:pointer}#dock .editing_move,#dock .moodle-core-dragdrop-draghandle{display:none}#dockeditempanel{min-width:200px;position:relative;left:100%;padding-left:5px}#dockeditempanel.dockitempanel_hidden{display:none}#dockeditempanel .dockeditempanel_content{background-color:#f5f5f5;width:384px;border:1px solid #d5d5d5;-webkit-box-shadow:2px 4px 4px 2px #eee;-moz-box-shadow:2px 4px 4px 2px #eee;box-shadow:2px 4px 4px 2px #eee;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}#dockeditempanel .dockeditempanel_bd{overflow:auto}#dockeditempanel .dockeditempanel_bd>*{margin:1em}#dockeditempanel .dockeditempanel_bd .block_navigation .block_tree li{overflow:visible}#dockeditempanel .dockeditempanel_hd{border-bottom:1px solid #fff;padding:.5em 1em}#dockeditempanel .dockeditempanel_hd h2{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase;font-size:1.1em;padding:0;margin:0}#dockeditempanel .dockeditempanel_hd .commands{display:block;text-align:right}#dockeditempanel .dockeditempanel_hd .commands>a,#dockeditempanel .dockeditempanel_hd .commands>span{margin-left:3px;cursor:pointer}#dockeditempanel .dockeditempanel_hd .commands img,#dockeditempanel .dockeditempanel_hd .commands input{vertical-align:middle;margin-right:1px}#dockeditempanel .dockeditempanel_hd .commands .hidepanelicon img{cursor:pointer}#dockeditempanel .dockeditempanel_hd .commands img.actionmenu{width:auto}.dir-rtl.has_dock #page{padding-left:20px;padding-right:45px}.dir-rtl #dock{left:auto;right:0}.dir-rtl #dock .dockedtitle h2{line-height:25px}.dir-rtl #dockeditempanel{right:100%}.dir-rtl #dockeditempanel .dockeditempanel_hd .commands{text-align:left}.columns-autoflow-1to1to1{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:20px;-moz-column-gap:20px;column-gap:20px}@media (max-width:767px){.columns-autoflow-1to1to1{-webkit-column-count:1;-moz-column-count:1;column-count:1;-webkit-column-gap:0;-moz-column-gap:0;column-gap:0}}@media (min-width:768px) and (max-width:979px){.dir-rtl .row-fluid.rtl-compatible [class*="span"]{float:right;margin-left:0;*margin-left:0;margin-right:2.76243094%;*margin-right:2.70923945%}.dir-rtl .row-fluid.rtl-compatible [class*="span"]:first-child{margin-right:0}}@media (min-width:980px) and (max-width:1199px){.dir-rtl .row-fluid.rtl-compatible [class*="span"]{float:right;margin-left:0;*margin-left:0;margin-right:2.12765957%;*margin-right:2.07446809%}.dir-rtl .row-fluid.rtl-compatible [class*="span"]:first-child{margin-right:0}}@media (min-width:1200px){.dir-rtl .row-fluid.rtl-compatible [class*="span"]{float:right;margin-left:0;*margin-left:0;margin-right:2.56410256%;*margin-right:2.51091107%}.dir-rtl .row-fluid.rtl-compatible [class*="span"]:first-child{margin-right:0}}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none !important}.visible-tablet{display:none !important}.hidden-desktop{display:none !important}.visible-desktop{display:inherit !important}@media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important}.visible-desktop{display:none !important}.visible-tablet{display:inherit !important}.hidden-tablet{display:none !important}}@media (max-width:767px){.hidden-desktop{display:inherit !important}.visible-desktop{display:none !important}.visible-phone{display:inherit !important}.hidden-phone{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:inherit !important}.hidden-print{display:none !important}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;content:"";line-height:0}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.56410256%;*margin-left:2.51091107%}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.56410256%}.row-fluid .span12{width:100%;*width:99.94680851%}.row-fluid .span11{width:91.45299145%;*width:91.39979996%}.row-fluid .span10{width:82.90598291%;*width:82.85279142%}.row-fluid .span9{width:74.35897436%;*width:74.30578287%}.row-fluid .span8{width:65.81196581%;*width:65.75877432%}.row-fluid .span7{width:57.26495726%;*width:57.21176578%}.row-fluid .span6{width:48.71794872%;*width:48.66475723%}.row-fluid .span5{width:40.17094017%;*width:40.11774868%}.row-fluid .span4{width:31.62393162%;*width:31.57074013%}.row-fluid .span3{width:23.07692308%;*width:23.02373159%}.row-fluid .span2{width:14.52991453%;*width:14.47672304%}.row-fluid .span1{width:5.98290598%;*width:5.92971449%}.row-fluid .offset12{margin-left:105.12820513%;*margin-left:105.02182215%}.row-fluid .offset12:first-child{margin-left:102.56410256%;*margin-left:102.45771959%}.row-fluid .offset11{margin-left:96.58119658%;*margin-left:96.4748136%}.row-fluid .offset11:first-child{margin-left:94.01709402%;*margin-left:93.91071104%}.row-fluid .offset10{margin-left:88.03418803%;*margin-left:87.92780506%}.row-fluid .offset10:first-child{margin-left:85.47008547%;*margin-left:85.36370249%}.row-fluid .offset9{margin-left:79.48717949%;*margin-left:79.38079651%}.row-fluid .offset9:first-child{margin-left:76.92307692%;*margin-left:76.81669394%}.row-fluid .offset8{margin-left:70.94017094%;*margin-left:70.83378796%}.row-fluid .offset8:first-child{margin-left:68.37606838%;*margin-left:68.2696854%}.row-fluid .offset7{margin-left:62.39316239%;*margin-left:62.28677941%}.row-fluid .offset7:first-child{margin-left:59.82905983%;*margin-left:59.72267685%}.row-fluid .offset6{margin-left:53.84615385%;*margin-left:53.73977087%}.row-fluid .offset6:first-child{margin-left:51.28205128%;*margin-left:51.1756683%}.row-fluid .offset5{margin-left:45.2991453%;*margin-left:45.19276232%}.row-fluid .offset5:first-child{margin-left:42.73504274%;*margin-left:42.62865976%}.row-fluid .offset4{margin-left:36.75213675%;*margin-left:36.64575377%}.row-fluid .offset4:first-child{margin-left:34.18803419%;*margin-left:34.08165121%}.row-fluid .offset3{margin-left:28.20512821%;*margin-left:28.09874523%}.row-fluid .offset3:first-child{margin-left:25.64102564%;*margin-left:25.53464266%}.row-fluid .offset2{margin-left:19.65811966%;*margin-left:19.55173668%}.row-fluid .offset2:first-child{margin-left:17.09401709%;*margin-left:16.98763412%}.row-fluid .offset1{margin-left:11.11111111%;*margin-left:11.00472813%}.row-fluid .offset1:first-child{margin-left:8.54700855%;*margin-left:8.44062557%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:"";line-height:0}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.76243094%;*margin-left:2.70923945%}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.76243094%}.row-fluid .span12{width:100%;*width:99.94680851%}.row-fluid .span11{width:91.43646409%;*width:91.3832726%}.row-fluid .span10{width:82.87292818%;*width:82.81973669%}.row-fluid .span9{width:74.30939227%;*width:74.25620078%}.row-fluid .span8{width:65.74585635%;*width:65.69266486%}.row-fluid .span7{width:57.18232044%;*width:57.12912895%}.row-fluid .span6{width:48.61878453%;*width:48.56559304%}.row-fluid .span5{width:40.05524862%;*width:40.00205713%}.row-fluid .span4{width:31.49171271%;*width:31.43852122%}.row-fluid .span3{width:22.9281768%;*width:22.87498531%}.row-fluid .span2{width:14.36464088%;*width:14.31144939%}.row-fluid .span1{width:5.80110497%;*width:5.74791348%}.row-fluid .offset12{margin-left:105.52486188%;*margin-left:105.4184789%}.row-fluid .offset12:first-child{margin-left:102.76243094%;*margin-left:102.65604796%}.row-fluid .offset11{margin-left:96.96132597%;*margin-left:96.85494299%}.row-fluid .offset11:first-child{margin-left:94.19889503%;*margin-left:94.09251205%}.row-fluid .offset10{margin-left:88.39779006%;*margin-left:88.29140708%}.row-fluid .offset10:first-child{margin-left:85.63535912%;*margin-left:85.52897614%}.row-fluid .offset9{margin-left:79.83425414%;*margin-left:79.72787116%}.row-fluid .offset9:first-child{margin-left:77.0718232%;*margin-left:76.96544023%}.row-fluid .offset8{margin-left:71.27071823%;*margin-left:71.16433525%}.row-fluid .offset8:first-child{margin-left:68.50828729%;*margin-left:68.40190431%}.row-fluid .offset7{margin-left:62.70718232%;*margin-left:62.60079934%}.row-fluid .offset7:first-child{margin-left:59.94475138%;*margin-left:59.8383684%}.row-fluid .offset6{margin-left:54.14364641%;*margin-left:54.03726343%}.row-fluid .offset6:first-child{margin-left:51.38121547%;*margin-left:51.27483249%}.row-fluid .offset5{margin-left:45.5801105%;*margin-left:45.47372752%}.row-fluid .offset5:first-child{margin-left:42.81767956%;*margin-left:42.71129658%}.row-fluid .offset4{margin-left:37.01657459%;*margin-left:36.91019161%}.row-fluid .offset4:first-child{margin-left:34.25414365%;*margin-left:34.14776067%}.row-fluid .offset3{margin-left:28.45303867%;*margin-left:28.3466557%}.row-fluid .offset3:first-child{margin-left:25.69060773%;*margin-left:25.58422476%}.row-fluid .offset2{margin-left:19.88950276%;*margin-left:19.78311978%}.row-fluid .offset2:first-child{margin-left:17.12707182%;*margin-left:17.02068884%}.row-fluid .offset1{margin-left:11.32596685%;*margin-left:11.21958387%}.row-fluid .offset1:first-child{margin-left:8.56353591%;*margin-left:8.45715293%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media (max-width:767px){body{padding-left:20px;padding-right:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;clear:none;width:auto;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-left:10px;padding-right:10px}.media .pull-left,.media .pull-right{float:none;display:block;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;left:10px;right:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media (max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111111}.nav-collapse.in .btn-group{margin-top:5px;padding:0}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-left:10px;padding-right:10px}}@media (min-width:979px + 1){.nav-collapse.collapse{height:auto !important;overflow:visible !important}}@media (min-width:980px){.dir-rtl .navbar .nav.pull-right,.dir-rtl .navbar .logininfo{float:left}.dir-rtl .navbar .nav{float:right}.dir-rtl .navbar .nav>li{float:right}}@media (min-width:980px){a[id]:empty::before,a[name]:empty::before{display:inline-block;position:relative;content:'';padding-top:40px;margin-top:-40px;vertical-align:top}}@media (min-width:980px) and (max-width:1199px){.form-item .form-label,.mform .fitem div.fitemtitle,.userprofile dl.list dt,.form-horizontal .control-label{width:200px}.form-item .form-setting,.form-item .form-description,.mform .fitem .felement,#page-mod-forum-search .c1,.mform .fdescription.required,.userprofile dl.list dd,.form-horizontal .controls{margin-left:220px}.dir-rtl .form-item .form-setting,.dir-rtl .form-item .form-description,.dir-rtl .mform .fitem .felement,.dir-rtl .mform .fdescription.required,.dir-rtl .userprofile dl.list dd,.dir-rtl .form-horizontal .controls{margin-right:220px}#page-mod-forum-search.dir-lrt .c1{margin-right:220px}.path-admin .buttons,.form-buttons{padding-left:220px}}@media (max-width:767px){.file-picker .fp-repo-area{width:100%;height:auto;max-height:220px;y-scroll:auto;float:none;border:0}.file-picker .fp-repo-items{width:100%;float:none;margin-left:0}.file-picker .fp-login-form .fp-login-input label{text-align:left}.dir-rtl .file-picker .fp-login-form .fp-login-input label{text-align:right}.file-picker .fp-content form td{display:block;width:100%;text-align:left}.dir-rtl .file-picker .fp-content form td{text-align:right}.fp-content .mdl-right{text-align:left}.dir-rtl .fp-content .mdl-right{text-align:right}.fp-repo-items .fp-navbar{border-top:1px solid #bbb}.dir-rtl .userprofile dl.list dt,.dir-rtl .userprofile dl.list dd{float:none;text-align:right;margin-right:0}.fp-formset div{height:auto}}@media (min-width:1200px){.path-question #id_answerhdr div.fitem_feditor{padding-right:6px}.loginbox.twocolumns .loginpanel{margin-left:0}.loginbox.twocolumns .loginpanel,.loginbox.twocolumns .signuppanel{width:48.71794872%;*width:48.66475723%}.form-item .form-label,.mform .fitem div.fitemtitle,.userprofile dl.list dt,.form-horizontal .control-label{width:245px}.form-item .form-setting,.form-item .form-description,.mform .fitem .felement,#page-mod-forum-search .c1,.mform .fdescription.required,.userprofile dl.list dd,.form-horizontal .controls{margin-left:265px}.dir-rtl .form-item .form-setting,.dir-rtl .form-item .form-description,.dir-rtl .mform .fitem .felement,.dir-rtl .mform .fdescription.required,.dir-rtl .userprofile dl.list dd,.dir-rtl .form-horizontal .controls{margin-right:165px}.dir-rtl #page-mod-forum-search .c1{margin-right:265px}.dir-rtl .form-item .form-label,.dir-rtl .mform .fitem div.fitemtitle,.dir-rtl .userprofile dl.list dt,.dir-rtl .form-horizontal .control-label{width:145px}.path-admin .buttons,.form-buttons{padding-left:265px}.dir-rtl .path-admin .buttons,.dir-rtl .form-buttons{padding-right:265px}.empty-region-side-post.used-region-side-pre #region-main.span8,.jsenabled.docked-region-side-post.used-region-side-pre #region-main.span8{width:74.35897436%;*width:74.30578287%}.empty-region-side-post.used-region-side-pre #block-region-side-pre.span4,.jsenabled.docked-region-side-post.used-region-side-pre #block-region-side-pre.span4{width:23.07692308%;*width:23.02373159%}}@media (min-width:980px){.loginbox.twocolumns .loginpanel{margin-left:0}.loginbox.twocolumns .loginpanel,.loginbox.twocolumns .signuppanel{width:48.61794872%;*width:48.66475723%}}@media (min-width:768px) and (max-width:979px){.loginbox.twocolumns .loginpanel{margin-left:0}.loginbox.twocolumns .loginpanel,.loginbox.twocolumns .signuppanel{width:48.61878453%;*width:48.56559304%}.empty-region-side-post.used-region-side-pre #region-main.span8,.jsenabled.docked-region-side-post.used-region-side-pre #region-main.span8{width:74.30939227%;*width:74.25620078%}.empty-region-side-post.used-region-side-pre #block-region-side-pre.span4,.jsenabled.docked-region-side-post.used-region-side-pre #block-region-side-pre.span4{width:22.9281768%;*width:22.87498531%}}@media (max-width:767px){.loginbox.twocolumns .loginpanel,.loginbox.twocolumns .signuppanel{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#page-mod-quiz-edit div.quizcontents,.questionbankwindow.block{width:100%;float:none}#page-mod-quiz-edit #block-region-side-pre,#page-mod-quiz-edit #block-region-side-post{clear:both}}@media (max-width:480px){.nav-tabs>li{float:none}.nav-tabs>li>a{margin-right:0}.nav-tabs{border-bottom:0}.nav-tabs>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{border:1px solid #ddd}.nav-tabs>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.nav-tabs>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#ddd;z-index:2}.fp-content-center{display:block;vertical-align:top}.course-content ul.topics li.section,.course-content ul.topics li.section .content,.course-content ul.weeks li.section .content,.course-content ul.weeks li.section,.course-content ul.section{margin-right:0;margin-left:0;padding:0}.activityinstance{display:block}.editing .course-content .section .activity{margin-bottom:.2em;padding-bottom:.2em;border-bottom:thin solid #eee}.course-content .section .activity .commands{text-align:right}.jsenabled .choosercontainer #chooseform .alloptions{max-width:100%}.jsenabled .choosercontainer #chooseform .instruction,.jsenabled .choosercontainer #chooseform .typesummary{position:static}.que .info{float:none;width:auto}.que .content{margin:0}.path-mod-choice .horizontal .choices .option{display:block}.path-mod-forum .forumsearch #search{width:120px}.path-mod-forum .forumheaderlist .picture{display:none}}@media (min-width:768px){.row-fluid .desktop-first-column{margin-left:0}#page-navbar .breadcrumb-button{display:inline}}@media (max-width:767px){.row-fluid .desktop-first-column{clear:both}}@media (max-width:767px){.form-item .form-label,.mform .fitem div.fitemtitle{float:none;width:auto;padding-top:0;text-align:left}.form-item .form-label label{display:inline-block;margin-right:.5em}.form-item .form-setting .form-checkbox{margin-top:0}.form-label span.form-shortname{display:inline-block}.form-item .form-setting,.mform .fitem .felement,.path-backup .mform .fitem .felement,.mform .fdescription.required,.form-item .form-description{margin-left:0}table#form td.submit,.form-buttons,#fitem_id_submitbutton,.fp-content-center form+div,#fgroup_id_buttonar,.form-horizontal .form-actions,.fitem_fsubmit .felement.fsubmit{padding-left:10px;padding-right:10px}#helppopupbox{width:auto !important;left:0 !important}}@media (min-width:768px) and (max-width:979px){.block_calendar_month .content,.block .minicalendar td{padding-left:0;padding-right:0}}.dir-rtl .dropdown-menu{right:0;left:auto;margin-right:0}.dir-rtl .navbar .nav>li>.dropdown-menu:before{right:9px;left:auto}.dir-rtl .navbar .nav>li>.dropdown-menu:after{right:10px;left:auto}.dir-rtl .dropdown-submenu>a:after{margin-right:0;margin-left:-10px;float:left;border-right-color:#ccc;border-left-color:transparent;border-width:5px 5px 5px 0}.dir-rtl .dropdown-submenu>.dropdown-menu{right:100%;left:auto}@media (max-width:979px){.nav-collapse{height:0}.nav-collapse .nav>li>a{color:#333}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus,.nav-collapse .dropdown-submenu a:hover,.nav-collapse .dropdown-submenu a:focus,.nav-collapse .dropdown-submenu a:active,.nav-collapse .dropdown-menu>li>a:hover,.nav-collapse .dropdown-menu>li>a:focus,.nav-collapse .dropdown-submenu:hover>a,.nav-collapse .dropdown-submenu:focus>a{background-image:none;color:#333}.nav-collapse.in{height:auto}.nav-collapse.in .usermenu .moodle-actionmenu[data-enhanced] .toggle-display{display:none}.nav-collapse.in .usermenu .moodle-actionmenu[data-enhanced] .menu{display:block}.nav-collapse.in .usermenu .moodle-actionmenu[data-enhanced] .menu li{margin:0 .5em}.path-mod-data .box>table>tbody>tr>td{display:block}.path-mod-forum .forumheaderlist thead .header{font-weight:normal;font-size:12px}.path-mod-forum .forumheaderlist .discussion .author,.path-mod-forum .forumheaderlist .discussion .replies,.path-mod-forum .forumheaderlist .discussion .lastpost{font-size:12px}.path-mod-forum .forumheaderlist .discussion .replies .unread a{padding:0}.navbar .nav-collapse.in{border-top:1px solid #d4d4d4}.navbar .nav-collapse.in.pull-left,.navbar .nav-collapse.in.pull-right{float:none}.navbar .nav-collapse.in>.nav{margin:0}.navbar .nav-collapse.in>.nav>li>a{padding-left:20px;border-radius:0}.navbar .nav-collapse.in>.nav .dropdown-menu{margin:0 0 0 15px}.navbar .nav-collapse.in>.nav .dropdown-menu li>a{border-radius:0}.navbar .nav-collapse.in .nav .dropdown-submenu .dropdown-toggle:after,.navbar .nav-collapse.in .nav .dropdown-menu .dropdown-submenu .dropdown-toggle:after{float:none;display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";border-top-color:#d4d4d4;margin-left:4px;margin-top:8px}.navbar .nav-collapse.in .nav .dropdown-submenu.open>a,.navbar .nav-collapse.in .nav .dropdown-menu .dropdown-submenu.open>a{background-color:#f2f2f2}.navbar .nav-collapse.in .nav .dropdown-submenu:hover .dropdown-menu,.navbar .nav-collapse.in .nav .dropdown-menu .dropdown-submenu:hover .dropdown-menu{display:none}.navbar .nav-collapse.in .nav .dropdown-submenu:hover.open>a,.navbar .nav-collapse.in .nav .dropdown-menu .dropdown-submenu:hover.open>a{background-color:#f2f2f2}.navbar .nav-collapse.in .nav .dropdown-submenu:hover.open>.dropdown-menu,.navbar .nav-collapse.in .nav .dropdown-menu .dropdown-submenu:hover.open>.dropdown-menu,.navbar .nav-collapse.in .nav .dropdown-submenu:hover.open .open>.dropdown-menu,.navbar .nav-collapse.in .nav .dropdown-menu .dropdown-submenu:hover.open .open>.dropdown-menu{display:block}.navbar .nav-collapse.in .nav .divider,.navbar .nav-collapse.in .nav .dropdown-menu .divider{width:auto;display:block;height:0;margin:4px 1px;border-left:0 none;border-right:0 none;border-top:1px solid #d4d4d4;border-bottom:1px solid #ffffff}.navbar-inverse .nav-collapse.in{border-top-color:#252525}.navbar-inverse .nav-collapse.in .nav .dropdown-submenu .dropdown-toggle:after,.navbar-inverse .nav-collapse.in .nav .dropdown-menu .dropdown-submenu .dropdown-toggle:after{border-top-color:#252525}.navbar-inverse .nav-collapse.in .nav .dropdown-submenu.open>a,.navbar-inverse .nav-collapse.in .nav .dropdown-menu .dropdown-submenu.open>a{background-color:#111111}.navbar-inverse .nav-collapse.in .nav .dropdown-submenu:hover.open>a,.navbar-inverse .nav-collapse.in .nav .dropdown-menu .dropdown-submenu:hover.open>a{background-color:#111111}.navbar-inverse .nav-collapse.in .nav .divider,.navbar-inverse .nav-collapse.in .nav .dropdown-menu .divider{width:auto;display:block;height:0;margin:4px 1px;border-top:1px solid #111111;border-bottom:1px solid #515151}.navbar-inverse .nav-collapse.in .nav>li>a:hover,.navbar-inverse .nav-collapse.in .nav>li>a:focus{color:#fff}.navbar-inverse .nav-collapse.in .dropdown-menu a:hover,.navbar-inverse .nav-collapse.in .dropdown-menu a:focus{color:#fff}.navbar-inverse .nav-collapse.in .dropdown-menu a>li>a:hover,.navbar-inverse .nav-collapse.in .dropdown-menu a>li>a:focus{color:#fff}.navbar-inverse .nav-collapse.in .dropdown-submenu a:hover,.navbar-inverse .nav-collapse.in .dropdown-submenu a:focus,.navbar-inverse .nav-collapse.in .dropdown-submenu a:active{color:#fff}.dir-rtl .navbar .nav-collapse.in>.nav{margin:0}.dir-rtl .navbar .nav-collapse.in>.nav>li>a{padding-left:0;padding-right:20px}.dir-rtl .navbar .nav-collapse.in>.nav .dropdown-menu{margin:0 15px 0 0}.dir-rtl .navbar .nav-collapse.in .dropdown-menu>li>a{padding:9px 15px}.dir-rtl .navbar .nav-collapse.in .nav .dropdown-submenu .dropdown-toggle:after,.dir-rtl .navbar .nav-collapse.in .nav .dropdown-menu .dropdown-submenu .dropdown-toggle:after{margin-left:0;margin-right:4px}}@media (max-width:767px){#filesskin .yui3-panel,#filesskin .file-picker.fp-generallayout{width:100%;left:0}.userprofile dl.list dt{float:none;clear:none;width:auto;text-align:left}.userprofile dl.list dd{margin-left:0}#page-mod-wiki-create .mform .fitem div.fitemtitle{float:left}.container{width:auto}.row-fluid{width:100%}.row-fluid .span8.pull-right,.row-fluid .span9.pull-right{float:none}.row{margin-left:0}[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.empty-region-side-post.used-region-side-pre #block-region-side-pre.span4,.jsenabled.docked-region-side-post.used-region-side-pre #block-region-side-pre.span4,.empty-region-side-post.used-region-side-pre #region-main.span8,.jsenabled.docked-region-side-post.used-region-side-pre #region-main.span8{width:100%;*width:99.94680851%}.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}div[role=main]{margin-bottom:1em}.coursebox .info .name a{background-position:0 13px}.category-browse .coursebox .info .name a{background-position:0 13px}}@media (min-width:1200px) and (max-width:1600px){#course-category-listings.columns-3{background-color:transparent;border:0}#course-category-listings.columns-3 #category-listing,#course-category-listings.columns-3 #course-listing{width:48.71794872%;*width:48.66475723%;margin-left:2.56410256%;*margin-left:2.51091107%}#course-category-listings.columns-3 #category-listing:first-child,#course-category-listings.columns-3 #course-listing:first-child{margin-left:0}#course-category-listings.columns-3 #course-detail{width:100%;*width:99.94680851%;margin:1em 0 0}}@media (max-width:1199px){.path-question #id_answerhdr div.fitem{padding-right:6px;padding-left:4px}#course-category-listings.columns-3{background-color:transparent;border:0}#course-category-listings.columns-3 #category-listing,#course-category-listings.columns-3 #course-listing,#course-category-listings.columns-3 #course-detail{width:100%;*width:99.94680851%;margin:0 0 1em 0}#page-mod-forum-discuss .discussioncontrols{text-align:right}#page-mod-forum-discuss .discussioncontrols .discussioncontrol{float:none;width:auto;display:inline-block;margin:0 3px .5em}#page-mod-forum-discuss .discussioncontrols .discussioncontrol select,#page-mod-forum-discuss .discussioncontrols .discussioncontrol input{margin-bottom:0}#page-mod-forum-discuss .discussioncontrols .discussioncontrol.movediscussion{margin-right:0;padding-right:0}#page-mod-forum-discuss.dir-rtl .discussioncontrols{text-align:left}}@media (max-width:768px){.fp-forminset .control-group .controls{margin-left:0}.dir-rtl .fp-formset .control-group label.control-label{text-align:right;float:none}.dir-rtl .fp-forminset .control-group label.control-label{text-align:right;float:none}.dir-rtl .fp-forminset .control-group .controls{margin-right:0}}body.behat-site .navbar-fixed-top{position:absolute}.phpinfo table,.phpinfo th,.phpinfo h2{margin:auto;text-align:left}.phpinfo h2{width:600px}.phpinfo .e,.phpinfo .v,.phpinfo .h{border:1px solid #000000;font-size:.8em;vertical-align:baseline;color:#000000;background-color:#cccccc}.phpinfo .e{background-color:#ccccff;font-weight:bold}.phpinfo .h{background-color:#9999cc;font-weight:bold}#page-footer .performanceinfo{margin:10px 20%}#page-footer .performanceinfo span{display:block}#page-footer .validators{margin-top:40px;padding-top:5px;border-top:1px dotted gray}#page-footer .validators ul{margin:0;padding:0;list-style-type:none}#page-footer .validators ul li{display:inline;margin-right:10px;margin-left:10px}#page-footer .performanceinfo .cachesused{margin-top:1em}#page-footer .performanceinfo .cachesused .cache-stats-heading,#page-footer .performanceinfo .cachesused .cache-total-stats{font-weight:bold;font-size:110%;margin-top:.3em}#page-footer .performanceinfo .cachesused .cache-definition-stats{margin:.3em;display:inline-block;vertical-align:top;background-color:#f5f5f5}#page-footer .performanceinfo .cachesused .cache-definition-stats .cache-definition-stats-heading span{display:inline-block;cursor:default}#page-footer .performanceinfo .cachesused .cache-definition-stats .cache-store-stats{padding:0 1.3em}#page-footer .performanceinfo .cachesused .cache-definition-stats .cache-store-stats.nohits{background-color:#f2dede}#page-footer .performanceinfo .cachesused .cache-definition-stats .cache-store-stats.lowhits{background-color:#fcf8e3}#page-footer .performanceinfo .cachesused .cache-definition-stats .cache-store-stats.hihits{background-color:#dff0d8}#page-footer,#page-footer .validators,#page-footer .purgecaches,#page-footer .performanceinfo{text-align:center}table#explaincaps tbody>tr:nth-child(odd)>td,table#defineroletable tbody>tr:nth-child(odd)>td,table.grading-report tbody>tr:nth-child(odd)>td,table#listdirectories tbody>tr:nth-child(odd)>td,table.rolecaps tbody>tr:nth-child(odd)>td,table.userenrolment tbody>tr:nth-child(odd)>td,table#form tbody>tr:nth-child(odd)>td,form#movecourses table tbody>tr:nth-child(odd)>td,#page-admin-course-index .editcourse tbody>tr:nth-child(odd)>td,.forumheaderlist tbody>tr:nth-child(odd)>td,table.flexible tbody>tr:nth-child(odd)>td,.generaltable tbody>tr:nth-child(odd)>td,table#explaincaps tbody>tr:nth-child(odd)>th,table#defineroletable tbody>tr:nth-child(odd)>th,table.grading-report tbody>tr:nth-child(odd)>th,table#listdirectories tbody>tr:nth-child(odd)>th,table.rolecaps tbody>tr:nth-child(odd)>th,table.userenrolment tbody>tr:nth-child(odd)>th,table#form tbody>tr:nth-child(odd)>th,form#movecourses table tbody>tr:nth-child(odd)>th,#page-admin-course-index .editcourse tbody>tr:nth-child(odd)>th,.forumheaderlist tbody>tr:nth-child(odd)>th,table.flexible tbody>tr:nth-child(odd)>th,.generaltable tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}table caption{font-size:24px;font-weight:bold;line-height:42px;text-align:left}.dir-rtl table#explaincaps td,.dir-rtl table#defineroletable td,.dir-rtl table.grading-report td,.dir-rtl table#listdirectories td,.dir-rtl table.rolecaps td,.dir-rtl table.userenrolment td,.dir-rtl table#form td,.dir-rtl form#movecourses table td,.dir-rtl .forumheaderlist td,.dir-rtl table.flexible td,.dir-rtl .generaltable td,.dir-rtl .generaltable thead:first-child tr:first-child td,.dir-rtl table#explaincaps th,.dir-rtl table#defineroletable th,.dir-rtl table.grading-report th,.dir-rtl table#listdirectories th,.dir-rtl table.rolecaps th,.dir-rtl table.userenrolment th,.dir-rtl table#form th,.dir-rtl form#movecourses table th,.dir-rtl .forumheaderlist th,.dir-rtl table.flexible th,.dir-rtl .generaltable th,.dir-rtl .generaltable thead:first-child tr:first-child th{text-align:right}.dir-rtl table caption{text-align:right}#page-admin-course-index.dir-rtl .editcourse td,#page-admin-course-index.dir-rtl .editcourse th{text-align:right}#page-report-loglive-index .generaltable th,#page-admin-report-log-index .generaltable th,#page-report-log-user .generaltable th,#page-admin-user table th,.environmenttable th,.category_subcategories th,.rcs-results th,table#listdirectories th,#page-report-loglive-index .generaltable td,#page-admin-report-log-index .generaltable td,#page-report-log-user .generaltable td,#page-admin-user table td,.environmenttable td,.category_subcategories td,.rcs-results td,table#listdirectories td{padding:4px 5px}.user-enroller-panel .uep-search-results .users tbody tr:hover>td,.user-enroller-panel .uep-search-results .cohorts tbody tr:hover>td,table.grading-report tbody tr:hover>td,.forumheaderlist tbody tr:hover>td,.generaltable tbody tr:hover>td,table.flexible tbody tr:hover>td,.category_subcategories tbody tr:hover>td,table#modules tbody tr:hover>td,table#permissions tbody tr:hover>td,.user-enroller-panel .uep-search-results .users tbody tr:hover>th,.user-enroller-panel .uep-search-results .cohorts tbody tr:hover>th,table.grading-report tbody tr:hover>th,.forumheaderlist tbody tr:hover>th,.generaltable tbody tr:hover>th,table.flexible tbody tr:hover>th,.category_subcategories tbody tr:hover>th,table#modules tbody tr:hover>th,table#permissions tbody tr:hover>th{background-color:#f5f5f5}div[id^="bar_pbar_"]{overflow:hidden !important;height:20px !important;margin-bottom:20px !important;background-color:#f7f7f7 !important;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9) !important;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)) !important;background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9) !important;background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9) !important;background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9) !important;background-repeat:repeat-x !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0) !important;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1) !important;-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1) !important;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1) !important;-webkit-border-radius:4px !important;-moz-border-radius:4px !important;border-radius:4px !important;border:none !important}div[id^="progress_pbar_"]{height:100% !important;color:#fff !important;float:left !important;font-size:12px !important;text-align:center !important;text-shadow:0 -1px 0 rgba(0,0,0,0.25) !important;background-color:#0e90d2 !important;background-image:-moz-linear-gradient(top, #149bdf, #0480be) !important;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)) !important;background-image:-webkit-linear-gradient(top, #149bdf, #0480be) !important;background-image:-o-linear-gradient(top, #149bdf, #0480be) !important;background-image:linear-gradient(to bottom, #149bdf, #0480be) !important;background-repeat:repeat-x !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0) !important;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15) !important;-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15) !important;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15) !important;-webkit-box-sizing:border-box !important;-moz-box-sizing:border-box !important;box-sizing:border-box !important;-webkit-transition:width .6s ease !important;-moz-transition:width .6s ease !important;-o-transition:width .6s ease !important;transition:width .6s ease !important;padding-top:0 !important;border:none !important}input.form-submit,input#id_submitbutton,input#id_submitbutton2,.path-admin .buttons input[type="submit"],td.submit input{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#005aa8;background-image:-moz-linear-gradient(top, #0070a8, #0038a8);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0070a8), to(#0038a8));background-image:-webkit-linear-gradient(top, #0070a8, #0038a8);background-image:-o-linear-gradient(top, #0070a8, #0038a8);background-image:linear-gradient(to bottom, #0070a8, #0038a8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0070a8', endColorstr='#ff0038a8', GradientType=0);border-color:#0038a8 #0038a8 #001e5c;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#0038a8;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}input.form-submit:hover,input#id_submitbutton:hover,input#id_submitbutton2:hover,.path-admin .buttons input[type="submit"]:hover,td.submit input:hover,input.form-submit:focus,input#id_submitbutton:focus,input#id_submitbutton2:focus,.path-admin .buttons input[type="submit"]:focus,td.submit input:focus,input.form-submit:active,input#id_submitbutton:active,input#id_submitbutton2:active,.path-admin .buttons input[type="submit"]:active,td.submit input:active,input.form-submit.active,input#id_submitbutton.active,input#id_submitbutton2.active,.path-admin .buttons input[type="submit"].active,td.submit input.active,input.form-submit.disabled,input#id_submitbutton.disabled,input#id_submitbutton2.disabled,.path-admin .buttons input[type="submit"].disabled,td.submit input.disabled,input.form-submit[disabled],input#id_submitbutton[disabled],input#id_submitbutton2[disabled],.path-admin .buttons input[type="submit"][disabled],td.submit input[disabled]{color:#fff;background-color:#0038a8;*background-color:#002f8f}input.form-submit:active,input#id_submitbutton:active,input#id_submitbutton2:active,.path-admin .buttons input[type="submit"]:active,td.submit input:active,input.form-submit.active,input#id_submitbutton.active,input#id_submitbutton2.active,.path-admin .buttons input[type="submit"].active,td.submit input.active{background-color:#002775 \9}input.form-submit .caret,input#id_submitbutton .caret,input#id_submitbutton2 .caret,.path-admin .buttons input[type="submit"] .caret,td.submit input .caret{border-top-color:#fff;border-bottom-color:#fff}#notice .singlebutton+.singlebutton input,.submit.buttons input[name="cancel"]{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #fff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #fff, #e6e6e6);background-image:-o-linear-gradient(top, #fff, #e6e6e6);background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)}#notice .singlebutton+.singlebutton input:hover,.submit.buttons input[name="cancel"]:hover,#notice .singlebutton+.singlebutton input:focus,.submit.buttons input[name="cancel"]:focus,#notice .singlebutton+.singlebutton input:active,.submit.buttons input[name="cancel"]:active,#notice .singlebutton+.singlebutton input.active,.submit.buttons input[name="cancel"].active,#notice .singlebutton+.singlebutton input.disabled,.submit.buttons input[name="cancel"].disabled,#notice .singlebutton+.singlebutton input[disabled],.submit.buttons input[name="cancel"][disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}#notice .singlebutton+.singlebutton input:active,.submit.buttons input[name="cancel"]:active,#notice .singlebutton+.singlebutton input.active,.submit.buttons input[name="cancel"].active{background-color:#ccc \9}#notice .singlebutton+.singlebutton input:first-child,.submit.buttons input[name="cancel"]:first-child{*margin-left:0}#notice .singlebutton+.singlebutton input:hover,.submit.buttons input[name="cancel"]:hover,#notice .singlebutton+.singlebutton input:focus,.submit.buttons input[name="cancel"]:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}#notice .singlebutton+.singlebutton input:focus,.submit.buttons input[name="cancel"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#notice .singlebutton+.singlebutton input.active,.submit.buttons input[name="cancel"].active,#notice .singlebutton+.singlebutton input:active,.submit.buttons input[name="cancel"]:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}#notice .singlebutton+.singlebutton input.disabled,.submit.buttons input[name="cancel"].disabled,#notice .singlebutton+.singlebutton input[disabled],.submit.buttons input[name="cancel"][disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}#notice .singlebutton+.singlebutton input .label,.submit.buttons input[name="cancel"] .label,#notice .singlebutton+.singlebutton input .badge,.submit.buttons input[name="cancel"] .badge{position:relative;top:-1px}#notice .singlebutton+.singlebutton input,.submit.buttons input[name="cancel"]{margin:0 0 10px 5px}input[id$="_clearbutton"],input[type="reset"]{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}input[id$="_clearbutton"]:hover,input[type="reset"]:hover,input[id$="_clearbutton"]:focus,input[type="reset"]:focus,input[id$="_clearbutton"]:active,input[type="reset"]:active,input[id$="_clearbutton"].active,input[type="reset"].active,input[id$="_clearbutton"].disabled,input[type="reset"].disabled,input[id$="_clearbutton"][disabled],input[type="reset"][disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}input[id$="_clearbutton"]:active,input[type="reset"]:active,input[id$="_clearbutton"].active,input[type="reset"].active{background-color:#c67605 \9}input[id$="_clearbutton"] .caret,input[type="reset"] .caret{border-top-color:#fff;border-bottom-color:#fff}
\ No newline at end of file
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}.img-responsive{max-width:100%;width:auto\9;height:auto;-ms-interpolation-mode:bicubic}img{vertical-align:middle;border:0}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#0070a8;text-decoration:none}a:hover,a:focus{color:#003d5c;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:"";line-height:0}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.12765957%;*margin-left:2.07446809%}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.12765957%}.row-fluid .span12{width:100%;*width:99.94680851%}.row-fluid .span11{width:91.4893617%;*width:91.43617021%}.row-fluid .span10{width:82.9787234%;*width:82.92553191%}.row-fluid .span9{width:74.46808511%;*width:74.41489362%}.row-fluid .span8{width:65.95744681%;*width:65.90425532%}.row-fluid .span7{width:57.44680851%;*width:57.39361702%}.row-fluid .span6{width:48.93617021%;*width:48.88297872%}.row-fluid .span5{width:40.42553191%;*width:40.37234043%}.row-fluid .span4{width:31.91489362%;*width:31.86170213%}.row-fluid .span3{width:23.40425532%;*width:23.35106383%}.row-fluid .span2{width:14.89361702%;*width:14.84042553%}.row-fluid .span1{width:6.38297872%;*width:6.32978723%}.row-fluid .offset12{margin-left:104.25531915%;*margin-left:104.14893617%}.row-fluid .offset12:first-child{margin-left:102.12765957%;*margin-left:102.0212766%}.row-fluid .offset11{margin-left:95.74468085%;*margin-left:95.63829787%}.row-fluid .offset11:first-child{margin-left:93.61702128%;*margin-left:93.5106383%}.row-fluid .offset10{margin-left:87.23404255%;*margin-left:87.12765957%}.row-fluid .offset10:first-child{margin-left:85.10638298%;*margin-left:85%}.row-fluid .offset9{margin-left:78.72340426%;*margin-left:78.61702128%}.row-fluid .offset9:first-child{margin-left:76.59574468%;*margin-left:76.4893617%}.row-fluid .offset8{margin-left:70.21276596%;*margin-left:70.10638298%}.row-fluid .offset8:first-child{margin-left:68.08510638%;*margin-left:67.9787234%}.row-fluid .offset7{margin-left:61.70212766%;*margin-left:61.59574468%}.row-fluid .offset7:first-child{margin-left:59.57446809%;*margin-left:59.46808511%}.row-fluid .offset6{margin-left:53.19148936%;*margin-left:53.08510638%}.row-fluid .offset6:first-child{margin-left:51.06382979%;*margin-left:50.95744681%}.row-fluid .offset5{margin-left:44.68085106%;*margin-left:44.57446809%}.row-fluid .offset5:first-child{margin-left:42.55319149%;*margin-left:42.44680851%}.row-fluid .offset4{margin-left:36.17021277%;*margin-left:36.06382979%}.row-fluid .offset4:first-child{margin-left:34.04255319%;*margin-left:33.93617021%}.row-fluid .offset3{margin-left:27.65957447%;*margin-left:27.55319149%}.row-fluid .offset3:first-child{margin-left:25.53191489%;*margin-left:25.42553191%}.row-fluid .offset2{margin-left:19.14893617%;*margin-left:19.04255319%}.row-fluid .offset2:first-child{margin-left:17.0212766%;*margin-left:16.91489362%}.row-fluid .offset1{margin-left:10.63829787%;*margin-left:10.53191489%}.row-fluid .offset1:first-child{margin-left:8.5106383%;*margin-left:8.40425532%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;*zoom:1;padding-left:5px;padding-right:5px}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:180px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:200px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;border:1px solid #ccc;background-color:#fff}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#8a6d3b}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#8a6d3b}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:180px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:200px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:200px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:200px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("[[pix:theme|glyphicons-halflings]]");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("[[pix:theme|glyphicons-halflings-white]]")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{background-position:-216px -120px;width:16px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px;width:16px}.icon-folder-open{background-position:-408px -120px;width:16px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#fff;background-color:#00699e;background-image:-moz-linear-gradient(top, #0070a8, #005f8f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0070a8), to(#005f8f));background-image:-webkit-linear-gradient(top, #0070a8, #005f8f);background-image:-o-linear-gradient(top, #0070a8, #005f8f);background-image:linear-gradient(to bottom, #0070a8, #005f8f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0070a8', endColorstr='#ff005f8f', GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#00699e;background-image:-moz-linear-gradient(top, #0070a8, #005f8f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0070a8), to(#005f8f));background-image:-webkit-linear-gradient(top, #0070a8, #005f8f);background-image:-o-linear-gradient(top, #0070a8, #005f8f);background-image:linear-gradient(to bottom, #0070a8, #005f8f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0070a8', endColorstr='#ff005f8f', GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #fff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #fff, #e6e6e6);background-image:-o-linear-gradient(top, #fff, #e6e6e6);background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#005aa8;background-image:-moz-linear-gradient(top, #0070a8, #0038a8);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0070a8), to(#0038a8));background-image:-webkit-linear-gradient(top, #0070a8, #0038a8);background-image:-o-linear-gradient(top, #0070a8, #0038a8);background-image:linear-gradient(to bottom, #0070a8, #0038a8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0070a8', endColorstr='#ff0038a8', GradientType=0);border-color:#0038a8 #0038a8 #001e5c;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#0038a8;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#0038a8;*background-color:#002f8f}.btn-primary:active,.btn-primary.active{background-color:#002775 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444, #222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444), to(#222));background-image:-webkit-linear-gradient(top, #444, #222);background-image:-o-linear-gradient(top, #444, #222);background-image:linear-gradient(to bottom, #444, #222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{border-color:transparent;cursor:pointer;color:#0070a8;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#003d5c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px}.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#0038a8}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#8a6d3b}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success h4{color:#468847}.alert-danger,.alert-error{bac